实例初始化程序块的编译顺序

时间:2016-02-21 18:55:24

标签: java constructor instance-initializers

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

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

我认为编译器只是将实例初始化器分叉到构造函数的开头。如果是这样的话,这两个看起来都应该有效吗?

1 个答案:

答案 0 :(得分:2)

因为x未在任何地方声明为类成员。您在第一个实例初始化程序块中将其声明为局部变量,但第二个块不“知道”此局部变量。构造函数有同样的问题,x未定义...

试试这样:

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

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