Java虚拟机使用某个类的过程,可分为七个阶段:

加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载

本文只介绍在什么情况下对类进行初始化。

Java虚拟机规范对何时进行类的初始化做了严格规范,有且只有四种情况:

1. 虚拟机启动时,指定的主类。

包含main方法的类。

2. 遇到new、getstatic、putstatic、invokestatic四条指令时。

new:使用new关键字实例化对象。

getstatic:读引用一个类的静态字段。

putstatic:写引用一个类的静态字段。

invokestatic:调用一个类的静态方法。

3. 初始化一个类时,先初始化其父类。

接口则不是,只有真正引用到了父接口时,才会初始化。

4. 对类进行反射调用时。

测试代码:

MainClass:

package com.xuefeng.jvm.load;

/**

* 初始化类的时机

* 1. 虚拟机启动时指定的主类

* 2. new某类的对象时、引用某类的static变量时、设置某类的变量时、调用某类的static方法时

* 3. 初始化一个类时,先初始化其父类。接口则不是,真正使用到了父接口时,才会初始化父接口。

* 4. 通过反射调用某类时

* @author xuefeng

*

*/

public class MainClass {

static {

System.out.println("MainClass init.");

}

// 1

public static void main(String[] args) throws ClassNotFoundException {

2

//System.out.println("SuperClass.F_V1 : " + SuperClass.F_V1);

//System.out.println("SuperClass.v1 : " + SuperClass.v1);

3

//SubClass s1 = new SubClass();

// 3.1 如果通过子类名引用父类的static变量,是否会触发子类的初始化?

// 这取决于具体的虚拟机实现,Sun HotSpot虚拟机此时是不会触发子类的初始化的。

System.out.println(SubClass.v1);

// 4

Class.forName("com.xuefeng.jvm.load.SubClass");

}

}

SuperClass:

package com.xuefeng.jvm.load;

public class SuperClass {

static {

System.out.println("SuperClass init.");

}

/**

* 引用v1时,会初始化SuperClass

*/

public static int v1 = 1;

/**

* 引用F_V1时,不会初始化SuperClass

* static final的变量,已经在编译器放到了常量池里

*/

public static final int F_V1 = 1;

}

SubClass:

package com.xuefeng.jvm.load;

/**

*

* @author xuefeng

*

*/

public class SubClass extends SuperClass {

static {

System.out.println("SubClass init.");

}

}

java 虚拟机 初始化_Java虚拟机 类初始化 阶段相关推荐

  1. java 类 加载 初始化_java中类的初始化和加载

    最近在阅读孙卫琴的java面向对象一书中,看到对java中类的初始化和加载中的论述比较系统,故笔记之 1)类的初始化,JAVA在初始化一个类时,以下步骤 A 假如类存在直接的父类,并且这个父类还没有初 ...

  2. java类初始化_Java的类/实例初始化过程

    昨天看到群里面有人分享了一道题目,我答错了,于是趁机了解了下Java的类/对象初始化过程: 程序的输出见文章最后 程序A主要考察的是 类实例初始化 .简单验证了下,类实例初始化过程如下:父类实例初始化 ...

  3. Java什么时候会触发类初始化及原理(详解)

    先上结论: 以下情况会触发类的初始化: 遇到new,getstatic,putstatic,invokestatic这4条指令: 使用java.lang.reflect包的方法对类进行反射调用: 初始 ...

  4. java类变量什么时候初始化_Java类变量的初始化时机

    先上代码 测试类public class MyNumber { public static MyNumber myNumber=new MyNumber(2.8); private static do ...

  5. java 看虚拟机内存_java 虚拟机内存介绍

    已经入行快有两年了,然而没有认真看过java虚拟机内存的介绍,下面把自己看的关于java虚拟机内存的介绍写下来,分享给大家. java 虚拟机在运行时将内存分为几个区域,分别为程序记数区,java虚拟 ...

  6. java虚拟机进程_Java虚拟机详解(七)------虚拟机监控和分析工具(1)——命令行...

    通过前面的几篇博客,我们介绍了Java虚拟机的内存分配以及内存回收等理论知识,了解这些知识对于我们在实际生产环境中提高系统的运行效率是有很大的帮助的.但是话又说回来,在实际生产环境中,线上项目正在运行 ...

  7. Java内部抽象类的匿名类初始化

    说在前面的话,以前写过一次这个变态代码,后来重构,把那个new的语法简化了,最近又要整,差点都想不起来了,留个文档把 1.下面这个案例更变态,抽象类还有一个个泛型类:首先内部抽象类的定义: /* * ...

  8. java异常判断_Java异常类

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  9. java file 工具_JAVA文件类工具

    FileUtil package cn.jiangzeyin.util.file; import org.springframework.util.Assert; import java.io.*; ...

  10. java inputstream子类_Java InputStream 类

    Java InputStream 类 在本教程中,我们将通过一个示例来学习Java InputStream类及其方法. java.io包的InputStream类是一个抽象超类,它表示字节的输入流. ...

最新文章

  1. Apache 'mod_accounting'模块SQL注入漏洞(CVE-2013-5697)
  2. Java语言类的作用,java 语言Class类的作用,怎么使用?
  3. 左神算法:可见的山峰对数量(有重复值的情况)(Java版)
  4. Elasticsearch技术解析与实战(二)文档的CRUD操作
  5. OA项目实战(二) 开发准备
  6. 路径规划之 A* 算法
  7. 4-1k近邻算法(k-Nearest Neighbors)
  8. 深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器--在深度学习的视觉分类中的,这两个分类器的原理和比较
  9. python 性能测试_python 写一个性能测试工具(一)
  10. 08Vue.js快速入门-Vue综合实战项目
  11. 程序江湖:第五章 机会是一种困扰
  12. 感谢大家的热情与温暖
  13. IIS中间件渗透总结
  14. JAVA对字符串进行32位MD5加密
  15. mysql建三行三列表格_制作好的表格怎样才可以成重新编辑
  16. 电影《阿凡达》观后感
  17. 如何用Python画一只机器猫?
  18. 将ceph与calamari相连(connect ceph servers to calamari)
  19. word首页之前插入空白页没有页眉页脚且不影响后续页码
  20. 安装VMware-tools出现initctl: Job failed to start

热门文章

  1. 替换软连接导致的问题
  2. 你有没有成为技术作家的潜力
  3. 基于Python的MORSE音频的波形和频谱
  4. Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)
  5. Kubernetes 笔记 01 初识 Kubernetes 新时代的领航者
  6. windows下 nginx安装 使用
  7. Skynet入门范例之sproto
  8. 动态规划---最长公共子序列
  9. 无限轮播的N+2 策略
  10. matlab 基础知识class lt; superclass_name