摘要:两个初始化程序都访问一个尚未初始化的字段(因此,其默认值为零)。由于这很可能是编程错误,因此该语言禁止了这种访问的某些简单形式。但是,它不禁止使用更复杂的形式。
该行为符合JLS,特别是第8.3.2.3节。初始化期间对字段的使用限制
只有在成员声明是
static类或接口的实例字段(分别为)C且满足以下所有条件的情况下,成员声明才需要以文本形式出现:
使用情况发生在C的实例(分别
static)的变量初始化程序中或C的实例(分别static)的初始化程序中。用法不在作业的左侧。
用法是通过一个简单的名称。
C是包含用法的最里面的类或接口。
第一个示例满足所有四个条件,因此无效。第二个示例不满足第三个条件(
this.x不是简单的名称),因此可以。
事件的总体顺序如下:
- 创建类的实例时,所有字段都将初始化为其类型的默认值。
- 然后按文本顺序(从上到下)运行初始化程序。
因此,如果初始化程序引用的是稍后在类定义中出现的字段(或字段本身),它将看到该其他字段的默认值。这很可能是编程错误,因此第8.3.2.3节明确禁止。
例如,如果通过使用
this.前向引用字段来绕过§8.3.2.3
,您将看到默认值(表示零
int)。因此,以下内容定义明确,可以保证将其设置
x为
42:
class test { int x = this.x + 42;}


