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 требует?

Ответы на вопрос(2)

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

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

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

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

Ваш ответ на вопрос