这个问题在这里已有答案:
public class Test {
private static final int A;
static {
A = 5;
}
}
这种初始化静态最终变量A的方法没问题。
public class Test {
private static final int A;
static {
Test.A = 5;
}
}
这种方式会产生编译错误“无法为最终变量'A'赋值。
为什么?
由rules for Definite Assignment指定:
设C为一个类,让V为C的空白
static final
成员字段,在C中声明。然后:
- 在最左边的枚举常量,静态初始化器(§8.7)或C的静态变量初始化器之前,V肯定是未分配的(并且还没有明确赋值)。
- 在枚举常量,静态初始化器或C的静态变量初始化器之前,除了最左边的iff V在前面的枚举常量,静态初始化器或C的静态变量初始化器之后被指定[un]时,V被[un]赋值。
通俗地说:
static final
字段是正常的,因为该字段在初始化程序之后是明确分配的。实际上,在声明静态初始化程序的类中有上下文,并且您没有通过简单名称引用该字段来执行任何非法赋值;相反,您正在满足必须明确分配字段的要求。static final
字段是非法的,因为在引用它的静态属性时必须初始化类(在您的情况下,Test.A
必须先被初始化,并且A
被赋值为默认值完成初始化后的null
)。