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

时间:2017-08-09 10:35:29

标签: java inheritance static interface-implementation

假设我有这样的代码:

public interface JustAnInterface {
    void doSomething();
}

public class JustAnInterfaceImplementation implements JustAnInterface {

    @Override
    public static void doSomething() {

    }
}

为什么static doSomething()方法显示错误" 方法不会覆盖超类中的方法"?

3 个答案:

答案 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必须以某种方式确定应该丢弃该参数。这种语言可能是为了实现这一目的而写的,但是设计师采取了更简单的方法来禁止它(因为无论如何都没有充分的理由使用它)。