我对实例块和构造函数有疑问。我了解到实例块总是在构造函数之前执行。
但是,如果我尝试访问实例变量,或者甚至尝试使用“this”,则不会出现任何错误。 但是,即使在创建对象之前,我怎样才能访问实例变量。
答案 0 :(得分:2)
我了解到实例块总是在构造函数之前执行。
然后你学到了错误。他们不是。在隐式super()调用之后,它们在构造函数中执行。
答案 1 :(得分:1)
构造函数实际上并不创建对象,因此您指示的悖论实际上并不存在。构造函数仅在先前分配的对象上运行。
但是,用于调用构造函数的new
运算符执行创建对象的任务,然后在一个原子操作中调用构造函数。
此外,Java编译器通过有效地将包含在其中的代码添加到每个构造函数来实现实例块,因此它们也作为被调用的构造函数的一部分运行。
答案 2 :(得分:-1)
因为,在对象生命的开始,Java虚拟机(JVM)在堆上分配足够的内存以容纳对象的实例变量。但是,首次分配该内存时,它包含的数据是不可预测的。如果按原样使用内存,则对象的行为也是不可预测的。为了防范这种情况,Java确保在任何代码使用内存之前初始化内存,至少是可预测的默认值。