Cloneable接口是一個空接口,僅用於標記對象,Cloneable接口里面是沒有clone()方法,的clone()方法是Object類里面的方法!默認實現是一個Native方法
protected native Object clone() throws CloneNotSupportedException;
如果對象implement Cloneable接口的話,需要覆蓋clone方法(因為Object類的clone方法是protected,需要覆蓋為public)
public Object clone() throws CloneNotSupportedException{ return super.clone(); }
Object類里的clone()方法僅僅用於淺拷貝(拷貝基本成員屬性,對於引用類型僅返回指向改地址的引用)
深拷貝需要重新覆蓋Clone方法。
public class testDeepClone implements Cloneable { public int num = 0; public String str = "default"; public A a; public Object clone() throws CloneNotSupportedException { testDeepClone o = (testDeepClone) super.clone(); o.str = new String(this.str); o.a = (A) a.clone(); return o; } } // 成員屬性A必須為Cloneable的,否則無法Clone其組合的類 class A implements Cloneable { public Object clone() throws CloneNotSupportedException { return super.clone(); } }
利用Serializable來實現深層復制
利用Serializable進行深拷貝的時候成員屬性也必須是Serializable的,否則只返回一個引用,具體參考本人的博客:
Java中的Serializable接口transient關鍵字,及對象IO