定義在類別中、方法外部,描述物件屬性(如汽車的顏色、輪胎數)。生命週期隨物件:存放於堆記憶體,有預設初始值(int 為 0、引用為 null)。
定義在方法、建構子、程式區塊內部(如 for(int i=0;...) 中的 i)。作用域僅限所在區塊,存放於棧記憶體,無預設值,必須顯式初始化才能使用。
Java 採用就近原則:先找區域範圍,再找成員範圍。當區域變數與成員變數同名時,區域變數會遮蔽成員變數,在該作用域內無法直接存取成員變數。
public class Person {
private int age = 1000; // 成員變數
public void setAge(int age) { // 參數 age 為區域變數
age = age; // 區域變數自我賦值,成員變數未被修改!
System.out.println("方法內的年齡 " + age); // 輸出 20
}
public void sayHello() {
System.out.println("我的年齡是 " + age + "."); // 輸出 1000
}
}
// 測試
Person p = new Person();
p.setAge(20);
p.sayHello();
// 輸出:
// 方法內的年齡 20
// 我的年齡是 1000.
this 代表當前物件實例,可精確指向成員變數。
public void setAge(int age) {
this.age = age; // 明確賦值給成員變數
System.out.println("方法內的年齡 " + age);
}
// 再次執行:
// 方法內的年齡 20
// 我的年齡是 20.
| 特性 | 成員變數 | 區域變數 |
|---|---|---|
| 定義位置 | 類別內、方法外 | 方法/區塊內 |
| 儲存區域 | 堆記憶體 | 棧記憶體 |
| 生命週期 | 隨物件建立/銷毀 | 隨作用域進入/離開 |
| 預設值 | 有 | 無(必須初始化) |
| 存取範圍 | 全類別可見 | 僅所在區塊 |
mAge、_age)或依慣例使用 this.age。this 是標準慣用語。newAge、inputAge),減少認知負擔。「同名遮蔽」是 Java 初學者常踩的坑,本質是作用域解析規則導致。掌握 this 的語義、記憶體模型差異,並養成良好命名習慣,即可徹底避免此類問題。