Блок инициализации экземпляра и подклассы

Я запутался, когда должен запускаться блок инициализации экземпляра. Согласно книге Кэти Сьерра:

Блоки инициализации экземпляра запускаются каждый раз, когда создается экземпляр класса

Итак, рассмотрим два класса: родитель и ребенок, в соответствии с этим вопросом и документацией Java:

создание экземпляра объекта подкласса создает только 1 объект типа подкласса, но вызывает конструкторы всех его суперклассов.

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

4 ответа

Решение

После компиляции экземпляра блоки init становятся частью конструкторов. javac просто добавляет блок init к каждому конструктору, то есть так:

public class Test1 {
    int x;
    int y;

    {
        x = 1;
    }

    Test1() {
        y = 1;
    }
}

Это эквивалентно этому:

public class Test1 {
    int x;
    int y;

    Test1() {
        x = 1;
        y = 1;
    }
}

Таким образом, блок init запускается при запуске конструктора.

не похоже, что создается новый объект суперкласса.

На самом деле, это так.

Каждый экземпляр подкласса неявно содержит экземпляр своего суперкласса.

Конструктор суперкласса всегда вызывается как первый шаг в любом конструкторе (и он, в свою очередь, запускает любые блоки инициализатора экземпляра для суперкласса)

Хотя это был старый пост, я наткнулся на эту концепцию, которая стоит того, чтобы поделиться ею

Поскольку мы говорим о блоке экземпляра, то вот как поток кода экземпляра выполняется в родительском классе дочерних отношений // Child extends Parent Если мы создаем объект для Child

1) Идентификация членов экземпляра класса от родителя к ребенку

2) выполнение назначений переменных экземпляра и блоков экземпляров только в родительском классе

3) выполнение родительского конструктора

4) выполнение назначений переменных экземпляра и блоков экземпляров только в дочернем классе

5) Выполнение дочернего конструктора

Потому что всегда есть неявное super() вызов (если не сделано явно) конструктора родителя в конструкторе потомка.

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