Прежде всего, ваши предположения более или менее верны, за исключением того факта, что объявления (с инициализацией, такие как int b = 0
) и блоки инициализатора экземпляра выполняются в том порядке, в котором они записаны.
int b = 0; // executed first
{
b = 1; // executed second
}
int a = b; // executed third
Также обратите внимание, что объявление , т.е. int b
не выполнено .Объявление просто объявляет существование переменной.
Что касается полученной вами ошибки (или, скорее, ошибки, которую вы не получили), я согласен, что онавыглядит странноЯ предполагаю, что компилятор имеет дело со ссылкой на переменную в выражении и присвоением ей значения различными способами.При записи в переменную в инициализаторе экземпляра он просто проверяет наличие переменной, а при чтении из нее требует, чтобы она была объявлена над блоком инициализатора экземпляра.Я посмотрю, смогу ли я найти ссылку на это в JLS.