参考:https://juejin.im/entry/5bafa3d66fb9a05cff322691
总结:
1、如果想要支持clone,就需要实现Cloneable 接口
2、如果没有实现Cloneable接口的调用clone方法,会抛出CloneNotSupportedException异常。
3、重写clone方法,并修改成public访问级别
深拷贝:
1、使用默认的clone方法
2、对于原始数据域进行值拷贝
3、对于引用类型仅拷贝引用
4、执行快,效率高
5、不能做到数据的100%分离。
6、如果一个对象只包含原始数据域或者不可变对象域,推荐使用浅拷贝。
浅拷贝:
1、需要重写clone方法,不仅仅只调用父类的方法,还需调用属性的clone方法
2、做到了原对象与克隆对象之间100%数据分离
3、如果是对象存在引用类型的属性,建议使用深拷贝
4、深拷贝比浅拷贝要更加耗时,效率更低
深拷贝实现方式:
//深度拷贝
public Object deepClone() throws Exception{
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
序列化是将对象写到流中便于传输,而反序列化则是把对象从流中读取出来。这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。
注意每个需要序列化的类都要实现 Serializable 接口,如果有某个属性不需要序列化,可以将其声明为 transient,即将其排除在克隆属性之外。
因为序列化产生的是两个完全独立的对象,所有无论嵌套多少个引用类型,序列化都是能实现深拷贝的。
网友评论