非法转发参考java问题

Tim*_*fei 10 java

任何人都可以解释这段代码有什么问题:

    public class Base {


    static {
        i = 1;
        System.out.println("[Base]after static init block i=" + i);// LINE 1
        System.out.println("*************************************");
        System.out.println();
    }
    static int i;



    public static void main(String[] args) {
        System.out.println(Base.i);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我评论LINE 1 - 一切正常,Base.main方法打印"1".如果没有注释LINE 1 - ,则得到编译时错误:"非法前向引用".所以,正如我在静态初始化块中所理解的,我可以为i设置值,但不能读取.谁有人解释为什么?

ass*_*ias 21

这是因为初始化期间使用字段限制.特别是,静态初始化块在声明它们的行之前使用静态字段只能在表达式的左侧(即赋值),除非它们是完全限定的(在您的情况下Base.i).

例如:如果您int j = i;i = 1;获得相同错误后立即插入.

解决问题的显而易见的方法是在静态初始化块static int i; 之前声明.


Mas*_*uso 7

"非法转发引用"表示您在定义变量之前尝试使用该变量.

您观察到的行为是javac错误的症状(请参阅此错误报告).问题似乎在较新版本的编译器中得到修复,例如OpenJDK 7.

看一下

静态最终字段的非正向引用错误