静态final字段的初始化可以从静态初始化器中进行

6
为什么不能使用声明类作为限定符(静态方式)从相应的静态初始化器中访问静态final字段?
一开始,我认为这是Eclipse的一个bug:
我还觉得自己有点缺乏知识,因为静态初始化器不是我每天都用的。但是看啊,这样就像所预期的那样可以在没有类限定符的情况下工作:
要完成我的测试系列,我尝试在命令行中进行:
导致相同的结果。
这使我有了最后一个问题:
是否有任何理由禁止使用类限定符从静态初始化器块中访问静态final字段? 因为在声明类之前没有初始化吗?

@Shail016 是正确的,对不起,伙计们。 - Franz Ebner
2个回答

5
实际上,你可以从静态初始化器初始化静态字段。
但我认为(我不确定),你有另一个问题。这里的问题是,你(根据编译器)正在尝试分配一个final字段。然而,你真正的意图并不是要分配它...你正在尝试初始化它。但是编译器无法理解这一点。
当你调用像Test.I这样的东西时,编译器会认为你正在尝试修改可能已经被初始化(即从静态初始化器)的静态变量。编译器并不聪明,无法看到你实际上正在初始化变量,它只是将你解释为从类中分配静态变量,无论是Test还是Foo。
然而,如果你没有使用类限定符调用它,编译器知道你正在尝试修改自己的静态变量,并在静态初始化器中进行操作,因此对于final字段来说是安全的。
请注意,我希望我表达得足够清楚,并且请注意,我对这种行为不确定。

1
为了在初始化块中初始化最终变量,应该使用变量的简单名称。即仅用变量名而不带任何限定符。
以下是Java语言规范中所述的内容:
“同样,每个空白final变量必须被分配一次;当对它进行分配时,它必须明确未分配。这样的分配被定义为仅当变量的简单名称或其由this限定的简单名称出现在赋值运算符的左侧时发生。Java编译器必须执行特定的保守流分析,以确保对空白final变量的每次分配,在分配之前变量一定未分配;否则必须发生编译时错误。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接