静态最终变量必须在使用前初始化。它可以直接在声明时初始化,也可以在静态块中初始化。
但是当你使用它时,它不是一个初始化,而是一个分配。class.var = x
对于 JDK 7,错误是无法为最终变量赋值。
这就解释了为什么如果您删除关键字,它会起作用final
class Test {
static final int a = 2; // initialization at declaration time
static final int b;
static final int c;
static {
b = 4; // initialization in static block
Test.c = 6; // error : cannot assign a value to final variable c
}
...
}
编辑
在 JLS 中,初始化的正确词是定赋值
摘自JLS:
对于局部变量或空白最终字段 x 的每次访问,必须在访问之前明确分配 x,否则会发生编译时错误。
类似地,每个空白的最终变量最多必须分配一次;当对它进行赋值时,它必须是绝对未赋值的。
当且仅当变量的简单名称(或者,对于字段,其简单名称由此限定)出现在赋值运算符的左侧时,才会发生此类赋值。
对于对空白最终变量的每个赋值,在赋值之前必须明确取消赋值该变量,否则会发生编译时错误。
强调我的,但我认为这是错误的真正原因。