假设我有这样的代码:
public interface JustAnInterface {
void doSomething();
}
public class JustAnInterfaceImplementation implements JustAnInterface {
@Override
public static void doSomething() {
}
}
为什么static doSomething()
方法显示错误" 方法不会覆盖超类中的方法"?
答案 0 :(得分:6)
有人可以这样说:因为@Override和静态根本就不能一起使用。
请记住:多态性仅适用于非静态方法。 静态表示您的方法“附加”到包含的类。
换句话说:您在编译时了解有关 static 方法调用的所有内容。但是确定要调用哪个重写方法的过程在运行时发生。这两个概念在Java中没有结合在一起。
答案 1 :(得分:2)
GhostCat说的所有内容都是正确的,但@Override
注释不是编译错误的直接原因。
即使删除它,该方法在编译时也无效。
您无法通过在派生类中添加static
修饰符来覆盖或实现方法,因为重写/实现仅对实例方法有效。
尝试没有注释:
public class JustAnInterfaceImplementation implements JustAnInterface {
public static void doSomething() {
}
}
编译错误比具有@Override
方法不会覆盖或实现超类型
中的方法
你应该得到类似的东西:
覆盖方法是静态的
答案 2 :(得分:1)
静态和非静态方法具有不同的签名,而不仅仅是因为static
。
非静态方法秘密采用额外参数 - this
的值。
如果您熟悉python,可以明确地看到:
class SomeClass(object):
def doSomething(self):
pass // whatever method body
这里,self
参数只是一个常规参数:您可以调用该方法并自行传递此参数。
在Java中,它有点相同。当您调用doSomething
方法时,您隐式地将一个参数传递给它,并且它变为this
。
但是,静态方法需要零参数。实际上,它们并不是覆盖等价的,因此您不能正确地覆盖该方法。
JVM必须以某种方式确定应该丢弃该参数。这种语言可能是为了实现这一目的而写的,但是设计师采取了更简单的方法来禁止它(因为无论如何都没有充分的理由使用它)。