Порядок компиляции экземпляров блоков инициализатора
Блоки инициализации экземпляра выполняются в том порядке, в котором они определены. Почему тогда в приведенном ниже коде есть ошибки, где они указаны?
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 ответ
Решение
Так как x
нигде не объявлен как член класса. Вы объявляете это как локальную переменную в блоке инициализатора первого экземпляра, но второй блок не "знает" эту локальную переменную. Конструктор имел ту же проблему, x
не определено...
Попробуйте вот так:
class Tester {
private int x;
{ x = 3; } // Instance initializer 1...
Tester() { // Constructor
x = 5;
}
}