当我们创建一个对象时,对象的创建和构造函数的执行是同时发生还是第一个对象被创建然后构造函数执行?
它在 Herbert Schildt 中写道:“一旦定义,构造函数将在对象创建后、new 运算符完成之前立即自动调用”。我的队列是,如果 new 运算符尚未完成其内存分配,那么如何在 new 完成之前调用构造函数,因为它编写的构造函数仅在创建对象之后调用。
最佳答案
Section 12.5 of the JLS给出了详细信息。它的基本框架是:
- 分配内存空间(所有字段都具有相关类型的默认值,例如
null
或 0) - 调用指定类的构造函数,该构造函数将立即链接到同一类中的另一个构造函数或 super 构造函数
- 最终链到达
java.lang.Object
- 在返回的每个构造函数链中,实例变量根据其字段初始值设定项(如果有)进行初始化(并且仅当我们没有链接到同一类中的另一个构造函数时),然后执行构造函数主体代码。然后返回到调用构造函数等。
当然,JLS 更详细,包括内存不足或构造函数体抛出异常的情况。
构造函数每一位的计时都很重要:
- 链接到此/ super 构造函数
- (隐式)如果链是父类(super class)构造函数,则为字段分配初始值
- 构造函数主体
重要的是要理解,如果 super 构造函数调用显示字段值的重写方法,那么它将尚未执行字段初始值设定项。因此,您可以看到字段的默认值,而不是您期望从初始值设定项获得的值。例如:
class Bar extends Foo {
private String name = "fred";
@Override public String toString() {
return name;
}
}
如果 Foo
构造函数调用 toString()
,则将为 null
而不是 "fred"
。
(如果name
是final
,那么它在toString()
中被视为常量,并且会发生其他事情,但这是另一回事.)
关于java - 当我们创建一个对象时,对象的创建和构造函数的执行是同时发生的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27947296/