【发布时间】:2018-05-11 07:03:06
【问题描述】:
看了stackoverflow上的各种链接,我有这样的理解:
这是否正确:
- 实例变量在类被实例化时被初始化。
- 如果实例变量只声明而不初始化,它们 将在构造函数执行之前由 JVM 分配默认值。
- 如果实例变量是用初始化声明的,那么这些 行将在我的类的每个构造函数中移动。因此, 编译器会在构造函数中执行。
谢谢。
【问题讨论】:
-
您可以在 Java 语言规范第 12.5 节中找到所有步骤。该语言可能有点技术性,但它是权威的来源。你上面写的很接近,但并不完全正确。例如,实例变量总是首先被赋予它们的默认值,不管它们是否有初始化器。对于 Java 8:docs.oracle.com/javase/specs/jls/se10/html/jls-12.html#jls-12.5
-
我从上面的链接了解到以下执行流程: 1. 内存分配(假设所需内存由 JVM 计算) 2. JVM 分配给相应实例变量的默认值 3. 构造函数执行(第一行) 4. 实例初始化程序执行(假设构造函数执行已停止) 5. 剩余的构造函数执行。还不清楚在声明时初始化的变量何时执行?
-
另外,现在下面的答案说,“我可以说声明时的初始化是由编译器在构造函数执行之前完成的”。让我更加困惑
-
在第 4 步中完成:为此类执行实例初始化程序和 实例变量初始化程序
-
谢谢,最后一件事:编译器是否在幕后移动了构造函数中的实例变量初始化器?还是人们只是为了更好地理解而这么说。这是因为:编译器在第一行之后停止(递归调用 super() 或 this())以运行实例变量初始化程序(未移动到构造函数),然后执行剩余的构造函数代码?