为什么静态初始化块中不允许有一个合格的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; } }
如果他们有更多的资源,他们可能会做出更好的规则。 但是现在我们不能改变规格。