public class Person {
private int age = 1000; // 成員變量
public void setAge(int age) { // 參數 age 為局部變量
age = age; // ❌ 錯誤:局部變量賦值給自身
System.out.println("方法內的年齡: " + age);
}
public void sayHello() {
System.out.println("我的年齡是: " + age); // 訪問成員變量
}
}
public static void main(String[] args) {
Person p = new Person();
p.setAge(20);
p.sayHello();
}
// 輸出:
// 方法內的年齡: 20
// 我的年齡是: 1000 ← 成員變量未被修改!
方法內變量名優先匹配局部變量(參數/內部定義);若無同名局部變量,則匹配成員變量。
age 只代表局部變量,與成員變量無任何關係age 代表成員變量age=1000 在堆內存中初始化age=20 入棧age = age 只是局部變量自賦值,成員變量未被觸碰20 消失1000public class Person {
private int age = 1000;
public void setAge(int age) {
this.age = age; // ✅ this.age 明確指向「當前對象的成員變量」
System.out.println("方法內的年齡: " + age);
}
public void sayHello() {
System.out.println("我的年齡是: " + age); // 這裡 age 隱含 this.age
}
}
// 輸出:
// 方法內的年齡: 20
// 我的年齡是: 20 ← 成員變量成功修改!
public class Person {
private String name;
private int age;
// 構造器鏈式調用
public Person() {
this("匿名", 0); // 必須是第一條語句
}
public Person(String name) {
this(name, 0);
}
public Person(String name, int age) {
this.name = name; // 消歧義
this.age = age;
}
// 返回當前對象,支持鏈式調用
public Person setName(String name) {
this.name = name;
return this;
}
}
// 使用
Person p = new Person().setName("張三").setAge(25);
| 場景 | 建議 |
|---|---|
| Setter 參數同名 | ✅ 必須使用 this.field = field |
| 構造器參數同名 | ✅ 必須使用 this.field = field |
| 無歧義情況 | ⭕ 可省略 this.(IDE 通常提示冗餘) |
| 靜態方法 | ❌ 禁用 this(無當前對象) |
同名變量遮蔽是 Java 語言設計的特性,而非缺陷。理解作用域優先級(局部 > 成員)並善用 this 消歧義,是寫出正確 Java 代碼的基本功。多寫代碼、多調試觀察內存變化,自然能內化為直覺。