this 是 Java 中引用當前對象實例的隱式參數,贯穿構造器、方法、初始化塊全生命周期。掌握其三大核心用法——消除變量遮蔽、構造器鏈調用、返回當前實例,是編寫清晰、健壯、支持鏈式調用代碼的關鍵。
public class Student {
private String name; // 成員變量(屬性)
public void setName(String name) { // 參數名與成員變量同名
// name = name; // 錯誤!自我賦值,成員變量未被修改
this.name = name; // 正確:this.name 明確指向成員變量
}
}
編譯器規則:作用域內同名變量,局部變量(參數/方法內定義)遮蔽成員變量。無 this 時默認引用局部變量。
public void process(String name) {
String name = "local"; // 編譯錯誤!參數已在作用域內,不可重複定義同名局部變量
// 正確場景:代碼塊內定義同名局部變量
{
String name = "block-local"; // 合法,遮蔽參數
this.name = name; // 明確賦值給成員變量
}
}
this.(IDE 可自動生成),消除歧義,閱讀代碼時一眼區分成員與局部newName、nameParam 或前綴 aName/pNamethis.field = param,無替代方案this(...)this(...) 或 super(...)public class Student {
private String id;
private String name;
private int age;
private String major;
private String email;
// 全參構造器:核心初始化邏輯集中地
public Student(String id, String name, int age, String major, String email) {
this.id = id;
this.name = name;
this.age = age;
this.major = major;
this.email = email;
}
// 便利構造器:委託給全參構造器,提供默認值
public Student(String id, String name) {
this(id, name, 18, "Undeclared", "unknown@school.edu");
}
public Student(String id, String name, int age) {
this(id, name, age, "Undeclared", "unknown@school.edu");
}
public Student(String id, String name, String major) {
this(id, name, 18, major, "unknown@school.edu");
}
}
優勢:初始化邏輯單一來源、減少重複代碼、易維護、支持不可變對象構建。
public class BadExample {
public BadExample() { this("default"); }
public BadExample(String s) { this(); } // 循環調用 → StackOverflowError
}
public class StringBuilder {
private char[] buffer;
private int length;
public StringBuilder append(String str) {
// 追加邏輯...
return this; // 返回當前實例,支持鏈式調用
}
}
// 使用:new StringBuilder().append("A").append("B").append("C");
public class User {
private final String username;
private final String email;
private final int age;
private final String address;
private User(Builder builder) {
this.username = builder.username;
this.email = builder.email;
this.age = builder.age;
this.address = builder.address;
}
public static class Builder {
private String username;
private String email;
private int age;
private String address;
public Builder username(String username) { this.username = username; return this; }
public Builder email(String email) { this.email = email; return this; }
public Builder age(int age) { this.age = age; return this; }
public Builder address(String address) { this.address = address; return this; }
public User build() { return new User(this); }
}
}
// 使用:User user = new User.Builder().username("john").email("j@x.com").age(25).build();
this 的方法不應修改對象狀態(除非是 Builder 等可變構建器)this| 場景 | this 指向 | 訪問外部類實例 |
|---|---|---|
| 普通內部類 | 內部類實例 | OuterClass.this |
| 靜態內部類 | 無 this(靜態上下文) | 不可直接訪問,需傳入外部實例 |
| 匿名內部類 | 匿名類實例 | OuterClass.this |
| Lambda 表達式 | 外部類實例(語法糖) | 直接使用 this 即外部類實例 |
public class Outer {
private String value = "outer";
public void demo() {
// 匿名內部類
Runnable r1 = new Runnable() {
@Override public void run() {
System.out.println(this); // 匿名類實例
System.out.println(Outer.this.value); // 訪問外部類
}
};
// Lambda
Runnable r2 = () -> {
System.out.println(this); // 外部類實例!
System.out.println(value); // 直接訪問
};
}
}
this.field = paramthis(...) 委託return this;this 指向 → 內部類用 Outer.this,Lambda 直接用 thisthis. 或始終不加(推薦加)
this看似簡單,實則貫穿對象生命周期。
善用this,代碼更清晰、更安全、更具表達力。