Наследование метода Init

Если у меня есть абстрактный класс A с методом init:

abstract class A(){ init { println("Hello") } } 

А затем класс B, который расширяет A

 class B(): A() 

Если я создаю B как это

 fun main(args: Array<String>){ B() } 

Продолжает ли запускаться метод init в A, и Hello печатается?

А если нет, что мне нужно сделать, чтобы запустить метод init A?

Да, блок init базового класса запускается, когда экземпляр производного класса инициализируется.

В Kotlin, подобно Java, экземпляр класса строится следующим образом:

  1. Выделяется объект.

  2. Вызывается конструктор класса. (а)

    1. Если класс имеет суперкласс, конструктор суперкласса вызывается перед выполнением логики построения класса ;
      (т. е. точка (а) выполняется рекурсивно для суперкласса, тогда выполнение продолжается отсюда)

    2. Если класс имеет инициализаторы свойств или блоки init , они выполняются в том же порядке, что и в классе класса;

    3. Если конструктор имеет тело (т.е. он является вторичным конструктором ), то тело выполняется.

В этом описании вы можете видеть, что при построении B конструктор A вызывается до выполнения логики инициализации B и, в частности, выполняются все блоки init из A

(runnable demo этой логики)


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