初始化方法继承
如果我有一个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,一个类的实例按照以下方式构造:
-
一个对象被分配。
-
该类的构造函数被调用。 (一个)
-
如果类有一个超类, 超类的构造函数在类构造逻辑被执行之前被调用 ;
(即,对于超类递归地执行点(a) ,则执行从这里继续) -
如果类具有属性初始值设定项或
init
块,则它们按照它们在类体中出现的顺序执行; -
如果构造函数有一个主体(即它是一个辅助构造函数 ),则执行主体。
-
在这个描述中,你可以看到,当构造B
时, A
的构造函数在B
初始化逻辑被执行之前被调用,特别是A
所有init
块被执行。
(这个逻辑的可运行演示)
关于术语的一点小小的评论: init
块实际上并不是一个单独的方法。 相反,所有的init
块和成员属性初始化器一起被编译成构造函数的代码,所以它们应该被认为是构造函数的一部分。