首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 陣列宣告位置影響存取:成員變數 vs 區域變數

     編輯:程式設計疑難解答

錯誤程式碼


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.achar a[] = ...
方法內部 (區域變數)方法執行期間直接用變數名 avoid 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 ✅
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved