初始化方法继承

如果我有一个init方法抽象类A:

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

然后是扩展A的B类

 class B(): A() 

如果我像这样实例化B.

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

A中的init方法仍然运行并且Hello打印出来了吗?

如果没有,我需要做些什么来让A的init方法运行?

是的,当派生类实例初始化时,基类的init块会运行。

在Kotlin中,类似于Java,一个类的实例按照以下方式构造:

  1. 一个对象被分配。

  2. 该类的构造函数被调用。 (一个)

    1. 如果类有一个超类, 超类的构造函数在类构造逻辑被执行之前被调用 ;
      (即,对于超类递归地执行点(a) ,则执行从这里继续)

    2. 如果类具有属性初始值设定项或init块,则它们按照它们在类体中出现的顺序执行;

    3. 如果构造函数有一个主体(即它是一个辅助构造函数 ),则执行主体。

在这个描述中,你可以看到,当构造B时, A的构造函数在B初始化逻辑被执行之前被调用,特别是A所有init块被执行。

(这个逻辑的可运行演示)


关于术语的一点小小的评论: init块实际上并不是一个单独的方法。 相反,所有的init块和成员属性初始化器一起被编译成构造函数的代码,所以它们应该被认为是构造函数的一部分。