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

时间:2018-03-06 20:29:52

标签: 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'。

为什么?

1 个答案:

答案 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