java中對象的賦值是經過對象的引用的形式進行賦值。java
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' + ", age=" + age + '}'; } } 複製代碼
@Test
public void testSimpleDemo(){
Person p1 = new Person();
p1.setName("tom");
p1.setAge(21);
Person p2 = p1;
System.out.println(p1); //Person{name='tom', age=21}
System.out.println(p2); //Person{name='tom', age=21}
System.out.println(p1 == p2); //true
}
複製代碼
Cloneable
接口clone
方法public class Person implements Cloneable {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' + ", age=" + age + '}'; } } 複製代碼
@Test
public void testShallowClone() throws CloneNotSupportedException {
Person p1 = new Person();
p1.setName("tom");
p1.setAge(21);
Person p2 = (Person) p1.clone();
System.out.println(p1); //Person{name='tom', age=21}
System.out.println(p2); //Person{name='tom', age=21}
System.out.println(p1 == p2); //false
}
複製代碼
注意:若是實體類中添加了引用類型的對象bash
public class Address {
private String type;
private String name;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Address{" +
"type='" + type + '\'' + ", name='" + name + '\'' + '}'; } } 複製代碼
public class Person implements Cloneable {
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } } 複製代碼
@Test
public void testShallowClone() throws CloneNotSupportedException {
Address address = new Address();
address.setType("home");
address.setName("北京");
Person p1 = new Person();
p1.setName("tom");
p1.setAge(21);
p1.setAddress(address);
Person p2 = (Person) p1.clone();
p2.getAddress().setType("office");
System.out.println(p1); //Person{name='tom', age=21, address=Address{type='office', name='北京'}}
System.out.println(p2); //Person{name='tom', age=21, address=Address{type='office', name='北京'}}
System.out.println(p1 == p2); //false
}
複製代碼
這裏就發現了問題,我只在p2對象中將type
屬性修改成office
,但是p1也跟着改變了,該如何解決呢?ide
要解決問題首先要知道深拷貝和淺拷貝是什麼學習
若是隻是實現基本類型的賦值,只須要實現Cloneable
接口便可,可是若是是引用類型的話就須要將這些對象都實現Cloneable
接口並重寫clone
方法。測試
步驟:ui
Address
類實現Cloneable
接口,並重寫clone
方法Person
類中重寫clone
方法public class Person implements Cloneable {
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
Address address = ((Person) obj).getAddress();
((Person) obj).setAddress((Address) address.clone());
return obj;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } } 複製代碼
@Test
public void testShallowClone() throws CloneNotSupportedException {
Address address = new Address();
address.setType("home");
address.setName("北京");
Person p1 = new Person();
p1.setName("tom");
p1.setAge(21);
p1.setAddress(address);
Person p2 = (Person) p1.clone();
p2.getAddress().setType("office");
System.out.println(p1); //Person{name='tom', age=21, address=Address{type='home', name='北京'}}
System.out.println(p2); //Person{name='tom', age=21, address=Address{type='office', name='北京'}}
System.out.println(p1 == p2); //false
}
複製代碼
這樣便解決了clone引用類型的問題this
做者學習自 blog.csdn.net/qq_33314107… 文中若有錯誤望加以指正。spa