Java 最引人注目的特性之一在於程式碼的重複使用與再生。雖然在 C 等程序化語言中也能透過複製程式碼來重用,但效果有限。Java 則將這個問題提升到類的層面:我們可以直接使用別人已建好並除錯好的現成類,而不必從頭建立新類。但前提是必須確保不會干擾原有程式碼。
合成是在新類中建立現有類的對象,新類由現有類的對象組合而成。這是單純重用功能,而非形式。繼承則是建立新類作為現有類的一種型態,繼承現有類的形式並可新增程式碼,且不影響原類。繼承是物件導向程式設計最重要的基礎概念之一,大多數工作由編譯器自動完成。
合成只需在新類中置入物件參考。對於非基本型別,放置參考即可;基本型別則需在類中定義。Java 會自動將基本型別初始化為零值,物件參考初始化為 null。若在初始化前呼叫方法會拋出例外,這其實是種保護機制。
初始化可在三個地方進行:定義時、建構子中、或實際使用前(延遲初始化)。範例展示了 SprinklerSystem 包含 WaterSource 物件與基本型別欄位,以及 Bath 類展示三種初始化方式的執行順序。
extends 關鍵字繼承使用 extends 關鍵字,自動獲得基底類的所有資料成員與方法。範例中 Cleanser 為基底類,Detergent 繼承並覆寫 scrub()、新增 foam() 方法。透過 super 關鍵字可呼叫基底類版本的方法,避免遞迴呼叫。
建議將所有欄位設為 private、方法設為 public(或 protected 允許衍生類存取),以利繼承規劃。每個類都可包含 main() 進行單元測試,執行時僅調用指定類的 main()。
建立衍生類物件時,會先初始化基底類的「子物件」。Java 自動在衍生類建構子插入基底類建構子呼叫,順序從根基底類向下。若基底類建構子帶參數,必須顯式使用 super(參數) 呼叫,且必須是建構子第一行敘述。
實務常需結合兩者。PlaceSetting 範例繼承 Custom 並合成 Spoon、Fork、Knife、DinnerPlate 等物件,展示建構子初始化順序:基底類 → 成員物件 → 衍生類本體。
finally 區塊Java 無 C++ 式的解構函式,依賴垃圾回收器回收記憶體。但若類在生命週期需釋放非記憶體資源(如檔案控制代、網路連線),必須自訂 cleanup() 方法,並在 finally 區塊呼叫以確保執行。清除順序應與 C++ 解構函式一致:先衍生類特有清除,再呼叫 super.cleanup()。
final 關鍵字完整解析static final 編譯期常數命名全大寫。設計時慎用 final,標準庫 Vector 將所有方法設為 synchronized 卻非 final,即為教訓。
Java 採動態載入:首次使用類時載入,static 初始化依宣告順序執行一次。繼承鏈載入時,先載入基底類,再依序執行 static 初始化。物件建立順序:記憶體歸零 → 基底類建構子 → 成員初始化 → 衍生類建構子本體。
合成用於實現重用(has-a 關係),繼承用於介面重用(is-a 關係)。設計時優先考慮合成,僅在明確需要上溯造型時使用繼承。理想類結構應各司其職、大小適中、易於復用。