JAVA 對象拷貝java
爲何須要有對象拷貝?post
對象拷貝相對的天然是引用拷貝。java初學者常常會問,我這個方法要改變一個對象的屬性,能夠把參數傳進去了,爲何沒有改變了?this
——基本數據類型傳值,而對象傳引用或引用的拷貝。spa
而有時候咱們要獲取到一個當前狀態的對象複製品,他們是兩個獨立對象。再也不是引用或者引用拷貝(實質都是指向對象自己)。就是說a是b的拷貝,b發生變化的時候,不要影響a。.net
對象拷貝有淺拷貝和深度拷貝兩種。對象
1)淺拷貝blog
淺拷貝是指對象中基本數據類型獲得拷貝,而引用數據類型並未拷貝。
提到拷貝天然和clone聯繫起來了,全部具備clone功能的類都有一個特性,那就是它直接或間接地實現了Cloneable接口。
不然,咱們在嘗試調用clone()方法時,將會觸發CloneNotSupportedException異常。
eg:遞歸
運行結果:接口
xiaogou
2
dagou
2get
2)深度拷貝
相對淺拷貝。實現對象中基本數據類型和引用數據類型的拷貝。
請先看下面代碼:
運行結果是:
333
333
而真正要實現拷貝還的加點代碼,以下請對比上面和下面代碼的異同之處:
運行結果:
333
test
這樣基本就達到了咱們當初的母的。
可是明顯的這種方法仍是有許多不足,人們老是但願一個clone就是對象直接克隆。而上面還要對對象中的對象遞歸使用clone。下面提供一種更高級點的作法:
輸出:
333
test
上面的代碼用序列化與反序列化實現了對象拷貝。比較通用。可是得注意的是其中的類得implements Serializable。
3)後記
咱們若是利用強大的反射機制+序列化與反序列化,能作出更加靈活的對象拷貝。有興趣的朋友能夠自行去研究。
我在javaeye上看到一篇短文:http://www.javaeye.com/post/367014 主要講的就是反射在對象拷貝中的應用。