初始化java中的静态最终变量

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’赋值。

为什么?

由定义分配规则指定 :

设C为一个类,让V为C的空白static final成员字段,在C中声明。然后:

  • 在最左边的枚举常量,静态初始化器(§8.7)或C的静态变量初始化器之前,V肯定是未分配的(并且还没有明确赋值)。

  • 除了最左边的iff V在前面的枚举常量,静态初始化器或C的静态变量初始化器之后[un]赋值之外,V在枚举常量,静态初始化器或C的静态变量初始化器之前被指定[un]。

通俗地说:

  • 使用静态初始化程序通过引用其简单名称来初始化static final字段是正常的,因为该字段在初始化程序之后是明确赋值的。 实际上,在声明静态初始化程序的类中有上下文,并且您没有通过简单名称引用该字段来执行任何非法赋值; 相反,您正在满足必须明确分配字段的要求。

  • 使用静态初始化程序通过引用其限定名称来初始化static final字段是非法的,因为在引用它的静态属性时必须初始化类(在您的情况下, 必须在之前初始化Test.A ,并且为A分配完成初始化后的默认值为null )。