提问之前,先请各位大神确认两个观点是否正确:
1、一个类被初始化,该类实现的接口不会被初始化;
2、虚拟机对于类有预加载机制,即判断到某个类将要被使用的时候,会预先加载它,但是如果类的.class文件缺失或者错误,并不会报错,而是等到该类首次被主动使用的时候才会报错,否则一直不会报错,我的理解是,如果出现加载异常,那么该类直到初始化的时候才会报错。
我一直深信我的观点,直到我遇到一段代码:
public class TestOq3 {
public static void main(String[] args) {
System.out.println(Child3.b);
}
}
interface Parent09 {
String a = "2";
}
class Child3 implements Parent09{
public static String b = "3";
}
System.out.println(Child3.b) 调用Child3.b的静态属性,会触发 Child3 类的初始化,按照第一个观点,不会引发 Parent09 这个接口的初始化。然而,我把编译之后的 Parent09.class文件删掉,再运行的时候,竟然会报错:java.lang.NoClassDefFoundError,文件找不到我理解,毕竟我把 Parent09.class 文件删掉了,但是我不理解的是,接口 Parent09 既然没有被主动使用,为啥就报错了呢?按照第二种观点,不应该是等到 Parent09 被初始化的时候,才会报错吗?
求路过的大神能讲解一下,我是不是哪里理解不对。跪谢,跪谢!!
最后贴上报错信息: