实例初始化块和子类

a.u*_*u.r 2 java inheritance initialization initialization-block

我对实时初始化块应该运行的时间感到困惑.根据凯西塞拉的书:

每次创建类实例时都会运行实例初始化块

因此,根据这个问题和java的文档,考虑有两个类:父母和孩子:

实例化子类对象只创建子类类型的1个对象,但调用其所有超类的构造函数.

根据以上所述: 为什么每次实例化子类的对象时都会调用位于超类中的实例初始化块?它不像是超实例的新对象被实例化.

Evg*_*eev 5

编译实例后,init块成为构造函数的一部分.javac只需将init块添加到每个构造函数中,即:

public class Test1 {
    int x;
    int y;

    {
        x = 1;
    }

    Test1() {
        y = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

相当于:

public class Test1 {
    int x;
    int y;

    Test1() {
        x = 1;
        y = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此init块在构造函数运行时运行.