`this` 是 Java 中引用「當前對象」的關鍵字,看似簡單,實則貫穿對象生命週期的三大核心場景。本文通過代碼示例深度解析 **字段遮蔽消除**、**構造器鏈調用**、**鏈式調用返回** 三大用法,並探討構造器鏈中的內存分配機制。
當局部變量(參數)與實例字段同名時,`this.field` 明確指向實例字段。
public class ThisDemo {
private String name = "Default";
public void print(String name) { // 參數遮蔽字段
System.out.println("實例字段: " + this.name); // this.name → 實例字段
System.out.println("局部參數: " + name); // name → 參數
}
public static void main(String[] args) {
new ThisDemo().print("Custom");
}
}
// 輸出:
// 實例字段: Default
// 局部參數: Custom
最佳實踐:構造器、Setter 參數名與字段同名時,**慣用 `this.field = field`**,IDE 可自動生成。
在構造器中調用 `this(...)` **必須是第一條語句**,實現多構造器復用初始化邏輯。
public class ThisDemo {
private String name;
private int age;
// 無參構造器:默認初始化
public ThisDemo() {
this.age = 18; // 默認年齡
}
// 全參構造器:復用無參 + 覆蓋 name
public ThisDemo(String name, int age) {
this(); // 必須第一行:調用無參構造器
this.name = name; // 覆蓋 name
// age 已由 this() 初始化,若需覆蓋:this.age = age;
}
public void print() {
System.out.println("Name: " + name + ", Age: " + age);
}
public static void main(String[] args) {
new ThisDemo("Alice", 25).print(); // Name: Alice, Age: 18 (age 未覆蓋)
new ThisDemo("Bob", 30) {{ this.age = 30; }}.print(); // 匿名內部類演示覆蓋
}
}
這正是文章原作者疑惑的答案:雖有兩個構造器參與,但只有一個對象、一塊內存,最終字段均屬於同一對象。
方法返回 `this`,支持流式 API 設計(Builder、StringBuilder、JDBC、Stream)。
public class ThisDemo {
private int number = 0;
public ThisDemo increment() {
number++;
return this; // 返回當前對象
}
public void print() {
System.out.println("Number: " + number);
}
public static void main(String[] args) {
new ThisDemo()
.increment()
.increment()
.increment()
.print(); // Number: 3
}
}
public class User {
private String username;
private String email;
private int age;
private User(Builder builder) {
this.username = builder.username;
this.email = builder.email;
this.age = builder.age;
}
public static class Builder {
private String username;
private String email;
private int age;
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 User build() {
return new User(this); // 構造器鏈:Builder → User 私有構造器
}
}
public static void main(String[] args) {
User user = new User.Builder()
.username("alice")
.email("alice@example.com")
.age(25)
.build();
}
}
| 用法 | 核心語法 | 核心場景 | 關鍵約束 |
|---|---|---|---|
| 消除遮蔽 | `this.field` | 構造器/Setter 參數同名 | 無 |
| 構造器鏈 | `this(...)` | 多構造器復用初始化邏輯 | 必須為構造器第一條語句 |
| 鏈式調用 | `return this` | Builder、流式 API、配置對象 | 方法返回類型為當前類 |
掌握 `this` 三大用法,是寫出**清晰、復用、流暢** Java 代碼的基礎功力。