深克隆、淺克隆

首先建了一個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

可見已經可以用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章