2017-08-09 75 views
3

让我们假设我有这样的代码:为什么接口方法在实现接口的类中不能是静态的?

public interface JustAnInterface { 
    void doSomething(); 
} 

public class JustAnInterfaceImplementation implements JustAnInterface { 

    @Override 
    public static void doSomething() { 

    } 
} 

为什么static doSomething()方法显示错误“方法不从其超覆盖法”?

+7

因为在接口中定义的方法是非静态的。你的问题基本上是循环的。 – EJP

+1

静态方法通常无效。它们属于它们所定义的类别,仅属于该类别,并不构成层次结构的一部分。 – Michael

+1

方法签名与接口不同。 –

回答

5

可以这样说:因为@Override和静态根本就不在一起。

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

换句话说:你知道关于静态方法调用在编译时的一切。但确定哪个重写方法调用的过程发生在运行时。 Java中这两个概念并不一致。

1

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必须以某种方式确定该参数应该丢弃。这种语言本来可以写成允许的,但设计师采取了简单的禁止它的路线(因为无论如何都没有理由使用它)。

相关问题