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