例如,考虑下面的代码捕捉:
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.b = 10;
类本身的静态块中使用Test
?没有班级名称,它的工作正常。
这背后有什么理由吗?
答案 0 :(得分:7)
必须在使用前初始化静态最终变量。它可以在声明时直接初始化,也可以在静态块中初始化。
但是当你使用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必须是明确的 在访问之前分配,或发生编译时错误。
同样,每个空白的最终变量最多只能分配一次;肯定是 当它的赋值发生时,它肯定是未分配的。
这样的赋值被定义为当且仅当的简单名称时才出现 变量(或者,对于一个字段,其简单名称由此限定)出现在左侧 任务操作员的一面。
对于空白最终变量的每个赋值,变量必须是明确的 在分配之前未分配,或发生编译时错误。
强调我的,但我认为这是错误的真正原因。