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

标签 java static final static-block

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

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 类本身的静态 block 中使用 Test.b = 10;?如果没有类名,它可以正常工作。

这背后有什么原因吗?

最佳答案

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

但是当您使用 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 必须是肯定的 在访问之前分配,或者发生编译时错误。

同样,每个空白的 final 变量最多只能赋值一次;肯定是 当分配给它时肯定是未分配的。

当且仅当 变量(或者,对于一个字段,它的简单名称由 this 限定) 出现在左侧 赋值运算符的一侧。

每次赋值给一个空白的 final 变量,这个变量必须是肯定的 在赋值之前未赋值,或者发生编译时错误。

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

关于java - 为什么我们不能通过类名在静态 block 中设置静态最终变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506053/

相关文章:

c++ - C++ 中的静态属性

java - getClass() 和静态方法 : What is the best practice?

c++ - 为什么将final添加到final类的成员函数中?

java - 在 Java 中定义最终的 String 有意义吗?

java - 进程正在暂停,直到我关闭程序

java - 创建位矩阵和扫描集列的有效方法

Java程序无法作为Java应用程序运行

swift - "static let"与 "let"用于声明特定于类的常量

java - Java 中继承的最终常量值?

java - 在 Java 中以编程方式设置主题备用名称