实例初始化块和子类

时间:2013-04-21 04:48:52

标签: java inheritance initialization initialization-block

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

  

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

所以,根据this question和java的文档,考虑有两个类:父母和孩子:

  

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

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

4 个答案:

答案 0 :(得分: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;
    }
}

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

答案 1 :(得分:1)

  

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

实际上就是这样。

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

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

答案 2 :(得分:0)

虽然这是一篇旧帖,但我发现这个概念值得分享

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

1)从父母到孩子

识别班级的实例成员

2)仅在父类

上执行实例变量赋值和实例块

3)执行父构造函数

4)仅在Child类

上执行实例变量赋值和实例块

5)执行子构造函数

答案 3 :(得分:-1)

因为在子构造函数中始终对父的构造函数进行隐式super()调用(如果没有显式)。