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

Java 三大特性之繼承深度解析:extends 機制、方法重寫、構造器鏈與設計原則

     編輯:Java 綜合教學

Java 三大特性之繼承深度解析:extends 機制、方法重寫、構造器鏈與設計原則

繼承是面向對象復用代碼、建立類層次結構的核心機制。Java 支持單繼承(一個類只能繼承一個父類),但允許多層繼承(孫子繼承兒子繼承父親),通過 extends 關鍵字實現。本文系統講解繼承特點、關係判斷、注意事項及最佳實踐。

1. 繼承核心特點

  • 屬性與方法繼承: 子類自動擁有父類非私有字段與方法(public/protected/default 同包可見)。
  • 方法重寫: 子類可重新定義父類方法,實現多態(動態分派)。需遵循「兩同兩小一大」:方法名、參數列表相同;返回類型、拋出異常 ≤ 父類;訪問權限 ≥ 父類。
  • 單繼承: class A extends B,避免菱形繼承問題。C++ 支持多繼承,Java 用接口實現多實現。

2. 關係判斷:「is-a」vs「has-a」

  • is-a(繼承): 「學生是人」→ Student extends Person。滿足里氏替換原則:父類引用可指向子類對象。
  • has-a(組合/聚合): 「人有寵物狗」→ class Person { Dog dog; }、「球隊有球員」→ class Team { List players; }。代碼中最常見,耦合度低於繼承。

判斷技巧: 用「A 是 B」造句,通順則考慮繼承;否則用組合。

3. Java 繼承語法

class Parent {
    private String secret;      // 私有,子類不可直接訪問
    protected int age;          // 保護,子類可見
    public void eat() { ... }   // 公共,可重寫
}

class Child extends Parent {
    // 繼承了 age、eat();secret 不可見
    @Override
    public void eat() {         // 重寫
        System.out.println("Child eating...");
    }
}

4. 關鍵注意事項(必考點、易錯點)

  1. 不要為了復用代碼而濫用繼承: 僅在明確「is-a」關係時使用。工具類、工具方法優先用組合/靜態導入。
  2. 父類私有成員不可繼承: 子類無法直接訪問 private 字段/方法,需通過公共/保護 getter/setter 間接訪問。
  3. 父類構造器不可繼承: 子類必須定義自己的構造器。子類構造器首行默認隱式調用 super()(父類無參構造器)。若父類無無參構造器,子類必須顯式 super(參數) 調用帶參構造器。
  4. 構造器鏈機制: new Child() → Child() → super() → Parent() → Object()。保證父類先初始化,再初始化子類字段。
  5. 字段隱藏非多態: 父子類同名字段,引用類型決定訪問哪個(靜態綁定),非對象類型。

5. 代碼示例:構造器鏈與字段隱藏

class Animal {
    String name = "Animal";
    Animal() { System.out.println("Animal()"); }
    Animal(String name) { this.name = name; System.out.println("Animal(name)"); }
}

class Dog extends Animal {
    String name = "Dog"; // 隱藏父類 name
    Dog() { System.out.println("Dog()"); }
    Dog(String name) { super(name); System.out.println("Dog(name)"); }
    void printNames() {
        System.out.println("this.name=" + this.name);      // Dog
        System.out.println("super.name=" + super.name);    // Animal
    }
}

public class Test {
    public static void main(String[] args) {
        Dog d = new Dog("Buddy");
        // 輸出:
        // Animal(name)
        // Dog(name)
        d.printNames();
    }
}

6. 設計原則建議

  • 組合優於繼承: 《Design Patterns》核心原則。靈活性高、耦合度低、運行時可動態替換行為。
  • 里氏替換原則(LSP): 子類必須能替換父類而不破壞程序正確性。重寫方法不應收縮前置條件、擴大後置條件。
  • 模板方法模式: 父類定義算法骨架,子類實現具體步驟,受控復用。
  • final 封鎖: 不想被繼承的類/方法加 final,如 String、Integer、工具類。

繼承是把雙刃劍:用得好極大提升復用與擴展性,用不好導致脆弱的類層次、強耦合、難以維護。理解其語法機制、構造器鏈、字段隱藏與設計原則,方能駕輕就熟。

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