Java 为什么可以';我们通过类名设置静态块中静态final变量的值 例如,考虑下面的代码快照: 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. }

Java 为什么可以';我们通过类名设置静态块中静态final变量的值 例如,考虑下面的代码快照: 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. },java,static,final,static-block,Java,Static,Final,Static Block,为什么我们不能使用Test.b=10在Test类本身的静态块中?如果没有类名,它工作得很好 这背后有什么原因吗?使用前必须初始化静态最终变量。它可以在声明时直接初始化,也可以在静态块中初始化 但是使用class.var=x时,它不被视为初始化,而是赋值 对于JDK 7,错误是无法为最终变量赋值 这就解释了为什么删除final关键字会起作用 class Test { static final int a = 2; // initialization at declaration time

为什么我们不能使用
Test.b=10
Test
类本身的静态块中?如果没有类名,它工作得很好


这背后有什么原因吗?

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

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

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

这样的赋值定义为当且仅当 变量(或者,对于字段,其简单名称由此限定)出现在左侧 赋值运算符的一侧

对于每个空白最终变量的赋值,该变量必须是 在赋值之前未赋值,或发生编译时错误


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

因为在静态初始值设定项中,类尚未初始化?也可能是因为JLS禁止这样做……您是否对“JLS的哪一部分禁止这样做”或“为什么语言是这样设计的”感兴趣?这里可能是错误的,但可能是因为您将
Test.b
声明为
final
@JSKNS:除了该赋值之外,您在哪里看到它被初始化?如果你删除了
测试部分,你会如何看待这一变化?你是否在寻找一个秘密的冬季聚会帽来积累问题上被删除的答案…?我认为这不是很正确,尽管它的思路一定是正确的。这意味着你不能分配给一个空白的最终变量,除非它在那一点上肯定是未分配的,但它肯定是未分配的。在我看来,这并没有违反你所引用的条款。@Chiatic security:我不是一名真正的律师,英语也不是我的第一语言,因为我认为这里重要的单词是简单的名字,因为
Test.b
不是一个简单的名字。是的,这个短语很重要,但它所说的是
Test.b=10
不是“这样的任务”,也就是说,这段代码不适用于这段JLS。@Chiatic security:您是对的。我忘记了段落的第一行,该行指出,对于每次访问局部变量或空白最终字段x,x必须在访问之前明确赋值,否则会发生编译时错误。。增加了。@chiaticsecurity:正如我所说,英语不是我的第一语言,我认为访问可能是一种写操作,也可能是一种读操作,这与错误的文本是一致的。