Порядок компиляции экземпляров блоков инициализатора

Блоки инициализации экземпляра выполняются в том порядке, в котором они определены. Почему тогда в приведенном ниже коде есть ошибки, где они указаны?

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;
 }
}
Другие вопросы по тегам