* 对于初始化只有主动使用类字段时才会初始化<br>
* 除非对一个类的主动引用,否则所有引用类的方式都不会触发其初始化<br>
* 主动引用有且只有以下场景:<p>
* 遇到new 、getstatic、putstatic或invokestatic者四条字节码指令时,如果类没有进行初始化,则需要先触发其初始化。
* 对应的JAVA代码场景是
1)new 实例对象、读取或设置一个类的静态字段[被final修饰、已在编译器把结果放入常量池的静态字段除外]时候,以及调用一个类的静态方法的时候【除外:静态字段,静态方法】
这里笔者验证了一下 发现ClassA .其中一个静态final变量 还是会触发其初始化。。。
2)使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则先触发其初始化
3)当初始化一个类的时候,如果发现父类还没有过初始化,则需要其先触发其父类的初始化
4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main方法的那个类)虚拟机先初始化这个主类
5)当使用jdk1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic,REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应类没有进行过初始化,则先触发其初始化

这5中场景中的行为称为对一个类的主动引用。除此之外所有引用 类的方式都不会触发初始化,称为被动引用。

列举一下被动引用相关代码

public class SuperClass {

    static {
System.out.println("SuperClass init!");
} public static int par=123; }
public class SubClass extends SuperClass {

    public static int parv=1234;

    static {
System.out.println("Subclass init!");
}
}
/**
*非主动使用类字段演示
*/
public class NotInitialization { public static void main(String[] args) {
System.out.println(SubClass.par);
} }

输出

p.p1 { margin: 0; font: 12px Menlo }

SuperClass init!

123

这里有几个关键字需要注意一下

p.p1 { margin: 0; font: 12px Menlo; color: rgba(79, 118, 203, 1) }

发起对类的主动调用 会触发其初始化  否则任何一个引用 类的方式都不会触发其初始化

JVM初始化类契机的更多相关文章

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

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

  2. 实例的初始化由JVM装载类的时候进行,保证了线程的安全性

    在23种设计模式中,单例是最简单的设计模式,但是也是很常用的设计模式.从单例的五种实现方式中我们可以看到程序员对性能的不懈追求.下面我将分析单例的五种实现方式的优缺点,并对其在多线程环境下的性能进行测 ...

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

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

  4. JVM加载的初始化类

    首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1.什么是类加载?什么时候进行类加载? 2.什么是类初始化?什么时候进行类初始化? 3.什么时候会为变量分配内存? 4.什么时候会为变量赋默 ...

  5. JVM 1.类的加载、连接、初始化

    Java类的加载是由类加载器来完成的,过程如下: 首先,加载是把硬盘.网络.数据库等的class文件中的二进制数据加载到内存的过程,然后会在Java虚拟机的运行时数据区的堆区创建一个Class对象,用 ...

  6. jvm(2)类的初始化(一)

    [深入Java虚拟机]之三:类初始化 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Java程序代码. 1,下面说的初始化主要是类变量的初始化,实例变量的初始化触发条件不同(一 ...

  7. Java 类加载机制(阿里面试题)-何时初始化类

    (1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...

  8. jvm(1)类的加载(二)(自定义类加载器)

    [深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...

  9. JVM调用类的main方法的过程

    jvm先装载类,再链接类,再初始化类(以代码的文本顺序执行类变量初始化器.类静态初始化方法或接口的属性(field)初始化器),完成类的初始化后,才执行类的main方法.在链接过程中,可以静态链接(解 ...

随机推荐

  1. MySQL慢查询日志(SLOW LOG)

    慢查询日志可以帮助DBA或开发人员定位可能存在问题的SQL语句,从而进行优化. 如何开启 默认情况下,MySQL是不开启慢查询日志的.可以通过以下命令查看是否开启: mysql> SHOW VA ...

  2. 全文检索django-haystack+jieba+whoosh

    全文检索里的组件简介 1.什么是haystack? 1. haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更 ...

  3. 从七牛云迁移图片到github

    迁移理由 问题是网站的大部分图床都是用的七牛云,官网有改动,所以原测试域名都失效,所以决定进行迁移,将七牛云中的图片迁移到github仓库中. 迁移步骤 Step1:从废弃测试域名空间至可用测试域名空 ...

  4. redis的配置文件redis.conf常用配置

    参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. 当Redis以守护进程方式运行时 ...

  5. RabbitMQ Go客户端教程5——topic

    本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第五篇--topic. 这些教程涵盖了使用RabbitMQ创建消息传递 ...

  6. PyQt(Python+Qt)学习随笔:QTabWidget部件信号简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget自身提供的信号包括如下: currentChanged(int index):每 ...

  7. 题解-Sakuya's task

    题面 Sakuya's task \[\left(\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\right)\bmod 10^9+7 \] 数据范围:\(1\ ...

  8. java试用静态图片制作gif

    参考博客:https://www.cnblogs.com/dreammyle/p/4843365.html 代码中需要的依赖: <!-- gif --> <dependency> ...

  9. Linux 批量创建user和批量删除用户

    Linux 批量创建user和批量删除用户 以下为批量创建用户: #首先我们需要创建一个xxx.txt文件,把需要的我们创建的用户写在这个文本里面来,注意:每写完一个用户都需要换行. vim user ...

  10. MySQL MHA安装配置

    1.环境规划 192.168.12.131 node01 192.168.12.132 node02 192.168.12.133 node03 2.环境准备 一主两从GTID,略. 3.配置关键程序 ...