Java this 關鍵字
this 關鍵字代表當前物件的參考,用於在類別內部存取當前物件的成員。
基本用法
區分成員變數和參數
當參數名稱與成員變數同名時,使用 this 區分:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name; // this.name 是成員變數,name 是參數
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
不使用 this 會導致問題:
public Person(String name, int age) {
name = name; // ✗ 這只是把參數賦值給自己
age = age; // ✗ 成員變數沒有被設定
}
在方法中使用
public class Counter {
private int count = 0;
public void increment() {
this.count++; // 存取當前物件的 count
}
public int getCount() {
return this.count;
}
}
在沒有命名衝突時,
this可以省略
呼叫同類別的方法
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int addThree(int a, int b, int c) {
return this.add(a, b) + c; // 呼叫同類別的 add 方法
}
public void display() {
int result = this.addThree(1, 2, 3);
System.out.println("結果:" + result);
}
}
建構子鏈結 (Constructor Chaining)
使用 this() 呼叫同類別的其他建構子:
public class Person {
private String name;
private int age;
private String email;
// 主建構子
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// 呼叫主建構子
public Person(String name, int age) {
this(name, age, null); // 呼叫三參數建構子
}
// 呼叫兩參數建構子
public Person(String name) {
this(name, 0); // 呼叫兩參數建構子
}
// 預設建構子
public Person() {
this("Unknown"); // 呼叫一參數建構子
}
}
注意事項
this() 必須是建構子的第一行:
public Person(String name) {
System.out.println("建立中..."); // ✗ 編譯錯誤
this(name, 0);
}
正確寫法:
public Person(String name) {
this(name, 0); // ✓ 必須是第一行
System.out.println("建立完成");
}
回傳當前物件
回傳 this 可以實現方法鏈(Method Chaining):
public class StringBuilder2 {
private String value = "";
public StringBuilder2 append(String s) {
this.value += s;
return this; // 回傳當前物件
}
public StringBuilder2 appendLine(String s) {
this.value += s + "\n";
return this;
}
public String toString() {
return this.value;
}
}
// 使用方法鏈
String result = new StringBuilder2()
.append("Hello")
.append(" ")
.append("World")
.appendLine("!")
.toString();
Builder 模式
public class User {
private String name;
private int age;
private String email;
private User() {}
public static class Builder {
private String name;
private int age;
private String email;
public Builder name(String name) {
this.name = name;
return this; // 回傳 Builder 本身
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public User build() {
User user = new User();
user.name = this.name;
user.age = this.age;
user.email = this.email;
return user;
}
}
}
// 使用
User user = new User.Builder()
.name("Alice")
.age(25)
.email("alice@example.com")
.build();
作為參數傳遞
將當前物件作為參數傳給其他方法:
public class Event {
private Object source;
public Event(Object source) {
this.source = source;
}
public Object getSource() {
return source;
}
}
public class Button {
private String name;
public Button(String name) {
this.name = name;
}
public void click() {
Event event = new Event(this); // 傳遞當前物件
handleEvent(event);
}
private void handleEvent(Event event) {
Button btn = (Button) event.getSource();
System.out.println(btn.name + " 被點擊");
}
}
內部類別中的 this
在內部類別中,使用 外部類別.this 存取外部類別的實例:
public class Outer {
private String message = "外部訊息";
public class Inner {
private String message = "內部訊息";
public void show() {
String message = "區域訊息";
System.out.println(message); // 區域變數
System.out.println(this.message); // 內部類別成員
System.out.println(Outer.this.message); // 外部類別成員
}
}
}
this 不能用的情況
靜態方法中不能使用 this
public class MyClass {
private int value = 10;
public static void staticMethod() {
// System.out.println(this.value); // ✗ 編譯錯誤
// 靜態方法沒有「當前物件」的概念
}
}
靜態區塊中不能使用 this
public class MyClass {
private int value;
static {
// this.value = 10; // ✗ 編譯錯誤
}
}
比較 this 和 super
| 關鍵字 | 用途 |
|---|---|
this | 參考當前物件 |
super | 參考父類別 |
this() | 呼叫同類別建構子 |
super() | 呼叫父類別建構子 |
this.member | 存取當前類別成員 |
super.member | 存取父類別成員 |
更多說明請參考 Java super 關鍵字。
重點整理
this代表當前物件的參考- 用於區分成員變數和參數/區域變數
this()呼叫同類別的其他建構子- 回傳
this可以實現方法鏈 - 可以將
this作為參數傳遞 - 內部類別用
外部類別.this存取外部實例 - 靜態方法和靜態區塊中不能使用
this