Java中的对象拷贝指将一个对象的所有属性拷贝到另一个同类的对象中。
Java中的对象拷贝主要分为深拷贝、浅拷贝、延迟拷贝
浅拷贝
1.对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,将该属性值复制一份给新的对象。此时,对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据;
2.对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,只将该成员变量的内存地址复制一份给新的对象。因此两个对象的该成员变量其实都指向同一个实例,在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值
模型图中field1是基本数据类型的成员变量,CopiedObject对其值创建了新的拷贝field2;而对于引用数据类型的成员变量refObj,两个对象的该成员变量都指向同一个实例。
此时若修改filed1的值,field2 不会随之改变;但refObj的值的改变,会同时影响两个对象
深拷贝
1.对于数据类型是基本数据类型的成员变量,与浅拷贝一样,直接将属性值复制一份给新对象
2.深拷贝要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象,直到该对象可达的所有对象;因此深拷贝相比于浅拷贝速度较慢并且花销较大
模型图中,CopiedObject复制了所有的成员变量,此时改变refObj1或field1的值都不会对refObj2和field2产生影响