2013-04-21 138 views
2

我对实例初始化块何时运行感到困惑。 据凯西塞拉利昂的书:实例初始化块和子类

实例初始化块运行每次创建一个类的实例

因此,考虑有两班时间:家长和孩子,根据this question和Java的文档:

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

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

回答

5

编译实例初始化块成为构造函数的一部分。 javac只是增加了初始块到每个构造函数,那就是:

public class Test1 { 
    int x; 
    int y; 

    { 
     x = 1; 
    } 

    Test1() { 
     y = 1; 
    } 
} 

等效于此:

public class Test1 { 
    int x; 
    int y; 

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

因此初始块构造运行时运行。

+0

实际上,还有一点,在任何现有的超级构造函数调用之后,实例初始化块将被添加到构造函数中。请参阅http://java-blog.kbsbng.com/2016/01/instance-initializer-blocks-in-java.html以供参考 – kbsbng 2016-01-10 09:28:40

1

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

实际上,就是这样。

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

超类的构造函数总是调用在任何构造的第一步(而这又运行了超任何实例初始化块)

+0

我知道,所有的超类的构造函数会被调用,但我的理解是,无论调用这些构造函数:只有一个对象正在实例化/创建那里,这是子类。 – 2013-04-21 04:55:51

+1

你可以这样看待它。但是你也可以说同一个对象也是超类的一个实例。可以肯定的是,实例除了包含它自己之外,还包含超类定义的所有字段。 – Thilo 2013-04-21 05:43:31

-1

因为总有一个隐含的super()通话(如果没有明确完成)以父级的构造函数在孩子的构造函数中。

0

虽然这是一个旧的文章我碰到这个概念就认为值得分享它

因为我们在这里讨论的实例块是如何实例代码流程执行父子关系类 //儿童伸出父 如果我们创建一个对象儿童

1)的类的实例成员的鉴定从父到子

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

3)父类的构造执行

4)实例变量赋值和实例块只在儿童类执行

5)子构造的执行