一、概述
了解类的初始化顺序,可以更灵活、方便的构造一个类。
二、类初始化顺序
2.1 示例
public class InitialOrderTest {
public static void main(String[] args) {
new InitialOrderTest();
}
// 变量
public FieldClass field = new FieldClass("变量");
// 初始化块
{
System.out.println("初始化块");
}
// 静态变量
public static FieldClass staticField = new FieldClass("静态变量");
// 静态初始化块
static {
System.out.println("静态初始化块");
}
// 构造器
public InitialOrderTest() {
System.out.println("构造器");
}
}
public class FieldClass {
public FieldClass(String msg){
System.out.println(msg);
}
}
2.2 结论
2.1 示例运印结果:
1.静态变量
2.静态初始化块
3.变量
4.初始化块
5.构造器
三、继承关系初始化顺序
3.1 示例
public class Parent {
public Parent(){
System.out.println("父类构造器");
}
//静态初始块
static{
System.out.println("父类静态初始化");
}
//静态变量
public static FieldClass parentStaticField=new FieldClass("父类静态变量");
//初始化块
{
System.out.println("父类初始化块");
}
//变量
public FieldClass parentField=new FieldClass("父类变量");
}
public class Child extends Parent{
public Child(){
System.out.println("子类构造器");
}
//静态初始块
static{
System.out.println("子类静态初始化");
}
//静态变量
public static FieldClass childStaticField=new FieldClass("子类静态变量");
//初始化块
{
System.out.println("子类初始化块");
}
//变量
public FieldClass childField=new FieldClass("子类变量");
public static void main(String[] args){
new Child();
}
}
public class FieldClass {
public FieldClass(String msg){
System.out.println(msg);
}
}
3.2 结论
3.1 示例打印结果:
1. 父类静态初始化
2. 父类静态变量
3. 子类静态初始化
4. 子类静态变量
5. 父类初始化块
6. 父类变量
7. 父类构造器
8. 子类初始化块
9. 子类变量
10. 子类构造器
四、静态变量与静态初始化块、变量与初始化块的顺序
仔细观察以上两个示例,会发现关于静态变量与静态初始化块、变量与初始化块的结果打印顺序是不同的,所以最终的结论:静态变量和静态初始化块、变量和初始化块的初始化顺序取决于在类中定义的顺序。