java复制
直接赋值赋值
直接赋值,在java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象。因此,当a1变化的时候,a2里面的成员变量也会跟着变化
浅复制
复制引用但不复制引用的对象
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是基础类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象
操作
- 实现Cloneable接口
- 重写Clone方法(必须重写,由于object中是protected的其它地方掉不到)
- 用object的clone方法复制对象,并返回
- 调用对象.clone()方法创建新对象
现象
- 两个对象地址不同
- 对象的基本类型属性值相同
- 对象的引用类型属性地址相同
深复制
深拷贝不仅复制对象本身,而且复制对象包含的引用指向的所以对象
操作
- 实现Cloneable接口(当前类和属性中的引用类型)
- 重写clone方法
- 用object的clone方法复制对象
- 变量当前类里的引用类型,调用指定类型的clone方法
- 生成新对象并返回
- 调用对象.clone()方法创建新对象
现象
- 两个对象地址不同
- 对象的基本类型属性值相同
- 对象的引用类型属性地址不相同
序列化
在java语言里深复制一个对象,常常可以先使对象实现Serializable接口,然后把对象写到一个流里,在从流里读出来,便可以重建对象