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