为什么静态最终变量不是默认值,而静态(但非最终变量是默认值)。
在Java中实现此类行为的原因是什么?
答案 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
,因此您将无法在以后修改它们,因此默认值也将是最终的。您将无法在以后修改它。不太有用。