浅拷贝和深拷贝

时间:2021-04-11 19:54:44

在学习原型模式时,发现对浅克隆和克隆的理解不深刻,在此记录下学习心得

概念理解:

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,指向新的地址,并复制原实例的内容,如下图

浅拷贝和深拷贝