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:好吧,我们只是不同意。(我不再是——不再是要测试的机器了。)