这是我的代码:
class StaticBlock {
{
println("initializer block : " + message);
}
public StaticBlock(String message) {
this.message = message;
}
private String message;
}
现在的问题是,在初始化块中
{
println("initializer block : " + message);
}
如果我添加this
之前的关键字message
,可以用,但是丢失的时候出现错误this
关键词。
编译器说:
StaticBlockDemo.java:34: illegal forward reference
println("initializer block : " + message);
^
1 error
为什么它们不一样?
我不知道设计原理,但阅读Java语言规范的相关部分可能会有所帮助。
8.6。实例初始化器
允许实例初始值设定项通过关键字引用当前对象this
(§15.8.3),使用关键字super
(§15.11.2,§15.12),并在范围内使用任何类型变量。
其声明在使用后以文本方式出现的实例变量的使用有时会受到限制,即使这些实例变量在作用域内。有关管理对实例变量的前向引用的精确规则,请参阅第 8.3.2.3 节。
8.3.2.3。初始化期间Fields的使用限制
仅当成员是实例时(分别为static
) 类或接口的字段C
并且满足以下所有条件:
以下是规范该部分的示例,经过删减,以说明您所询问的具体问题:
class UseBeforeDeclaration {
{
j = 200;
// ok - assignment
j = j + 1;
// error - right hand side reads before declaration
int k = j = j + 1;
// error - illegal forward reference to j
int n = j = 300;
// ok - j at left hand side of assignment
int h = j++;
// error - read before declaration
int l = this.j * 3;
// ok - not accessed via simple name
}
int j;
}
不过,我还应该指出,即使是代码的编译版本也不会执行您想要的操作。如果你运行它:
new StaticBlock("abc");
它将打印
initializer block : null
这是因为初始化程序是在(大部分)构造函数主体之前执行的。以下是规范中的要点:
12.5。创建新的类实例
[...]使用以下过程处理指定的构造函数以初始化新对象:
[...]
4. 执行该类的实例初始值设定项和实例变量初始值设定项[...]
5. 执行该构造函数主体的其余部分。[...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)