深拷贝与浅拷贝
求关注 求支持
先看代码
class Person implements Cloneable {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Address implements Cloneable {
private String city;
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("City 1");
Person person1 = new Person("John", address);
Person person2 = (Person) person1.clone();
System.out.println("person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("person2: " + person2.getName() + ", " + person2.getAddress().getCity());
person1.getAddress().setCity("City 2");
System.out.println("person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("person2: " + person2.getName() + ", " + person2.getAddress().getCity());
}
}
person1: John, City 1
person2: John, City 1
person1: John, City 2
person2: John, City 2
改变person1为什么会影响到person2呢?
这里把 Person 对象内部的 Address 对象一起克隆
Address address = new Address("City 1");
Person person1 = new Person("John", address);
Person person3 = new Person(person1.getName(), (Address) person1.getAddress().clone());
System.out.println("person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("person3: " + person3.getName() + ", " + person3.getAddress().getCity());
person1.getAddress().setCity("City 2");
System.out.println("person1: " + person1.getName() + ", " + person1.getAddress().getCity());
System.out.println("person3: " + person3.getName() + ", " + person3.getAddress().getCity());
person1: John, City 1
person3: John, City 1
person1: John, City 2
person3: John, City 1
结论