2.即使基类 A 已有 clone() 函数,其子类 ExtendA 若要具备 clone 功能,则必须 override 其基类 A 的 clone() 函数。否则,对类型为 ExtendA 的对象 ea 的 clone() 方法的调用,会执行于类 A 中定义的 clone() 方法而返回一个类型为 A 的对象,它显然不是 ea 的克隆。
如果 this.getClass() 没有实现 Cloneable 接口, clone() 就会抛 CloneNotSupportedException 返回。否则就会创建一个类型为 this.getClass() 的对象 other ,并将 this 各 field 的值赋值给 other 的对应 field ,然后返回 other 。
Deep Clone 对于实现不可变( Immutable )类很有帮助。设一个类包含可变类 M 类型的 field ,如何将其设计为不可变类呢?先为 M 实现 Deep Clone 功能,然后这样设计类 ImmutableClass :
class ImmutableClass { MutableClass m; ImmutableClass(MutableClass m) { this.m = m.clone(); // 将传入的 m 的 clone 赋值给内部 m } public MutableClass getM() { returnthis.m.clone(); // 将内部 m 的 clone 返回给外部 } }
3.2 如何实现 Deep Clone
检查类有无可变类类型的字段。如果无,返回 super.clone() 即可;
如果有,确保包含的可变类本身都实现了 Deep Clone ;
Object o = super.clone(); //先执行浅克隆,确保类型正确和基本类型及非可变类类型字段内容正确