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

Java super 關鍵字深度解析:訪問父類字段、調用父類方法、構造器鏈、內存模型圖解

     編輯:Java 相關知識

super 是 Java 中引用父類對象的關鍵字,配合 this (當前對象) 構成繼承體系的雙核引用。本文通過代碼實戰、內存佈局圖解、構造器鏈機制、字段遮蔽與方法重寫場景,徹底講透 super 的三大核心用法與底層原理。

核心概念

  • this:當前對象引用,在構造器/實例方法中隱式可用。
  • super:當前對象內部的父類對象部分的引用。子類實例化時,堆內存包含「父類對象區」+「子類擴展區」。

三大用法

1. 訪問父類字段 (字段遮蔽場景)


class Father {
    public int value = 100;
}
class Child extends Father {
    public int value = 200; // 遮蔽父類字段

    public void print() {
        System.out.println("Child.value = " + value);       // 200 (this.value)
        System.out.println("Father.value = " + super.value); // 100
    }
}

內存圖解:
Child 對象內存佈局:
[Father part: value=100] [Child part: value=200]
super.value 定位到 Father part,this.value 定位到 Child part。

2. 調用父類方法 (方法重寫場景)


class Father {
    public void show() { System.out.println("Father show"); }
}
class Child extends Father {
    @Override
    public void show() {
        super.show(); // 顯式調用父類實現
        System.out.println("Child show");
    }
}

輸出:
Father show
Child show

3. 調用父類構造器 (構造器鏈)

  • 子類構造器首行必須調用 super(...) 或 this(...)。
  • 未顯式寫時,編譯器隱式插入 super() (調用父類無參構造器)。
  • 父類無無參構造器時,子類必須顯式調用帶參 super(...)。

class Father {
    private String name;
    public Father(String name) { this.name = name; }
}
class Child extends Father {
    private int age;
    public Child(String name, int age) {
        super(name); // 必須顯式調用父類帶參構造器
        this.age = age;
    }
}

完整實戰代碼與內存演變


class FatherClass {
    public int value;
    public void f() { value = 100; System.out.println("Father f, value=" + value); }
}
class ChildClass extends FatherClass {
    public int value; // 遮蔽
    @Override
    public void f() {
        super.f();          // 1. 調用父類 f(),父類 value=100
        value = 200;        // 2. 設置子類 value=200
        System.out.println("Child value=" + value);       // 200
        System.out.println("Father value=" + super.value); // 100
    }
}
public class Test {
    public static void main(String[] args) {
        ChildClass cc = new ChildClass();
        cc.f();
    }
}

內存演變步驟

  1. new ChildClass():分配對象,包含 Father 部分 (value=0) 和 Child 部分 (value=0)。
  2. super.f():進入 Father.f(),this 指向 Father 部分,設置 value=100。
  3. value=200:this 指向 Child 部分,設置 Child.value=200。
  4. 打印驗證兩部分互不干擾。

super vs this 對比表

特性thissuper
指向當前對象 (完整子類實例)當前對象的父類部分
訪問字段子類字段 (遮蔽後)父類字段 (被遮蔽的)
調用方法子類重寫後方法 (多態)父類原始方法 (非多態)
調用構造器this(...) 本類其他構造器super(...) 父類構造器
靜態上下文不可用不可用

常見誤區與最佳實踐

  1. 誤區:super.super.method() 非法。Java 不支持跨級調用祖父類方法。
  2. 誤區:構造器中 super() 可寫在非首行。必須首行,否則編譯錯誤。
  3. 最佳實踐:字段盡量 private,提供 getter/setter,避免遮蔽混淆。
  4. 最佳實踐:重寫方法需複用父類邏輯時,首行調用 super.method(),語義清晰。
  5. 最佳實踐:構造器鏈確保父類狀態正確初始化,不可跳過。

super 是繼承體系中連接父子類的關鍵橋樑。理解「對象內存包含父類部分」這一本質,即可輕松掌握字段訪問、方法調用、構造器鏈三大核心場景,寫出清晰、正確的面向對象代碼。

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