【JVM虛擬機】類的加載和接口的加載

在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

說明在調用子接口的時候並沒有去加載父接口。

結論:在接口繼承關係中,調用子接口的屬性,並不會去加載父接口。

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