为什么在静态初始化块中不允许使用合格的静态最终变量?

拉维:

情况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);
    }
}

情况二

class Program {
    static final int var;

    static {
        var = 8;  //OK
    }

    public static void main(String[] args) {
        System.out.println(Program.var);
    }
}

为什么情况1会导致编译错误?

arshajii:

JLS保留了答案(请注意粗体字):

同样,每个空白最终变量最多只能分配一次;对其进行分配,必须绝对将其取消分配这样的分配被定义为仅在变量的简单名称(或对于字段而言,其简单名称受其限定)出现在赋值运算符的左侧时才发生。[ §16 ]

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java不允许在构造函数中初始化静态最终变量(例如static final int d)?

Java为什么不允许从静态初始化块中引发检查异常?

为什么静态最终变量使用静态方法初始化需要同步?

为什么不允许在Java实例初始化块中引发异常?

静态最终变量和静态初始化程序块

为什么这个朋友功能不允许大括号初始化列表,但是静态列表允许呢?

为什么超类中的静态块/静态变量在main之前初始化?

为什么C#不允许字段初始化器带有非静态字段?

Java-最终变量可以在静态初始化块中初始化吗?

为什么在这里允许使用非const初始化静态变量?

为什么在括号初始化中允许在参数列表中不允许使用多余的逗号?

C ++中不允许使用静态/全局变量

无法在try / catch中初始化静态最终变量

在Java的子类(子类)中初始化静态最终变量

为什么C ++ 11不允许使用auto进行直接列表初始化

为什么不允许使用赋值语法进行auto_ptr初始化

在环境中不允许使用初始化程序

什么时候应该使用未初始化的静态最终变量?

为什么方法中不允许使用静态本地类?

从静态块或方法初始化静态最终int并在批注中使用它

如果引用的静态字段是最终的,为什么不执行静态初始化程序

Kotlin中的静态初始化块

使用静态初始化块

Java为什么不允许覆盖静态方法?

为什么在初始化私有静态成员时允许调用私有静态方法?

在静态初始化块和最终不是最终静态字段

为什么标准不允许模板参数列表中的常量相关类型的初始化?

为什么C ++不允许派生类在初始化列表中使用基类成员?

静态块中不允许使用公共修饰符?