为什么在下面的代码中为可接受的静态变量赋值,但是使用相同的变量不是?静态块和变量
class Test
{
static
{
var=2; //There is no error in this line
System.out.println(var); //Why is there an error on this line if no error on the above line
}
static int var;
}
为什么在下面的代码中为可接受的静态变量赋值,但是使用相同的变量不是?静态块和变量
class Test
{
static
{
var=2; //There is no error in this line
System.out.println(var); //Why is there an error on this line if no error on the above line
}
static int var;
}
因为the usage is not on the left hand side of an assignment,如下面所解释:初始化期间
从JLS,对使用字段的限制的部分8.3.2.3:
一个成员的声明中需要出现之前仅在使用 时,该成员是一个类的实例(分别为静态)字段或接口C为 并且以下所有条件成立:
的使用发生在一个实例的C或在一个实例(分别静态)初始化(分别静态)可变
初始化
C.的的使用不是在左手侧的任务。
C是内部使用的最内层类或接口。
如果上述三个要求中的任何一个都不符合,则会发生编译时错误。
您收到的错误是Test.java:6: illegal forward reference
。在静态块之前移动int var
。
呀之前,这是正确的。但是我想知道的是这种行为的原因。为什么当我为该变量赋值时有没有“Illegal Forward Reference”错误,并且在使用该变量时有一个错误? – Lavneesh
尝试这样的:
class Test
{
static int var;
static
{
var=2; //There is no error in this line
System.out.println(var); //Why is there an error on this line if no error on the above line
}
}
宣言在使用
+1用于实际回答问题并且未发布解决方法。 – Perception
但是这留下了“为什么JLS作者实现这个确切的限制,即它如何让编译器作者的生活更简单”?特别是当分配**是**确定... –