什么时候需要初始化
1.使用new该类实例化对象的时候
2.读取或设置类静态字段的时候(但被final修饰的字段,在编译器时就被放入常量池的静态字段除外static final)
3.调用类静态方法的时候
4.使用反射Class.forName(“xxxx”)对类进行反射调用的时候,该类需要初始化
5.初始化一个类的时候,有父类,先初始化父类(注:1. 接口除外,父接口在调用的时候才会被初始化;2.子类引用父类静态字段,只会引发父类初始化)
6.被标明为启动类的类(即包含main()方法的类)要初始化
7.当使用JDK1.7的动态语言支持时,如果一个java.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化
初始化顺序
1.父类的静态变量和静态块赋值(按照声明顺序)
2.自身的静态变量和静态块赋值(按照声明顺序)
3.父类成员变量和块赋值(按照声明顺序)
4.父类构造器赋值
如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错
5.自身成员变量和块赋值(按照声明顺序)
6.自身构造器赋值