所以我知道在 Java 中,当你有一个静态方法时,你应该使用 ClassName.method()
格式调用它,而不是使用与实例方法相同的结构,即:
ClassName myObject = new ClassName();
myObject.method();
但是,如果您这样做,它仍然是有效代码并且可以工作。假设我决定在有问题的方法是静态的情况下执行此操作,并具有以下设置:
public SuperClass {
public static int foo(int x) {
return x;
}
}
public SubClass extends SuperClass {
public static int foo(int x) { // Overriding foo() in SuperClass
return x + 1;
}
}
public MyDriver {
public static void main(String[] args) {
SuperClass myObject = new SubClass(); // Upcasting.
System.out.println(myObject.foo(5)); // This should polymorphically print 6
}
}
然而,屏幕上打印出的是 5 而不是 6。为什么?
最佳答案
静态方法仅适用于定义它们的类,并且不能被覆盖。
当你调用 myObject.foo(5)
时,你实际上是在调用 SuperClass.foo(5)
,因为你声明了 myObject
作为 SuperClass
,无论您是否将其实例化为一个。
调用静态方法的正确方法是直接从声明它的类中调用它,所以如果你想调用 SubClass.foo()
,你必须 从显式声明的 SubClass
实例中调用它(意味着没有 向上转换),或者您需要像这样调用 SubClass.foo()
。
简单的答案是,从实例调用静态方法的计算结果是从没有实例而不是实例类型的声明类型调用这些相同的方法。
我不确定这一点,但如果当代码被编译成字节码时,实例静态方法调用实际上会被编译成对声明类型的直接调用,我不会感到惊讶。
编辑:一个赞成票让我的注意力重新回到了这个问题上,我清理了解释以使其更清楚,并修复了一些微不足道的语法错误。我希望这对 future 的读者有所帮助。
关于java - 继承Java中的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18039457/