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

Java 面向對象三大特性之繼承:機制、陷阱與最佳實踐

     編輯:Java 程式設計入門

繼承本質:is-a 關係與代碼復用

繼承建立「子類是父類的一種」關係,子類自動擁有父類非私有成員,可新增、覆寫、擴展。關鍵字 extends,Java 單繼承(類),多實現(介面)。

核心語法與關鍵字

public class Animal {
    protected String name;
    public void eat() { System.out.println(name + " 進食"); }
}

public class Dog extends Animal {
    // 1. 覆寫 @Override:編譯期檢查簽名一致,防誤寫成重載
    @Override
    public void eat() {
        super.eat(); // 調用父類實現
        System.out.println("狗狂吞虎嚥");
    }

    // 2. super 調用父構造器(必須首行)
    public Dog(String name) {
        super(); // 隱式調用父無參構造器;父無無參構造器必須顯式 super(...)
        this.name = name;
    }
}

方法重載 vs 覆寫

維度重載覆寫
發生位置同一類 / 父子類父子類之間
方法簽名名稱相同,參數列表不同名稱、參數、返回類型完全一致
返回類型可不同协變返回類型(子類型)
拋出異常無限制子類異常 ⊆ 父類異常
訪問權限無限制子類權限 ≥ 父類權限
綁定時機編譯期靜態綁定運行期動態綁定(多態核心)

向上轉型與多態

Animal a = new Dog(); // 向上轉型:子類對象賦值給父類引用
a.eat(); // 動態分派:調用 Dog.eat()
a.name = "旺財"; // 僅能訪問 Animal 定義的成員
// a.bark(); // 編譯錯誤:父類引用不可訪問子類特有方法

向上轉型安全:父類引用指向更具體子類對象,不會丟失父類成員。向下轉型需 instanceof 守衛。

繼承的陷阱與設計原則

  • 破壞封裝:子類依賴父類實現細節(protected 字段、內部調用鏈),父類變更易導致子類失效。
  • 脆弱基類問題:父類新增方法可能與子類同名方法衝突(Java 8+ default 方法更明顯)。
  • 組合優於繼承:Has-a 關係更靈活,通過介面委託實現復用(策略模式、裝飾器模式)。
  • 設計文檔化繼承意圖:@implSpec 標註可覆寫方法的契約,或用 final 禁止覆寫/繼承。

構造器鏈與初始化順序

  1. 父類靜態字段/塊 → 子類靜態字段/塊
  2. 父類實例字段/塊 → 父類構造器
  3. 子類實例字段/塊 → 子類構造器

子類構造器首行隱式/顯式 super() 保證父對象先構造完成。

何時使用繼承?

  1. 明確 is-a 關係(ArrayList is-a List)。
  2. 需要多態行為(同一介面不同實現)。
  3. 復用父類完整邏輯,且子類不違背父類契約(里氏替換原則)。

其他場景優先考慮組合、介面、委託。

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