this 是 Java 物件導向核心關鍵字,代表「當前物件」。本文系統整理四大使用場景、原理機制、程式碼範例與避坑指南,幫助開發者徹底掌握。
當建立物件時,JVM 會為其分配一個指向自身的參考指標,即 this。誰呼叫方法,this 就指向誰。這是理解所有用法的基礎。
class Student {
private String name;
public void setName(String name) {
name = name; // 錯誤:區域變數指派給區域變數,成員變數未被修改
}
}
執行結果:姓名:null
public void setName(String name) {
this.name = name; // this.name 明確指向成員變數
}
規則:當區域變數(含形式參數)與成員變數同名時,區域變數遮蔽成員變數。必須用 this.成員變數名 存取成員變數。
this(參數列表) — 必須置於建構子第一行。
class Student {
private String name;
private int age;
public Student() {
System.out.println("新物件實例化");
}
public Student(String name) {
this(); // 呼叫無參建構子
this.name = name;
}
public Student(String name, int age) {
this(name); // 呼叫單參建構子
this.age = age;
}
}
public void setName(String name) {
this.name = name;
this.print(); // 呼叫同類別的 print 方法
}
public void print() {
System.out.println("設定相關資訊...");
}
雖無同名衝突也可使用 this.方法名(),提升程式碼可讀性:一眼辨識出呼叫的是成員方法而非區域函式。
public Student setName(String name) {
this.name = name;
return this; // 支援 student.setName("A").setAge(20);
}
public boolean compare(Student stu) {
Student s1 = this; // 當前物件
Student s2 = stu; // 傳入物件
if (s1 == s2) return true; // 同一記憶體位址
return this.name.equals(stu.name) && this.age == stu.age;
}
public class Car {
public Car getCarObject() {
return this; // 傳回當前 Car 物件
}
}
| 誤區 | 正確觀念 |
|---|---|
| 靜態方法中使用 this | 靜態方法屬於類別,無 this 參考,編譯錯誤 |
| 建構子中 this() 不在第一行 | 編譯錯誤:必須最先執行以完成初始化鏈 |
| 所有建構子都用 this() 串聯 | 會造成遞迴循環,至少保留一個基底建構子 |
| 以為 this 是物件複製 | this 是參考(指標),非複製品 |
this.成員:解決同名遮蔽,明確存取成員。this(參數):建構子鏈,消除重複初始化碼。this 作為參考傳回:支援方法鏈、物件比較、回呼傳遞。善用 this 能讓程式碼更規範、簡潔、靈活,是 Java 開發者必備的基本功。