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

3
假设我有以下代码:
public interface JustAnInterface {
    void doSomething();
}

public class JustAnInterfaceImplementation implements JustAnInterface {

    @Override
    public static void doSomething() {

    }
}

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

7
因为接口中定义的方法是非静态的,所以你的问题基本上是循环的。 - user207421
1
通常情况下,静态方法没有被重写的意义。它们属于定义它们的类,并且仅在该类中存在,不构成层次结构的一部分。 - Michael
1
方法签名与接口不同。 - seenukarthi
1
因为你不能有两个具有相同签名的方法,其中一个是静态的,另一个是非静态的。请记住,拥有非静态方法是必需的,因为你正在实现接口,所以像 Interface in = new YourImplementation(); in.interfaceMethod(); 这样的代码总是有效的。 - Pshemo
1
静态方法是“早期绑定”,静态方法调用的实现在编译时已知。接口方法的调用是“晚期绑定”,实现只有在运行时才知道。 - lance-java
1
我很感激您的超快速接受;-) - GhostCat
3个回答

7

可以这么说:由于@Override和static根本不搭配。

请记住:多态仅适用于非静态方法。 static表示您的方法“附加”到包含类中。

换句话说:在编译时,您对static方法调用的所有内容都已知。但是,在运行时确定要调用哪个重写方法的过程发生。这两个概念在Java中不兼容。


2
所有GhostCat所说的都是正确的,但@Override注解并不是编译错误的直接原因。
即使删除它,该方法在编译时也无效。
您不能通过在派生类中添加static修饰符来覆盖或实现方法,因为覆盖/实现仅适用于实例方法。
请尝试不使用注解:
public class JustAnInterfaceImplementation implements JustAnInterface {

    public static void doSomething() {

    }
}

如果使用 @Override 关键字,编译错误会更加具体。

方法不重写或实现超类型的方法

你应该会得到类似以下的提示信息:

重写的方法是静态的


1
静态方法和非静态方法有不同的签名,这并不仅仅是因为 "static"。非静态方法秘密地带有一个额外的参数 - "this" 的值。
如果您熟悉 Python,则可以明确地看到这一点:
class SomeClass(object):
  def doSomething(self):
    pass // whatever method body

在这里,self参数只是一个普通的参数:您可以调用该方法并自己传递此参数。
在Java中,它有点类似。当您调用doSomething方法时,隐式传递一个参数,并且该参数成为this
但是,静态方法不接受任何参数。因此,它们实际上不是覆盖等效的,因此您无法正确地覆盖该方法。
JVM必须以某种方式确定应该丢弃该参数。语言可以编写允许此操作,但设计者采取了更简单的路线,即禁止使用它(因为没有好的理由使用它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接