protected native Object clone() throws CloneNotSupportedException;
2.一個Object可能有基本數據類型,如:int,long,float,double等,也會含有非基本數據類型如數組,collection,自定義對象等。如果被克隆得到的對象基本類型的值修改了,原對象的值不會改變.這種就是shadow clone.
3.如果你要改變一個非基本類型的值時,原對象的值卻改變了,.比如一個數組,內存中只copy他的地址,而這個地址指向的值並沒有copy,當clone時,兩個地址指向了一個值,這樣一旦這個值改變了,原來的值當然也變了,因爲他們共用一個值.,這就必須得用deep clone。重載clone方法,對於非原始類型的對象,手動去作clone,這樣比較複雜,公用性不高,對於每個類都要去寫一套。
4.序列化/反序列化方式實現deepclone
如果source對象實現了Serializable接口,就可用這種方式來做deepclone,一段示例代碼
public Object deepClone(Object src) {
Object o = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(src);
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos
.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
o = ois.readObject();
ois.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return o;
}