2011-08-13 193 views
6

为什么在下面的代码中为可接受的静态变量赋值,但是使用相同的变量不是?静态块和变量

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; 
} 

回答

2

因为the usage is not on the left hand side of an assignment,如下面所解释:初始化期间

从JLS,对使用​​字段的限制的部分8.3.2.3

一个成员的声明中需要出现之前仅在使用 时,该成员是一个类的实例(分别为静态)字段或接口C为 并且以下所有条件成立:

  • 的使用发生在一个实例的C或在一个实例(分别静态)初始化(分别静态)可变
    初始化
    C.的

  • 的使用不是在左手侧的任务。

  • C是内部使用的最内层类或接口。

如果上述三个要求中的任何一个都不符合,则会发生编译时错误。

+0

+1用于实际回答问题并且未发布解决方法。 – Perception

+0

但是这留下了“为什么JLS作者实现这个确切的限制,即它如何让编译器作者的生活更简单”?特别是当分配**是**确定... –

3

您收到的错误是Test.java:6: illegal forward reference。在静态块之前移动int var

+0

呀之前,这是正确的。但是我想知道的是这种行为的原因。为什么当我为该变量赋值时有没有“Illegal Forward Reference”错误,并且在使用该变量时有一个错误? – Lavneesh

0

尝试这样的:

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 
} 
} 

宣言在使用