文章參考 :http://www.java3z.com/cwbwebhome/article/article8/81145.html?id=2600
?
Java Object類 提供了一個 protected 修飾的clone()方法,該方法用于幫助其他對象來實現“自我克隆”,所謂“自我克隆”就是得到一個當前對象的副本,而且兩者之間完全隔離, 該方法只能被子類重寫或調用 。
?
自定義類實現“克隆”的步驟:
1、自定義類實現Cloneable接口;(這是個 標記性接口 ,實現該接口對象可以實現“自我克隆”,接口里沒有定義任何方法,否則不能執行clone方法)
2、自定義類實現自己的clone()方法
3、實現clone()方法時通過super.clone();調用Object實現的clone()方法來得到該對象的副本,并返回該副本。
?
備注: 標記性接口是沒有任何方法和屬性的接口。它僅僅表明他的類屬于一個特定的類型,供其他代碼來測試允許做一些事情。使用標記性接口的唯一目的是使得可以用instanceof進行類型查詢 ,例如:
if(obj instanceof Cloneable){......}
一些容器例如EJB容器,servlet容器或運行環境依賴標記接口識別類是否需要進行某種處理,例如serialiable接口標記類需要進行序列化操作。
?
?
package hb.com.clone; class Address{ String detail; public Address(String detail){ this.detail = detail; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String print(){ System.out.println(this.detail); return this.detail; } }
?
package hb.com.clone; public class User implements Cloneable{ public int age; public Address address; public User(int age){ this.age = age; this.address = new Address("地名"); } public User clone(){ try { return (User)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } }
?
public class CloneTest { public static void main(String[] args) { User u1 = new User(29); //u1克隆之后,會單獨開辟一塊內存空間,u2指向的地址與u1不一致 // x.clone() != x // x.clone().getClass() == x.getClass() // x.clone().equals(x) User u2 = u1.clone(); System.out.println(u1==u2); //false // primitive的確做到了相等且隔離。 // 引用類型僅僅是復制了一下引用 System.out.println(u1.address ==u2.address); //true //值相等,實際上內存不是指向同一個位置 System.out.println(u1.age == u2.age); System.out.println(u1.address.print()); u1.address.setDetail("地名1"); System.out.println(u1.address.print()); System.out.println(u2.address.print()); } }
?
Object類的clone()方法雖然簡單、易用,但它只是一種“ 潛克隆 ”—— 它只克隆該對象的所有Field值,不會對引用類型的Field值所引用的對象克隆 。如果需要“ 深克隆 ”,則需要開發者自己進行“遞歸”克隆,保證所有引用類型的Field值所引用的對象都被復制了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
