浅拷贝的问题:
常规认识:拷贝是两个对象 不管修改哪个对象的内容,都不会影响另外一个对象的内容
但若是这个类中有一个是自定义的类则和预期结果不一样(基本数据类型可以达到完全复制,应用数据类型则不可以)
例子:
public class QianClone implements Cloneable {
private String id;
private String name;
private QianCloneObj obj;
public static void main(String[] args) throws CloneNotSupportedException {
QianClone qianClone=new QianClone();
qianClone.setId("1");
qianClone.setName("name");
QianCloneObj obj=new QianCloneObj();
obj.setId("obj");
qianClone.setObj(obj);
//源对象
System.out.println(qianClone);
Object clone = qianClone.clone();
//克隆后对象
System.out.println(clone);
//改变自定义引用类型的值结果为
qianClone.getObj().setId("obj1");
//源对象
System.out.println(qianClone);
//克隆后对象
System.out.println(clone);
}
//改变了其中的一个对象的自定义对象属性,会改变复制出来的对象的对象,
输出结果为:
QianClone{id='1', name='name', obj=QianCloneObj{id='obj'}}
QianClone{id='1', name='name', obj=QianCloneObj{id='obj'}}
QianClone{id='1', name='name', obj=QianCloneObj{id='obj1'}}
QianClone{id='1', name='name', obj=QianCloneObj{id='obj1'}}
深拷贝:
要解决浅拷贝这种情况,就出现了深拷贝的这样的改进措施。
主要解决方式:需要充写clone()方法,手动set进去自定义的引用类型
改写clone()方法