java类初始化顺序

一、概述

了解类的初始化顺序,可以更灵活、方便的构造一个类。

二、类初始化顺序

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. 子类构造器

四、静态变量与静态初始化块、变量与初始化块的顺序

仔细观察以上两个示例,会发现关于静态变量与静态初始化块、变量与初始化块的结果打印顺序是不同的,所以最终的结论:静态变量和静态初始化块、变量和初始化块的初始化顺序取决于在类中定义的顺序