JVM总结二_类的主动使用
package com.ald.ups;
/**
* @describe: JVM learning
* author: liutengyuan
* @date: Created in 2017/12/4 14:22
**/
public class MyTest7 {
/**
* JVM 规范当设计到类的主动使用时,才去初始化类,由于各个虚拟机的厂商不同,JVM规范中允许在类可能被用到的情况下,可以先去加载类;主动使用的其中情况
* 类主动使用的七种情况:
* 1:创建类的实例
* 2:访问类的或者接口的静态变量,或对类的静态变量进行赋值
* 3:访问类的静态方法
* 4:反射
* 5:初始化一个类的子类
* 6:java虚拟机启动时,被标明为启动类的类
* 7:JDK1.7开始提供动态语言的支持(动态代理)
*/
// 特殊 如果子类调用父类的静态变量或静态方法,都是对父类的主动使用,不涉及到子类的主动使用
public static void main(String[] args) {
System.out.println(Child.a);
System.out.println("-----------");
Child.doSomething();
}
}
class Parent{
static int a = 3;
static {
System.out.println("Parent block..");
}
static void doSomething(){
System.out.println("do Something");
}
}
class Child extends Parent{
static {
System.out.println("Child Block..");
}
}
运行结果:
D:\Java\jdk1.8\bin\java.exe -javaagent:D:\IDEA\idea\lib\idea_rt.jar=55847:D:\IDEA\idea\bin -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8\jre\lib\charsets.jar;D:\Java\jdk1.8\jre\lib\deploy.jar;D:\Java\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8\jre\lib\ext\localedata.jar;D:\Java\jdk1.8\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8\jre\lib\ext\sunec.jar;D:\Java\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8\jre\lib\javaws.jar;D:\Java\jdk1.8\jre\lib\jce.jar;D:\Java\jdk1.8\jre\lib\jfr.jar;D:\Java\jdk1.8\jre\lib\jfxswt.jar;D:\Java\jdk1.8\jre\lib\jsse.jar;D:\Java\jdk1.8\jre\lib\management-agent.jar;D:\Java\jdk1.8\jre\lib\plugin.jar;D:\Java\jdk1.8\jre\lib\resources.jar;D:\Java\jdk1.8\jre\lib\rt.jar;D:\develop26\jvm_demo\target\classes com.ald.ups.MyTest7
Parent block..
3
-----------
do Something
Process finished with exit code 0
打印类的加载信息: