为什么静态最终变量没有被赋予默认值,而静态(但非最终变量被赋予默认值)。
在 Java 中实现这种行为的原因是什么?
当然,静态最终变量被赋予默认值,例如:
class Test {
static final int x;
static {
printX();
x = 42;
printX();
}
static void printX() {
System.out.println("Here x is "+x);
}
public static void main(String[] args) { }
}
输出是:
Here x is 0
Here x is 42
如果x
没有给出JLS 4.12.50
中指定的默认值,则输出将取决于所使用的 JVM。您可能会看到一些随机数。
更新:既然我们已经证明静态最终字段确实获得了默认值,您可能想知道为什么默认值还不够。这个问题没有很好的答案,除了显而易见的问题:“规范是这样说的”。摘自 8.3.1.2:
如果声明它的类的静态初始化程序(第 8.7 节)未明确分配(第 16.8 节)一个空白 final(第 4.12.4 节)类变量,则这是编译时错误。
我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果您想将变量设置为 0,则明确地执行此操作会更清楚。
简单的。由于它们是final
,因此您以后将无法修改它们,因此默认值也将是 final。以后将不允许您对其进行修改。不是很有用。