最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java深拷貝,淺拷貝和Cloneable接口

 更新時間:2022年08月21日 14:35:49   作者:XIN-XIANG榮  
這篇文章主要為大家詳細介紹了Java中Cloneable接口以及深拷貝與淺拷貝的相關(guān)知識,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. Cloneable接口的介紹

Cloneable是標記型的接口(空接口),它們內(nèi)部都沒有方法和屬性,實現(xiàn) Cloneable來表示該對象能被克隆,能使用Object.clone()方法。如果沒有實現(xiàn) Cloneable的類對象調(diào)用clone()就會拋出CloneNotSupportedException異常。

可以理解為Cloneable接口發(fā)揮的是標記功能,自定義類型需要用戶自己標記出哪些類是可以clone的,這個標記就是去實現(xiàn)Cloneable接口,實現(xiàn)了Cloneable接口后就表明該類創(chuàng)建的對象可以被克隆。

而要想使一個類具備拷貝實例的功能,除了要實現(xiàn)Cloneable接口,還必須重寫Object類的clone()方法。

可以看到Object類的clone()方法是被protected修飾的,所以需要在重寫的clone()方法中通過super關(guān)鍵字去調(diào)用Object類中的clone()方法

2. 淺拷貝的介紹和實例

在拷貝一個對象時,對 對象的基本數(shù)據(jù)類型的成員變量進行拷貝,但對引用類型的成員變量只進行引用的傳遞,并沒有創(chuàng)建一個新的對象,當對引用類型的內(nèi)容修改會影響被拷貝的對象。簡而言之:淺拷貝僅僅復(fù)制所拷貝的對象,而不復(fù)制它所引用的對象。

觀察下面的代碼,將Money類的實例作為了Person類的字段,new一個Person類的對象person1,將這個person1對象拷貝到person2中,這里的拷貝就是淺拷貝了,只是將person1對象的money引用拷貝到了person2,person1和person2中的momey指向的是同一個對象。

class Money {
    public double m = 666;
}
class Person implements Cloneable{
    int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class TestDemo3 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通過person2修改前的結(jié)果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通過person2修改后的結(jié)果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

執(zhí)行結(jié)果:

淺拷貝圖解:

3. 深拷貝的介紹和實例

在拷貝一個對象時,除了對基本數(shù)據(jù)類型的成員變量進行拷貝,對引用類型的成員變量進行拷貝時,創(chuàng)建一個新的對象來保存引用類型的成員變量。簡而言之:深拷貝把要復(fù)制的對象所引用的對象都復(fù)制了一遍。

下面的代碼實現(xiàn)了深拷貝;實現(xiàn)person1對象的深拷貝,先用Person tmp引用來保存淺拷貝的結(jié)果,通過tmp引用找到money對象,再將money對象拷貝一份,然后賦值給tmp中的money,最后返回tmp即可。這樣就將money引用的對象也拷貝了一份,實現(xiàn)了深拷貝,此時person1和person2中的momey指向的是兩個不同的對象。

class Money implements Cloneable{
    public double m = 666;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

class Person implements Cloneable{
    public int id;
    public Money money = new Money();

    public Person(int id) {
        this.id = id;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //return super.clone();
        Person tmp = (Person) super.clone();
        tmp.money = (Money) this.money.clone();
        return tmp;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", money=" + money.m +
                '}';
    }
}
public class Test2 {
    public static void main(String[] args) throws CloneNotSupportedException{
        Person person1 = new Person(1);
        Person person2 = (Person) person1.clone();

        System.out.println("通過person2修改前的結(jié)果");
        System.out.println(person1);
        System.out.println(person2);

        person2.money.m = 888;
        person2.id = 2;
        System.out.println("通過person2修改后的結(jié)果");
        System.out.println(person1);
        System.out.println(person2);
    }
}

執(zhí)行結(jié)果:

深拷貝圖解:

4. clone方法總結(jié)

java中clone方法是一個淺拷貝,引用類型依然在傳遞引用。我們可以通過繼續(xù)調(diào)用clone()方法,對 該對象的引用類型變量再實現(xiàn)一次clone()的方法來實現(xiàn)深拷貝。

到此這篇關(guān)于詳解Java深拷貝,淺拷貝和Cloneable接口的文章就介紹到這了,更多相關(guān)Java Cloneable接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

古蔺县| 临洮县| 桂林市| 远安县| 察隅县| 定日县| 和平县| 孟津县| 高阳县| 威海市| 靖江市| 吴川市| 兴宁市| 霸州市| 锦屏县| 大余县| 资源县| 中江县| 万山特区| 望都县| 含山县| 凤阳县| 阿瓦提县| 新邵县| 荆门市| 集安市| 辽宁省| 汤阴县| 杨浦区| 德庆县| 东宁县| 孟村| 松原市| 安岳县| 涡阳县| 木里| 阿克苏市| 仁寿县| 保亭| 西盟| 平乐县|