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

时间:2016-12-27 20:31:00

标签: java constructor instance-variables

变量仅在对象创建期间获取内存分配,那么为什么为构造函数外部的变量赋值不会产生错误?此外,由于没有创建特定对象,因此该指定值的位置是什么?

1 个答案:

答案 0 :(得分:0)

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

  

变量仅在对象创建期间获取内存分配

实际上,顺序如下:

  1. 评估构造函数参数表达式。
  2. 执行类初始化(如果尚未执行)。 (这在课程的一生中发生过一次......)
  3. 为对象分配内存,包括类和超类链的实例字段的内存。
  4. 执行默认初始化字段。
  5. 执行this(...)super(...)来电。 (这会对链执行字段初始化和运行构造函数进行递归。对于this调用,我们跳过下一步。)
  6. 以源代码顺序执行类实例字段初始值设定项和静态初始化程序块。
  7. 执行构造函数的其余部分。
  8. 如果这是叶子构造函数,则返回构造的对象。否则解除一级递归。
  9. 步骤6是您关注的字段初始值设定项的处理方式。初始化表达式和块的代码组合成一个合成方法,该方法由构造函数在适当的点调用。但是,这是一个实现细节。

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

      

    此外,由于没有创建特定对象,此指定值的位置是什么?

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

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

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