理解 Java 類的定義語法與運行時初始化順序,是寫出正確、可預測代碼的基石。本文通過圖解與代碼追蹤,帶你釐清從 .class 載入到物件誕生的完整鏈路。
public class Dog {
// 成員變量(屬性)
String name;
int age;
// 構造器:無返回值、名稱與類同
public Dog(String name, int age) {
this.name = name;
this.age = age;
System.out.println("感謝主人領養了我");
}
// 實例方法
public void bark() { System.out.println("汪汪!"); }
public void hungry() { System.out.println("主人,我餓了"); }
}
| 類型 | 位置 | 生命週期 | 訪問方式 |
|---|---|---|---|
| 局部變量 | 方法/代碼塊內 | 方法執行期間 | 僅在作用域內 |
| 實例變量 | 類中、方法外 | 隨對象創建/銷毀 | obj.field |
| 類變量 | 類中、方法外 + static | 隨類加載/卸載 | Class.field(推薦) |
Dog myDog; // 1. 聲明:引用變量,棧上分配 4/8 字節
myDog = new Dog("花花", 3); // 2. 實例化 + 3. 初始化:堆上分配對象、調用構造器
// 或合寫
Dog myDog = new Dog("花花", 3);
以以下代碼為例:
public class Demo {
private String name = "微學苑"; // ① 實例變量顯式初始化
private int age = 3; // ②
public Demo() { // ③ 構造器
System.out.println("構造器執行");
}
public static void main(String[] args) { // ④ 程序入口
Demo obj = new Demo(); // ⑤ 創建對象
System.out.println(obj.name);
}
}
main 入口(第 ④ 行)new Demo()(第 ⑤ 行)new 表達式返回引用賦給 objmain 後續代碼父類靜態 → 子類靜態 → 父類實例變量/塊 → 父類構造器 → 子類實例變量/塊 → 子類構造器
private/final/static 方法。new Dog("花花", 3)
│
├─▶ 1. 類加載檢查(首次用到才觸發)
│ └─▶ 靜態初始化(只一次)
│
├─▶ 2. 堆內存分配(指針碰撞/空閒列表)
│
├─▶ 3. 零值初始化(默認值)
│
├─▶ 4. 設置對象頭(哈希碼、GC 年齡、類指針、鎖狀態…)
│
├─▶ 5. 實例變量顯式賦值 + 實例初始化塊(按順序)
│
└─▶ 6. 構造器執行( 方法)
│
└─▶ 返回引用地址
清晰掌握初始化順序,能幫你規避 90% 的「字段未初始化」、「循環依賴」、「子類覆寫導致空指針」等隱形坑。建議將本文流程圖收藏,寫構造器時隨時對照。