Java的对象拷贝是指实现了Cloneable接口的对象调用clone()方法来创建新的对象的方式。
该函数会创建该类的新实例,并初始化所有属性对象。属性对象本身并不会自动调用 ,因此此方法实现的是浅拷贝而不是深拷贝。
因此我们可以了解到,浅拷贝将返回该类的新的实例,该实例的引用类型对象共享。
拷贝也会返回该类的新的实例,但是该实例的引用类型属性也是拷贝的新对象。
浅拷贝和深拷贝的主要区别在于对于引用类型是否共享。
如何实现深拷贝呢?
方法1:手动实现,重写clone方法的实现
@Data
public class Dog implements Cloneable{
public String spice;
public Address address;
public Dog clone() throws CloneNotSupportedException {
Dog dog=(Dog) super.clone();
dog.setAddress(new Address(dog.getAddress().getName()));
return dog;
}
}
此时生成的对象内部的引用对象是新生成的对象
@Test
public void testClone() throws CloneNotSupportedException {
Dog dog=new Dog();
dog.setSpice("wang");
dog.setAddress(new Address("beijing"));
Dog dog1=dog.clone();
//false
System.out.println(dog.address==dog1.address);
}
方法2:利用序列化和反序列化的方式来生成新对象
@Data
public class Dog implements Cloneable{
public String spice;
public Address address;
public Dog clone() throws CloneNotSupportedException {
Dog dog=(Dog) super.clone();
String json= JSON.toJSONString(dog);
Dog dog1=JSON.parseObject(json,Dog.class);
return dog1;
}
}