为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2019-11-08 10:49:30
该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么?public interface ITest {    public static String test();}上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public和abstract”。
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别


public interface Foo {

  public static int bar();

}


public interface Foo {

  public static int bar() {

    ...

  }

}

出于Espo提到的原因,第一个是不可能的:您不知道哪个实现类是正确的定义。


Java 可以允许后者。实际上,从Java 8开始,它确实做到了!


查看完整回答
反对 回复 2019-11-08
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-11-08
?
偶然的你

TA贡献1841条经验 获得超3个赞

谎言在设计原理的原因,那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()会发生什么?


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 945 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信