java中深拷貝淺拷貝分析

2021-07-06 05:56:10 字數 928 閱讀 4907

淺拷貝是指拷貝物件時僅僅拷貝物件本身(包括物件中的基本變數),而不拷貝物件包含的引用指向的物件(這裡的不拷貝是指不會給生成不同的引用位址)

深拷貝不僅拷貝物件本身,而且拷貝物件包含的引用指向的所有物件。

舉例:物件a1中包含對b1的引用,b1中包含對c1的引用,淺拷貝a1得到a2,那麼a2中依然包含對b1中的引用,b1中依然包含對c1的引用,也就是說如果你改變c1,b1中屬性的值,會引發a1中相應值的變化

深拷貝則會拷貝所有物件的引用,重新指向新的引用。

若不對 cloneable.clone()方法進行改寫,則呼叫此方法則是淺拷貝

說明:之前我以為 a2 = (a1)a1;和 a2 = (a1)a1.clone()是同一概念,實際上是錯誤的,因為clone其實已經a2和a1的引用位址改變,只是如果a1物件中包含非基本型別時,會仍然引用到之前物件的引用位址

為什麼clone()是乙個protected作用域呢?

因為作為object中的方法,基於安全,允許子類靈活的重寫clone()並定義他的作用域是public還是protected

然而說了這麼多,一般不建議使用轉殖方法,因為如果乙個類重寫了object內定義的clone(),需要同時實現cloneable介面(雖然這個介面內沒有定義clone方法),否則的話,你好在呼叫clone()時會報 clonenotsupportedexception異常,也就是說,cloneable介面只是個合法呼叫clone()的標識(marker-inte***ce)

如果在實際中,若想用到物件的轉殖,我們可以借用第三方開源包中的類:

apache提供了 serializationutils.clone(t),t物件需要實現 serializable 介面,他屬於深轉殖

同時還可以使用 beanutils.clonebean(t) 來進行淺轉殖,但要注意的是,t物件必須有乙個不帶引數的建構函式,而且它的類還必須為public

java深拷貝和淺拷貝

會建立乙個新物件,這個物件有原始物件屬性的精確拷貝。屬性是基本型別及其擴充套件型別 拷貝的就是基本型別的值。如果修改原始物件中的基本型別,拷貝物件中的基本型別不變。即原始物件和拷貝物件共用同乙個引用型別或陣列。修改原始物件或拷貝物件中引用型別,另乙個也會跟著變化 通常這種情況不是我們所想要的,這就需...

java深拷貝與淺拷貝

淺拷貝與深拷貝 淺拷貝 被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不複製它所引用的物件。深拷貝 被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複製過的新...

Java深拷貝與淺拷貝

深拷貝與淺拷貝主要的不同是對於引用變數的拷貝,淺拷貝的引用變數不僅僅是拷貝乙個引用 位址 引用變數的成員也一樣深拷貝。廢話少說下面是兩個拷貝的例子 1.淺拷貝 1 package com.lightcopy 23 public class professor implements cloneable...