2

我对实例初始化块何时应该运行感到困惑。根据 Kathy Sierra 的书:

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

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

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

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

4

4 回答 4

5

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

public class Test1 {
    int x;
    int y;

    {
        x = 1;
    }

    Test1() {
        y = 1;
    }
}

相当于这个:

public class Test1 {
    int x;
    int y;

    Test1() {
        x = 1;
        y = 1;
    }
}

所以初始化块在构造函数运行时运行。

于 2013-04-21T05:02:46.127 回答
1

它不像超类的新对象被实例化。

实际上,就是这样。

子类的每个实例都隐含地包含其超类的一个实例。

超类构造函数总是作为任何构造函数的第一步被调用(并且反过来运行超类的任何实例初始化程序块)

于 2013-04-21T04:52:21.350 回答
0

虽然这是一篇旧文章,但我遇到了这个值得分享的概念

因为我们在这里讨论的是实例块,所以实例代码流在父子关系类中是如何执行的 // Child extends Parent 如果我们为 Child 创建一个对象

1)从父到子识别类的实例成员

2) 仅在父类上执行实例变量赋值和实例块

3)父构造函数的执行

4)仅在子类上执行实例变量赋值和实例块

5)子构造函数的执行

于 2017-03-20T13:26:31.460 回答
-1

因为在子的构造函数中总是存在super()对父构造函数的隐式调用(如果没有显式调用)。

于 2013-04-21T04:52:37.110 回答