Java的淺度轉殖和深度轉殖

2021-08-05 23:20:53 字數 1592 閱讀 8250

前言:

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 不同,如果被拷貝的物件屬性為可變類,則直接複製該引用物件的位址。這會導致,淺轉殖出來的物件 如果改變可變類屬性值,則原物件的可變類屬性值也會一起變。換句...