在程式設計中,常需要一個與現有物件內容相同但獨立的新物件。單純賦值 (B = A) 僅複製參考,修改 B 會影響 A。clone() 能建立獨立副本。
Cloneable 介面 (標記介面,無方法)。clone() 方法,拋棄 protected 改為 public。super.clone() 並捕獲 CloneNotSupportedException。class CloneClass implements Cloneable {
public int aInt;
public Object clone() {
CloneClass o = null;
try { o = (CloneClass) super.clone(); }
catch (CloneNotSupportedException e) { e.printStackTrace(); }
return o;
}
}
Object.clone() 逐位複製欄位。基本型別複製值,參考型別複製參考地址,指向同一個物件。class DeepClone implements Cloneable {
private int[] data;
private OtherObject ref;
public DeepClone(int[] data, OtherObject ref) {
this.data = data;
this.ref = ref;
}
@Override
public DeepClone clone() {
try {
DeepClone cloned = (DeepClone) super.clone();
// 基本型別陣列需手動複製
cloned.data = this.data.clone();
// 參考物件需支援 clone
cloned.ref = this.ref.clone();
return cloned;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
Object.clone() 是 native 方法,效率高。若類別未實作 Cloneable 卻呼叫 super.clone(),會拋出 CloneNotSupportedException。實作介面即告知 JVM 該類別允許被複製。