Как создаётся экземпляр класса?

На первом этапе загружается сам класс, вместе со своими предками. Класс загружается всего раз, во время 1-го упоминания данного класса.

Когда загрузка закончится, начинается процесс выделения памяти под имеющиеся в нём static поля и начинают выполняться команды, прописанные в static блоках инициализации.

После этого инициализируется экземпляр. Это происходит по следующей схеме:

  • в куче создаётся ссылка на создаваемый экземпляр;
  • инициализируются нестатические поля в том же порядке, в котором они были объявлены;
  • запускается конструктор.

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

Чтобы избежать ошибки виртуального вызова, возникающей в конструкторе, рекомендуется не применять переопределяемые функциональные методы в тех классах, которые планируется впоследствии расширить. Ниже приведена иллюстрация, не которой демонстрируется не очевидное поведение, возникающее при появлении этой ошибки.

class Parent {
  int i = callme(); // == 123
  int callme()( { return 42; }
}
class Child extends Parent {
  int callme() { return 123; }
}
Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *