繼承是 Java 面向對象程式設計的基石之一,它允許我們基於現有類別建立新類別,從而復用父類別的方法與欄位,並可在此基礎上擴充新功能。在 Java 中,所有繼承均為公有繼承,意味著父類別的公有與受保護成員保持原有存取層級,私有成員則不可被子類別直接存取——這與 C++ 的私有/保護繼承機制有本質區別。
使用 extends 關鍵字即可建立繼承關係。術語上,被繼承的類別稱為超類別、父類別或基類別;新建立的類別稱為子類別、派生類別或孩子類別。子類別可透過 super 關鍵字呼叫父類別被覆寫的方法或建構子。值得注意的是,super 並非物件引用,而是指示編譯器呼叫超類別方法的特殊關鍵字。
class Manager extends Employee {
private double bonus;
public double getSalary() {
return bonus + super.getSalary(); // 必須透過 super 存取父類別私有欄位
}
public Manager(double b) {
super(b); // 顯式呼叫父類別建構子
}
}
若子類別未顯式呼叫父類別建構子,Java 會自動呼叫父類別的無參數建構子;若父類別無此建構子且子類別未顯式呼叫其他建構子,編譯器將報錯。
子類別定義與父類別相同簽名(方法名+參數列表)的方法即為覆寫。覆寫方法的回傳型別可以是父類別方法回傳型別的子型別(協變回傳型別),但存取層級不能低於父類別方法。final 修飾的方法不可被覆寫,建議使用 @Override 註解標記覆寫意圖,編譯器將驗證是否真正覆寫了父類別方法。
多態允許父類別引用指向子類別物件,實現「is-a」關係:子類別物件可用於任何需要父類別物件的場合。動態綁定機制確保在執行期根據物件實際型別呼叫適當方法,而非編譯期靜態綁定。
當父類別某些方法需由子類別具體實作時,可宣告為抽象方法,類別也必須宣告為抽象類別。抽象類別不可實例化,但可包含具體欄位與方法。介面則是完全抽象的類別,所有方法隱含為 public abstract,欄位隱含為 public static final。
private:僅本類別可見protected:同套件與所有子類別可見public:所有類別可見Object 是所有 Java 類別的始祖。重寫 equals() 時必須遵守自反性、對稱性、傳遞性、一致性與非空性五大契約,並同步重寫 hashCode() 以確保雜湊容器正常運作。toString() 建議回傳 類別名[欄位=值,...] 格式。
ArrayList<E> 提供動態陣列功能,支援泛型與自動擴容。基本型別不可直接作為型別參數,需使用包裝類別(如 Integer)。Java SE 5 引入自動裝箱/拆箱機制,編譯器自動插入 valueOf() 與 xxxValue() 呼叫,簡化程式碼。注意包裝類別快取機制:Integer 快取 -128 至 127 範圍內的物件,直接比較參考時在此範圍內會回傳 true。
可變參數(Type... args)本質是陣列語法糖,允許傳入任意數量引數或陣列。列舉類別實質為固定實例的類別,支援 == 比較,繼承自 Enum,提供 values()、ordinal()、compareTo() 等實用方法。
反射允許執行期分析類別結構。Class 物件代表執行期型別資訊,可透過 getClass()、Class.forName()、T.class 取得。反射可動態建立實例、存取欄位、呼叫方法,但會繞過編譯期檢查,影響效能與安全性,建議謹慎使用。