为什么静态最终变量不是默认值?

时间:2012-04-30 09:45:31

标签: java

为什么静态最终变量不是默认值,而静态(但非最终变量是默认值)。

在Java中实现此类行为的原因是什么?

2 个答案:

答案 0 :(得分: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.5中的规定给出0的默认值,则输出将取决于所使用的JVM。您可能会看到一些随机数。

更新:现在我们已经证明静态最终字段确实获得了默认值,您可能想知道默认值不够的原因。除了显而易见的问题之外,这个问题没有一个好的答案:"The spec says so"。摘录自8.3.1.2:

  

如果空白的final(§4.12.4)类变量未被声明它的类的静态初始化程序(第8.7节)明确赋值(第16.8节),则是编译时错误。

我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则可以更明确地执行此操作。

答案 1 :(得分:0)

简单。由于它们是final,因此您将无法在以后修改它们,因此默认值也将是最终的。您将无法在以后修改它。不太有用。