Наследование метода 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 / Android: возвращение может быть отменено из «когда» Несоответствие типа Kotlin после преобразования в Android Studio TornadoFx: Что делает лучше FXML или type-CSS Kotlin: Видимость статического вложенного класса Java, объявленного внутри невидимого класса Kotlin Невозможно создать поле @Autowired в классе, которое аннотируется с @Configuration @EnableWebMvc перерыв или возврат из выражения Kotlin не может получить доступ к kotlin.jvm.functions.Function1 при вызове функции kotlin с java lambda Подписка на несколько видов на A views onclick и изменение видимости RxAndroid Как получить доступ к «Activity.this» в Котлине? Glide 4.3.1: как использовать ошибку ()? Как получить PhoneStateListener при использовании функций Dual SIM Как писать while loop с ответомInputStream.read в kotlin android – – while ((i = responseInputStream.read (byteContainer)) Как добавить поддержку Kotlin для обычного Java Lib в Android? Как сделать операцию «салфетки информации»? Невозможно ссылаться на подкласс в Котлине