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

Java super 關鍵字深度解析:構造器鏈、方法調用與隱藏字段訪問全景指南

     編輯:Java 程式設計入門

super 是 Java 中訪問父類成員的核心關鍵字,涉及構造器鏈調用、方法重寫後的父方法調用、隱藏字段訪問三大核心場景。本文通過代碼實戰徹底講透 super 的語義、限制與最佳實踐。

核心語法速覽

用法語法位置限制典型場景
調用父構造器super(...)子類構造器第一行初始化父類狀態,構造器鏈
調用父方法super.method()實例方法任意處擴展父邏輯、模板方法模式
訪問父字段super.field實例方法/構造器子類字段隱藏父類同名字段時

場景一:構造器鏈與 super(...)

class Animal {
    protected String name;
    public Animal(String name) { this.name = name; }
}

class Cat extends Animal {
    private int lives;
    
    // ✅ 正確:第一行顯式調用父構造器
    public Cat(String name, int lives) {
        super(name);           // 必須在第一行
        this.lives = lives;
    }
    
    // ✅ 正確:無參構造器隱式調用 super()
    public Cat() {
        super("Unknown");      // 顯式調用帶參父構造器
        this.lives = 9;
    }
    
    // ❌ 錯誤:super() 不在第一行
    // public Cat(String name) { this.lives = 9; super(name); } // 編譯報錯
}

關鍵規則:

  • 子類構造器必須調用父構造器(顯式 super(...) 或隱式 super())。
  • 若父類無無參構造器,子類必須顯式調用帶參 super(...)。
  • super(...) 與 this(...) 互斥,只能二選一,且必須在第一行。

場景二:重寫方法中調用 super.method()

class Logger {
    public void log(String msg) {
        System.out.println("[INFO] " + msg);
    }
}

class TimestampLogger extends Logger {
    @Override
    public void log(String msg) {
        super.log("[" + Instant.now() + "] " + msg); // 擴展而非完全替換
    }
}

這是模板方法模式的基礎:父類定義骨架,子類通過 super 復用通用邏輯並注入差異化行為。

場景三:字段隱藏與 super.field

class Base {
    protected int value = 10;
}

class Derived extends Base {
    private int value = 20; // 隱藏父類 value
    
    public void printBoth() {
        System.out.println("this.value = " + this.value); // 20
        System.out.println("super.value = " + super.value); // 10
    }
}

最佳實踐:避免字段隱藏(易混淆),改用不同命名或封裝 getter/setter。

構造器鏈執行順序圖解

new Cat("Kitty", 7)
   │
   ├─ Cat(String, int) 第一行:super("Kitty")
   │       │
   │       └─ Animal(String) 執行:this.name = "Kitty"
   │
   └─ Cat 構造器繼續:this.lives = 7

內存分配只發生一次(new Cat 觸發),構造器鏈只是在同一塊內存上依次初始化父類與子類字段,無多次分配。

常見誤區與避坑

  1. 靜態方法不可用 super:static 方法屬於類,無 this/super 語境。
  2. 接口默認方法調用 super:Java 8+ 接口默認方法用 InterfaceName.super.method() 語法。
  3. 構造器中調用可重寫方法風險:父構造器調用被子類重寫的方法時,子類字段尚未初始化,易引發 NPE 或邏輯錯誤。

總結

super 是連接子類與父類的橋樑:構造器鏈保證初始化順序,方法調用實現邏輯復用,字段訪問解決隱藏衝突。牢記「構造器第一行、靜態不可用、字段慎隱藏」,即可靈活駕馭繼承體系。

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