clone的深拷貝與淺拷貝

2021-10-08 16:45:52 字數 1682 閱讀 8033

想要了解淺拷貝和深拷貝之前,要了解的是值傳遞和引用傳遞。

值傳遞:傳遞的是變數的值,對該值進行修改不會影響原來變數的值

引用傳遞:傳遞的是變數的在堆中的引用,修改其值,會影響實際變數

這裡只是簡單的介紹,想要詳細了解的話,建議檢視其他部落格

知道了值傳遞和引用傳遞就可以來了解淺拷貝和深拷貝了

淺拷貝:基本型別拷貝的是值,引用型別拷貝的是引用

深拷貝:基本型別拷貝的是值,引用型別拷貝的也是值

用具體的例子來展示淺拷貝和深拷貝,重寫clone方法需要實現cloneable標識介面,標識該類是可以拷貝的,不然拷貝時會報錯

首先申明兩個類

boy類

package clone;

public

class

boyimplements

cloneable

public

boy(

)public

boy(girl girl, string name,

int age)

public girl getgirl()

public

void

setgirl

(girl girl)

public string getname()

public

void

setname

(string name)

public

intgetage()

public

void

setage

(int age)

@override

protected object clone()

throws clonenotsupportedexception

}

girl類

package clone;

public

class

girl

implements

cloneable

public

girl()

public string getname()

public

void

setname

(string name)

public

intgetage()

public

void

setage

(int age)

@override

public string tostring()

@override

protected object clone()

throws clonenotsupportedexception

}

測試類

package clone;

public

class

clonetest

}

當我們用的是淺拷貝時,檢視**的執行結果

可以看到修改boy1時,boy中的值也被改變了

再來使用深拷貝,檢視**的執行結果

可以看到修改boy1的值不會對boy產生影響

Clone 分淺拷貝和深拷貝

兩者的區別 當有引用型別成員時,淺拷貝複製的是成員的引用,深拷貝複製的是成員物件。如何實現物件的拷貝功能 繼承介面icloneable實現clone方法 icloneable.clone本身並不能區分 deep or shallow 你可以在clone中呼叫memberwiseclone來實現乙個s...

Object的clone 方法 深拷貝 淺拷貝

乙個物件直接使用 比如object o1 new object object o2 o1 那麼問題是o1改變,o2也會改變。這時候,需要不隨之前的物件改變而改變,使用clone。需要注意clone是protect的,所以子類繼承object 否則丟擲異常 public teacher clone c...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...