Cloneable 和clone的區別和聯絡

2022-03-09 20:41:13 字數 1552 閱讀 6547

設計模式----原型模式時候,涉及到的複製轉殖,

cloneable 介面,內部是沒有任何方法的,

這個介面其實是乙個標記性的介面,和serializable是一樣的,都是標記使用,

在類實現了這個cloneable 介面後呼叫object中得clone方法,才可以正常的使用,如果沒有implements cloneable的類呼叫object.clone()方法就會丟擲clonenotsupportedexception。 

在複製中,分為淺複製和深複製;

先說淺複製:

其實這樣的複製是一種很危險的複製,有時候預期效果並不是你想要的!

1

package

method.clone;23

public

class student implements

cloneable 413

14public student(int

id, string name)

1819

public

boolean

equals(object obj)

2223

public

string tostring()

2627

public

static

void main(string args) throws clonenotsupportedexception //

這裡為什麼一定得寫

2840 }

淺層拷貝導致s1和s2共享同乙個stringbuffer物件,s2還是可以呼叫s1中得stringbuffer。這樣的複製還是很危險!

object中提供的clone方法是一種淺複製,對於基本型別的字段,可以說它成功轉殖了。但對於物件型字段,它並沒有實現轉殖的功能,僅僅做了乙個賦值。(拷貝基本成員屬性,對於引用型別僅返回指向改位址的引用)

深複製: 

首先這個物件必須實現了serializable 介面,可以被序列化,和反序列化:深複製時候採用的是流進行讀寫的,原物件還是存在jvm中

序列化前和序列化後的物件的關係

反序列化還原後的物件位址與原來的的位址不同,序列化前後物件的位址不同了,但是內容是一樣的,而且物件中包含的引用也相同。換句話說,通過序列化操作,我們可以實現對任何可serializable物件的」深度複製(deep copy)"——這意味著我們複製的是整個物件網,而不僅僅是基本物件及其引用。對於同一流的物件,他們的位址是相同,說明他們是同乙個物件,但是與其他流的物件位址卻不相同。也就說,只要將物件序列化到單一流中,就可以恢復出與我們寫出時一樣的物件網,而且只要在同一流中,物件都是同乙個。

1

public object deepclone() throws

ioexception, classnotfoundexception

對具體分析:參考部落格 

Java中的clone和深度clone

複製物件 or 複製引用 person p new person 23,zhang person p1 p system.out.println p system.out.println p1 當person p1 p 執行之後,是建立了乙個新的物件嗎?首先看列印結果 person p new pe...

Cloneable介面和迴圈冗餘校驗演算法

實現該介面的類可以呼叫clone 方法合法地對該類例項進行按欄位複製。按照慣例,實現此介面的類應該使用公共方法重寫 object.clone 它是受保護的 迴圈冗餘校驗 英語 cyclic redundancy check,通稱 crc 是一種根據網路資料資料報或計算機檔案等資料產生簡短固定位數校驗...

實現 Cloneable 需要注意

產品product裡面包含baseinfo物件 product productname,companyname,baseinfo 如果implement cloneable 需要實現 注意強轉型別,這時例項clone product1.clone 獲得備份,通過輸出兩者hashcode 發現prod...