在学习原型模式时,发现对浅克隆和克隆的理解不深刻,在此记录下学习心得
概念理解:
x.clone()!=x, 浅拷贝和深拷贝对属性的拷贝,如下表
基本类型属性 | 引用类型属性 | 引用类型备注 | |
浅拷贝 | 拷贝值 | 拷贝引用,指向原引用的地址 | 如果修改引用的属性,都会影响另外一个对像 |
深拷贝 | 拷贝值 | 拷贝引用和引用的内容,并创建新的实例,指向新的地址 | 可以理解,创建一个新的对象,把原对象的内容复制到新对象中 |
代码解析
有一个Husband类
public class Husband {public int age; public Husband(int age){this.age = age; } public Husband(Husband p){ //拷贝构造方法this.age = p.age; }
还有一个Wife类
public class Wife { Husband husband; public Wife(Husband Husband){ this.husband = Husband; } public Wife(Wife wife){ //拷贝构造方法 this(wife.husband); }
测试是在Wife类进行, 执行拷贝Wife,和Husband
Husband h = new Husband(24) Wife f1 = new Wife(h); Wife f2 = new Wife(f1);
System.out.println(f1); //两者打印的地址是不一样的,因为是new的 System.out.println(f2); System.out.println(f1.husband); //两者打印引用类型属性的的地址是一样的 System.out.println(f2.husband);
浅拷贝,传递的是引用, 如下图:
执行,修改引用类型属性的内容的语句
f2.husband.age = 25; //修改属性 System.out.println(f2.husband.age); //两者输出的都是25 System.out.println(f1.husband.age);
当修改引用类型的属性时,另一个对象也会受影响, 如下图
执行改变引用类型属性的语句
f2.husband = new Husband(f1.husband);//new就会创建新的对象,两个对象的地址不一样,但是内容一样 System.out.println(f1.husband); //两者输出的结果是不一样的 System.out.println(f2.husband);
创建一个新的Husband,指向新的地址,并复制原实例的内容,如下图