淺拷貝和深拷貝

clone方法

clone是定義一個(gè)Object類下基本方法之一:

    protected native Object clone() throws CloneNotSupportedException;

使用的時(shí)候需要繼承object對(duì)象,并且為了可以使其它類調(diào)用該方法,覆寫克隆方法時(shí)必須將其作用域設(shè)置為public.

淺拷貝

淺拷貝就拷貝了對(duì)象本身,屬性值不變,也就是說(shuō)對(duì)象里面的引用還是原來(lái)對(duì)象里面的引用

class A implements Cloneable {
    int a = 0;
    int[] b = {1, 2};

    @Override
    protected Object clone() throws CloneNotSupportedException {
        A a = null;
        try {
            a = (A) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return a;
    }
}

測(cè)試一下

A a = new A();
A b = (A) a.clone();
System.out.println(b.a);
for (int i :b.b) {
    System.out.print(i);
}
b.a = 1;
b.b[0] = 3;
b.b[1] = 4;
System.out.println(a.a);
for (int i :a.b) {
    System.out.print(i);
}
測(cè)試結(jié)果是:    
        0  1,2
        0  3,4

因?yàn)閍是基本類型所以值不變,但是b是引用類型,所以值也被改變了

深拷貝

和淺拷貝就一些細(xì)微區(qū)別,深拷貝是把對(duì)象中的屬性也進(jìn)行了一個(gè)拷貝

class A implements Cloneable {
    int a = 0;
    int[] b = {1, 2};

    @Override
    protected Object clone() throws CloneNotSupportedException {
        A a = null;
        try {
            a = (A) super.clone();
            // 對(duì)屬性進(jìn)克隆
            a.b = b.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return a;
    }
}
測(cè)試結(jié)果是:    
        0  1,2
        0  1,2

循環(huán)引用

如果類中的對(duì)象引用了其他的對(duì)象,那么一次次去clone顯然不現(xiàn)實(shí)

借助java的序列化,A需要實(shí)現(xiàn)序列化接口,而且A中使用的所有對(duì)象都要實(shí)現(xiàn)序列化接口,否則會(huì)拋出NotSerializableException異常

    @Override
    protected Object clone() throws CloneNotSupportedException {
    A a = null;
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        a = (A) ois.readObject();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    
    return a;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 首先需要明白,淺拷貝和深拷貝都是針對(duì)一個(gè)已有對(duì)象的操作。那先來(lái)看看淺拷貝和深拷貝的概念。 在 Java 中,除了基...
    IN_BLACK_IN閱讀 387評(píng)論 0 2
  • 面試的時(shí)候,經(jīng)常會(huì)被問(wèn)到j(luò)s的淺拷貝和深拷貝問(wèn)題,很多時(shí)候能夠想清楚是怎么回事,但是實(shí)在描述不出來(lái),可能還是自己比...
    肆意咯咯咯閱讀 402評(píng)論 0 3
  • 一、淺拷貝和深拷貝的定義關(guān)于淺拷貝和深拷貝是如何定義的,可能不同的人有不同的理解。據(jù)我了解(不知道有沒(méi)有偏差),蘋...
    大浪捉魚閱讀 1,022評(píng)論 0 2
  • 1、javaScript的變量類型 (1)基本類型:5種基本數(shù)據(jù)類型Undefined、Null、Boolean、...
    wengjq閱讀 870評(píng)論 0 15
  • 想起有個(gè)汽車廣告說(shuō)的,別趕路,去感受路。人類放眼未來(lái),總覺(jué)得人生路長(zhǎng)漫漫,但回顧人生的時(shí)候,又覺(jué)得時(shí)間過(guò)得是...
    駱亞雄閱讀 370評(píng)論 0 0

友情鏈接更多精彩內(nèi)容