雖 clone() 定義於 Object,但預設不自動啟用。Java 採「反其道而行」:必須主動加入代碼才能複製。
為避免所有類別預設可複製,Object.clone() 設為 protected。後果:
clone()Java 庫中多數類別不可複製(如 Integer)。
但在衍生類中可存取 Object.clone()(protected 允許繼承體系存取)。基類 clone() 提供真正「位元複製」功能,相當於標準複製行為。但必須將自己的 clone() 設為 public 才能被外部使用。複製兩大鐵律:幾乎必呼叫 super.clone(),且必設為 public。
protected 技巧僅用一次:首次從不可複製類別繼承並想開啟複製能力。之後所有衍生類自動擁有 clone()(public 不會在繼承中縮小存取範圍),除非用特殊機制「關閉」。
還需實作 Cloneable 介面——它是空介面:
interface Cloneable {}
非為了向上造型呼叫方法,而是作為標記封裝於類別型別中。兩大原因:
instanceof Cloneable 檢查是否可複製Object.clone() 執行期驗證:未實作 Cloneable 則拋出 CloneNotSupportedException一般情況下,implements Cloneable 是支援複製的必要條件。