何时初始化具有默认方法的接口?
在初始化类之前,必须初始化其直接超类,但不会初始化该类实现的接口。同样,在初始化接口之前,接口的超接口不会初始化。
出于我自己的好奇心,我尝试了一下,正如预期的那样,界面没有初始化。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
换句话说,接口的字段被初始化(详细初始化过程中的步骤 9),并且正在初始化的类型初始值设定项被执行。这意味着接口已初始化。static
static
我在JLS中找不到任何东西来表明这应该发生。不要误会我的意思,我知道这应该发生在实现类没有为方法提供实现的情况下,但是如果它这样做呢?Java语言规范中是否缺少此条件,我是否遗漏了某些内容,或者我错误地解释了它?