为什么Java不支持静态方法的动态多态性? 如果答案是“静态方法不应该在实例上调用,因此方法调用不需要在运行时解析”,那么更进一步的问题是:‘为什么Java允许我在实例上调用静态方法?’ 为什么Java不通过给出一些编译时错误来阻止用户直接在实例上调用该方法。
反过来说,如果Java支持静态方法的运行时多态性会有什么问题?
为什么Java不支持静态方法的动态多态性? 如果答案是“静态方法不应该在实例上调用,因此方法调用不需要在运行时解析”,那么更进一步的问题是:‘为什么Java允许我在实例上调用静态方法?’ 为什么Java不通过给出一些编译时错误来阻止用户直接在实例上调用该方法。
反过来说,如果Java支持静态方法的运行时多态性会有什么问题?
Tile
的类都有一个静态的 initialiseGraphicsForClass
方法,而您将类传递给方法)。因此,问题仍然存在;为什么不呢? - Richard Tingleclass A {
static void func() {}
}
class B extends A {
static void func() {}
}
B b = new B();
A a = b;
b.func(); // calls B.func()
a.func(); // same instance, but calls A.func()
动态多态性可以支持方法重写。但是对于静态方法重写来说是不可能的,因为它会导致方法隐藏。因此,动态多态性不支持静态方法。
public static void foo() {
//yadda yadda
}
public void bar() {
foo(); // this is legal
MyClass.foo() // this is also legal, but would be necessary if I couldn't call it through the instance
}
// in some other class:
new MyClass().foo() // this is legal but silly and my IDE warns me about it