为什么我不能在接口中声明静态方法?

该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么?


public interface ITest {

    public static String test();

}

上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public和abstract”。


慕姐8265434
浏览 946回答 3
3回答

郎朗坤

这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别public interface Foo {  public static int bar();}和public interface Foo {  public static int bar() {    ...  }}出于Espo提到的原因,第一个是不可能的:您不知道哪个实现类是正确的定义。Java 可以允许后者。实际上,从Java 8开始,它确实做到了!

慕妹3146593

接口中不能使用静态方法的原因在于Java解析静态引用的方式。尝试执行静态方法时,Java不会费心寻找类的实例。这是因为静态方法不依赖于实例,因此可以直接从类文件中执行。假设接口中的所有方法都是抽象的,则VM必须寻找该接口的特定实现,以便找到静态方法后面的代码,以便可以执行它。然后,这与静态方法解析的工作方式矛盾,并会在语言中引入不一致之处。

偶然的你

谎言在设计原理的原因,那Java不允许多重继承。下例可以说明多重继承的问题:public class A {   public method x() {...}}public class B {   public method x() {...}}public class C extends A, B { ... }现在,如果您调用Cx()会发生什么?将执行Ax()还是Bx()?具有多重继承的每种语言都必须解决此问题。接口在Java中允许某种受限的多重继承。为避免上述问题,不允许他们使用方法。如果我们在接口和静态方法上看同样的问题:public interface A {   public static method x() {...}}public interface B {   public static method x() {...}}public class C implements A, B { ... }同样的问题在这里,如果调用Cx()会发生什么?
打开App,查看更多内容
随时随地看视频慕课网APP