深层克隆

发表于:2007-06-22来源:作者:点击数: 标签:
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(); } } publ

   
  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()之后,克隆该类含有的对象类。

原文转自:http://www.ltesting.net