java对象初始化顺序验证示例



class Parent {
    static int staticField = initializeStaticField();

    static {
        System.out.println("Parent static block");
    }

    int field = initializeField();

    {
        System.out.println("Parent instance block");
    }

    public Parent() {
        System.out.println("Parent constructor");
    }

    static int initializeStaticField() {
        System.out.println("Initializing Parent static field");
        return 1;
    }

    int initializeField() {
        System.out.println("Initializing Parent instance field");
        return 2;
    }
}

class Child extends Parent {
    static int staticField = initializeStaticField();

    static {
        System.out.println("Child static block");
    }

    int field = initializeField();

    {
        System.out.println("Child instance block");
    }

    public Child() {
        super();
        System.out.println("Child constructor");
    }

    static int initializeStaticField() {
        System.out.println("Initializing Child static field");
        return 3;
    }

    int initializeField() {
        System.out.println("Initializing Child instance field");
        return 4;
    }

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

上面的Java示例演示了对象初始化的顺序。注意几个关键点:

1. **静态字段和静态块**:首先初始化父类的静态字段和静态块,然后是子类的静态字段和静态块。这是因为在类加载到JVM时进行的,且只执行一次。

2. **实例字段和实例块**:然后是对象的实例字段和实例块的初始化,这是按照它们在类中声明的顺序进行的。首先是父类的实例字段和实例块,然后是子类的实例字段和实例块。

3. **构造函数**:最后是构造函数的调用,先调用父类的构造函数,然后调用子类的构造函数。

在上面的例子中,你会看到以下输出,这验证了上述的初始化顺序:

Initializing Parent static field Parent static block Initializing Child static field Child static block Initializing Parent instance field Parent instance block Parent constructor Initializing Child instance field Child instance block Child constructor

这个示例清晰地展示了Java中对象及其静态成员的初始化顺序。