Sne*_*tel 21 java static final static-block
例如,考虑下面的代码捕捉:
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.
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能Test.b = 10;在Test类本身的静态块中使用?没有班级名称,它工作正常.
这背后有什么理由吗?
必须在使用前初始化静态最终变量.它可以在声明时直接初始化,也可以在静态块中初始化.
但是当你使用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
}
...
}
Run Code Online (Sandbox Code Playgroud)
编辑
在JLS中,正确的初始化词是明确的分配
从JLS中提取:
对于本地变量或空白最终字段x的每次访问,必须在访问之前明确分配x,否则发生编译时错误.
同样,每个空白的最终变量最多只能分配一次; 当它的赋值发生时,它必须是绝对未分配的.
当且仅当变量的简单名称(或者,对于字段,其由此限定的简单名称)出现在赋值运算符的左侧时,才会定义此类赋值.
对于空白最终变量的每个赋值,必须在赋值之前明确地取消赋值变量,否则会发生编译时错误.
强调我的,但我认为这是错误的真正原因.
| 归档时间: |
|
| 查看次数: |
2287 次 |
| 最近记录: |