在搜索 Java 语言规范以回答 这个问题时,我学习了 那个
在初始化一个类之前,它的直接超类必须是 初始化为 < strong > ,但类实现的接口不是 类似地,接口的超级接口不是 在接口初始化之前初始化。
出于我自己的好奇心,我尝试了一下,正如预期的那样,接口 InterfaceType
没有初始化。
public class Example {
public static void main(String[] args) throws Exception {
InterfaceType foo = new InterfaceTypeImpl();
foo.method();
}
}
class InterfaceTypeImpl implements InterfaceType {
@Override
public void method() {
System.out.println("implemented method");
}
}
class ClassInitializer {
static {
System.out.println("static initializer");
}
}
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public void method();
}
这个节目打印
implemented method
但是,如果接口声明了一个 default
方法,那么初始化就会发生
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
那么上面的程序就会打印出来
static initializer
implemented method
换句话说,接口的 static
字段被初始化(详细初始化程序的第9步) ,被初始化类型的 static
初始化器被执行。这意味着接口已初始化。
我在 JLS 中找不到任何迹象表明会发生这种情况。不要误解我的意思,我知道如果实现类没有为方法提供实现,那么应该会发生这种情况,但是如果它提供了实现呢?Java 语言规范中是否遗漏了这个条件,我是否遗漏了什么,或者我是否错误地解释了它?