浅拷贝(Shallow Copy):
浅拷贝是指创建一个新对象,然后将原对象的字段值复制到新对象中。但是,对于对象中的引用类型字段,浅拷贝只是复制了引用,而不是创建原对象中引用对象的副本。
class Person implements Cloneable {
private String name;
private Address address;
// 构造函数和其他方法省略
// Getter和Setter省略
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address {
private String city;
private String zipCode;
// 构造函数和其他方法省略
// Getter和Setter省略
}
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("City1", "12345");
Person person1 = new Person("John", address);
// 浅拷贝
Person person2 = (Person) person1.clone();
// 修改原对象的引用类型字段
person1.getAddress().setCity("City2");
System.out.println("Person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("Person2: " + person2.getName() + ", " + person2.getAddress().getCity());
}
}
深拷贝(Deep Copy):
深拷贝是指创建一个新对象,然后递归地复制原对象的所有字段,包括引用类型字段指向的对象。这样,即使原对象中存在引用类型字段,新对象中也会有该字段的全新副本。
class DeepCopyAddress {
private String city;
private String zipCode;
// 构造函数和其他方法省略
// Getter和Setter省略
@Override
protected Object clone() throws CloneNotSupportedException {
DeepCopyAddress copy = (DeepCopyAddress) super.clone();
// 对于引用类型字段,需要递归地进行深拷贝
// 这里假设Address类也实现了Cloneable接口
copy.city = new String(this.city);
copy.zipCode = new String(this.zipCode);
return copy;
}
}
class DeepCopyPerson implements Cloneable {
private String name;
private DeepCopyAddress address;
// 构造函数和其他方法省略
// Getter和Setter省略
@Override
public Object clone() throws CloneNotSupportedException {
DeepCopyPerson copy = (DeepCopyPerson) super.clone();
// 对于引用类型字段,需要递归地进行深拷贝
// 这里假设DeepCopyAddress类也实现了Cloneable接口
copy.address = (DeepCopyAddress) this.address.clone();
return copy;
}
}
public class DeepCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
DeepCopyAddress address = new DeepCopyAddress("City1", "12345");
DeepCopyPerson person1 = new DeepCopyPerson("John", address);
// 深拷贝
DeepCopyPerson person2 = (DeepCopyPerson) person1.clone();
// 修改原对象的引用类型字段
person1.getAddress().setCity("City2");
System.out.println("Person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("Person2: " + person2.getName() + ", " + person2.getAddress().getCity());
}
}