Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不';给定默认值的静态最终变量?_Java - Fatal编程技术网

Java 为什么不';给定默认值的静态最终变量?

Java 为什么不';给定默认值的静态最终变量?,java,Java,为什么静态最终变量没有给出默认值,而静态(但非最终变量给出默认值) 在Java中实现这种行为的原因是什么?很简单。由于它们是final,您以后将无法修改它们,因此默认值也将是final。以后将不允许您修改它。不是很有用。当然,静态最终变量是给定的默认值,请参见以下示例: class Test { static final int x; static { printX(); x = 42; printX(); } s

为什么静态最终变量没有给出默认值,而静态(但非最终变量给出默认值)


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

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

当然,静态最终变量是给定的默认值,请参见以下示例:

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
指定默认值
0
,则输出将取决于所使用的JVM。你可能会看到一些随机数

更新:现在我们已经演示了静态final字段确实获得默认值,您可能想知道为什么默认值不够。除了显而易见的一个问题外,这个问题没有好的答案。摘自8.3.1.2:

如果一个空的final(§4.12.4)类变量没有被声明它的类的静态初始值设定项(§8.7)明确赋值(§16.8),则这是一个编译时错误


我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则显式设置更为清晰。

@Thomas small bug,已修复。这个例子还缺少一个主要方法,我喜欢当一个答案完全推翻了其他人(包括我)的假设。不错。@JoniSalonen+1你完全正确!我正在删除我的答案。。。(或者投票赞成)这可能是一个错误的答案。只需取消注释行
x=42
,然后尝试编译程序。@Vaibhav:明白。我只是说,这在很大程度上取决于你如何看待它,因为这里有一个默认值。如果你愿意的话,你甚至可以使用默认值,尽管你必须这样做:@T.J.Crowder My bad,I dint查看他/她的个人资料:)为什么一个问题表面上是错误的被投票了?(真的很好奇。)@DaveNewton:因为这是一个好问题,尽管从技术上讲并不完全正确。看看有多少人在没有质疑问题基础的情况下发布了答案。其他人也会有类似的误解,希望他们能来到这里,找到乔尼的答案,像我一样,学到一些他们以前不知道的东西。不太正确?!几分钟和几行代码可能会对基本假设造成谎言——研究得很差。@Dave:好吧,我们只是不同意。(我不再是——不再是要测试的机器了。)