![](/img/trans.png)
[英]Why are methods of extended interface not visible in class that implements extending interface?
[英]Why interface methods can't be static in class that implements the interface?
让我们假设我有这样的代码:
public interface JustAnInterface {
void doSomething();
}
public class JustAnInterfaceImplementation implements JustAnInterface {
@Override
public static void doSomething() {
}
}
为什么static doSomething()
方法显示错误“ 方法不覆盖其超类的方法 ”?
有人可能会这样说:因为@Override和static根本就没有合在一起。
请记住:多态性仅适用于非静态方法。 static表示您的方法“附加”到包含类。
换句话说:您在编译时了解静态方法调用的所有内容。 但是确定调用哪个重写方法的过程在运行时发生。 这两个概念在Java中没有结合在一起。
所有什么GhostCat说的是正确的,但@Override
注释不是编译错误的直接原因。
即使删除它,该方法在编译时也无效。
您不能通过在派生类中添加static
修饰符来覆盖或实现方法,因为重写/实现仅对实例方法有效。
尝试没有注释:
public class JustAnInterfaceImplementation implements JustAnInterface {
public static void doSomething() {
}
}
编译错误比使用@Override
的编译错误更具体
方法不会覆盖或实现超类型的方法
你应该得到类似的东西:
覆盖方法是静态的
静态和非静态方法具有不同的签名,而不仅仅是因为static
。
非静态方法偷偷服用额外的参数-值this
。
如果你熟悉python,你可以明确地看到:
class SomeClass(object):
def doSomething(self):
pass // whatever method body
这里, self
参数只是一个常规参数:您可以调用该方法并自己传递此参数。
在Java中,它有点相同。 当你调用doSomething
方法时,你隐式地将一个参数传递给它, this
变成了this
。
但是,静态方法采用零参数。 实际上,它们不是覆盖等价的,因此您没有正确地覆盖该方法。
JVM必须以某种方式确定应该丢弃该参数。 语言可能是为了允许这样做而写的,但是设计师采取了更简单的方法来禁止它(因为没有充分的理由使用它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.