谁能解释一下这段代码有什么问题:
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);
}
}
如果我评论 LINE 1 - 一切正常,Base.main 方法打印“1”。
如果第 1 行 - 未注释,则会出现编译时错误:“非法前向引用”。
所以,正如我在静态初始化块中所理解的,我可以为 i 设置值,但不能读取。谁能解释一下为什么?
最佳答案
这是因为 restrictions on the use of Fields during Initialization .特别是,在声明它们的行之前的静态初始化块内使用静态字段只能在表达式的左侧(即赋值),除非它们是完全限定的(在您的情况下 Base.i
)。 )。
例如:如果您插入 int j = i;
紧随其后 i = 1;
你会得到同样的错误。
解决问题的明显方法是声明 static int i;
在静态初始化块之前。
关于java - 非法转发引用java问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14624919/