Подтвердить что ты не робот

Java: доступ к статическим переменным внутри статического блока

Анализ какого-то странного сценария в следующем статическом блоке:

static {
  System.out.println("Inside Static Block");
  i=100; // Compilation Successful , why ?
  System.out.println(i); // Compilation error "Cannot reference a field before it is defined"
}

private static int i=100;

В то время как тот же код работает нормально при использовании:

static {
  System.out.println("Inside Static Block");
  i=100; // Compilation Successful , why ?
  System.out.println(MyClass.i); // Compiles OK
}

private static int i=100;

Не знаете, почему переменная инициализации не нуждается в переменном доступе с использованием имени класса, в то время как SOP требует?

4b9b3361

Ответ 1

Это связано с ограничениями на использование полей во время инициализации. В частности, использование статических полей внутри статического блока инициализации перед линией, на которой они были объявлены, может находиться только в левой части выражения (т.е. Задание), если только они не являются полностью квалифицированными (в вашем случае MyClass.i).

Итак, например: если вы вставляете int j = i; сразу после i = 100;, вы получите ту же ошибку.

Очевидным способом решения проблемы является объявить static int i; до статического блока инициализации.

Ответ 2

это потому, что компиляторы выполняют статический анализ кода, например анализ живой переменной (анализ назад). Он вычисляет для каждой точки программы, будет ли переменная считываться перед следующей записью.