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'。
为什么?
答案 0 :(得分:7)
由rules for Definite Assignment指定:
设C为一个类,让V为C的空白
static final
成员字段, 在C中声明。然后:
在最左边的枚举常量静态初始化器之前,V绝对是未分配的(并且还没有明确赋值) (§8.7),或C的静态变量初始化器。
在枚举常量,静态初始值设定项或C的静态变量初始值设定项之前,除了最左边的iff V之外,V是[un]赋值的 在前面的枚举常量,静态初始化程序或之后分配[un] C的静态变量初始化器。
外行人的说法:
使用静态初始化程序通过引用其简单名称来初始化static final
字段是正常的,因为该字段在初始化程序之后是明确分配的。实际上,在声明静态初始化程序的类中有上下文,并且您没有通过简单名称引用该字段来执行任何非法赋值;相反,您正在满足必须明确分配字段的要求。
使用静态初始化程序通过引用其限定名称来初始化static final
字段是非法的,因为在引用它的静态属性时,类必须进行初始化(在在您的情况下,Test.A
必须之前进行初始化,并在初始化完成后为A
分配默认值null
。