Java: 在静态块内访问静态变量

25

分析以下静态块中的一些奇怪情况:

static {
  System.out.println("Inside Static Block");
  i=100; // Compilation Successful , why ?
  System.out.println(i); // Compilation error "Cannot reference a field before it is defined"
}

private static int i=100;

当使用以下内容时,相同的代码可以正常工作:

static {
  System.out.println("Inside Static Block");
  i=100; // Compilation Successful , why ?
  System.out.println(MyClass.i); // Compiles OK
}

private static int i=100;

不确定为什么使用类名进行变量初始化时不需要访问变量,而使用SOP则需要?


你是不是想在两个块中都显示错误? - Bohemian
1
@Bohemian 我认为这是复制/粘贴失败了。第二个代码块不应该显示错误。 - Alexis C.
递归初始化器在我添加“this”后有效。 - ZhongYu
2个回答

16
这是由于初始化过程中字段使用的限制。特别地,在声明它们的行之前,静态初始化块内部的静态字段只能在表达式的左侧(即赋值)用到,除非它们是完全合格的(例如MyClass.i)。
例如:如果你在i = 100;之后插入int j = i;,则会出现相同的错误。
显然的解决方法是在静态初始化块之前声明static int i;

+1 很酷。我不知道那个,也没有遇到过。而且我简直不敢相信这么长时间才弄清楚你的名字:/ - Bohemian
这实际上是一个巧合,但无论如何都很好! - assylias
@assylias 对于任何不便,我很抱歉。我只在本地以那种方式进行了测试,可能会出现>>相同的错误<<。 - Hearen
同意,出于同样的原因。 - assylias

0

这是因为编译器进行静态代码分析,例如活跃变量分析(向后分析)。它计算每个程序点在下一次写入之前是否会读取变量。


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