浅拷贝和深拷贝的区别

浅拷贝

定义:将对象的引用复制了一份,即两个不同的引用指向了同一个内存地址,那么在改变任一个引用的值都是在改变这个内存地址的所存储的值,因为它们作用的对象是同一个内存地址,所以两个变量的值都会改变。
代码如下:

        Student student=new Student("张三",20);
        Student student1=student;
        System.out.println(student);  //张三 20
        System.out.println(student1);  //张三  20

运行结果:

Student@1540e19d
Student@1540e19d

上述代码中student和student1的内存地址是同一个,现在修改student1的姓名,代码如下:

        student1.setName("王五");
        System.out.println(student);  //王五  20
        System.out.println(student1);  //王五  20

我们可以看到,浅拷贝作用的是同一个内存地址。

深拷贝

clone方法:在Java中是用clone()方法实现深拷贝的,除了对象本身被复制外,对象所包含的所有成员变量也将复制。这里需要注意,clone方法在Object类中的修饰符是protected修饰的,所以Student类需要实现Cloneable接口,然后重写clone方法。
代码如下:

        Student student=new Student("张三",20);
        Student student1 = (Student)student.clone();
        System.out.println(student);  //张三  20
        System.out.println(student1);  //张三  20

运行结果:

Student@4554617c
Student@74a14482

我们可以发现用clone方法创建的对象才是新开辟了一个空间。

问题探讨

上述深拷贝的代码中student和student1中的姓名属性和年龄属性是深拷贝还是浅拷贝?
由于判断是深拷贝还是浅拷贝,我们只需要判断内存地址是否相同即可,于是我们可以这样验证。
代码如下:

        Student student=new Student("张三",20);
        Student student1 = (Student)student.clone();
        System.out.println(student);
        System.out.println(student1);

        String s=student.getName()==student1.getName()?"浅拷贝":"深拷贝";
        System.out.println(s);

        String s1=student.getAge()==student1.getAge()?"浅拷贝":"深拷贝";
        System.out.println(s1);

运行结果:

Student@4554617c
Student@74a14482
浅拷贝
浅拷贝

说明姓名和年龄属性指向的是同一个内存地址,只不过引用不同,那么我们怎样才可以实现姓名和年龄的引用不同,同时内存地址也不同的深拷贝呢?这个问题下期解答。谢谢观看!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值