public class InvokeTest {
char a[] = {'a','b','c'}; // 成員變數 ✅
public static void main(String[] args) {
// char a[] = {'a','b','c'}; // 區域變數 ❌
InvokeTest test = new InvokeTest();
System.out.println(test.a); // 僅能存取成員變數
}
}
| 宣告位置 | 生命週期 | 存取方式 | 範例 |
|---|---|---|---|
| 類別主體 (成員變數) | 物件存活期間 | this.a 或 obj.a | char a[] = ... |
| 方法內部 (區域變數) | 方法執行期間 | 直接用變數名 a | void m() { char a[] = ...; } |
test.a 存取的是 物件的成員變數。若成員變數被註解,類別就沒有 a 這個欄位,編譯器報「找不到符號」。區域變數 a 僅存在於 main 方法堆疊框架中,test 物件完全看不見。
// 方案 1:保留成員變數(需實例化後存取)
public class InvokeTest {
char a[] = {'a','b','c'};
public static void main(String[] args) {
InvokeTest test = new InvokeTest();
System.out.println(test.a); // 輸出: abc
}
}
// 方案 2:改用區域變數(直接在方法內使用)
public class InvokeTest {
public static void main(String[] args) {
char a[] = {'a','b','c'};
System.out.println(a); // 輸出: abc
}
}
Heap (成員變數) Stack (區域變數) +------------------+ +------------------+ | InvokeTest obj | | main() frame | | a → [a,b,c] | | a → [a,b,c] | +------------------+ +------------------+ test.a ✅ 存取得到 直接用 a ✅