首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能在接口中声明静态方法?

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

Stack Overflow用户
提问于 2008-08-22 05:16:44
回答 12查看 105.4K关注 0票数 153

这个主题最能说明问题--静态方法不能在接口中声明的原因是什么?

public interface ITest {
    public static String test();
}

上面的代码给了我以下错误(至少在Eclipse中是这样的):“接口方法ITest.test()的非法修饰符;只允许公共和抽象”。

EN

回答 12

Stack Overflow用户

发布于 2008-08-22 05:20:29

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

票数 44
EN

Stack Overflow用户

发布于 2008-08-22 05:19:17

我将用一个例子来回答你的问题。假设我们有一个具有静态方法add的Math类。您可以像这样调用此方法:

Math.add(2, 3);

如果Math是一个接口而不是一个类,它就不能有任何已定义的函数。因此,像Math.add(2,3)这样的语句没有任何意义。

票数 18
EN

Stack Overflow用户

发布于 2008-09-26 08:48:34

原因在于设计原则,即java不允许多重继承。多重继承的问题可以通过下面的示例来说明:

public class A {
   public method x() {...}
}
public class B {
   public method x() {...}
}
public class C extends A, B { ... }

现在,如果调用C.x()会发生什么?将执行A.x()或B.x()?每一种具有多重继承的语言都必须解决这个问题。

在Java中,接口允许某种受限制的多重继承。为了避免上面的问题,他们不允许有方法。如果我们看一下接口和静态方法的相同问题:

public interface A {
   public static method x() {...}
}
public interface B {
   public static method x() {...}
}
public class C implements A, B { ... }

这里也有同样的问题,如果调用C.x()会发生什么?

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档