非法的前向引用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