- 1 1. 介紹
- 2 3. this 的主要使用情境
- 3 4. Important Notes When Using this
- 4 5. Practical Code Examples
- 4.1 5.1 Distinguishing Member and Local Variables
- 4.2 5.2 Constructor Chaining
- 4.3 5.3 Method Chaining
- 4.4 5.4 Passing the Current Instance
- 4.5 6. Frequently Asked Questions (FAQ)
- 4.6 Q1. Do I need to write “this” all the time?
- 4.7 Q2. What happens if I use this inside a static method?
- 4.8 Q3. What is the difference between this and super?
- 4.9 Q4. What is the benefit of returning this in method chaining?
- 4.10 Q5. 如果我在需要時忘記使用 this 會發生什麼?
- 4.11 7. 結論
1. 介紹
當您開始學習 Java 程式設計時,您會遇到各種關鍵字。其中,“this” 在理解類別和物件導向概念中扮演非常重要的角色。然而,因為英文單字 “this” 僅僅意味著「這個/此一」,許多初學者最初會覺得在程式設計中使用它的原因不明確。
這篇文章以清晰且適合初學者的方式,解釋 Java 中的 “this” 關鍵字 的角色和用法。您將學習到重點,例如 區分成員變數和區域變數 以及 在建構子中使用 “this”,並搭配實際的程式碼範例。
我們也會涵蓋常見問題、錯誤以及重要注意事項。閱讀完這份指南後,您將了解 this 關鍵字如何運作,並能從基礎到進階情境自信地使用它。
2. 什麼是 “this” 關鍵字?
在 Java 中,“this” 指的是目前物件本身。當從類別建立一個實例(物件)時,關鍵字 “this” 用來指向該特定物件。
即使從相同類別建立多個物件,每個物件的 this 都指向不同的實例。這有助於在您的程式碼中釐清「目前正在操作哪個物件」。
this 的基本角色
- 存取實例變數和方法 使用
this.變數名稱或this.方法名稱()可以存取特定物件的變數和方法。 - 區分區域變數和實例變數 當建構子參數或方法參數與成員變數名稱相同時,使用 “this” 來區分它們。
為什麼我們需要 “this”?
在 Java 中,您可以從單一類別建立多個物件,每個物件擁有獨立的狀態和行為。在這些物件內部,您需要一種方式來指向「此物件本身」。
這就是 “this” 關鍵字 的作用。
例如,在 Person 類別內部,使用 “this” 可以表達「此特定 Person 物件」。
摘要
“this” 是物件導向程式設計中非常重要的概念。它作為一座橋樑,讓物件能夠存取自己的資料和行為。
3. this 的主要使用情境
“this” 關鍵字在 Java 中會出現在許多地方。以下是搭配程式碼範例的代表性例子。
3.1 區分成員變數與區域變數
Java 經常使用相同的名稱來作為建構子參數和成員變數。在這種情況下,“this” 用來區分它們。 範例:區分成員變數與區域變數
public class Student {
private String name;
public Student(String name) {
this.name = name; // Left: member variable, Right: constructor parameter
}
}
如果省略 this,區域變數會優先,導致成員變數無法正確賦值。
3.2 在建構子中使用 this
Java 允許透過建構子過載來建立多個建構子。您可以使用 this() 來呼叫另一個建構子,以減少重複程式碼。 範例:使用 this() 呼叫另一個建構子
public class Book {
private String title;
private int price;
public Book(String title) {
this(title, 0); // calls another constructor
}
public Book(String title, int price) {
this.title = title;
this.price = price;
}
}
這有助於集中初始化邏輯並避免重複程式碼。
3.3 方法鏈結
傳回 this 可以讓您在相同實例上連續呼叫方法。 範例:方法鏈結
public class Person {
private String name;
private int age;
public Person setName(String name) {
this.name = name;
return this;
}
public Person setAge(int age) {
this.age = age;
return this;
}
}
// Method chaining
Person p = new Person().setName("佐藤").setAge(25);
這在建構者模式和設定類別中被廣泛使用。
3.4 Passing the Current Instance
You can use “this” when you need to pass the current instance to another method or class. Example: Passing the current object
public class Printer {
public void print(Person person) {
System.out.println(person);
}
}
public class Person {
public void show(Printer printer) {
printer.print(this); // passes this instance
}
}
4. Important Notes When Using this
Although very useful, “this” must be used carefully to avoid errors.
4.1 this Cannot Be Used in static Contexts
A static method or variable belongs to the class itself—not to an instance—so “this” cannot be used. Invalid example
public class Example {
private int value;
public static void printValue() {
// System.out.println(this.value); // Compile error
}
}
4.2 Overusing this Can Reduce Readability
Using “this” unnecessarily may make the code harder to read. Use it only when needed. Example of unnecessary usage
public class Test {
private int x;
public void setX(int x) {
this.x = x; // needed
// this.x = this.x + 1; // excessive use
}
}
4.3 Do Not Confuse this With super
- this → the current instance
- super → the parent (superclass)
Example: Using this vs super
public class Parent {
public void greet() {
System.out.println("Parent method");
}
}
public class Child extends Parent {
public void greet() {
System.out.println("Child method");
super.greet();
}
}
5. Practical Code Examples
5.1 Distinguishing Member and Local Variables
public class Account {
private String owner;
public Account(String owner) {
this.owner = owner;
}
public void printOwner() {
System.out.println("Account Owner: " + this.owner);
}
}

5.2 Constructor Chaining
public class Rectangle {
private int width;
private int height;
public Rectangle(int width) {
this(width, 1);
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public void printSize() {
System.out.println("Size: " + width + " x " + height);
}
}
5.3 Method Chaining
public class BuilderExample {
private String name;
private int age;
public BuilderExample setName(String name) {
this.name = name;
return this;
}
public BuilderExample setAge(int age) {
this.age = age;
return this;
}
public void printInfo() {
System.out.println("Name: " + name + ", Age: " + age);
}
}
BuilderExample person = new BuilderExample().setName("山田").setAge(30);
person.printInfo();
5.4 Passing the Current Instance
public class Notifier {
public void notifyUser(User user) {
System.out.println(user.getName() + " has been notified.");
}
}
public class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return this.name; }
public void sendNotification(Notifier notifier) {
notifier.notifyUser(this);
}
}
Notifier notifier = new Notifier();
User user = new User("佐藤");
user.sendNotification(notifier);
6. Frequently Asked Questions (FAQ)
Q1. Do I need to write “this” all the time?
A. Not always. Use it when:
- local and member variable names overlap
- you want to explicitly reference the current instance
Q2. What happens if I use this inside a static method?
A. You will get a compile error. Static methods belong to the class, not an instance.
Q3. What is the difference between this and super?
- this : the current instance
- super : the parent class
Q4. What is the benefit of returning this in method chaining?
它允許在同一個實例上連續呼叫,提升可讀性。
Q5. 如果我在需要時忘記使用 this 會發生什麼?
局部變數可能會覆寫成員變數,導致指派錯誤與程式錯誤。
7. 結論
本文說明了 Java 「this」關鍵字,從基礎到實務運用。你學到了:
- 如何區分成員變數與局部變數
- 如何將建構子邏輯集中化
- 如何建立方法鏈
- 如何將當前實例傳遞給其他方法
我們也討論了以下重要注意事項:
- 「this」不能在 static(靜態)環境中使用
- 不要過度使用「this」
- 正確地與「super」搭配使用
了解「this」的運作方式,能讓你的 Java 類別設計更清晰、減少錯誤。持續探索 Java 基礎,並在實際程式碼中運用這些概念。
