在 Java 程式設計中,繼承是物件導向三大特性之一,它允許我們建立類別之間的「是一種」關係,實現程式碼的複用與擴展。Java 採取了單繼承機制,這意味著一個子類別只能直接繼承一個父類別,這與 C++ 支援多重繼承形成鮮明對比。雖然限制了直接繼承的數量,但 Java 提供了介面機制來彌補這一點,讓類別可以實作多個介面,達到類似多重繼承的效果。
Java 之所以選擇單繼承,主要是為了避免「鑽石繼承問題」帶來的歧義與複雜性。當一個類別同時繼承兩個擁有共同父類別的類別時,若兩個父類別都覆寫了祖父類別的方法,子類別呼叫該方法時將無法確定具體執行哪一個版本。單繼承機制從根本上消除了這類衝突,使類別層次結構清晰明確,便於維護與除錯。
雖然限制直接繼承為單一,但 Java 完整支援多層繼承(繼承體系)。這意味著類別 A 可以被類別 B 繼承,類別 B 再被類別 C 繼承,形成 A → B → C 的繼承鏈。在這種結構中,類別 C 不僅擁有類別 B 的特性,也間接擁有類別 A 的所有非私有成員。這種層級結構非常適合表現領域模型中的「泛化-特化」關係,例如:動物 → 哺乳類 → 人類。
class Animal {}
class Mammal extends Animal {}
class Human extends Mammal {}
在子類別方法中存取變數時,遵循「就近原則」:優先查找區域變數,其次是本類別的成員變數,最後才是父類別的成員變數。若子類別定義了與父類別同名的成員變數(遮蔽),則在子類別中直接使用變數名稱時指向子類別的版本。若需存取父類別被遮蔽的變數,必須使用 super.變數名 語法。這機制確保了封裝性,同時提供了靈活的存取控制。
子類別實例化時,會自動呼叫父類別的無參數建構子(隱含 super())。若父類別僅提供帶參數的建構子,子類別必須在其建構子首行顯式呼叫 super(參數),否則編譯失敗。這機制保證了父類別狀態的正確初始化,是繼承體系穩健運作的基石。
繼承的核心價值在於方法覆寫。子類別可以重新定義父類別的非 final、非 static、非 private 方法,實現特定行為。結合向上轉型,父類別引用指向子類別物件時,呼叫覆寫方法會執行子類別版本,這就是執行期多型的體現。正確使用 @Override 註解可讓編譯器協助檢查覆寫規範,避免拼寫錯誤導致的邏輯缺陷。
使用 final 修飾類別可禁止被繼承(如 String、包裝類別);修飾方法可禁止被覆寫;修飾變數則變為常數。合理運用 final 能明確設計意圖,防止非預期的擴展破壞核心邏輯,也是建立不可變物件的關鍵手段。
super 關鍵字調用父類別實作,避免重複程式碼掌握 Java 繼承機制的精髓,能幫助開發者設計出結構清晰、擴展性強、易於維護的物件導向系統。單繼承與多層繼承的結合,配合介面多實作,構成了 Java 靈活且嚴謹的類別體系基石。