Как создаётся экземпляр класса?
На первом этапе загружается сам класс, вместе со своими предками. Класс загружается всего раз, во время 1-го упоминания данного класса.
Когда загрузка закончится, начинается процесс выделения памяти под имеющиеся в нём static поля и начинают выполняться команды, прописанные в static блоках инициализации.
После этого инициализируется экземпляр. Это происходит по следующей схеме:
- в куче создаётся ссылка на создаваемый экземпляр;
- инициализируются нестатические поля в том же порядке, в котором они были объявлены;
- запускается конструктор.
Поля static, объявленные у интерфейсов, не нуждаются в инициализации, что разрешает вопросы, могущие возникнуть при наследовании от нескольких предков.
Чтобы избежать ошибки виртуального вызова, возникающей в конструкторе, рекомендуется не применять переопределяемые функциональные методы в тех классах, которые планируется впоследствии расширить. Ниже приведена иллюстрация, не которой демонстрируется не очевидное поведение, возникающее при появлении этой ошибки.
class Parent {
int i = callme(); // == 123
int callme()( { return 42; }
}
class Child extends Parent {
int callme() { return 123; }
}
Готовьтесь к работе в команде
AI Sprints — обучение профессиям с ИИ
Освойте Agile, Scrum и Kanban. Поймёте, как устроены процессы в IT-командах — придёте на работу подготовленным
- Методологии: Agile и Scrum — как организованы спринты и роли в команде
- Инструменты: Jira, Git Flow, код-ревью — что используют в продакшене
- Результат: понимаете процессы и готовы к работе в IT-команде
AI Challenge — собери чат-бота за 5 дней
Бесплатный марафон по AI-инжинирингу. Cursor + OpenAI, 60 минут в день — без опыта в программировании. К пятнице у вас будет рабочий чат-бот с памятью в браузере.
- Практика с первого дня, без теории «в стол»
- Готовый проект в портфолио к концу недели
- Старт в любой день — учитесь в своём темпе