this 在非靜態方法內部自動可用,型別為該類別,指向「正在呼叫此方法的物件實例」。無需宣告,三大核心用法:
class PersonInformation {
String name, gender, nationality, address;
int age;
// 參數與成員同名,必須用 this 區分
void PersonInformation(String name, String gender, String nationality, String address, int age) {
this.name = name;
this.gender = gender;
this.nationality = nationality;
this.address = address;
this.age = age;
}
}
若寫 name = name,編譯器視為區域變數自我指派,成員變數因被遮蔽而未初始化。
System.out.println(this); // 隱性呼叫 toString()
otherObject.register(this); // 將自身傳遞給其他物件
class UserInfo {
public UserInfo(String name) {
this(name, generateSerialNumber()); // 呼叫另一個建構子
}
public UserInfo(String name, int number) {
userName = name;
userNumber = number;
}
}
new UserInfo("Wayne") 會自動委派給雙參數建構子,避免程式碼重複。
當子類別成員 (變數/方法) 與父類別同名時,子類別成員優先,父類別成員被遮蔽。super 提供存取管道:
class Country {
String name;
void value() { name = "China"; }
}
class City extends Country {
String name; // 遮蔽父類別 name
void value() {
name = "Hefei"; // 子類別變數
super.value(); // 呼叫父類別方法
System.out.println(name); // Hefei
System.out.println(super.name); // China
}
}
輸出:Hefei / China。若無 super. 前綴,name 與 value() 均指向子類別成員。
class Child extends Parent {
Child(String param) {
super(param); // 顯性呼叫父類別建構子
// 初始化子類別專屬欄位
}
}
若父類別無無參建構子,子類別 必須 以 super(...) 顯性呼叫帶參數建構子,否則編譯錯誤。
| 誤區 | 正確理解 |
|---|---|
this 可在 static 方法使用 | 不可。static 方法無 this 參考 |
super 可存取祖父類別 (super.super) | 不可。Java 不支援多層 super 鏈 |
| 建構子鏈可任意順序呼叫 | this()/super() 必須為建構子第一行,且二擇一 |
| 私有父類別成員可用 super 存取 | 不可。private 成員對子類別不可見,super 也存取不到 |
熟練掌握兩者,是撰寫健壯繼承體系與避免變數遮蔽 Bug 的關鍵基本功。