在Java中数据类型分为值(基本数据类型)类型和引用类型。深克隆和浅克隆的重要区别在于是否支持引用类型(数组、类、接口等复杂类型)的成员变量的复制。
浅克隆(ShallowClone)
被Clone的类实现Clonenable接口,然后覆写clone()方法,得到clone的对象。
深克隆
在深克隆中,无论成员变量是值类型还是引用类型都会复制一份给克隆对象。
通过Clonenable接口
若被Clone的类中存在引用类型的成员变量,那么这个变量也需要实现Clonenalbe接口,并在被clone类的clone方法中调用成员变量类的clone方法。
若类中存在很多引用类型的成员变量,那么实现深克隆将非常麻烦。
通过序列化(Serialization)
通过将对象序列化写到流中,再通过反序列化从流中读出对象,可实现深克隆。
但引用类型的成员变量也必须实现Serializable接口。
基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的时通过泛型限定,可以检查除要克隆的对象是否支持序列化,可以由编译器完成。