如何在构造函数之外初始化变量?
How is it possible for variables to be initialized outside of the constructor?
变量只在对象创建时获得内存分配,那么为什么在构造函数之外给变量赋值不会产生错误?此外,由于没有创建特定对象,此分配值的位置是什么?
因为所有实例字段初始化程序代码(和任何实例初始化程序块)都被执行,就好像它们是构造函数的一部分一样。
Variables only get memory allocation during object creation
其实顺序如下:
- 计算构造函数参数表达式。
- 执行 class 初始化(如果尚未执行)。 (这种情况在 class 的生命周期内发生一次 ...)
- 为对象分配内存,包括class和superclass链实例字段的内存。
- 执行默认初始化字段。
- 执行
this(...)
或 super(...)
调用。 (这递归执行字段初始化和 运行 构造函数的链。对于 this
调用,我们然后跳过下一步。)
- 按源代码顺序执行 classes 实例字段初始化器和静态初始化器块。
- 执行构造函数的其余部分。
- 如果这是叶构造函数,return 构造的对象。否则展开一层递归。
第 6 步是处理您关心的字段初始值设定项的地方。初始化表达式和块的代码被组合成一个合成方法,该方法在适当的时候由构造函数调用。但是,这是一个实现细节。
如您所见,分配给对象的内存量很早就确定了,不受任何初始化逻辑的影响。在对象本身中表示它们所需的变量和内存量将是相同的...无论如何。
Moreover what is the location of this assigned value as no particular object is created?
字段的位置是步骤 3 中分配的对象的一部分。就像在构造函数中完成初始化的情况一样。
(也许您对将对象或数组分配给字段时实际发生的事情感到困惑?请记住,对象和数组类型称为 引用类型。字段或变量其类型是引用类型对应于保存仅引用的位置...而不是引用所指对象的实际状态。)
(也许你认为构造函数的调用与普通方法的调用相同。事实并非如此......见上文。)
变量只在对象创建时获得内存分配,那么为什么在构造函数之外给变量赋值不会产生错误?此外,由于没有创建特定对象,此分配值的位置是什么?
因为所有实例字段初始化程序代码(和任何实例初始化程序块)都被执行,就好像它们是构造函数的一部分一样。
Variables only get memory allocation during object creation
其实顺序如下:
- 计算构造函数参数表达式。
- 执行 class 初始化(如果尚未执行)。 (这种情况在 class 的生命周期内发生一次 ...)
- 为对象分配内存,包括class和superclass链实例字段的内存。
- 执行默认初始化字段。
- 执行
this(...)
或super(...)
调用。 (这递归执行字段初始化和 运行 构造函数的链。对于this
调用,我们然后跳过下一步。) - 按源代码顺序执行 classes 实例字段初始化器和静态初始化器块。
- 执行构造函数的其余部分。
- 如果这是叶构造函数,return 构造的对象。否则展开一层递归。
第 6 步是处理您关心的字段初始值设定项的地方。初始化表达式和块的代码被组合成一个合成方法,该方法在适当的时候由构造函数调用。但是,这是一个实现细节。
如您所见,分配给对象的内存量很早就确定了,不受任何初始化逻辑的影响。在对象本身中表示它们所需的变量和内存量将是相同的...无论如何。
Moreover what is the location of this assigned value as no particular object is created?
字段的位置是步骤 3 中分配的对象的一部分。就像在构造函数中完成初始化的情况一样。
(也许您对将对象或数组分配给字段时实际发生的事情感到困惑?请记住,对象和数组类型称为 引用类型。字段或变量其类型是引用类型对应于保存仅引用的位置...而不是引用所指对象的实际状态。)
(也许你认为构造函数的调用与普通方法的调用相同。事实并非如此......见上文。)