jvm原理(3)编译期常量与运行期常量的区别及数组创建本质分析
2018-02-25 18:38
399 查看
上一个例子我们用的final是一个字面量“hello world”,这次我们改一下使用UUID为常量赋值,注意:UUID是多少只有在运行期间才会被确定。
运行结果:
当一个常量的值并非编译期可以确定的,那么其值就不会被放到调用类的常量池中,
这时的程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化。
接下来看一下数组的形式
运行结果:
对于数组实例来说,其类型是由JVM在运行期间动态生成的,表示为[Lcom.twodragonlake.jvm.classloader.MyParent4这种形式。动态生成的类型(类似于动态代理),其父类型就是Object
对于数组来说,JavaDoc经常讲构成数组的元素称为Component,实际上就是将数组降低一个维度后的类型。
助记词:
anewarray : 表示创建一个引用类型的(如类、接口、数组)数组,并将其引用值压入栈顶
newarray : 表示创建一个指定的原始类型(如int、float、char等)的数组,并将其压入栈顶
public class MyTest3 { public static void main(String[] args) { System.out.println(MyParent3.str); } } class MyParent3{ public static final String str =UUID.randomUUID().toString(); static{ System.out.println("Myparnet3 static bloack"); } }
运行结果:
Myparnet3 static bloack 04d27b8c-5480-497d-83cc-8b924e5889a5
当一个常量的值并非编译期可以确定的,那么其值就不会被放到调用类的常量池中,
这时的程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化。
接下来看一下数组的形式
public class MyTest4 { public static void main(String[] args) { // MyParent4 myParent4 = new MyParent4(); 毫无疑问这个会触发初始化,属于主动调用 MyParent4 [] myParent4s = new MyParent4[1]; System.out.println(myParent4s.getClass()); System.out.println(myParent4s.getClass().getSuperclass()); MyParent4 [][] myParent4s1 = new MyParent4[1][1]; System.out.println(myParent4s1.getClass()); System.out.println(myParent4s1.getClass().getSuperclass()); System.out.println("=============="); int [] ints = new int[1]; System.out.println(ints.getClass()); System.out.println(ints.getClass().getSuperclass()); byte [] bytes = new byte[1]; System.out.println(bytes.getClass()); System.out.println(bytes.getClass().getSuperclass()); short [] shorts = new short[1]; System.out.println(shorts.getClass()); System.out.println(shorts.getClass().getSuperclass()); boolean [] booleans =new boolean[1]; System.out.println(booleans.getClass()); System.out.println(booleans.getClass().getSuperclass()); } } class MyParent4{ static { System.out.println("MyParent4 static bloack"); } }
运行结果:
class [Lcom.twodragonlake.jvm.classloader.MyParent4; class java.lang.Object class [[Lcom.twodragonlake.jvm.classloader.MyParent4; class java.lang.Object ============== class [I class java.lang.Object class [B class java.lang.Object class [S class java.lang.Object class [Z class java.lang.Object
对于数组实例来说,其类型是由JVM在运行期间动态生成的,表示为[Lcom.twodragonlake.jvm.classloader.MyParent4这种形式。动态生成的类型(类似于动态代理),其父类型就是Object
对于数组来说,JavaDoc经常讲构成数组的元素称为Component,实际上就是将数组降低一个维度后的类型。
助记词:
anewarray : 表示创建一个引用类型的(如类、接口、数组)数组,并将其引用值压入栈顶
newarray : 表示创建一个指定的原始类型(如int、float、char等)的数组,并将其压入栈顶
相关文章推荐
- 数组和指针、数组指针和指针数组、函数指针和指针函数、数组标识符的意义、静态和动态创建的数组的本质区别、标识符类型判断方法
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
- String类编译期与运行期分析
- java中的编译期和运行期有什么区别?
- 一维数组和指针数组和数组指针,以及扩展到二维数组和二级指针的分析和区别
- python使用in操作符时元组和数组的区别分析
- PHP7常量数组用法分析
- 【Python数据分析工具之Numpy01】数组创建ndarray
- 从编译器角度分析C语言中数组名和指针的区别
- PHP数组合并+与array_merge的区别分析 & 对多个数组合并去重技巧
- C++中关于[]静态数组和new分配的动态数组的区别分析
- C中常量字符串和字符数组的区别
- wukong引擎源码分析之索引——part 1 倒排列表本质是有序数组存储
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
- msp430 iar 堆栈分析 常量数组优化
- 第27课 - 数组的本质分析
- 通过3个程序分析数组与指针区别
- 从编译器角度分析C语言中数组名和指针的区别
- 运行期绑定与编译期绑定的区别