::Z::Thinking::

::Simple::
文章 - 124,收藏 - , 评论 - 49, trackbacks - 0
1、表层克隆


public class  Snake implements Cloneable
{
    private Snake next;
    private char c;
    Snake(int i, char x){
        c = x;
        if(--i > 0){
             next = new Snake(i,(char)(x+1));
        }
    }

    public void increment(){
        c++;
        if(next!=null){
            next.increment();
        }
    }

    public String toString(){
        String s = ":"+c;
        if(next!=null){
            s += next.toString();
        }
        return s;
    }
    public Object clone(){
        Object o = null;
        try{
            o = super.clone();
        }catch(CloneNotSupportedException e){}        
        return o;
    }
    public static void main(String[] args) 
    {
        Snake s = new Snake(5,'a');
        System.out.println("s ="+s);
        Snake s2 = (Snake)s.clone();
        System.out.println("s2 ="+s2);
        s2.increment();
        System.out.println("after s2.increment, s="+s+"  s2 ="+s2);
    }
}

此时的输出结果:
s =:a:b:c:d:e
s2 =:a:b:c:d:e
after s2.increment, s=:a:c:d:e:f  s2 =:b:c:d:e:f

2、深层克隆


public class  Snake implements Cloneable
{
    private Snake next;
    private char c;
    Snake(int i, char x){
        c = x;
        if(--i > 0){
             next = new Snake(i,(char)(x+1));
        }
    }

    public void increment(){
        c++;
        if(next!=null){
            next.increment();
        }
    }

    public String toString(){
        String s = ":"+c;
        if(next!=null){
            s += next.toString();
        }
        return s;
    }
    public Object clone(){
        Snake o = null;
        try{
            o = (Snake)super.clone();
        }catch(CloneNotSupportedException e){}
        if(o.next !=null)
        o.next = (Snake)o.next.clone();
        return o;
    }
    public static void main(String[] args) 
    {
        Snake s = new Snake(5,'a');
        System.out.println("s ="+s);
        Snake s2 = (Snake)s.clone();
        System.out.println("s2 ="+s2);
        s2.increment();
        System.out.println("after s2.increment, s="+s);
        System.out.println("s2 ="+s2);
    }
}

此时的输出结果为:
s =:a:b:c:d:e
s2 =:a:b:c:d:e
after s2.increment, s=:a:b:c:d:e  s2 =:b:c:d:e:f

在colne()函数中,如果只是简单的调用一下父类的super.clone()则只是将当前类的
本类型
按位复制克隆后的类所含有的对象句柄仍然和当前类相同。所以,如果需要进行深
层克隆,则需要在调用super.clone()之后,克隆该类含有的对象类。



Trackback: http://tb.donews.net/TrackBack.aspx?PostId=32088


[点击此处收藏本文]  发表于2004年06月22日 11:25 AM




正在读取评论……