1.编译期常量与运行期常量的区别
- 案例 一
讲过上一篇文章 ,我们可以知道打印结果
只有 hello world
原因:常量在编译阶段会存入 到 调用这个常量 的方法所在的常量池中,存在 MyTest01 的常量池中 并没有 初始化 MyParent1
2. 案例 二
好好想想那!
结果是:
为什么呢?
原因:
当常量的值编译时期无法确定时,那么其值就不会被放到调用类的常量池中,
这时程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类 初始化
- 案例三
结果显而易见
因为满足其中情况中的一种 **首次**主动使用
- 案例四
没有任何输出
Lcom.ffm.MyParent2 是Java 虚拟机运行期 帮助我们生成出来的
对于数组实例来说,其类型是由JVM 在运行期动态生成的 ,表示为 【lcom.ffm.jvm.classloader.MyParent2 这种形式,动态生成的类型,其父类型就是Object
- 案例五
反编译一下来看一下
助记符
- anewarray 表示创建一个引用类型的(如类 接口 数组 )数组 并将其引用值压入栈顶
- newarray 表示创建一个指定的原始类型 (int float char 等) 的数组 并将其引用值压入栈顶
接口初始化规则 与类加载器准备阶段和初始化阶段
- 当一个接口在初始化时 ,并不要求其父接口都完成了初始化 (类一定要求 父类一定初始化)
- 只有在真正使用到父接口的时候(如引用接口中所定义的常量时)才会初始化
- 案例 一
那如果是这样呢
原因;
count2 又被重新初始化了