为什么不是一个合格的静态最终变量在静态初始化块允许吗?(Why isn't a qualif

2019-06-21 18:46发布

情况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所引起编译错误?

Answer 1:

该JLS持有答案(注意是大胆的声明):

同样,每一个空白最终变量必须最多分配一次; 它必须是当分配给它肯定会发生未分配这样的分配被定义当且仅当任一变量的简单名称(或者,对于一个场,其由该合格简单名称)在赋值运算符的左手侧发生发生。 [ §16 ]

这意味着,“简单名称”必须分配静态final变量时可以使用 - 即变量名称,没有任何修饰词。



Answer 2:

显然,这是一种廉价的语法技巧来限制类本身中明确(UN)分配分析。

如果该字段是一个类名语法合格,该代码通常是在另一个类,这里的分析也无法到达。

这招在你的榜样失败。 古怪的其他例子:

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

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



文章来源: Why isn't a qualified static final variable allowed in a static initialization block?