在JAVA虛擬機中,對於類和接口的加載有不同的處理方式。
在【JVM虛擬機】類的加載,連接和初始化 這篇文章中提到了Java對類的主動使用有7種,其中有一種是初始化一個類的子類
,對於這樣的情況,我們先寫一個案例看看
public class Test5 {
public static void main(String[] args) {
System.out.println(MyChild5.num1);
}
}
class MyParent5 {
static {
System.out.println("MyParent5 invoked");
}
}
class MyChild5 extends MyParent5 {
public static int num1 = 1;
static {
System.out.println("MyChild5 invoked");
}
}
運行結果
MyParent5 invoked
MyChild5 invoked
1
發現,會先執行父類的類,然後執行子類的。
那對於類是這樣的,那接口呢???
相信這裏聯想到上一章關於JVM虛擬機】類的加載之常量池 的內容和接口中屬性的特性,也能聯想到會不會加載父類。 我們先寫個例子看看
/**
* 接口的加載
*/
public class Test4 {
public static void main(String[] args) {
System.out.println(MyChild4.num2);
}
}
interface MyParent4{
public static final Thread thread = new Thread(){
//這個解釋下: 我們之前一直使用的是static{} 靜態代碼塊,
//{} 則是實例代碼塊,當被實例化後,則會執行的。優先於構造函數
{
System.out.println("MyParent4 invoke");
}
};
}
interface MyChild4 extends MyParent4{
public static final int num2 = 2;
}
運行結果看看
2
說明在調用子接口的時候並沒有去加載父接口。
結論:在接口繼承關係中,調用子接口的屬性,並不會去加載父接口。