类初始化顺序

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)> 构造器。

可以通过以下代码验证

public class InitializationOrder {

    // 静态变量
    public static String staticField = "静态变量";
    // 变量
    public String field = "变量";

    // 静态初始化块
    static {
        System.out.println(staticField);
        System.out.println("静态初始化块");
    }

    // 初始化块
    {
        System.out.println(field);
        System.out.println("初始化块");
    }

    // 构造器
    public InitialOrderTest() {
        System.out.println("构造器");
    }

    public static void main(String[] args) {
        new InitializationOrder();
    }
}

执行结果为

静态变量
静态初始化块
变量
初始化块
构造器

如果类在继承的情况下则按照 父类(静态变量、静态初始化块)> 子类(静态变量、静态初始化块)> 父类(变量、初始化块)> 父类构造器 > 子类(变量、初始化块)> 子类构造器。
可以通过以下代码验证

class InitializationOrderParent {   
    // 静态变量   
    public static String pStaticField = "父类--静态变量";   
    // 变量   
    public String pField = "父类--变量";   

    // 静态初始化块   
    static {   
        System.out.println(pStaticField);   
        System.out.println("父类--静态初始化块");   
    }   

    // 初始化块   
    {   
        System.out.println(pField);   
        System.out.println("父类--初始化块");   
    }   

    // 构造器   
    public InitializationOrderParent() {   
        System.out.println("父类--构造器");   
    }   
}   

public class InitializationOrderChild extends InitializationOrderParent {   
    // 静态变量   
    public static String sStaticField = "子类--静态变量";   
    // 变量   
    public String sField = "子类--变量";   
    // 静态初始化块   
    static {   
        System.out.println(sStaticField);   
        System.out.println("子类--静态初始化块");   
    }   
    // 初始化块   
    {   
        System.out.println(sField);   
        System.out.println("子类--初始化块");   
    }   

    // 构造器   
    public InitializationOrderChild() {   
        System.out.println("子类--构造器");   
    }   

    // 程序入口   
    public static void main(String[] args) {   
        new InitializationOrderChild();   
    }   
}  

执行结果为

父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

静态变量和静态初始化块之间、变量和初始化块之间的先后顺序取决于它们在类中出现的先后顺序。
http://www.tuicool.com/articles/zeamyeQ

class Super{
public static int m = 11;
static{
System.out.println("执行了super类静态语句块");
}
}

class Father extends Super{
public static int m = 33;
static{
System.out.println("执行了父类静态语句块");
}
}

class Child extends Father{
static{
System.out.println("执行了子类静态语句块");
}
}

public class StaticTest{
public static void main(String[] args){
System.out.println(Child.m);
}
}
执行结果如下:

执行了super类静态语句块
执行了父类静态语句块
33
如果注释掉 Father 类中对 m 定义的那一行,则输出结果如下:

执行了super类静态语句块
11
备注:只有直接定义这个字段的类才会被初始化。在初始化一个类时,要求其父类全部初始化完成
http://wiki.jikexueyuan.com/project/java-vm/class-loading-mechanism.html

你可能感兴趣的:(类初始化顺序)