主動引用和被動引用

 Java初始化,有且只有5種場景,會導致初始化

1)遇到new,getstatic,putstatic,invokestatic 這四條字節碼指令時。

2)使用java.lang.reflect包的方法對類進行反射調用時。

3)初始化子類,其父類還未初始化

4)虛擬機啓動,指定主類

5)java.lang.invoke.MethodHandler 實例最後解析結果REF_getStatic,REF_putStatic,Ref_invokeStatic方法句柄,且對應類未被初始化

主動引用:導致類初始化的五種對類引用場景。

被動引用:不會導致類初始化的引用。

/**
 * 所有引用類的方式都不會觸發初始化,稱爲被動引用
 */
public class SuperClass {
    static {
        System.out.println("Hello SuperClass");
    }
    public static int value = 1;
    public static final int value1 = 2;

}
class SubClass extends SuperClass {
    static {
        System.out.println("Hello SubClass");
    }
}
public class Test {
    public static void main(String []args){
        //1.只有直接定義這個字段的類,纔會被初始化 輸出:Hello SuperClass
        System.out.println(SubClass.value);
        //2.常量在編譯階段會存入調用類的常量池中,本質沒有直接引用定義常量的類 輸出:2
        System.out.println(SubClass.value1);
        //3.通過數組定義類,不會導致類的初始化 無輸出
        //SuperClass[] superClasses = new SuperClass[2];
    }
}

 

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