Java 的多態機制依賴於動態綁定:基類引用指向子類對象時,調用覆寫方法會根據對象的實際類型在運行時確定具體實現。這是面向對象編程「面向基類編程」的核心。然而,動態綁定在兩種情況下會失效,導致多態無法實現。
private 方法對子類不可見,子類定義同名方法屬於方法隱藏而非覆寫,自然不存在多態。final 方法同理,禁止被覆寫,編譯期即確定調用版本。
靜態方法屬於類級別,而非對象級別。它在編譯階段就根據引用變量的聲明類型綁定,而非運行時的實際類型。請看下面的代碼實證:
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");
}
@Override
public void dynamicMethod() {
System.out.println("Sub dynamicMethod");
}
}
public class StaticPolymorphismTest {
public static void main(String[] args) {
Base obj = new Sub(); // 基類引用指向子類對象
obj.staticMethod(); // 輸出: Base staticMethod
obj.dynamicMethod(); // 輸出: Sub dynamicMethod
}
}
obj.staticMethod() 輸出 Base staticMethod。因為靜態綁定在編譯期根據 Base 類型決定調用 Base.staticMethod()。obj.dynamicMethod() 輸出 Sub dynamicMethod。動態綁定在運行期根據實際對象 Sub 決定調用覆寫版本。obj.staticMethod()),應改用 ClassName.staticMethod(),避免誤導可讀性與維護性。