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];