在一个类被初始化之前,它的直接超类必须被初始化,但该类实现的接口没有被初始化。类似地,接口的超接口在接口初始化之前不会被初始化。
出于自己的好奇,我试了一下,果然,界面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
方法,那么就会发生初始化。考虑InterfaceType
给出的接口为
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 语言规范中是否缺少此条件,是我遗漏了什么,还是我错误地解释了它?