Java程序初始化顺序,结论如下:
- 初始化顺序:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数
- 总结起来就是3点:先静态后普通,先超类后子类,而且都得按照声明顺序,具体说明如下:
-
- 静态的包括静态变量、静态代码块,超类的先按声明顺序执行完再是子类的
- 静态变量和静态代码块只会在对应的 Class 类加载时初始化一次
- 普通的包括实例变量 + 代码块 + 构造函数,也是超类的先按声明顺序执行后才是子类的
- 相当于在构造器里面先调用父类构造器super(),然后再执行实例变量初始化、代码块初始化,最后才执行构造器中的代码。
其实也很好理解:静态部分在类的加载时执行,而父类先于子类实例化。
参考:
- [1]12.1.3. Initialize Test: Execute Initializers https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.1.3
- [2]12.4. Initialization of Classes and Interfaces https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4
- [3]12.5. Creation of New Class Instances https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5
- [4]Initializing Fields https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
- [5]《On Java8》(即 Java编程思想 第5版) 第6章 初始化与清理:构造器初始化 ,中文开源版请参考 https://github.com/lingcoder/onJava8/
- [6]Java order of Initialization and Instantiation https://stackoverflow.com/questions/23093470/java-order-of-initialization-and-instantiation
- [7]In what order do static/instance initializer blocks in Java run? https://stackoverflow.com/questions/2007666/in-what-order-do-static-instance-initializer-blocks-in-java-run
- [8]Java Static Initialization Order https://stackoverflow.com/questions/19058766/java-static-initialization-order