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
