this 是 Java 實例方法中指向當前對象的隱式引用,核心作用:消除字段/參數同名歧義、實現鏈式調用、構造器之間調用。本文通過代碼實戰與內存模型圖解,徹底講透 this 的三大核心場景與常見誤區。
public class ThisDemo {
private String name = "Mick"; // 實例字段
public void print(String name) { // 局部參數同名
System.out.println("字段 name = " + this.name); // this. 訪問字段
System.out.println("參數 name = " + name); // 直接訪問參數
}
public static void main(String[] args) {
new ThisDemo().print("Orson");
}
}
// 輸出:
// 字段 name = Mick
// 參數 name = Orson
規則:作用域最近原則——局部變量遮蔽同名字段,this.field 強制訪問字段。
public class Counter {
private int count = 0;
public Counter increment() {
count++;
return this; // 返回當前對象引用
}
public void print() {
System.out.println("count = " + count);
}
public static void main(String[] args) {
new Counter().increment().increment().increment().print(); // 輸出 3
}
}
這是 Builder 模式、流式 API(如 StringBuilder.append()、Stream)的核心機制。
this(...)
public class User {
private String name;
private int age;
// 主構造器(全參)
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 便利構造器:委托主構造器
public User(String name) {
this(name, 18); // 必須在第一行
}
public User() {
this("Anonymous", 0);
}
}
關鍵規則:
this(...) 必須在構造器第一行。this(...) 與 super(...) 互斥,二選一。許多開發者誤以為 this(...) 會創建多個對象。實際上:
new User("Alice")
│
├─ User(String) 第一行:this("Alice", 18)
│ │
│ └─ User(String, int) 執行:this.name="Alice"; this.age=18
│
└─ User(String) 繼續:無其他語句
public class Outer {
private int value = 10;
class Inner {
private int value = 20;
public void print() {
System.out.println("Inner.value = " + this.value); // 20
System.out.println("Outer.value = " + Outer.this.value); // 10
}
}
}
Outer.this 語法精確訪問外部類實例,解決內部類字段遮蔽問題。
this 是實例方法的隱式上下文引用:
✅ this.field 消除遮蔽
✅ return this 支持鏈式調用
✅ this(...) 構造器委托復用初始化邏輯
✅ Outer.this 內部類訪問外部實例
掌握這四大模式,即可靈活駕馭 Java 對象自引用機制。