这个主题最能说明问题--静态方法不能在接口中声明的原因是什么?
public interface ITest {
public static String test();
}
上面的代码给了我以下错误(至少在Eclipse中是这样的):“接口方法ITest.test()的非法修饰符;只允许公共和抽象”。
发布于 2008-08-22 05:20:29
不能在接口中使用静态方法的原因在于Java解析静态引用的方式。在尝试执行静态方法时,Java不会费心查找类的实例。这是因为静态方法不依赖于实例,因此可以直接从类文件执行。假设接口中的所有方法都是抽象的,VM将必须查找接口的特定实现,以便找到静态方法背后的代码,以便可以执行它。这就与静态方法解析的工作方式相矛盾,并会给语言带来不一致。
发布于 2008-08-22 05:19:17
我将用一个例子来回答你的问题。假设我们有一个具有静态方法add的Math类。您可以像这样调用此方法:
Math.add(2, 3);
如果Math是一个接口而不是一个类,它就不能有任何已定义的函数。因此,像Math.add(2,3)这样的语句没有任何意义。
发布于 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()会发生什么?
https://stackoverflow.com/questions/21817
复制相似问题