Java 中的多態性依賴於動態綁定(Dynamic Binding),即根據對象的實際類型在運行時決定調用哪個方法。然而,static 修飾的方法在編譯期即根據引用類型綁定,與對象實際類型無關,因此不具備多態性。
class Base {
public static void staticMethod() { System.out.println("Base staticMethod"); }
public void dynamicMethod() { System.out.println("Base dynamicMethod"); }
}
class Sub extends Base {
public static void staticMethod() { System.out.println("Sub staticMethod"); }
public void dynamicMethod() { System.out.println("Sub dynamicMethod"); }
}
public class Test {
public static void main(String[] args) {
Base obj = new Sub();
obj.staticMethod(); // 輸出: Base staticMethod
obj.dynamicMethod(); // 輸出: Sub dynamicMethod
}
}
| 調用方式 | 輸出結果 | 綁定時機 | 綁定依據 |
|---|---|---|---|
obj.staticMethod() | Base staticMethod | 編譯期 | 引用類型 Base |
obj.dynamicMethod() | Sub dynamicMethod | 運行期 | 實際對象類型 Sub |
obj.staticMethod() 解析為 Base.staticMethod()(等同於 Base.class.getMethod("staticMethod").invoke(null))。@Override 註解用於靜態方法會編譯報錯。private 或 final 修飾:不可見或不可覆寫,自然無多態。static 修飾:編譯期靜態綁定,阻斷動態分派。類名.靜態方法() 形式。靜態方法綁定於類,而非實例;編譯期根據引用類型解析,運行期不再動態分派。這是 Java 語言規範決定的行為,理解此機制有助於避免常見的多態誤用陷阱,編寫更清晰、可維護的代碼。