前言:
protected native object clone() throws clonenotsupportedexception
方法由protected修飾,只能由子類重寫和呼叫,而且為本地方法。
object提供clone方法,生成物件的乙個副本,來實現物件的一次淺度轉殖。但是物件的引用型別不會拷貝乙份,引用位址與原物件相同。
實現物件的轉殖需要實現cloneable介面,重寫clone方法,通過super.clone()呼叫object類的clone方法得到當前物件的副本,並放回該副本。
淺度轉殖與深度轉殖的區別:
淺度轉殖:基本型別都會拷貝乙份,引用型別引用位址不變,還是同乙個物件。
深度轉殖:基本型別和引用型別都會拷貝乙份,完完全全的是不同的兩份,引用位址不一樣。
下面結合乙個具體的例子:(兩者結合)
定義person類:(實現了cloneable介面)
class person implements cloneable
public int getid()
public void setid(int id)
@override
protected object clone() throws clonenotsupportedexception
}
定義student類(實現cloneable介面)
public class student implements cloneable
public int getage()
public void setage(int age)
public string getname()
public void setname(string name)
public person getperson()
public void setperson(person person)
@override
protected object clone() throws clonenotsupportedexception
public static void main(string args) throws exception
}
輸出結果:
false
true
false
分析:
student中有兩個引用型別:string和person,在person中實現了clone介面,在student的clone方法中我們對person屬性也進行了一次深度轉殖,這樣對student1拷貝成student2後,各自的person屬性是單獨的兩份,引用位址不一樣,所以為false,但是string屬性是同乙份,故為true。綜述,對student2而言,這是一次不徹底的深度轉殖,因為部分引用屬性沒有進行深度轉殖。
畫個圖來明了下:
student1和student2對應於堆中的同乙個name,不同的person。
轉殖,深轉殖和淺轉殖
轉殖,深轉殖和淺轉殖。1.實現轉殖,繼承cloneable介面,實現clone beanutils.clonebean origin 2.深轉殖和淺轉殖的區別,淺轉殖指的是轉殖的時候僅僅轉殖物件本身 物件的基本變數 而不拷貝物件的引用變數。深轉殖指的是轉殖的時候不僅轉殖物件本身,而且拷貝物件包含的引...
深轉殖和淺轉殖
為什麼需要轉殖?new出來的物件中的屬性都是初始化時候的值,當需要乙個新的物件來儲存當前物件的 狀態 就靠clone方法了。直接使用object a new object object b b a不行嗎,答案是不行的。因為這只是轉殖了引用。如何實現轉殖?首先由兩種轉殖的方式,乙個是深轉殖,乙個是淺轉...
淺轉殖和深轉殖
1淺轉殖 shallow copy 是通過呼叫object的clone方法,建立出和原物件 結構相同的新物件。淺轉殖 和深轉殖 deep copy 不同,如果被拷貝的物件屬性為可變類,則直接複製該引用物件的位址。這會導致,淺轉殖出來的物件 如果改變可變類屬性值,則原物件的可變類屬性值也會一起變。換句...