如何在构造函数之外初始化变量?

How is it possible for variables to be initialized outside of the constructor?

变量只在对象创建时获得内存分配,那么为什么在构造函数之外给变量赋值不会产生错误?此外,由于没有创建特定对象,此分配值的位置是什么?

因为所有实例字段初始化程序代码(和任何实例初始化程序块)都被执行,就好像它们是构造函数的一部分一样。

Variables only get memory allocation during object creation

其实顺序如下:

  1. 计算构造函数参数表达式。
  2. 执行 class 初始化(如果尚未执行)。 (这种情况在 class 的生命周期内发生一次 ...)
  3. 为对象分配内存,包括class和superclass链实例字段的内存。
  4. 执行默认初始化字段。
  5. 执行 this(...)super(...) 调用。 (这递归执行字段初始化和 运行 构造函数的链。对于 this 调用,我们然后跳过下一步。)
  6. 按源代码顺序执行 classes 实例字段初始化器和静态初始化器块。
  7. 执行构造函数的其余部分。
  8. 如果这是叶构造函数,return 构造的对象。否则展开一层递归。

第 6 步是处理您关心的字段初始值设定项的地方。初始化表达式和块的代码被组合成一个合成方法,该方法在适当的时候由构造函数调用。但是,这是一个实现细节。

如您所见,分配给对象的内存量很早就确定了,不受任何初始化逻辑的影响。在对象本身中表示它们所需的变量和内存量将是相同的...无论如何。

Moreover what is the location of this assigned value as no particular object is created?

字段的位置是步骤 3 中分配的对象的一部分。就像在构造函数中完成初始化的情况一样。

(也许您对将对象或数组分配给字段时实际发生的事情感到困惑?请记住,对象和数组类型称为 引用类型。字段或变量其类型是引用类型对应于保存引用的位置...而不是引用所指对象的实际状态。)

(也许你认为构造函数的调用与普通方法的调用相同。事实并非如此......见上文。)