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

Java 繼承機制深度解析:super 呼叫、欄位遮蔽與建構子鏈

     編輯:Java 相關知識

繼承是物件導向三大特性之一,但初學者常在「父類建構子呼叫時機」、「同名欄位存取」與「super 關鍵字用法」上產生困惑。本文透過一個完整範例,逐步拆解 Java 繼承的關鍵細節。

程式碼範例

class A {
    int num = 0;               // 父類實例欄位
    public A(int i) {          // 父類帶參數建構子
        System.out.println("aaaaaaaaaaaaaaaaaaa");
        System.out.println("i = " + i);
        num = i;               // 將參數賦值給父類欄位
    }
}

class B extends A {
    int num = 0;               // 子類同名欄位(遮蔽父類)
    public B() {
        super(10);             // 顯式呼叫父類建構子,必須為第一行
        System.out.println("bbbbbbbbbbbbbbbbbbbb");
        System.out.println("num = " + num);       // 存取子類欄位
        System.out.println("super.num = " + super.num); // 存取父類欄位
    }
}

public class C {
    public static void main(String[] args) {
        new B();               // 建立子類實例,觸發建構子鏈
    }
}

執行流程圖解

  1. new B() 呼叫子類無參建構子。
  2. 子類建構子第一行 super(10) 顯式呼叫父類 A(int) 建構子。
  3. 父類建構子執行:列印訊息,將 10 賦值給 A.num。
  4. 返回子類建構子繼續執行:列印訊息,存取 B.num(預設 0)與 super.num(已被設為 10)。

三大核心觀念

1. 建構子鏈與 super() 呼叫規則

  • 子類建構子必須在第一行呼叫父類建構子(super(...) 或隱式 super())。
  • 若父類沒有無參建構子,子類必須顯式呼叫帶參數的 super(...),否則編譯錯誤。
  • 父類建構子完成初始化後,子類建構子才繼續執行,確保「由父至子」的初始化順序。

2. 欄位遮蔽而非覆寫

B 類宣告 int num = 0 並不會覆寫父類的 num,而是在子類建立新欄位「遮蔽」父類同名欄位。

  • this.num / num → 存取子類欄位(預設 0)。
  • super.num → 存取父類欄位(已被父類建構子設為 10)。
  • 方法若被覆寫則走動態繫結;欄位永遠靜態繫結,取決於宣告類型。

3. 實例化時的記憶體佈局

建立 B 實例時,堆上會配置一個物件,內含父類欄位與子類欄位兩塊區域:

+---------------------+
| A part: num = 10    |  ← 父類欄位
+---------------------+
| B part: num = 0     |  ← 子類欄位(遮蔽)
+---------------------+

常見錯誤與最佳實務

錯誤寫法問題正確做法
子類建構子未呼叫 super(),父類無無參建構子編譯失敗顯式 super(參數) 呼叫對應父類建構子
誤以為子類欄位會覆蓋父類欄位值邏輯錯誤,兩欄位並存用 super.field 明確存取父類欄位;避免同名欄位
在父類建構子中呼叫可被覆寫的方法子類欄位尚未初始化,導致 NPE 或錯誤行為父類建構子只呼叫 final/private/static 方法

總結

掌握 super 呼叫時機、欄位遮蔽機制與建構子鏈順序,是寫出正確、可維護繼承體系的基石。實務上建議:

  • 父類提供明確的建構子,避免依賴預設無參建構子。
  • 子類欄位命名避免與父類同名,必要時用 super.field 區分。
  • 建構子中勿呼叫非 final 方法,防止初始化順序缺陷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved