例如,考虑下面的代码快照:
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
没有类名它工作正常。
这背后有什么原因吗?
例如,考虑下面的代码快照:
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
没有类名它工作正常。
这背后有什么原因吗?
静态最终变量必须在使用前进行初始化。它可以在声明时直接初始化,也可以在静态块中初始化。
但是,当您使用class.var = x
它时,它不会被视为初始化,而是被视为分配。
对于 JDK 7,错误是cannot assign a value to final variable。
这就解释了为什么如果您删除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 限定)出现在赋值运算符的左侧时,才会定义这样的赋值。
对于每次对空白最终变量的赋值,该变量必须在赋值之前明确地未赋值,否则会发生编译时错误。
强调我的,但我认为这是错误的真正原因。