首先建了一個Wallet類
public class Wallet {
private int number;
public Wallet(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
然後建了一個Person類
public class Person implements Cloneable{
private int age;
private Wallet money;
public Person(int age, Wallet money) {
this.age = age;
this.money = money;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Wallet getMoney() {
return money;
}
public void setMoney(Wallet money) {
this.money = money;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
測試代碼
public static void main(String[] args) throws CloneNotSupportedException {
Wallet wallet = new Wallet(100);
Person personA = new Person(20, wallet);
Person personB= (Person) personA.clone();
System.out.println("B的年紀"+personB.getAge());
System.out.println("B的錢數" + personB.getMoney().getNumber());
personB.setAge(50);
personB.getMoney().setNumber(20);
System.out.println("A的年紀"+personA.getAge());
System.out.println("A的錢數" + personA.getMoney().getNumber());
System.out.println("B的年紀"+personB.getAge());
System.out.println("B的錢數" + personB.getMoney().getNumber());
}
輸出:
B的年紀20
B的錢數100
A的年紀20
A的錢數20
B的年紀50
B的錢數20
可見clonePerson的時候,Wallet只是copy了指針,並沒有copy對象,這就是淺克隆。
在Wallet類中直接加入clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
輸出顯示並不能解決問題,依舊是淺克隆。
改一下Person類的clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
Object o = null;
try {
o = (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
((Person) o).money= (Wallet) money.clone();
return o;
}
輸出:
B的年紀20
B的錢數100
A的年紀20
A的錢數100
B的年紀50
B的錢數20
可見已經可以用了