JVM -- 类的初始化
《深入理解Java虚拟机》 第二版中介绍到了类的加载过程。
一个类从加载入内存到卸载出内存为止,整个生命周期包括:
Loading(加载)-----Verification(验证)-----Preparation(准备)-----Resolution(解析)-----Initialization(初始化)-----Using(使用)----Unloading(卸载)
在Initalization 阶段,虚拟机规范严格定一个5种必须立即对类初始化的情况。
1、遇到new ,getstatic putstatic invokestatic
2、使用java.lang.reflect 包中的方法对类进行反射调用的时候,如果没有初始化,要首先触发其初始化。
3、初始化一个类的时候,如果发现其父类还未初始化,那么首先初始化其父类。
4、当虚拟机启动的时候,用户需要指定一个需要执行的主类,然后虚拟机才会初始化这个主类。
5、JDK1.7的动态语言支持,如果一个java.lang.invoke.MethodHandle 实例最后解析结果REF_getStatic,REF_putStatic,REF_invokeStatic 的方法句柄,并且这个方法句柄对应的类没有进行初始化,则需要将其初始化。
除此之外,所有引用类的方式都不会触发初始化。---被动引用。
1、通过子类调用父类中定义的静态字段,不会导致子类的初始化
package volshell;
public class SuperCalss {
static {
System.out.println("super class init");
}
public static int value = ;
}
package volshell;
public class SubClass extends SuperCalss {
static {
System.out.println("subclass init");
}
}
package volshell;
public class Demo1 {
public static void main(String[] args) {
System.out.println(SubClass.value);
}
}
输出:
super class init
23
对于静态字段,只有直接定义该字段的类才会被初始化,因此通过子类的来引用父类定义的静态字段,并不会触发子类的初始化。
2、使用数组来定义引用类,不会触发该类的初始化。
还是使用上面的代码在main方法中添加
SuperCalss[]subClass = new SuperCalss[10];
执行之后不会有任何的输出。
3、常量在编译接阶段就会存入调用类的常量池中,本质上没有直接引用定义常量的类,因此不会触发被引用的类的初始化。
同样还是使用上面的例子 ,将superClass 中的 value 设置为public static final int value=23; 设置为常量
在主类中调用SuperClass.value
执行结果;
23
在编译阶段,通过常量的传播优化,已将常量value存入Demo1 的常量池中了。
JVM -- 类的初始化的更多相关文章
- jvm - 类的初始化过程
我们知道,我们写的java代码称为源码,想要能够被jvm执行首先需要编译成.class文件,那么编译完到使用又都经理的哪些阶段呢?主要分为以下三个阶段: 加载:查找并加载类的二进制数据(.class文 ...
- JDK8中JVM对类的初始化探讨
在<深入理解Java虚拟机>(第二版,周志明著)中,作者介绍了JVM必须初始化类(或接口)的五种情况,但是是针对JDK7而言的. 那么,在JDK8中,这几种情况有没有变化呢?(我猜测应该会 ...
- JDK 8 - JVM 对类的初始化探讨
在<深入理解 Java 虚拟机>(第二版,周志明著)中,作者介绍了 JVM 必须初始化类(或接口)的五种情况,但是是针对 JDK 7 而言的. 那么,在 JDK 8 中,这几种情况有没有变 ...
- Java虚拟机JVM学习04 类的初始化
Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...
- 关于JVM加载class文件和类的初始化
关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量 ...
- jvm的学习笔记:二、类的初始化,代码实战(3)
首次主动此用导致类的初始化 MyParent4 myParent4 = new MyParent4(); MyParent4 myParent5 = new MyParent4(); 输出: MyPa ...
- 什么情况下JVM会立即对类进行初始化
虚拟机规范严格规定了有且只有5种情况必须立即对类进行“初始化”(加载.验证.准备等阶段在此之前开始). 遇到new.getstatic.putstatic.invokestatic等4条字节码指令时. ...
- Java JVM 类的连接与初始化 [ 转载 ]
Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过 ...
- jvm(2)类的初始化(二)和实例化
深入理解Java对象的创建过程:类的初始化与实例化 对象实例化内存分析: 对内存分配情况分析最常见的示例便是对象实例化: Object obj = new Object(); 这段代码的执行会涉及ja ...
随机推荐
- 微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
问题描述: php5.5已经把通过@加文件路径上传文件的方式给放入到Deprecated中了.php5.6默认是不支持这种方式了 解决办法curl处理 function curl_post($url, ...
- 高质量程序设计指南C/C++语言——C++/C常量(2)
- JS 深拷贝
使用递归进行深拷贝 http://lingyu.wang/2014/03/20/js-interview-1/ Object.prototype.deepClone = function() { va ...
- 泛型 "new的性能"
完美的.net泛型也有特定的性能黑点?追根问底并且改善这个性能问题 完美的.net真泛型真的完美吗 码C#多年,不求甚解觉得泛型就是传说中那么完美,性能也是超级好,不错,在绝大部分场景下泛型表现简直可 ...
- android 同时发送几条通知
android 同时发送几条通知 ======= 下面是转载的文章. 同时发送几条通知把ID添加,接收的时候找到这个id就可以出来多条了. 还是不太明白或者编码实现不了的可以加我QQ. 博客很少上 ...
- 用Visual C++设计“精灵”窗体
随着Microsoft凭借Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准.统一的界面给广大用户对应用软件的学习与使用带来了很大方便.但每天都面对同一副面孔,日久天长 ...
- HDU 3466 Proud Merchants
题目大意:现在给出商品,有三个参数,记为pi,qi,vi,vi是商品的在你心里价值,pi是商品的价格,qi是你要买商品的时候至少需要的钱然后求可得的最大价值. 单词积累:Merchants 商人 t ...
- HDU 1568 Fibonacci
题解:首先,对于小于10000的斐波那契数,我们直接计算,当大于10000时,用公式,由于只要输出前四位,所以不用考虑浮点数的问题,算出其取log的结果: tmp=(log(sq5/5)+n*log( ...
- Phone List(字典树)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25709 Accepted: 7785 Descr ...
- [置顶] js操作iframe兼容各种浏览器
在做项目时,遇到了操作iframe的相关问题.业务很简单,其实就是在操作iframe内部某个窗体时,调用父窗体的一个函数.于是就写了两个很简单的htm页面用来测试,使用网上流行的方法在谷歌浏览器中始终 ...