为什么静态初始化块中不允许有一个合格的static finalvariables?

情况1

class Program { static final int var; static { Program.var = 8; // Compilation error } public static void main(String[] args) { int i; i = Program.var; System.out.println(Program.var); } } 

案例2

 class Program { static final int var; static { var = 8; //OK } public static void main(String[] args) { System.out.println(Program.var); } } 

为什么案例1导致编译错误?

JLS有答案(注意大胆的陈述):

同样,每个空白的最终variables最多只能分配一次; 当它发生分配时,它肯定是分配的。 这样的分配被定义为当且仅当在赋值操作符的左侧出现variables的简单名称(或者,对于字段而言,其简单名称由此限定)时才发生。 [ §16 ]

这意味着在分配静态最终variables时必须使用“简单名称” – 即没有任何限定符的var名称。

显然这是一个便宜的语法技巧来限制类中的明确(非)赋值分析。

如果该字段在语法上与类名称一致,则代码通常位于另一个类中,分析无法到达。

这个技巧在你的例子中失败了。 其他古怪的例子:

 static class A { static final int a; static { // System.out.println(a); // illegal System.out.println(Aa); // compiles! a = 1; } } 

如果他们有更多的资源,他们可能会做出更好的规则。 但是现在我们不能改变规格。