Object对象有个clone()方法,实现了对象中各个属性的复制.
实现步骤
- 实现Cloneable接口,这是一个标记接口,自身没有方法
- 覆盖clone()方法,可见性提升为public
这里说一下为什么要重写clone方法,并且提升为public类型
如果不重写,由于Object的clone()方法时protected修饰的,在不同包下别的类即使使用目标类的对象也不能访问目标类继承的clone()方法,只能在目标类内部使用,局限性大。
实现

测试

遇到点麻烦,我们之修改了克隆对象的地址,发现原来对象的地址也被改变了,这就涉及到了clone的浅拷贝和深拷贝。
浅拷贝和深拷贝
clone()方法默认浅拷贝,即基本数据类型+常用类型(日期,字符串),拷贝一份,修改克隆对象,不影响原对象。
但是对象类型的属性,拷贝的是引用(地址),它是两个对象共用的,所以修改克隆对象影响原对象。
如果想实现深拷贝,我们可以让属性对应的实体类同样实现Cloneable接口,重写clone()方法。


再次测试发现克隆对象的属性,原对象的属性不会发生变化,深克隆实现成功!
