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

问题描述 投票:6回答:1
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'赋值。

为什么?

java
1个回答
7
投票

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)。
© www.soinside.com 2019 - 2024. All rights reserved.