super 是 Java 中引用父類對象的關鍵字,配合 this (當前對象) 構成繼承體系的雙核引用。本文通過代碼實戰、內存佈局圖解、構造器鏈機制、字段遮蔽與方法重寫場景,徹底講透 super 的三大核心用法與底層原理。
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。
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
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();
}
}
new ChildClass():分配對象,包含 Father 部分 (value=0) 和 Child 部分 (value=0)。super.f():進入 Father.f(),this 指向 Father 部分,設置 value=100。value=200:this 指向 Child 部分,設置 Child.value=200。| 特性 | this | super |
|---|---|---|
| 指向 | 當前對象 (完整子類實例) | 當前對象的父類部分 |
| 訪問字段 | 子類字段 (遮蔽後) | 父類字段 (被遮蔽的) |
| 調用方法 | 子類重寫後方法 (多態) | 父類原始方法 (非多態) |
| 調用構造器 | this(...) 本類其他構造器 | super(...) 父類構造器 |
| 靜態上下文 | 不可用 | 不可用 |
super.super.method() 非法。Java 不支持跨級調用祖父類方法。super() 可寫在非首行。必須首行,否則編譯錯誤。private,提供 getter/setter,避免遮蔽混淆。super.method(),語義清晰。super 是繼承體系中連接父子類的關鍵橋樑。理解「對象內存包含父類部分」這一本質,即可輕松掌握字段訪問、方法調用、構造器鏈三大核心場景,寫出清晰、正確的面向對象代碼。