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 ...
随机推荐
- HTML+CSS笔记 CSS中级 一些小技巧
水平居中 行内元素的水平居中 </a></li> <li><a href="#">2</a></li> &l ...
- 创见WiFi SD卡破解之路
我最近搞了张Transcend WiFi SD,颇为得意.它可以让我在几秒钟内将单反(奶昔,相当便携)中拍摄的照片传到任何支持wifi的设备上.我很喜欢在旅途中拍摄和分享图片,所以对我而言,可以无线传 ...
- 用QComboBox实现tree状结构(QComboBox居然有setView和setModel函数)
实现的效果图如下: #include "mainwindow.h" #include <QApplication> #include <QTreeView> ...
- mfc删除标题和边框
//删除标题和边框WS_CAPTION和WS_BORDER风格 ModifyStyle(WS_CAPTION, 0);ModifyStyle(WS_BORDER, 0);
- hdoj 1878 欧拉回路(无向图欧拉回路+并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 思路分析:该问题给定一个无向图,要求判断该无向图是否存在欧拉回路:无向图判断存在欧拉回路的两个必 ...
- 使用js对select动态添加和删除OPTION示例代码
动态删除select中的所有options.某一项option以及动态添加select中的项option,在IE和FireFox都能测试成功,感兴趣的朋友可以参考下,希望对大家有所帮助 <s ...
- JavaBean讲解 规范
一:JavaBean定义 JavaBean是一种可重复使用.跨平台的软件组件.JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean,例如NetBean中 ...
- Django的TemplateResponse
def my_render_callback(response): return response from django.template.response import TemplateRespo ...
- sign a third-party dll which don't have a strong name
Problem: Assembly generation failed -- Referenced assembly '' does not have a strong name Cause: thi ...
- vim: 字符串替换
:s/str1/str2/ 替换当前行第一个 str1 为 str2:s/str1/str2/g 替换当前行所有 str1 为 str2 ( 注意, s/xx/xxx/g 语句从s开始,中间的空格视 ...