java的克隆
❶ java中對對象克隆,一定要實現Cloneable介面嗎
是的。如果沒渣知有實現Cloneable介面,則調用Object的clone方法克隆對象將會拋出下面這個錯誤:
CloneNotSupportedException
- 如果對象的類不支持 Cloneable 介面,則重寫 clone
方法的子類也會拋出此異常,以指示無法復制某胡升個實例。褲梁老更多java技術請訪問bug315。
這是Object中clone方法的定義:
protected Object clone() throws CloneNotSupportedException
❷ Java中將a對象轉換為b對象及深復制的幾種方式
在編程實踐過程中,我們有時會遇到這樣的需求:在某個時刻有一個對象A,其中已包含有效值,此時需要創建一個與A完全相同的新對象B,確保B的任何改動都不會影響到A中的值。這意 義是A與B是兩個獨立的對象,B的初始值由A對象確定。例如程序演示的情況:
結果:
>學生1:54321
>學生2:54321
為什麼改變學生2的學號,學生1的學號也發生了變化呢?
原因在於(stu2 = stu1)。該操作將stu1的引用賦值給stu2,導致stu1和stu2指向內存堆中的同一對象。那麼如何實現干凈、清晰地復制一個對象呢?在Java中,僅使用簡單的賦值語句無法滿足這種需求,實現復制對象有多種方法:
(1)逐個屬性賦值。
(2)重寫java.lang.Object類中的方法clone()。
(3)使用org.apache.commons中的工具類BeanUtils和PropertyUtils進行對象復制。
(4)通過JSON之間的轉換,進行對象克隆。
(5)通過序列化實現對象的復制。
接下來,我們將詳細介紹其中的幾種方法。
將A對象的值分別通過set方法加入B對象中
對屬性逐個賦值,適用於屬性較少的場景,操作較為直觀。但對於屬性較多的對象,這種方式會導致大量的get、set方法調用,操作變得繁瑣。
重寫java.lang.Object類中的方法clone()
介紹淺克隆和深克隆的概念。
淺克隆主要關注值類型的成員變數復制,而引用類型成員變數的引用地址保持不變。深克隆則會復制對象的引用類型成員變數,包括內部包含的對象。
淺克隆
實現步驟:被復制的類需要實現Cloneable介面,並覆蓋clone()方法,使用super.clone()實現基本復制。
結果展示:復制對象後,如果成員變數為引用類型,新對象與原對象引用同一內存地址。
深克隆
完整代碼實現深克隆,解決淺克隆的局限性。
結果展示:無論成員變數是值類型還是引用類型,復制對象時均會復制所有的成員變數。
使用工具類BeanUtils和PropertyUtils進行對象復制
利用BeanUtils的Properties()方法將轉換前的A類賦值給轉換後的B類,簡化屬性復制過程。
注意點:屬性名稱需一致,B類存在A類不一定存在的屬性,Spring的BeanUtils方法要求屬性有getter和setter方法,且存在屬性完全相同的內部類時,需特別注意。
通過JSON轉換實現深克隆
利用fastjson進行對象與JSON串之間的轉換,本質為反射操作。
通過序列化實現對象的復制
使用Java序列化機制,如SerializationUtils的clone()方法,要求對象實現Serializable介面。
總結與個人意見
在性能要求不高時,可選擇簡單、易於實現的方法如fastjson、序列化或DozerBeanMapper等。在性能要求較高的場景下,推薦自定義工具類實現更靈活的復制邏輯。