Почему вы можете инициализировать статическую переменную перед ее объявлением

Этот код ниже распечатает 5.

  static {
    x = 5;
  }
  static final int x;
  public static void main(String[] args) {
    System.out.println(x);

  }

Хотя я не понимаю, насколько это законно. Есть и другие ссылки, без четкого ответа, почему это работает.

Который будет загружен первым статическим переменный или статический блок?

Который будет загружен первым статическим блок или статическая переменная?

потому что ответ, который я встретил, сказал, что люди говорят что-то вроде строк «статические блоки инициализируются в том порядке, в котором они появляются в исходном коде».

Но в этом случае x = 5 предшествует static final int x в исходном коде.


person katiex7    schedule 06.02.2018    source источник
comment
Объявления разрешаются во время компиляции, тогда как инициализация разрешается во время выполнения.   -  person Code-Apprentice    schedule 06.02.2018
comment
Статическая переменная объявляется как часть загрузки класса (она принадлежит классу, а не экземплярам), ТОГДА выполняются статические блоки. В этом нет ничего неясного.   -  person Jim Garrison    schedule 06.02.2018
comment
static final int x вообще не выполняется. Это декларация.   -  person user207421    schedule 06.02.2018
comment
@JimGarrison Неправильно, для многих (новичков) это непонятно, потому что похоже, что это нарушает обычное правило для переменных блочной области: все, что используется, должно было быть объявлено ранее.   -  person Jean-Baptiste Yunès    schedule 06.02.2018
comment
Всем спасибо теперь понятно   -  person katiex7    schedule 06.02.2018


Ответы (1)


Основная проблема здесь заключается в разнице между компиляцией кода и его выполнением. Компилятор гарантирует, что все переменные были объявлены. Возможно, он выполняет два прохода по абстрактному синтаксическому дереву, сначала для поиска всех объявлений, а затем для проверки всех применений, имеющих объявление.

Теперь, когда код запускается, объявления переменных больше не имеют значения, потому что об этом позаботились во время компиляции. Сгенерированный байт-код выполняет операции, определенные в исходном коде Java.

person Code-Apprentice    schedule 06.02.2018