5

为什么静态最终变量没有被赋予默认值,而静态(但非最终变量被赋予默认值)。

在 Java 中实现这种行为的原因是什么?

4

2 回答 2

16

当然,静态最终变量被赋予默认值,例如:

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,则明确地执行此操作会更清楚。

于 2012-04-30T09:53:18.403 回答
0

简单的。由于它们是final,因此您以后将无法修改它们,因此默认值也将是 final。以后将不允许您对其进行修改。不是很有用。

于 2012-04-30T09:48:28.873 回答