繼承是面向對象「is-a」關係的代碼體現,配合組合「has-a」,構成復用雙引擎。本文從類繼承、訪問控制、方法覆蓋、構造鏈四大維度,構建完整繼承知識體系。
繼承基礎:extends 關鍵字
class Human {
private int height;
public Human(int h) { this.height = h; }
public int getHeight() { return height; }
public void growHeight(int h) { height += h; }
public void breath() { System.out.println("hu...hu..."); }
}
class Woman extends Human { // 繼承 Human
public Human giveBirth() { // 新增方法
System.out.println("Give birth");
return new Human(20);
}
}

- 基類:
Human,被繼承類。
- 衍生類:
Woman,繼承類,自動擁有基類所有 public/protected 成員。
- 單繼承:Java 類僅能繼承一個直接父類,但可多層繼承(
A → B → C)。
三層視角:基類定義、衍生類定義、外部使用

外部使用者看到的是合併後的公共接口,無感知內部繼承結構。
衍生類開發者需理解內存佈局:

- 創建衍生對象時,**先構造基類對象(子對象),再構建衍生層**。
- 基類
private 成員存在但不可直接訪問,只能通過基類 public/protected 方法間接操作。
- 衍生層訪問基類
public/protected 成員用 super.member,調用基類構造用 super(args)。
protected:給子類的特權通道
| 修飾符 | 同類 | 同包 | 子類(異包) | 任意處 |
| private | ✓ | ✗ | ✗ | ✗ |
| default | ✓ | ✓ | ✗ | ✗ |
| protected | ✓ | ✓ | ✓ | ✗ |
| public | ✓ | ✓ | ✓ | ✓ |
設計意圖:基類預留擴展點給子類,但對包外非子類隱藏。典型用法:
- 基類定義
protected void onDataLoaded() {},子類覆寫掛鉤業務邏輯(模板方法模式)。
- 基類暴露
protected Logger logger,子類直接用日誌,外部不可見。
方法覆蓋:多態的運行時分派
class Woman extends Human {
@Override
public void breath() { // 覆蓋基類方法
super.breath(); // 可選:調用基類版本
System.out.println("su...su..."); // 女性特有呼吸聲
}
}
覆蓋規則:
- 方法簽名(名+參數列表)完全一致。
- 返回類型兼容(协变返回:子類型可替換父類型)。
- 拋出異常範圍不大於基類(可少拋、拋子類異常)。
- 訪問權限不低於基類(可放寬,不可收窄)。
final/static/private 方法不可覆蓋。
外部調用 woman.breath() 執行衍生類版本,實現動態綁定。
構造鏈:super() 必須首行
class Woman extends Human {
public Woman(int h) {
super(h); // 必須第一行顯式調用基類構造,否則隱式調用 super()
System.out.println("Hello, Pandora!");
}
}
基類無無參構造時,衍生類必須顯式 super(args) 指定調用哪個基類構造。
繼承設計鐵律:里氏替換原則(LSP)—— 衍生類對象必須能無縫替換基類對象,不破壞基類契約。濫用繼承導致脆弱基類問題,**優先組合,謹慎繼承**,僅當明確滿足 is-a 且行為可替換時使用。
- 上一篇文章: Java 反編譯工具箱:7 款開源神器橫向評測
- 下一篇文章: Java 連續奇數合數演算法:暴力解法與效能分析
Copyright ©
程式碼之家 All Rights Reserved