实例初始化块的编译顺序
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;
}
}
实例初始化块按照它们定义的顺序执行。那么,为什么下面的代码在指示的地方有错误?
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;
}
}