中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java深拷貝,淺拷貝和Cloneable接口怎么用

發布時間:2022-08-24 11:09:09 來源:億速云 閱讀:151 作者:iii 欄目:開發技術

這篇文章主要介紹“Java深拷貝,淺拷貝和Cloneable接口怎么用”,在日常操作中,相信很多人在Java深拷貝,淺拷貝和Cloneable接口怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java深拷貝,淺拷貝和Cloneable接口怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. Cloneable接口的介紹

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

Java深拷貝,淺拷貝和Cloneable接口怎么用

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

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

Java深拷貝,淺拷貝和Cloneable接口怎么用

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

Java深拷貝,淺拷貝和Cloneable接口怎么用

2. 淺拷貝的介紹和實例

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

觀察下面的代碼,將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修改前的結果");
        System.out.println(person1);
        System.out.println(person2);

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

執行結果:

Java深拷貝,淺拷貝和Cloneable接口怎么用

淺拷貝圖解:

Java深拷貝,淺拷貝和Cloneable接口怎么用

3. 深拷貝的介紹和實例

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

下面的代碼實現了深拷貝;實現person1對象的深拷貝,先用Person tmp引用來保存淺拷貝的結果,通過tmp引用找到money對象,再將money對象拷貝一份,然后賦值給tmp中的money,最后返回tmp即可。這樣就將money引用的對象也拷貝了一份,實現了深拷貝,此時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修改前的結果");
        System.out.println(person1);
        System.out.println(person2);

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

執行結果:

Java深拷貝,淺拷貝和Cloneable接口怎么用

深拷貝圖解:

Java深拷貝,淺拷貝和Cloneable接口怎么用

4. clone方法總結

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

到此,關于“Java深拷貝,淺拷貝和Cloneable接口怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红原县| 筠连县| 叶城县| 平潭县| 盐津县| 宜良县| 遵义县| 云南省| 宿州市| 濉溪县| 张家港市| 南和县| 岚皋县| 理塘县| 广州市| 乌拉特中旗| 武清区| 惠安县| 石河子市| 嘉定区| 额敏县| 永宁县| 汪清县| 抚州市| 鄂州市| 南部县| 营山县| 苍梧县| 方城县| 东源县| 泌阳县| 衡阳县| 东台市| 友谊县| 永平县| 三亚市| 安塞县| 安顺市| 博野县| 安新县| 资兴市|