Java类中变量初始化顺序

Posted hj0612

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java类中变量初始化顺序相关的知识,希望对你有一定的参考价值。

规则1(单个类中):

(静态变量、静态初始化块)>(变量、初始化块)>构造器

public class InitialOrderTest {
    // 静态变量
    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 InitialOrderTest();
    }
}

结果显示:

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

规则2(父子类中):

子类的静态变量和静态初始化块的初始化是在父类的非静态变量、非静态初始化块和构造器初始化之前就完成

class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    // 变量
    public String p_Field = "父类--变量";
    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }
    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
    }
}

//如果你想把这两个类放在同一个文件且名字起为SubClass, 父类前不能加public
public class SubClass extends Parent { 
    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }
    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }
    // 构造器
    public SubClass() {
        System.out.println("子类--构造器");
    }
    // 程序入口
    public static void main(String[] args) {
        new SubClass();
    }
}

结果显示:

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

规则3(静态变量和静态初始化块):

静态变量和静态初始化块是依照他们在类中的定义顺序进行初始化的。同样,非静态变量和非静态初始化块也遵循这个规律。

public class testOrder {
    // 静态变量
    public static TestA a = new TestA();
    public TestC c = new TestC();
    // 静态变量
    public static TestB b = new TestB();
    public testOrder(){
        System.out.println("in constract");
    }
    // 静态初始化块
    static {
        System.out.println("静态初始化块");
    }
    public static void main(String[] args) {
        new testOrder();
    }
}
class TestA {
    public TestA() {
        System.out.println("Test--A");
    }
}
class TestB {
    public TestB() {
        System.out.println("Test--B");
    }
}
class TestC {
    public TestC() {
        System.out.println("Test--C");
    }
}

返回结果:

Test--A
Test--B
静态初始化块
Test--C
in constract

总结:先静后动,先父后子,从上到下,先变量后构造

以上是关于Java类中变量初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java类中变量初始化顺序

Java类成员初始化顺序

浅谈java类中成员的初始化顺序

java类中的初始化顺序

Java中代码块执行顺序

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序