java 浅拷贝和深拷贝

1、直接赋值

好下面我们先看第一种方式,直接赋值。在Java中,A a1 = a2,我们需要理解的是这实际上复制的是引用,也就是说a1和a2指向的是同一个对象。因此,当a1变化的时候,a2里面的成员变量也会跟着变化。

2、浅拷贝

实现浅拷贝的是Object的Clone()函数,创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,即该字段引用的一个对象,或者理解为java中的一个类,则复制引用但不复制引用的对象,即是复制了一个引用对象的方式,但是没有复制对象,就是说只是复制了一个引用方式,而这个对象改变的时候,引用这个对象的取得值都会发生变化。如下图所示:

java 浅拷贝和深拷贝

3、深拷贝

其实出现问题的关键就在于clone()方法上,我们知道该clone()方法是使用Object类的clone()方法,但是该方法存在一个缺陷,它并不会将对象的所有属性全部拷贝过来,而是有选择性的拷贝,基本规则如下:

      1、 基本类型

         如果变量是基本很类型,则拷贝其值,比如int、float等。

      2、 对象

         如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。

      3、 String字符串

         若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有紫都城对象保持不变。

参考:https://www.cnblogs.com/qlky/p/7348353.html

https://zhuanlan.zhihu.com/p/30320149