clone-java

浅克隆

在浅克隆中, 如果原型对象的成员变量是值类型, 将复制一份给克隆对象; 如果原型对象的地址复制一份给克隆对象, 也就是说原型对象和克隆对象的成员变量指向相同的内存地址.

简单来说, 在浅克隆中, 当对象被复制时只复制它本身和其中包含的值类型的成员变量, 而引用类型的成员对象并没有被复制.

在java语言中, 通过覆盖object类的clone()方法可以实现浅克隆

深克隆

在深克隆中, 无论原型对象的成员变量是值类型还是引用类型, 将复制一份给克隆对象, 深克隆将原型对象的所有引用对象也复制一份给克隆对象.

简单来说, 在深克隆中, 除了对象本身被复制外, 对象所半酣的所有成员变量也将复制.

在Java语言中, 如果需要实现深克隆, 可以通过覆盖Object类的clone()方法实现, 也可以通过序列化(serialization)等方式来实现

如果引用类型里面还包含很多引用类型, 或者内层引用类型的类里面又包含引用类型, 实用clone方法就会很麻烦. 这时我们可以用反序列的方式来实现对象的深克隆.

序列化就是将对象写到流的过程, 写到流中的对象是原有对象的一个拷贝, 而原对象仍然存在于内存中. 通过序列化实现的拷贝不仅可以复制对象本身, 而且可以复制其引用的成员对象, 因此通过序列化将对象写到一个流中, 再从流里将其读出来, 可以实现深克隆. 需要注意的是能够实现序列化的对象其类必须实现serializable接口, 否则无法实现序列化操作

java语言提供的Cloneable接口和serializable接口的代码非常简单, 它们都是空接口, 这种空接口也成为表示接口, 表示接口中没有任何方法的定义, 其作用是告诉jre这些接口的实现类是否具有某个功能, 如是否支持克隆, 是否支持序列化等.