Наследование метода 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 вместе с инициализаторами свойств элемента компилируются в код конструктора, поэтому их следует считать частью конструктора.

Intereting Posts
Kotlin список vs массива Переключатель мертвеца в Котлине Kotlin-приемник без поля Как работает синтаксис доступа к свойствам Kotlin для классов Java (например, EditText setText)? Ошибка Android 3.0 Canary: Неподдерживаемая версия major.minor 52.0 Могу ли я получить KFunction из переменной типа функции в Kotlin? Встроенная функция не может получить доступ к непубличным API: @PublishedApi vs @Suppress vs @JvmSynthetic Есть ли в Kotlin аналог didSet / willSet? LinkageError для экземпляра класса Kotlin с уведомлением метода () Подкласс класса закрытого класса Kotlin должен быть отлит в базовый класс, если он представлен как RxJava Observable оба приложения: showAsAction = "ifRoom" и андроид: showAsAction = "ifRoom" работают не так, как ожидалось Каков правильный способ объявить тип переменной в android с помощью Kotlin? Как лучше всего найти элемент в вложенных списках? Почему Kotlin Array <T> не реализует Iterable <T> FirebaseRecyclerAdapter – populateViewHolder не получает доступ к данным