在初始化类之前,必须先初始化其直接超类,但不初始化由该类实现的接口。同样,在初始化接口之前,不会初始化接口的超级接口。
出于我自己的好奇心,我尝试了一下,并且未如预期的那样对接口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语言规范中是否缺少这种情况?我错过了什么吗?还是我误解了?
interface
在Java中不应定义任何具体方法。所以我很惊讶InterfaceType
代码已经编译。
default
方法。