JAVA类加载机制,看会这一篇就够了
类加载7个阶段
加载 ——>验证——>准备——>解析——>初始化——>使用——>卸载
五种情况需要立即初始化
1、指令 new getstatic putstatic invokestatic
2、反射包对起类进行反射调用,如果没有初始化,先对其初始化
3、初始化一个类,如果其父类没有初始化,初始化其父类
4、初始化main类
5、JDK1.7动态语言,如果一个java.lang.invoke.MethodHandle实例最后解析结果为
REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法没有
初始化,将其初始化(java.lang.invoke.MethodHandle 是反射reflect 升级产物,在
JDK1.7+出来的,更加简洁)
Q1 输出
super init
11
原因:初始化父类,不会初始化自己
Q2 输出
什么也不会输出
原因:初始化数组,不会初始化数组里的实体类
Q3输出
Hello
原因:final在常量池里,不会初始化实体类