接着上一份笔记,继续学习类加载部分:
2.立即初始化类的五种情况:
a.遇到new、getstatic、putstatic或invokestatic这4条字节码指令会触发其初始化;对应场景是使用new关键字、读取或设置一个类的静态字段(被final修饰,已在编译器期把几个放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候
b.使用java.lang.reflect包的方法对类进行反射调用的时候,触发初始化
c.当初始化类的时候,发现父类还没有进行过初始化时候,则需要先触发其父类的初始化
d.当虚拟机启动时候,用户u需要指定一个要执行的主类(包含main方法的类),虚拟机会优先初始化那个类
e.jdk1.7新方法动态语言获取到了几个关键字的句柄,触发初始化
3.在类加载的时候,介绍了几种被动引用的例子,不会导致初始化
a.子类引用了父类的静态字段,只会读父类进行初始化,不会对子类初始化,因为只会加载直接定义了这个静态字段的类才会被初始化
b.new 一个数组类型的对象,不会导致初始化,数组类型的这种形式是由虚拟机直接生成的
c.使用了一个被final修饰,且已经被加载到常量池中的字段也不会触发定义这个常量的类的初始化,因为jvm在编译时候有优化,相当于直接指向了该类的常量池中
针对初始化这一块,