class Person {
Person() { System.out.println("Person 無參構造"); }
Person(String name) { System.out.println("Person 有參: " + name); }
}
class Student extends Person {
Student() {
super(); // 必須為構造器第一行
System.out.println("Student 無參");
}
Student(String name) {
super(name); // 調用父類對應構造器
System.out.println("Student 有參");
}
Student(String name, int age) {
this(name); // 調用本類其他構造器
System.out.println("年齡: " + age);
}
}
鐵律:super() 必須置於構造器第一行;若父類無無參構造,子類必須顯式調用 super(參數)。
class Base { String val = "父類"; void show() { System.out.println(val); } }
class Derived extends Base {
String val = "子類";
void show() {
System.out.println(val); // 子類字段
System.out.println(super.val); // 父類字段
super.show(); // 父類方法
}
}
| 關鍵字 | 指向 | 典型用途 |
|---|---|---|
this | 當前對象實例 | 區分同名字段、調用本類構造器/方法、傳遞當前對象 |
super | 父類對象引用(編譯期解析) | 訪問被遮蔽成員、調用父類構造器/方法 |
class Outer {
void greet() { System.out.println("Outer"); }
class Inner {
void greet() { System.out.println("Inner"); }
void callOuter() { Outer.super.greet(); } // 訪問外部類實例方法
}
}
super(..) 調用父類構造器,必須在構造器首行this(..) 調用本類其他構造器,必須在構造器首行super 訪問父類被隱藏字段/方法this 代表當前對象,消除歧義super(參數)super()/this() 僅能在構造器中使用this 本質是指向當前對象的引用;super 是編譯期關鍵字,非引用super 指向父類實例,OuterClass.super 指向外部類實例| 錯誤代碼 | 原因 | 修正 |
|---|---|---|
super(); ...; this(); |
同一構造器同時調用 super 和 this | 二選一,或通過參數區分調用鏈 |
static 方法中用 super.method() |
靜態上下文無 this/super | 改為實例方法,或用 父類名.靜態方法() |
| 子類構造器不寫 super,父類無無參構造 | 隱式 super() 找不到匹配構造器 | 顯式寫 super(對應參數) |
super 是 繼承體系中的「向上穿透」鑰匙:向上調用構造器、向上訪問被遮蔽成員、向上委派方法實現。配合 this 的「當前對象」語義,構成了 Java 面向對象初始化與調度的雙軸核心。牢記 11 條鐵律,可避開 90% 的繼承相關編譯錯誤與邏輯 Bug。