为什么我不能使用已实现接口的静态方法?

正如专家在Java 8中所知道的那样,接口可以具有静态方法,这些方法本身具有实现。

正如我在相关教程中读到的,实现此类接口的类可以使用其静态方法。但是,我有一个问题,在这里,我用一个比我拥有的更简单的例子来展示它。

public interface Interface1{
    public static void printName(){
        System.out.println("Interface1");
    }
}

当我实现这样的接口时

public class Class1 implements Interface1{
    public void doSomeThing() {
        printName();
    }
}

我遇到编译错误。

The method printName() is undefined for the type Class1

怎么了?


答案 1

从 Java 语言规范中

类 C 从其直接超类继承超类的所有具体方法 m(静态和实例),其所有方法都为真:

  • [...]

类 C 继承自其直接超类和直接超接口的所有抽象和默认 (§9.4) 方法 m,其所有方法均为真:

  • [...]

类不从其超接口继承静态方法。

因此,该方法不会被继承。

您可以静态导入成员

import static com.example.Interface1.printName;
...
printName();

或将其与完全限定的类型名称一起使用

com.example.Interface1.printName();

或导入所属的类型,并使用其短名称调用它printName

import static com.example.Interface1;
...
Interface1.printName();

答案 2

推荐