Java通过重写clone()方法是进行浅拷贝。
User u1=new User('Java',16);
User u2=u1.clone();
u2.setName('JavaScript');
浅拷贝(Shallow Copy):
1.对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。
2.对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。
深拷贝
深拷贝不仅要复制对象的所有基本数据类型的成员变量值,还要为所有引用数据类型的成员变量申请存储空间,并复制每个引用数据类型成员变量所引用的对象。应用对象不再是只想同一个对象了。
特殊类型
String类型非常特殊,String类型属于引用数据类型,不属于基本数据类型,但是String类型的数据是存放在常量池中的,是无法修改的。也就是说,当我将name属性从“Java”改为“JavaScript"后,并不是修改了这个数据的值,而是把这个数据的引用从指向”JavaScript“这个常量。
在这种情况下,另一个对象的name属性值仍然指向”Java“不会受到影响。
可利用serializable实现深拷贝。