【发布时间】:2018-01-08 20:47:15
【问题描述】:
为什么这段代码在右侧使用显式静态字段表示法编译,但不是没有?
public class A
{
static int a = ++A.a; // compiles
//static int a = ++a; // error - cannot reference a field before it is defined
public static void main(String[] args) {
System.out.println(a);
}
}
【问题讨论】:
-
因为规范就是这样写的。 Sec 8.3.3,确切地说。具体来说,这不是一个简单的名称,因此并非所有编译时错误的条件都得到满足。
-
出于好奇:这种事情的 IRL 用例是什么?真正的程序员原则:难写,就应该难读? ;-)
-
@AndyTurner 检查了您的参考资料,对我来说看起来是正确的。如果你把它放在一个答案中,我会接受它。
-
@Lothar:这只是一个安全网,还有其他漏洞(例如来自方法或其他类的引用)。让不寻常的语法成为逃生口是一种非常常见的方法。
-
@Lothar - 这是一个反问......
标签: java static initialization