提問之前,先請各位大神確認兩個觀點是否正確:
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 被初始化的時候,纔會報錯嗎?
求路過的大神能講解一下,我是不是哪裏理解不對。跪謝,跪謝!!
最後貼上報錯信息: