实例初始化块的编译顺序

Compilation order of instance initializer blocks

实例初始化块按照它们定义的顺序执行。那么,为什么下面的代码在指示的地方有错误?

public class MyTest {
    public static void main(String[] args) {
    Tester t = new Tester();
    }
}

class Tester {
   { int x; }  // Instance initializer 1 
   { x = 3; }  // Instance initializer 2...ERROR cannot resolve symbol 'x'

   Tester() {  // Constructor
       x = 5;  // ERROR cannot resolve symbol 'x'
 }
}

我认为编译器只是将实例初始值设定项叉到构造函数的开头。如果是这样的话,这两个似乎都应该起作用?

因为 x 未在任何地方声明为 class 成员。您在第一个实例初始化块中将其声明为局部变量,但第二个块没有 "know" 这个局部变量。构造函数有同样的问题,x is not defined...

这样试试:

class Tester {
   private int x;
   { x = 3; }  // Instance initializer 1...

   Tester() {  // Constructor
       x = 5;
 }
}