Внутренний класс в теле цикла

Изучаю java по книге Шилда и в примере внутреннего класса в теле цикла есть объявление объекта obj2 и обращения к методу внутреннего класса obj2.methodInner()

class outer{

  int outer_x = 100;

  void methodOuter(){
    for (int i = 0; i<10; i++){
      class inner{
        void methodInner(){
          System.out.println("outer_x = " + outer_x);
        }
      }

      inner obj2 = new inner();
      obj2.methodInner();

    }
  }
}

class programm{

  public static void main (String args[]){
    outer obj1 = new outer();
    obj1.methodOuter();
  }
}

Вопрос:

Почему при перемещении этих 2х строк кода

inner obj2 = new inner();
obj2.methodInner();

в положение перед классом

  void methodOuter(){
    for (int i = 0; i<10; i++){

      inner obj2 = new inner();
      obj2.methodInner();

      class inner{
        void methodInner(){
          System.out.println("outer_x = " + outer_x);
        }
      }
    }
  }

выдает ошибку.

код ошибки

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
        inner cannot be resolved to a type
        inner cannot be resolved to a type

Пишу в VSCode с плагином для Java, пробовал в IntelliJ IDEA - результат тот же

порядок выполнения инструкций

Вопрос не про ошибку и что с ней делать, а факт ошибки. Раз объявление объекта obj2 и обращение к методу внутреннего класса obj2.methodInner() находится в области видимости цикла, почему не могу поставить перед внутренним классом? Хочу добиться выполнения 1,2,3,4,5, а не 1,4,5,2,3


Ответы (1 шт):

Автор решения: m. vokhm

Область видимости класса, вложенного в блок, начинается от объявления этого класса и простирается до конца блока:

The scope of a local class declaration immediately enclosed by a block (§14.2) is the rest of the immediately enclosing block, including its own class declaration.

(см. спецификацию языка)

→ Ссылка