淺轉殖與深轉殖

2021-08-17 16:16:39 字數 1245 閱讀 3381

clone()方法是object中的乙個方法

淺轉殖(shallow copy)

employee cindy=tobby.clone()

深轉殖(deep copy)   必須實現cloneable介面

class employee implements cloneable    

}  如果物件中有引用型別,就必須使用深度轉殖,就是在轉殖時,要把物件中的引用型別物件,也要進行轉殖

如果物件中有引用型別,進行淺轉殖時候只是把物件的引用傳過去了,那樣,當我們改變其中乙個物件的引用變數的值時候,另外乙個的值也發生了變化(因為兩個位址指的同乙個堆空間,當乙個表示的值變了,另外乙個自然也變了)。這當然是不成功的轉殖。那要怎麼使複製之後的物件的改變互不影響呢。深轉殖 實現cloneable介面,並重新寫clone方法。

這裡舉乙個深轉殖的例子,學生有name,age,address三個屬性,而address是引用變數這就需要進行深轉殖

public class address implements cloneable

public void setcity(string city)

public address(string city)

public address()

//@override

public object clone() throws clonenotsupportedexception    

}public class student implements cloneable

public void setname(string name)

public int getage()

public void setage(int age)

public address getaddress()

public void setaddress(address address)

public student(string name, int age,address address)

public student()

@override

public object clone() throws clonenotsupportedexception   

}public class testclone

}把student  s中的address中的city變為南京 執行結果顯示 student stu的address仍為蘇州

說明這是乙個成功的轉殖

深轉殖與淺轉殖

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

淺轉殖與深轉殖

一般實現陣列轉殖的方法都是淺轉殖,直接將儲存在棧中的值賦值給對應變數,如果是基本資料型別,則直接賦值對應的值,如果是引用型別,則賦值的是位址 slice let arr2 arr1.slice 0 concat let arr2 arr1.concat 擴充套件運算子 ary let arr2 ar...

c 深轉殖與淺轉殖

我們都知道memberwiseclone 會將淺轉殖。什麼是淺轉殖?如何深轉殖呢?public class good private static good good private static good good new good public good createinstance publi...