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

Рассмотрим следующий код:

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;
}

Согласно вашему вопросу, это тоже будет незаконно, потому что инициализация происходит до объявления.

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

Другие вопросы по тегам