静态块和静态变量

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;
}
3个回答

3
您遇到的错误是Test.java:6: 非法的前向引用。请将int var放在静态块之前。

是的,没错。但我想知道的是这种行为的原因。为什么当我给那个变量赋值时没有出现“非法向前引用”错误,而在使用该变量时却会出现呢? - Lavneesh

2
因为如下所述,它的用法不在赋值语句的左手边
来自JLS第8.3.2.3节 初始化期间字段使用的限制
必须在成员变量使用之前声明成员,仅当以下所有条件都满足时,且该成员是C类或接口的实例(分别为静态)字段时:
  • 使用发生在C的实例(分别为静态)变量初始化程序中或C的实例(分别为静态)初始化程序中。
  • 使用不在一个赋值语句的左手边。
  • C是封装使用的最内部的类或接口。
如果上述任何一条要求未得到满足,则会出现编译时错误。

+1 针对问题的实际回答,而非提供解决方法。 - Perception
但这就引出了一个问题:“为什么JLS的作者们要实现这个确切的限制,即它如何使编译器编写者的生活更轻松?”特别是当赋值可以的时候... - Karl Knechtel

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

在使用之前进行声明

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接