为什么要克隆?
直接new一个对象不行吗?
对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值
如果想创建一个与当前状态相同的对象,大概有三种方式:
- 先new一个,然后按属性一个一个赋值
- 先new一个对象b,再让b指向原来的a对象。这种是复制了引用,实际上内存中还是只有一个对象。
- clone。两个对象独立存在。并且是native方法,效率高。分为浅克隆与深克隆(浅克隆与第二种没区别)
浅克隆(浅拷贝、浅复制)
效果:如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,就是引用地址的复制,修改一个另一个会被改变。
注意:如果是Sting这种final引用类型,修改克隆后的变量,原对象不会被改变。 Sting是特例
实现方法:实现Cloneable接口并重写Object类中的clone()方法;
深克隆(深拷贝、深复制)
效果:深拷贝是一种完全拷贝,无论是值类型还是引用类型都会完完全全的拷贝一份,在内存中生成一个新的对象,两个对象修改其中任意的值另一个值不会改变。
实现方法:
- 实现Cloneable接口并重写Object类中的clone()方法(要求引用对象也实现 Cloneable 接口)
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆
zhuanlan.zhihu.com/p/95686213 blog.nowcoder.net/n/96b0de4a4…