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) { }
}
It is a compile-time error if a blank final (§4.12.4) class variable is not definitely assigned (§16.8) by a static initializer (§8.7) of the class in which it is declared.
# 1 楼答案
当然,静态最终变量是给定的默认值,请参见以下示例:
输出为:
如果
x
没有按照JLS 4.12.5中指定的默认值0
,那么输出将取决于所使用的JVM。你可能会看到一些随机数更新:现在我们已经演示了静态final字段确实获得默认值,您可能想知道为什么默认值不够。除了显而易见的一个问题外,这个问题没有好的答案:"The spec says so"。摘自8.3.1.2:
我们只能猜测这种限制背后的动机,但我认为这是为了让程序更容易理解。如果要将变量设置为0,则显式设置更为清晰
# 2 楼答案
简单。由于它们是
final
,您以后将无法修改它们,因此默认值也是final。以后将不允许您修改它。不是很有用