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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

引用拷贝

浅拷贝

深拷贝

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


引用拷贝

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

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

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

浅拷贝

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

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

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

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

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

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

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

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

深拷贝

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

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

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

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

三者的区别 :

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

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

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

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“深拷贝,浅拷贝,引用拷贝有什么区别?” 的相关文章