| 維度 | 靜態變量 | 成員變量 | 局部變量 |
|---|---|---|---|
| 所屬 | 類(類變量) | 對象(實例變量) | 方法/代碼塊 |
| 內存位置 | 方法區/元空間 | 堆內存 | 棧內存 |
| 生命週期 | 類加載~類卸載 | 對象創建~對象銷毀 | 方法調用~方法結束 |
| 調用方式 | 類名/對象名 | 對象名 | 僅方法內部 |
| 默認值 | 有 | 有 | 無(必須顯式初始化) |
| 作用域 | 全局可見 | 對象內部可見 | 塊級作用域 |
public class VariableDemo {
// 靜態變量
static String staticVar = "靜態變量";
// 成員變量
String instanceVar = "成員變量";
public void method() {
// 局部變量
String localVar = "局部變量";
// 就近原則:局部變量遮蔽同名成員變量
String instanceVar = "方法內同名變量";
System.out.println(instanceVar); // 輸出:方法內同名變量
System.out.println(this.instanceVar); // 輸出:成員變量
}
public static void main(String[] args) {
// 靜態變量調用
System.out.println(VariableDemo.staticVar); // ✅ 類名調用
System.out.println(new VariableDemo().staticVar); // ✅ 對象名調用(不推薦)
// 成員變量調用
VariableDemo obj = new VariableDemo();
System.out.println(obj.instanceVar); // ✅ 必須對象名調用
// System.out.println(VariableDemo.instanceVar); // ❌ 編譯錯誤
obj.method();
}
}
JVM 內存結構: ┌─────────────────────────────────────┐ │ 方法區 / 元空間 │ ← 靜態變量、類信息、常量池 │ (Class Metadata, Static Fields) │ ├─────────────────────────────────────┤ │ 堆 │ ← 成員變量(對象實例數據) │ (Object Instances, Arrays) │ ├─────────────────────────────────────┤ │ 棧 │ ← 局部變量、方法幀、引用指針 │ (Stack Frames, Local Variables) │ └─────────────────────────────────────┘
類加載 ──► 靜態變量初始化 ──► 類初始化完成
│
▼
new Object() ──► 分配堆內存 ──► 成員變量默認值 ──► 構造器賦值 ──► 對象就緒
│
▼
方法調用 ──► 棧幀入棧 ──► 局部變量分配(無默認值) ──► 顯式賦值 ──► 使用
│
▼
方法返回 ──► 棧幀出棧 ──► 局部變量銷毀
│
▼
對象不可達 ──► GC 標記 ──► 成員變量隨對象回收
│
▼
類卸載 ──► 靜態變量銷毀
int x; System.out.println(x); 編譯報錯this. 區分三類變量在存儲位置、生命週期、訪問權限、初始化規則上本質不同。理解底層內存模型,能寫出更高效、線程安全、易維護的代碼。記住口訣:靜態屬類存方法區,成員屬對象存堆裡,局部屬方法存棧中,默認值只有前兩類。