首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 程式設計思想:類的復用與再生——合成與繼承深度解析

     編輯:Java 綜合教學

Java 程式設計思想:類的復用與再生——合成與繼承深度解析

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 關鍵字完整解析

  • final 資料:基本型別變常數;物件參考變常數(不可指向新物件,但物件本身可修改)。static final 編譯期常數命名全大寫。
  • 空白 final:宣告時不賦值,但在建構子中必須初始化,增加彈性。
  • final 參數:方法內不可改變參考指向,基本型別唯讀。
  • final 方法:鎖定行為防止覆寫,編譯器可內嵌優化效能。
  • final 類:禁止繼承,所有方法隱含 final。

設計時慎用 final,標準庫 Vector 將所有方法設為 synchronized 卻非 final,即為教訓。

類載入與初始化順序

Java 採動態載入:首次使用類時載入,static 初始化依宣告順序執行一次。繼承鏈載入時,先載入基底類,再依序執行 static 初始化。物件建立順序:記憶體歸零 → 基底類建構子 → 成員初始化 → 衍生類建構子本體。

總結

合成用於實現重用(has-a 關係),繼承用於介面重用(is-a 關係)。設計時優先考慮合成,僅在明確需要上溯造型時使用繼承。理想類結構應各司其職、大小適中、易於復用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved