我对实例初始化块何时运行感到困惑。 据凯西塞拉利昂的书:实例初始化块和子类
实例初始化块运行每次创建一个类的实例
因此,考虑有两班时间:家长和孩子,根据this question和Java的文档:
实例化子类对象只创建子类 类型的1个对象,但调用其所有超类的构造函数。
根据以上: 为什么位于超类的实例初始化块被调用每个子类的对象实例的时间?它不像超类的新对象被实例化。
我对实例初始化块何时运行感到困惑。 据凯西塞拉利昂的书:实例初始化块和子类
实例初始化块运行每次创建一个类的实例
因此,考虑有两班时间:家长和孩子,根据this question和Java的文档:
实例化子类对象只创建子类 类型的1个对象,但调用其所有超类的构造函数。
根据以上: 为什么位于超类的实例初始化块被调用每个子类的对象实例的时间?它不像超类的新对象被实例化。
编译实例初始化块成为构造函数的一部分。 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;
}
}
因此初始块构造运行时运行。
它不像是超类的新对象被实例化。
实际上,就是这样。
子类的每个实例都隐式包含其超类的一个实例。
超类的构造函数总是调用在任何构造的第一步(而这又运行了超任何实例初始化块)
我知道,所有的超类的构造函数会被调用,但我的理解是,无论调用这些构造函数:只有一个对象正在实例化/创建那里,这是子类。 – 2013-04-21 04:55:51
你可以这样看待它。但是你也可以说同一个对象也是超类的一个实例。可以肯定的是,实例除了包含它自己之外,还包含超类定义的所有字段。 – Thilo 2013-04-21 05:43:31
因为总有一个隐含的super()
通话(如果没有明确完成)以父级的构造函数在孩子的构造函数中。
虽然这是一个旧的文章我碰到这个概念就认为值得分享它
因为我们在这里讨论的实例块是如何实例代码流程执行父子关系类 //儿童伸出父 如果我们创建一个对象儿童
1)的类的实例成员的鉴定从父到子
2)仅在父类的实例变量赋值和实例块的执行
3)父类的构造执行
4)实例变量赋值和实例块只在儿童类执行
5)子构造的执行
实际上,还有一点,在任何现有的超级构造函数调用之后,实例初始化块将被添加到构造函数中。请参阅http://java-blog.kbsbng.com/2016/01/instance-initializer-blocks-in-java.html以供参考 – kbsbng 2016-01-10 09:28:40