欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

java深拷貝和淺拷貝的實現(xiàn)

吳曉飛1年前6瀏覽0評論

在Java中,對象的拷貝分為深拷貝和淺拷貝。當(dāng)我們需要復(fù)制一個對象時,無論是深拷貝還是淺拷貝,都需要調(diào)用clone()方法。下面我們來看一下這兩種拷貝的實現(xiàn)。

淺拷貝

淺拷貝就是將一個對象的引用賦值給另一個對象。也就是說,當(dāng)我們修改其中一個對象時,另一個對象也會受到影響。代碼如下:

public class Person implements Cloneable {
private String name;
private Integer age;
private Address address;
//省略setter和getter方法
//實現(xiàn)clone()方法
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Address {
private String province;
private String city;
private String district;
//省略setter和getter方法
//實現(xiàn)clone()方法
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//測試代碼
public static void main(String[] args) throws Exception {
Person person1 = new Person();
person1.setName("張三");
person1.setAge(18);
Address address1 = new Address();
address1.setProvince("廣東省");
address1.setCity("深圳市");
address1.setDistrict("寶安區(qū)");
person1.setAddress(address1);
Person person2 = (Person) person1.clone();
System.out.println(person1.getName() == person2.getName()); // true
System.out.println(person1.getAge() == person2.getAge()); // true
System.out.println(person1.getAddress() == person2.getAddress()); // true
}

從上面的代碼可以看出,當(dāng)我們修改person2的address對象時,person1的address對象也會發(fā)生變化。這就是淺拷貝的特點。

深拷貝

深拷貝就是將一個對象的所有屬性都復(fù)制一份到另一個對象中,包括引用類型的屬性。也就是說,當(dāng)我們修改其中一個對象時,另一個對象不會受到影響。代碼如下:

public class Person implements Cloneable {
private String name;
private Integer age;
private Address address;
//省略setter和getter方法
//實現(xiàn)clone()方法
public Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
person.setAddress((Address) address.clone());
return person;
}
}
public class Address implements Cloneable {
private String province;
private String city;
private String district;
//省略setter和getter方法
//實現(xiàn)clone()方法
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//測試代碼
public static void main(String[] args) throws Exception {
Person person1 = new Person();
person1.setName("張三");
person1.setAge(18);
Address address1 = new Address();
address1.setProvince("廣東省");
address1.setCity("深圳市");
address1.setDistrict("寶安區(qū)");
person1.setAddress(address1);
Person person2 = (Person) person1.clone();
System.out.println(person1.getName() == person2.getName()); // true
System.out.println(person1.getAge() == person2.getAge()); // true
System.out.println(person1.getAddress() == person2.getAddress()); // false
}

從上面的代碼可以看出,當(dāng)我們修改person2的address對象時,person1的address對象不會發(fā)生變化。這就是深拷貝的特點。