为什么我们不能通过类名在静态块中设置静态最终变量的值

2022-09-02 02:00:52

例如,考虑下面的代码快照:

public static final int a;
public static final int b;

static {
    a = 8;       // it's working
    Test.b = 10; // compilation error Test.b cannot be assigned. 
}

为什么我们不能在类本身的静态块中使用?没有类名,它工作正常。Test.b = 10;Test

这背后有什么原因吗?


答案 1

静态最终变量必须在使用前初始化。它可以直接在声明时初始化,也可以在静态块中初始化。

但是当你使用它时,它不是一个初始化,而是一个分配。class.var = x

对于 JDK 7,错误是无法为最终变量赋值

这就解释了为什么如果您删除关键字,它会起作用final

class Test {

    static final int a = 2; // initialization at declaration time
    static final int b;
    static final int c;

    static {
        b = 4;  // initialization in static block
        Test.c = 6; // error : cannot assign a value to final variable c
    }
    ...

}

编辑

在 JLS 中,初始化的正确词是定赋值

摘自JLS:

对于局部变量或空白最终字段 x 的每次访问,必须在访问之前明确分配 x,否则会发生编译时错误。

类似地,每个空白的最终变量最多必须分配一次;当对它进行赋值时,它必须是绝对未赋值的。

当且仅当变量的简单名称(或者,对于字段,其简单名称由此限定)出现在赋值运算符的左侧时,才会发生此类赋值。

对于对空白最终变量的每个赋值,在赋值之前必须明确取消赋值该变量,否则会发生编译时错误。

强调我的,但我认为这是错误的真正原因。


答案 2

推荐