Почему включение инициализации переменной в блок инициализации допускает инициализацию до объявления?
Рассмотрим следующий код:
class New {
id = 2;
int id = 7;
}
Очевидно, что он не скомпилируется, поскольку мы пытаемся инициализировать необъявленную переменную.
Однако включение оператора в блок инициализации делает его успешным:
class New {
{ id = 2; }
int id = 7;
}
Что это за "особенность" блока инициализации, которая делает эту инициализацию до объявления действительной?
Прежде чем задавать вопрос, я прочитал несколько постов о блоках инициализации в SO, но, похоже, они в основном решают проблемы порядка инициализации (например, статический или нестатический).
1 ответ
Дело в том, что id = 2;
является оператором, который может быть помещен в блок инициализатора.
Ваш первый код не является недопустимым из-за порядка объявления, но потому что вы не можете использовать операторы из блоков кода. Этот тоже терпит неудачу:
class New {
int id = 7;
id = 2;
}
Объявление переменных экземпляра может появиться в любом месте класса. Не имеет никакого отношения к блокам инициализатора вообще.
Например, ваш код эквивалентен
class New {
New() { id = 2; }
int id = 7;
}
Согласно вашему вопросу, это тоже будет незаконно, потому что инициализация происходит до объявления.
Просто привыкните к соглашению, чтобы всегда объявлять переменную экземпляра в начале класса, если это вас смущает.