不支持Java中静态方法的动态多态的原因

Tus*_*kar 3 java polymorphism static-methods overriding

为什么Java不支持静态方法的动态多态?如果答案是"静态方法不应该在实例上调用,因此不需要在运行时解析方法调用",那么进一步的问题是"为什么Java允许我在实例上调用静态方法?".为什么不直接通过给出一些编译时错误来阻止用户直接调用实例上的方法.

反过来说,如果Java支持静态方法的Runtime Polymorphism会出什么问题?

Bra*_*raj 7

为什么Java允许我在实例上调用静态方法?

你的假设是错误的.它从不调用类的实例.它总是叫上课.

尝试下面的示例代码,你永远不会得到 NullPointerException

class ABC {
    public static void hello() {
        System.out.println("Hello");
    }
}

ABC abc = null;
abc.hello(); 
Run Code Online (Sandbox Code Playgroud)

如果Java支持静态方法的Runtime Polymorphism,会出现什么问题?

当你重写子类中的方法时,多态性就会出现.因为静态方法属于类,所以没有覆盖静态方法的意义.因此,多态性总是适用于仅属于类实例的方法.

  • 虽然这都是真的; 有可能构造一个适用于静态方法的自一致继承模型(并且在某些情况下可能是有用的 - 例如,每个扩展`Tile`的类都有一个静态`initialiseGraphicsForClass`方法,你将一个类传递给一个方法).所以问题仍然存在; 为什么不? (2认同)