提问一个类预加载的问题,百思不得其解

提问之前,先请各位大神确认两个观点是否正确:

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 被初始化的时候,才会报错吗?

   求路过的大神能讲解一下,我是不是哪里理解不对。跪谢,跪谢!!

   最后贴上报错信息:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章