例如,考虑下面的代码快照:
public static final int a;
public static final int b;
static {
a = 8; // it's working
Test.b = 10; // compilation error Test.b cannot be assigned.
}
为什么我们不能在 Test
类本身的静态 block 中使用 Test.b = 10;
?如果没有类名,它可以正常工作。
这背后有什么原因吗?
最佳答案
静态最终变量必须在使用前进行初始化。它可以在声明时直接初始化,也可以在静态 block 中初始化。
但是当您使用 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 必须是肯定的 在访问之前分配,或者发生编译时错误。
同样,每个空白的 final 变量最多只能赋值一次;肯定是 当分配给它时肯定是未分配的。
当且仅当 变量(或者,对于一个字段,它的简单名称由 this 限定) 出现在左侧 赋值运算符的一侧。
每次赋值给一个空白的 final 变量,这个变量必须是肯定的 在赋值之前未赋值,或者发生编译时错误。
强调我的,但我认为这是错误的真正原因。
关于java - 为什么我们不能通过类名在静态 block 中设置静态最终变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506053/