非法的前向引用java问题

非法的前向引用java问题,java,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();

有人能解释一下这个代码的错误吗

    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);
    }
}
如果我评论第1行-一切正常,Base.main方法打印“1”。 如果第1行-未注释,则得到编译时错误:“非法转发引用”。 所以,正如我在静态init块中所理解的,我可以为i设置值,但不能读取。有人能解释一下原因吗?

“非法正向引用”表示您试图在定义变量之前使用它

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

看看

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

例如:如果你插入
intj=i紧跟在
i=1之后您将得到相同的错误

解决这个问题的明显方法是声明
static inti在静态初始化块之前。

将代码更改为:

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

您可以在静态块中将Base添加到i变量,或者必须在块之前声明static int i。另一种解决方案是创建静态方法,而不是静态块

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

我不认为问题中描述的行为是错误。只在System.out语句中添加Base就足够了,谢谢。我尝试了相同的示例,但没有使用static关键字,其行为方式与此代码相同。那么它也遵循同样的规则吗?只允许LHS有什么用?我们可以抛出编译时错误。是的,静态变量和实例变量的规则是一样的。按照我答案中的链接。
A variable should always be textually declared before used else Illegal forward Reference comes into picture. Only Exception to this Statement is : If prior to declaration it is used on LHS of expression. Ex :
Snippet 1: 
 static{
   x = 10;
}
static int x;  
Above snippet will work.

Snippet 2:
static{
  System.out.println("Value of x: " + x)  
}
static int x;
  This will give CTE, because x isnt LHS of expression.

Keeping those conditions in mind we can avoid Illegal Forward ref issue in our code.


Thanks