|
Java中的clone机制 java中有两种clone方式,一种是浅拷贝,一种是深拷贝. Object 定义了clone方法,而且定义为protected保护型,返回Object.
如果你要使自定义的类能够被clone,就必须实现Cloneable接口并且 重写clone()方法.
class CloneTest1() implements Cloneable { java.util.Date date; public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException ex) { //如果没有实现Cloneable接口,抛出异常 return null; } } }
CloneTest1简单的实现了Clone()方法,只是简单的调用Object的clone()方法. 这种方式属于浅拷贝,只是clone了CloneTest1的表层.测试如下: CloneTest1 src=new CloneTest1(); CloneTest1 des=(CloneTest1)src.clone(); System.out.println(src==des); //false 说明有两个CloneTest1的实例. System.out.println(src.date==des.date); //true 指向相同的数据成员.
有时候我们需要一个完全的备份,就是深层次的拷贝
class CloneTest2 implements Cloneable{ java.util.Date date; public Object clone(){ try { CloneTest2 ct=(CloneTest2)super.Clone(); ct.date=date.clone(); return ct; } catch (CloneNotSupportedException ex) { return null; } } }
上面的实现就是一个深拷贝了,要实现深拷贝类中的数据成员都得是Cloneable的(当然 你也可以不是,那就是自找麻烦): class NotCloneable{ public String str; } class CloneTest3{ NotCloneable nc; public clone(){ try { CloneTest3 ct=(CloneTest3)super.clone(); ct.nc=new NotCloneable(); ct.nc.str=str; return ct; } catch (CloneNotSupportedException ex) { return null; } } } 这样虽然也实现了深拷贝,但是非常不好.
|