Java基礎篇 深轉殖與淺轉殖

2021-08-28 15:11:14 字數 1322 閱讀 3588

轉殖,顧名思義,即是產生乙個與原物件「完全」一樣的乙個新物件。這裡的一樣,或許是表面的一樣,或許是真的一樣。這就牽扯到兩個新定義:淺轉殖與深轉殖。

淺轉殖:新物件的基礎型別的變數值與原物件相同,而特殊物件,即非八大基本型別的物件與原物件指向同一記憶體空間,不管新老物件誰對這段空間進行操作都會影響到另乙個,就像又要讓錢鍾書講三字經又要他講陶淵明,一人難敵兩角,肯定會引起問題,「假轉殖」。

深轉殖:新物件除了與老物件的八大基本型別的賦值一致以外,其類型別的物件在保證賦值一致的基礎上,指向的是一段新的記憶體空間,就像把同一斤大五花轉殖兩份,乙個給a廚師,乙個給b廚師,你要東坡還是紅燒隨你便,最後出來的是完全不同的兩道菜,「真轉殖」。

1.將該類實現clonable介面;

2.並覆蓋object的clone方法,設定為public關鍵字,原方法為protected;

3.在clone()中呼叫super.clone();

4.或者使用你的腦力自己實現乙個轉殖;

1.深轉殖

public class mecclone implements serializable 

private static void deleteresultobj(string path)

boolean deletesuccess = file.delete();

if(deletesuccess) else }

// todo 簡便淺轉殖的實現 未完成

public object deepclone(object object) catch (ioexception e) catch (classnotfoundexception e)

if(result == null) system.out.println("複製失敗!");

deleteresultobj("result.obj");

return result;

}}

原理:首先將需要複製的物件進行序列化,並將儲存著這個物件基本資訊的檔案儲存至磁碟,之後使用反序列化將物件讀取出來,並將檔案刪除。這樣,由於反序列化時jvm要根據序列號讀出類名、介面名、方法和屬性等資訊重新申請空間,指向的自然不是同一位址【此處可能有較大問題,歡迎大佬斧正】。demo如下:

public class demo 

}

刪除result.obj檔案成功!

raychew rayray 的年齡88

pikachew pikapika 的年齡99

2.淺轉殖

可以簡單的通過實現clonable介面、覆蓋clone()方法實現,此處不予演示。

淺轉殖與深轉殖

clone 方法是object中的乙個方法 淺轉殖 shallow copy employee cindy tobby.clone 深轉殖 deep copy 必須實現cloneable介面 class employee implements cloneable 如果物件中有引用型別,就必須使用深度...

深轉殖與淺轉殖

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

淺轉殖與深轉殖

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