this 和 super 是 Java 中兩個重要的引用關鍵字,分別用於引用當前對象和父類對象。理解它們的用法對於掌握繼承、多態、構造器鏈至關重要。
super 指向當前對象的父類(超類)引用,主要用途:
super.field 訪問父類字段。super.method() 調用父類實現。super(...) 必須是構造器第一條語句。class FatherClass {
public int value = 100;
public void f() {
value = 100;
System.out.println("FatherClass.value=" + value);
}
}
class ChildClass extends FatherClass {
public int value = 200; // 隱藏父類 value
public void f() {
super.f(); // 調用父類 f()
value = 200;
System.out.println("ChildClass.value=" + value);
System.out.println(value); // 200(子類)
System.out.println(super.value); // 100(父類)
}
}
public class TestInherit {
public static void main(String[] args) {
ChildClass cc = new ChildClass();
cc.f();
}
}
輸出:
FatherClass.value=100
ChildClass.value=200
200
100
this 代表當前對象的引用,主要用途:
this.field 指代字段。this(...) 調用本類其他構造器,必須為第一條語句。public class DotLoc {
double X, Y, Z;
// 參數與字段不同名,無需 this
public DotLoc(double XX, double YY, double ZZ) {
X = XX; Y = YY; Z = ZZ;
}
// 參數與字段同名,必須用 this 區分
public DotLoc(double X, double Y, double Z) {
this.X = X; this.Y = Y; this.Z = Z;
}
}
public class Person {
String name;
int age;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this(name); // 調用單參構造器
this.age = age;
}
}
| 特性 | this | super |
|---|---|---|
| 指向 | 當前對象 | 父類對象(當前對象的父類部分) |
| 訪問字段 | 本類字段(含繼承來的) | 父類被隱藏的字段 |
| 調用方法 | 本類方法(含繼承、覆蓋後的) | 父類被覆蓋的方法 |
| 構造器調用 | this(...) 調用本類其他構造器 | super(...) 調用父類構造器 |
| 可用位置 | 非靜態上下文(方法、構造器、實例初始化塊) | 非靜態上下文 |
| 靜態方法中 | 不可用 | 不可用 |
super(),編譯器默認插入無參 super();若寫了 this(),則由被調用構造器負責調用 super()。this 引用。this 用於當前對象內部引用,解決同名遮蔽、構造器復用、鏈式調用;super 用於子類訪問父類被隱藏/覆蓋的成員,維繫繼承鏈。熟練掌握二者是編寫清晰、正確面向對象代碼的基礎。