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

Vai*_*hav 5 java

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

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

Jon*_*oni 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) { }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Here x is 0
Here x is 42
Run Code Online (Sandbox Code Playgroud)

如果x没有给出JLS 4.12.5中0指定的默认值,则输出将取决于所使用的JVM.您可能会看到一些随机数.

更新:现在我们已经证明静态最终字段确实获得了默认值,您可能想知道为什么默认值不够.除了显而易见的问题之外,这个问题没有一个好的答案:"规范是如此".摘录自8.3.1.2:

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

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

  • 当一个答案完全打破了其他人(包括我)的假设时,我喜欢它.好一个. (4认同)
  • @JoniSalonen +1你完全正确!我正在删除我的答案......(或者无论如何都要投票) (2认同)
  • @Vaibhav:明白了.我只是说,这很大程度上取决于你如何看待它,因为那里有一个默认值.如果需要,您甚至可以使用该默认值,尽管您必须使用它:http://pastebin.com/kg95wq4M (2认同)