繁体   English   中英

为什么接口方法在实现接口的类中不能是静态的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM