`super` **可用於所有非私有、非靜態的父類成員** (方法、欄位、建構子),**不限於建構子**。
| 父類成員 | 子類中 super.可否呼叫 | 說明 |
|---|---|---|
| public 方法 | ✅ 是 | 直接 `super.method()` |
| protected 方法 | ✅ 是 | 同包或子類可見 |
| default (包私有) 方法 | ✅ 是 (同包) | 不同包不可見 |
| private 方法 | ❌ 否 | 子類不可見,無法 override 也無法 super 呼叫 |
| static 方法 | ❌ 不建議 | 屬於類別,非實例;`super.staticMethod()` 編譯通過但語意混淆,應用 `ParentClass.staticMethod()` |
| 建構子 | ✅ 僅限子類建構子首行 `super(...)` | 非建構子中不可呼叫建構子 |
| 實例欄位 | ✅ 是 | `super.field` 存取被遮蔽的父類欄位 |
package com.example;
class Country {
String name;
void value() { name = "China"; } // default
}
class City extends Country {
String name;
void value() {
name = "Beijing";
super.value(); // ✅ 同包可呼叫 default 方法
System.out.println("City name: " + name);
System.out.println("Country name: " + super.name);
}
public static void main(String[] args) {
new City().value();
}
}
// 輸出:
// City name: Beijing
// Country name: China