資料分類:依宣告位置區分
| 類別 | 宣告位置 | 作用域 | 生命週期 | 預設值 |
| 資料成員 (Field) | 類別主體內、方法外 | 整個類別(視權限可跨類) | 隨物件建立/銷毀;static 隨類別載入/卸載 | 有:0、false、null 等 |
| 區域變數 (Local Variable) | 方法/建構子/區塊內 | 僅限該方法/區塊內 | 方法執行時建立,結束即回收 | 無(必須显式初始化) |
程式碼範例
package com.csst.test;
public class TestData {
// 1. 資料成員
private int x;
private int y;
public void test(int y) { // 參數 y 也是區域變數
// 2. 區域變數
int z; // 未初始化,直接用會編譯錯誤
this.y = y; // this.y 為資料成員,y 為參數
System.out.println(x); // 輸出 0 (int 預設值)
// System.out.println(z); // 編譯錯誤:variable z might not have been initialized
}
}
七大差異總結
- 存取修飾詞:資料成員可用
public/protected/private;區域變數不可。
- static 修飾詞:資料成員可用;區域變數不可(Java 無靜態區域變數)。
- 資料型別:兩者皆支援所有型別(基本型別、參考型別)。
- 預設值:資料成員有預設值;區域變數必須手動初始化,否則編譯失敗。
- 作用域:資料成員屬於類別層級;區域變數侷限於方法/區塊。
- 生命週期:資料成員隨物件/類別;區域變數隨方法呼叫/返回。
- 同名遮蔽:區域變數/參數與資料成員同名時,直接寫名稱指向區域變數,需用
this.field 存取資料成員。
記憶體圖示
Stack (執行緒私有) Heap (共享)
┌─────────────────────┐ ┌─────────────────────┐
│ main() │ │ TestData object │
│ - args │ │ x = 0 (field) │
│ test() │ │ y = 0 (field) │
│ - y (parameter) │ └─────────────────────┘
│ - z (local var) │
└─────────────────────┘
常見錯誤與最佳實踐
| 錯誤 | 正確做法 |
| 區域變數未初始化即使用 | 宣告時賦值:int z = 0; |
忘記 this. 導致邏輯錯誤 | 養成 this.field 區分資料成員 |
| 濫用 static 造成共享狀態 Bug | 非必要勿用 static,優先實例欄位 |
| 公開資料成員破壞封裝 | 私有欄位 + public getter/setter |
結語
理解「資料成員 vs 區域變數」是掌握 Java 物件導向基石。牢記:位置決定作用域,初始化規則不同,同名用 this 區分,即可避開 90% 的新手陷阱。