在定義類、方法、變量之前使用它們。Java 允許向前引用,C++ 則要求先聲明。
class MyClass {
void method() {
System.out.println(myvar); // 向前引用 myvar
}
String myvar = "var value"; // 後定義
}
class MyClass {
int method() { return n; } // ① 向前引用 n
int m = method(); // ② 初始化 m,調用 method()
int n = 1; // ③ 初始化 n
}
System.out.println(new MyClass().method()); // 輸出 1 ✅
System.out.println(new MyClass().m); // 輸出 0 ❌(預期 1)
初始化 m 時(階段二),調用 method() → 讀取 n → 符號表中 n 仍為階段一的默認值 0 → 返回 0 → m=0。
隨後階段二繼續執行 n=1,符號表 n 更新為 1,但 m 已固化為 0。
class MyClass {
int method() { return n; }
int n = 1; // 先初始化 n
int m = method(); // 再初始化 m,此時 n 已為 1
}
System.out.println(new MyClass().m); // 輸出 1 ✅
理解符號表雙階段機制,是避開 Java 初始化陷阱的關鍵!