java对象的初始化顺序
1.初始化涉及的几个部分
java对象在初始化时不仅仅调用自身的构造方法,还涉及静态语句块、实例语句块、静态变量初始化、成员变量初始化等执行问题,初始化顺序指的就是这五部分的执行顺序。
2.Demo
package com.javase.classtest; public class InitializationSequence { static { System.out.println("静态语句块"); } static MyInnerClass in = new MyInnerClass("静态变量s"); MyInnerClass in01 = new MyInnerClass("a"); { System.out.println("实例语句块"); } MyInnerClass in02 = new MyInnerClass("b"); public InitializationSequence() { System.out.println("构造函数"); } @SuppressWarnings("unused") public static void main(String[] args) { InitializationSequence obj01 = new InitializationSequence(); System.out.println("-----------------------------------"); InitializationSequence obj02 = new InitializationSequence(); } } class MyInnerClass { public MyInnerClass(String description) { System.out.println("成员变量初始化::" + description); } }
执行结果:
分析:
- 静态语句块:在类加载到JVM时执行,由于JVM使用类的前提是类装载到JVM虚拟机,所以静态语句块首先执行,类只加载一次,静态语句块只执行一次。
- 静态变量初始化:由于静态变量为类的所有实例所共享,不依赖于具体的对象,因此不是在对象创建时初始化,而是在类加载时初始化,初始化顺序在静态语句块之后,只执行一次。
- 实例语句块:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,以成员变量初始化为参照,没有绝对的先后顺序,实际顺序取决于定义的顺序,定义在前,就在成员变量初始化前执行;定义在后,就在成员变量初始化后执行。
- 成员变量初始化:在构造方法前执行,每调用一次构造方法,执行一次。执行顺序在静态变量初始化之后,相对于实例语句块的执行顺序取决于定义顺序。
- 构造方法:最后执行。
综上可知,java对象初始化的执行顺序为:静态语句块>静态变量初始化>实例语句块/成员变量初始化>构造方法,实例语句块与成员变量初始化的相对执行顺序取决于定义的先后顺序。
不能仅仅停滞在实现上,应该去追求代价更小、性能更优的实现