类初始化时机以及被动引用

1. 根据java虚拟机规范,严格规定了四种情况必须立即对类进行‘初始化’。

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

    推荐阅读