浅拷贝和深拷贝

浅拷贝

定义:

创建一个新对象,这个新对象有着原始对象所包含的属性值的一份拷贝。如果属性值是基本数据类型,那么在新对象和原始对象之间会创建一个真正的副本。如果属性值是引用数据类型,那么在新对象和原始对象之间会创建一个指向同一个对象的引用

修改了内部对象,原始对象的内容也跟着改变——浅拷贝

如何实现拷贝

进行拷贝需要调用Object类中的clone()方法

在调用的时候我们有一些注意事项

当我们去直接调用clone()方法时,会报错
在这里插入图片描述
我们需要在Student类中实现Cloneable接口
重写Object类中的clone方法

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

返回值时Object类型
在这里插入图片描述
需要强转成子类类型
在这里插入图片描述
还会报错
在这里插入图片描述

还需要再main方法中和clone方法的提供的方法保持一致
即函数后面加上throws CloneNotSupportedException 表示这是支持克隆的
在这里插入图片描述
这就实现了拷贝

验证浅拷贝

我们在创建一个Number类(属性值是引用类型)

public class Number {
    public double num=9.9;

    public Number() {
    }
    public Number(double num) {
        this.num = num;
    }
}

再已经创建好的Student类中添加number属性

public class Student implements Cloneable{
    private String name;
    private int age;
    Number number=new Number();
   //省略了构造方法和空参构造
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

打印不同对象修改前的num和修改后的num

        System.out.println("修改前stu:"+stu.number.num);
        System.out.println("修改前stu2:"+stu2.number.num);
        stu2.number.num=9.99;
        System.out.println("修改后stu:"+stu.number.num);
        System.out.println("修改后stu2:"+stu2.number.num);

在这里插入图片描述

内存图

在这里插入图片描述
由于只拷贝了Student类中的name和age属性,没有拷贝num

深拷贝

定义:

创建一个新对象,并递归地复制原始对象中包含的所有属性值。在这种情况下,如果属性值是引用数据类型,那么在新对象和原始对象之间会创建一个真正的副本

修改了内部对象,原始对象保持不变——深拷贝
也就是把num克隆一份

实现

在Number类中实现Cloneable并重写clone方法

public class Number implements Cloneable {
    public double num=9.9;
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

在Student类中调用Number中的clone方法
注意:this是调用者的地址

    protected Object clone() throws CloneNotSupportedException {
       	Student tmp =(Student)super.clone();
        tmp.number=(Number)this.number.clone();
        return tmp;
    }

打印结果
在这里插入图片描述

内存图

在这里插入图片描述

总结

了解了深拷贝和浅拷贝的区别,并学会用内存图分析代码
❤️❤️请添加图片描述❤️❤️

  • 56
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值