gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:47:59 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com