《深入理解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 -- 类的初始化的更多相关文章

  1. jvm - 类的初始化过程

    我们知道,我们写的java代码称为源码,想要能够被jvm执行首先需要编译成.class文件,那么编译完到使用又都经理的哪些阶段呢?主要分为以下三个阶段: 加载:查找并加载类的二进制数据(.class文 ...

  2. JDK8中JVM对类的初始化探讨

    在<深入理解Java虚拟机>(第二版,周志明著)中,作者介绍了JVM必须初始化类(或接口)的五种情况,但是是针对JDK7而言的. 那么,在JDK8中,这几种情况有没有变化呢?(我猜测应该会 ...

  3. JDK 8 - JVM 对类的初始化探讨

    在<深入理解 Java 虚拟机>(第二版,周志明著)中,作者介绍了 JVM 必须初始化类(或接口)的五种情况,但是是针对 JDK 7 而言的. 那么,在 JDK 8 中,这几种情况有没有变 ...

  4. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

  5. 关于JVM加载class文件和类的初始化

    关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量 ...

  6. jvm的学习笔记:二、类的初始化,代码实战(3)

    首次主动此用导致类的初始化 MyParent4 myParent4 = new MyParent4(); MyParent4 myParent5 = new MyParent4(); 输出: MyPa ...

  7. 什么情况下JVM会立即对类进行初始化

    虚拟机规范严格规定了有且只有5种情况必须立即对类进行“初始化”(加载.验证.准备等阶段在此之前开始). 遇到new.getstatic.putstatic.invokestatic等4条字节码指令时. ...

  8. Java JVM 类的连接与初始化 [ 转载 ]

    Java类的连接与初始化 (及2013阿里初始化笔试题解析)  转自http://www.cnblogs.com/iceAeterNa/p/4876747.html         Java虚拟机通过 ...

  9. jvm(2)类的初始化(二)和实例化

    深入理解Java对象的创建过程:类的初始化与实例化 对象实例化内存分析: 对内存分配情况分析最常见的示例便是对象实例化: Object obj = new Object(); 这段代码的执行会涉及ja ...

随机推荐

  1. linux 查看文件系统类型

    1. mount [op@TIM ~]$ mount/dev/mapper/vg_tim-lv_root on / type ext4 (rw)proc on /proc type proc (rw) ...

  2. hdoj 1233 还是畅通工程(最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路分析:该问题为最小生成树问题,使用kruskal算法或者prim算法即可解决: 代码如下: ...

  3. HTTP基本协议(查看网页代码)

    此示例已实现查看网页的代码来理解HTTP基本协议: (返回的是百度首页的网页代码) import java.io.BufferedReader; import java.io.IOException; ...

  4. Swift调用Objective C的FrameWork

    很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...

  5. Scala函数---既存类型

    语法: Type ::= InfixType ExistentialClauses ExistentialClauses ::= „forSome‟ „{‟ ExistentialDcl {semi ...

  6. C#中Cache用法

    C#中Cache用法     Cache 是分配在服务器上的一个公共的内存片,所谓公共指的cache只要一创建是任何一个客户端浏览器都可以通过后台代码访问到它,它面向的是所有用户,相对而言sessio ...

  7. LinkNode 温度报警器视频(2016-05-15)

    文档就不发了,申请的时候说要官方首发,所以半个月后,这里就只上一个视频表表心意.

  8. 我常用的iphone开发学习网站[原创]

    引用地址:http://www.cnblogs.com/fuleying/archive/2011/08/13/2137032.html Google 翻译 Box2d 托德的Box2D的教程! Bo ...

  9. JavaSE学习总结第03天_Java基础语法2

      03.01 数据类型中补充的几个小问题 1:在定义Long或者Float类型变量的时候,要加L或者f.   整数默认是int类型,浮点数默认是double.   byte,short在定义的时候, ...

  10. HTML5 总结-表单-表单元素

    HTML5 表单元素 HTML5 的新的表单元素: HTML5 拥有若干涉及表单的元素和属性. 本章介绍以下新的表单元素: datalist keygen output 浏览器支持 Input typ ...