| 綁定類型 | 別名 | 決策時機 | 典型成員 |
|---|---|---|---|
| 早期綁定 | 靜態綁定 / 編譯期綁定 | 編譯期 | static 方法、final 方法、private 方法、所有字段 |
| 晚期綁定 | 動態綁定 / 運行期綁定 | 運行期 | 非 static/non-final/non-private 實例方法 |
class Base {
public String test = "Base Field";
public static void staticMethod() { System.out.println("Base staticMethod()"); }
public void notStaticMethod() { System.out.println("Base notStaticMethod()"); }
}
public class Derive extends Base {
public String test = "Derive Field";
public static void staticMethod() { System.out.println("Derive staticMethod()"); }
@Override public void notStaticMethod() { System.out.println("Derive notStaticMethod()"); }
public static void testFieldBind(Base b) { System.out.println(b.test); }
public static void testStaticBind(Base b) { b.staticMethod(); }
public static void testDynamicBind(Base b) { b.notStaticMethod(); }
public static void main(String[] args) {
Derive d = new Derive();
testFieldBind(d); // 輸出: Base Field ← 字段早期綁定
testStaticBind(d); // 輸出: Base staticMethod() ← 靜態方法早期綁定
testDynamicBind(d); // 輸出: Derive notStaticMethod() ← 實例方法晚期綁定
}
}
Base b = new Derive(); b.staticMethod() 永遠調用 Base 版本;理解綁定機制,能避免「以為覆蓋了父類字段/靜態方法」這類隱蔽 Bug,也是掌握 JVM 執行引擎的入門鑰匙。