目录
引用拷贝
浅拷贝
深拷贝
深拷贝,浅拷贝,引用拷贝有什么区别?
引用拷贝
当我们向复制一个对象的时候,自然想到的就是赋值,直接赋值给另外一个变量,这种做法只是赋值了对象的地址,即两个变量现在指向的是同一个对象,任意一个对象操作这个属性都会影响到另外一个变量,这种对同一个对象的操作,不算是真正的复制.
所以引用拷贝并不算是对象的拷贝
一般说对象拷贝其实就是深拷贝与浅拷贝
浅拷贝
浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
在Java中Object提供了一个Clone方法,与对象拷贝有关,该方法的访问修饰限定符为protected,如果子类不重写该方法并将其声明为public,外部就调用不了对象的克隆方法.
子类在重写时直接调用Object的clone()方法就可以了,是native方法,底层已经实现好对象拷贝的逻辑.
一定要注意子类一定要实现cloneable接口,否则调用clone方法时候就会抛出异常,
此时就会发现两个变量指向的已经是不同的对象,各自改变属性也不会影响另外一个对象.
不过有一个问题,如果拷贝的对象中有属性是引用类型,那这种浅拷贝的方式只会复制该属性的引用地址,也就是拷贝对象和原对象都指向了同一个对象.
如果对这个属性做了一些操作的时候,则会影响到另外一个对象的属性.
如果想要对象中的引用类型属性也进行拷贝,那就需要使用深拷贝了.
深拷贝
- 深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
克隆出对象之后,我们在对对象的属性进行一次拷贝这样就完成了属性的赋值.
此时对象中的属性也就指向了不同的对象实例
深拷贝,浅拷贝,引用拷贝有什么区别?
三者的区别 :
- 引用拷贝只是复制对象的地址,并不会创建一个新的对象
- 浅拷贝会创建一个对象,并进行属性赋值,不过对引用类型的属性只会赋值对象地址
- 深拷贝则是完全复制了整个对象,包括引用类型的属性
在上面演示的拷贝都是适用clone()方法,在实际开发中不建议使用这个方法,因为他有抛出异常的风险.
如果真想让对象提供拷贝功能的话.可以自己编写其他方法来实现
参考 : 【每天一个技术点】引用拷贝、浅拷贝、深拷贝_哔哩哔哩_bilibili