jvm-007(張龍老師jvm教程) 運行期常量和數組創建的本質分析

jvm-007

一、運行期常量與編譯器常量不同:

對於在編譯器無法確定的常量值,在被調用的時候,會引起常量所在類或者接口的初始化,此時不會觸發常量傳播優化。

代碼示例:
 

public class TestCode03 {

    public static void main(String[] args) {
        System.out.println(Parent03.constant);
    }
}

class Parent03 {
    public static final String constant = UUID.randomUUID().toString();
    static {
        System.out.println("parent03 is inited");
    }
}

運行結果:

parent03 is inited 8ecb0e96-3536-40b8-9d20-11e6c3dfdebd

 

二、數組創建對象的本質分析

對於數組來說,其類型是在運行期間由虛擬機動態生成的,數組的元素類型不會被初始化。虛擬機創建的對象類型如下:

Test[] ary = new Test[2];

ary數組對象:[Lcn.com.Test

如果是個多維的數組,有幾個維度就在類的全限定名前面添加幾個左方括號 “[”。由虛擬機所創建的數組對象的父類是java.lang.Object類。Java將構成數組的元素稱之爲component(組件),指數組在去掉一個維度之後的類型。

public class TestCode04 {
    public static void main(String[] args) {
        Parent04[] ps = new Parent04[2]; // 不會引起Parent04類的初始化
        System.out.println(ps.getClass()); // class [Lcn.com.ccxi.test.jvm.Parent04;
        System.out.println(ps.getClass().getSuperclass()); // class java.lang.Object
    }
}

class Parent04 {
    static {
        System.out.println("---Parent04----初始化");
    }
}

運行結果:

class [Lcn.com.ccxi.test.jvm.Parent04; class java.lang.Object

以上結果顯示,數組的創建不會導致數組元素類型的初始化。虛擬機創建的數組對象的類型以及其父類 java.lang.Object。

 

三、數組創建時的幾個字節碼指令:

1、原生類型的一個維度數組:

newarray:將一個原生類型的數組壓入棧頂。

int[] intAry = new int[2]; byte[] byteAry = new byte[2]

2、引用類型的一個維度的數組:

anewarray:將一個引用類型的數組壓入棧頂。

String[] stringAry = new String[3];

3、多維度類型的數組,基本元素類型包括原生類型和引用類型:

multianewarray:將一個多維度的數組壓入棧頂。

int[][] intMulAry = new int[3][4]; String[][] strMulAry = new String[4][5];

 

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