深拷贝,浅拷贝,引用拷贝有什么区别?

目录

引用拷贝

浅拷贝

深拷贝

深拷贝,浅拷贝,引用拷贝有什么区别?


引用拷贝

当我们向复制一个对象的时候,自然想到的就是赋值,直接赋值给另外一个变量,这种做法只是赋值了对象的地址,即两个变量现在指向的是同一个对象,任意一个对象操作这个属性都会影响到另外一个变量,这种对同一个对象的操作,不算是真正的复制.

所以引用拷贝并不算是对象的拷贝

一般说对象拷贝其实就是深拷贝与浅拷贝

浅拷贝

浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。

在Java中Object提供了一个Clone方法,与对象拷贝有关,该方法的访问修饰限定符为protected,如果子类不重写该方法并将其声明为public,外部就调用不了对象的克隆方法.

子类在重写时直接调用Object的clone()方法就可以了,是native方法,底层已经实现好对象拷贝的逻辑.

一定要注意子类一定要实现cloneable接口,否则调用clone方法时候就会抛出异常,

此时就会发现两个变量指向的已经是不同的对象,各自改变属性也不会影响另外一个对象.

不过有一个问题,如果拷贝的对象中有属性是引用类型,那这种浅拷贝的方式只会复制该属性的引用地址,也就是拷贝对象和原对象都指向了同一个对象.

如果对这个属性做了一些操作的时候,则会影响到另外一个对象的属性.

如果想要对象中的引用类型属性也进行拷贝,那就需要使用深拷贝了.

深拷贝

  • 深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

克隆出对象之后,我们在对对象的属性进行一次拷贝这样就完成了属性的赋值.

此时对象中的属性也就指向了不同的对象实例

深拷贝,浅拷贝,引用拷贝有什么区别?

三者的区别 :

  • 引用拷贝只是复制对象的地址,并不会创建一个新的对象
  • 浅拷贝会创建一个对象,并进行属性赋值,不过对引用类型的属性只会赋值对象地址
  • 深拷贝则是完全复制了整个对象,包括引用类型的属性

在上面演示的拷贝都是适用clone()方法,在实际开发中不建议使用这个方法,因为他有抛出异常的风险.

如果真想让对象提供拷贝功能的话.可以自己编写其他方法来实现

参考 : 【每天一个技术点】引用拷贝、浅拷贝、深拷贝_哔哩哔哩_bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值