java clone原理

在java中 clone爲什麼要用super.clone()方法 這裏爲什麼要用super不是this?

1.Object中的clone執行的時候使用了RTTI(run-time type identification)的機制,動態得找到目前正在調用clone方法的那個reference,根據它的大小申請內存空間,然後進行bitwise的複製,將該對象的內存空間完全複製到新的空間中去,從而達到shallowcopy的目的。 
所以你調用super.clone() 得到的是當前調用類的副本,而不是父類的副本。根本沒有必用調用this.clone();
2.要讓實例調用clone方法就需要讓此類實現Cloneable接口,API裏面還有句話是:如果在沒有實現 Cloneable 接口的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常,這便是“合法”的含義。 但請注意,Cloneable接口只是個標籤接口,不含任何需要實現的方法,就像Serializable接口一樣。

總之,一般如果你的子類沒有特殊需要而重寫clone()方法就直接用super.clone() 就行了。


super.clone()的操作是:(還是以Object中的clone()來說明吧)
  <1>檢查當前對象this所屬的類(指:你的Strings類有沒有實現Cloneable接口,若沒有則拋出:CloneNotSupportedException
  <2>創建當前對象this所屬的類(即你的Strings類)的一個對象(稱爲:copy_object),並對該copy_object進行初始化,使得copy_object的數據成員值與當前對象this中數據成員值一模一樣(即:當前對象this的二進制拷貝)--這就是所謂的"淺複製". 對於你的代碼,即:copy_object對象中的數據成員private String str; 與被複制的當前對象this中的private String str 引用的是同一個字符串對象.由於:字符串對象是內部值不可改變的常對象,因而:對於淺複製,這是沒有問題的.使用效果與"深複製"相同. 同樣:基本數據類型的數據成員,"淺複製"與"深複製"使用效果也相同.





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章