1. 根据java虚拟机规范,严格规定了四种情况必须立即对类进行‘初始化’。
- 当程序进行new对象,读取,设置和调用类的不被final修饰的静态字段和方法。
- 初始化一个类,他的父类还没有进行初始化,则先初始化父类。
- 使用反射调用,如果类还没有进行初始化,需要先初始化这个类。
- 当虚拟机启动时,用户需要启动main方法,则main所在的这个类是需要进行初始化的。
2. 当我们去引用类的时候,不会造成类初始化的,我们成为被动引用,这里简单说一下被动引用的情况都有那些。
- 引用类被final static 同时修饰的字段,是不会造成类初始化的,因为被final static 修饰的字段会在编译期间进入常量池。
- 通过子类调用父类的静态字段,子类不会因此初始化,因为调用静态字段只会初始化这个静态字段所存在的类。
- 创建某个引用类型的类数组,是不会触发这个类初始化的,因为他会创建一个数组类型,并不是这个类类型,同时这个数组拥有的也不是这个类的方法,而是数组的方法。