首頁  >  文章  >  Java  >  Java克隆的淺析(程式碼範例)

Java克隆的淺析(程式碼範例)

不言
不言轉載
2019-03-12 15:36:412531瀏覽

這篇文章帶給大家的內容是關於Java克隆的淺析(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

何謂深淺?程度而已。

複製:複製一份

被複製的類別實作Cloneable接口,覆蓋clone()方法,返回呼叫父類別的clone()即可。

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
    //...省略其余代码
}

然後,克隆時只須呼叫我們剛剛覆蓋的clone()。

淺拷貝

現在有Child類別:

public class Child{
    //...省略其余代码
}

還有Person類別:

public class Person implements Cloneable{
    private int age;
    private String name;
    private Child child;
    //...省略其余代码
}

複製Person物件p1賦給p2,然後我們來看看他們的toString()和hashCode()結果:

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person("zhangsan",23);
        p1.setChild(new Child("xiaoming", 1););
        //克隆操作
        Person p2 = p1.clone();
        //打印看看
        System.out.println(p1+", "+p1.hashCode()+", "+p1.getChild().hashCode());
        System.out.println(p2+", "+p2.hashCode()+", "+p2.getChild().hashCode());
    }
}

#輸出:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1550089733

結論:p1,p2成員的值相等,但它們是兩個不同的對象,他們的Child成員是同一個對象。

深拷貝

給Child也實作Cloneable介面並覆寫clone():

public class Child implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();;
    }
    //...省略其余代码
}

然後,改變Person類的clone()的實作:

public class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person)super.clone();
        p.setChild((Child)child.clone());
        return p;
    }
     //...省略其余代码
}

然後再呼叫上面的main(String [] args),結果是:

Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=1]], 118352462, 1550089733
Person [age=23, name=zhangsan, value=666, child=Child [name=xiaoming, age=2]], 865113938, 1442407170

結論:p1,p2是兩個不同的對象,他們的Child成員也是兩個不同的對象。

總結

複製就是複製一份。

淺拷貝就是簡單複製值,如果有引用成員,他們的引用成員將是同一個對象,深拷貝則不為然。

為什麼呢

可以這樣認為,呼叫誰的clone()就是對誰深拷貝。

在上面淺拷貝的例子中,因為呼叫了p1物件的clone(),所以p1和p2是兩個不同的物件(對p1,p2本身深拷貝);在深拷貝的例子中,不但呼叫了p1的clone(),也呼叫Child類型物件的clone(),所以兩個Child類型物件不同(對所有物件深拷貝)。


以上是Java克隆的淺析(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除