`this` 是**當前物件的隱含參考**,編譯器在非靜態方法/構造器中隱式傳遞。簡單說:**誰呼叫方法,this 就指向誰**。
public class ThisDemo {
private String name = "類別欄位";
public void setName(String name) { // 參數 name 遮蔽欄位 name
System.out.println("參數 name = " + name); // 區域變數
System.out.println("欄位 this.name = " + this.name); // 實例欄位
this.name = name; // 賦值給欄位
}
public static void main(String[] args) {
new ThisDemo().setName("方法參數");
}
}
✅ **慣例**:建構器/Setter 參數與欄位同名,配合 `this.` 賦值,語義清晰。
public class ChainDemo {
private int x, y, z;
public ChainDemo() { this(0); } // 呼叫單參版
public ChainDemo(int x) { this(x, 0); } // 呼叫雙參版
public ChainDemo(int x, int y) { this(x, y, 0); } // 呼叫三參版
public ChainDemo(int x, int y, int z) { // 真正初始化
this.x = x; this.y = y; this.z = z;
}
// ❌ 編譯錯誤:this() 必須是第一行
// public ChainDemo(int x) { int a=1; this(x,0); }
}
✅ **優點**:減少重複初始化碼,單一維護點,確保物件一致性。
public class BuilderDemo {
private String name;
private int age;
public BuilderDemo setName(String name) { this.name = name; return this; }
public BuilderDemo setAge(int age) { this.age = age; return this; }
public void build() { System.out.println(name + " " + age); }
public static void main(String[] args) {
new BuilderDemo().setName("Tom").setAge(18).build(); // 鏈式呼叫
}
}
✅ **應用**:Builder 模式、StringBuilder、Stream API、JPA CriteriaBuilder 皆採此模式。
public class StaticTrap {
static void test() {
// System.out.println(this); // 編譯錯誤:non-static variable this cannot be referenced from a static context
// this.hashCode(); // 同上
}
void instanceMethod() { System.out.println(this); } // 合法
}
public class Outer {
private String name = "Outer";
class Inner {
private String name = "Inner";
void print() {
System.out.println(name); // Inner.name
System.out.println(this.name); // Inner.name
System.out.println(Outer.this.name); // Outer.name (外部類.this)
}
}
}
| 場景 | 建議 | 理由 |
|---|---|---|
| 建構器/Setter 參數同名 | 必加 this. | 消除歧義、IDE 可自動生成 |
| 構造器重載 | 使用 this(...) 鏈式呼叫 | DRY、單一初始化入口 |
| 流式 API 設計 | 返回 this | 鏈式呼叫、可讀性高 |
| 內部類存取外部實例 | Outer.this.欄位 | 明確指定作用域 |
| Lambda/匿名類 | this 指向外部實例 (非函數本身) | Java Lambda 無自身 this |
| static 方法 | 絕不使用 this | 編譯錯誤、語義錯誤 |