在Java 8之前,您无法在foo()中定义Y.foo()方法。此问题对此进行了大量讨论。 我将参考此答案(由用户@ JamesA.Rosen来确定),为什么Java设计人员最初可能不希望在Y中使用X方法:

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

public interface Foo {
public static int bar();
}

public interface Foo {
public static int bar() {
...
}
}

Java不允许任何一种,但可以允许第二种。 首先是 由于Espo提到的原因,这是不可能的:您不知道 实现类是正确的定义。

Java可以允许后者,只要它将Interfaces视为 一流的对象。 Ruby的模块,大约是 等效于Java的接口,允许完全:

module Foo

def self.bar

...

end

end

但是,自Java 8发行以来,您实际上可以在X内添加Y.foo()和foo()方法。

我将在这里大量引用此资源。 这是最初的问题:

Java的界面语言功能使您可以使用 抽象方法并在其中提供这些方法的实现 实现接口的类。 您需要实施 每种方法,当有很多方法要 实行。 此外,发布界面后,您将无法添加新 无需中断源代码和二进制文件的抽象方法 兼容性。

这是Java 8提供的解决方案Y.foo():

Java 8通过改进接口来解决这些问题 默认和静态方法。 默认方法是实例方法 在其方法头以默认值开头的接口中定义 关键词; 它还提供了代码体。 每个实现 interface继承接口的默认方法,并且可以覆盖 他们

对于Y.foo():

静态方法是与其中的类相关联的方法 它是定义的,而不是使用从该类创建的任何对象定义的。 该类的每个实例都共享该类的静态方法。 Java 8还允许在接口中定义静态方法的地方 可以辅助默认方法。

当您实现包含静态方法的接口时, 静态方法仍然是接口的一部分,而不是接口的一部分 实现类。 因此,您不能在方法前添加前缀 类名。 相反,必须在方法的前面加上接口 名称

例:

interface X
{
static void foo()
{
System.out.println("foo");
}
}
class Y implements X
{
}
public class Z
{
public static void main(String[] args)
{
X.foo();
// Y.foo(); // won't compile
}
}

表达式Y.foo()将不会编译,因为foo()是静态成员 接口X的名称,而不是类Y的静态成员。