JVM (二) 深入理解 JVM

1.编译期常量与运行期常量的区别

  1. 案例 一

JVM (二) 深入理解 JVM

讲过上一篇文章 ,我们可以知道打印结果
只有  hello world  
原因:常量在编译阶段会存入 到 调用这个常量 的方法所在的常量池中,存在  MyTest01 的常量池中  并没有 初始化 MyParent1 

JVM (二) 深入理解 JVM
2. 案例 二

JVM (二) 深入理解 JVM

好好想想那!
结果是:

JVM (二) 深入理解 JVM

为什么呢?
原因:
当常量的值编译时期无法确定时,那么其值就不会被放到调用类的常量池中,
这时程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类 初始化
  1. 案例三

JVM (二) 深入理解 JVM

JVM (二) 深入理解 JVM

结果显而易见  
因为满足其中情况中的一种  **首次**主动使用   

JVM (二) 深入理解 JVM

  1. 案例四
    JVM (二) 深入理解 JVM

JVM (二) 深入理解 JVM

没有任何输出
Lcom.ffm.MyParent2   是Java 虚拟机运行期 帮助我们生成出来的 
对于数组实例来说,其类型是由JVM 在运行期动态生成的  ,表示为 【lcom.ffm.jvm.classloader.MyParent2 这种形式,动态生成的类型,其父类型就是Object 

JVM (二) 深入理解 JVM
JVM (二) 深入理解 JVM

  1. 案例五

JVM (二) 深入理解 JVM

反编译一下来看一下

JVM (二) 深入理解 JVM

助记符
  • anewarray 表示创建一个引用类型的(如类 接口 数组 )数组 并将其引用值压入栈顶
  • newarray 表示创建一个指定的原始类型 (int float char 等) 的数组 并将其引用值压入栈顶

接口初始化规则 与类加载器准备阶段和初始化阶段

  • 当一个接口在初始化时 ,并不要求其父接口都完成了初始化 (类一定要求 父类一定初始化)
  • 只有在真正使用到父接口的时候(如引用接口中所定义的常量时)才会初始化
  1. 案例 一

JVM (二) 深入理解 JVM

JVM (二) 深入理解 JVM
那如果是这样呢
JVM (二) 深入理解 JVM
JVM (二) 深入理解 JVM

原因;
count2  又被重新初始化了  

相关文章: