如果我有一个带有init方法的抽象类A:
abstract class A(){
init {
println("Hello")
}
}
然后是扩展A
的B类class B(): A()
如果我像这样实例化
fun main(args: Array<String>){
B()
}
A中的init方法是否仍然运行并且Hello
被打印?
如果没有,我需要做什么才能让A的init方法运行?
答案 0 :(得分:12)
是的,在初始化派生类实例时,会运行基类的init
块。
在Kotlin中,与Java类似,类的实例按以下方式构造:
分配了一个对象。
调用类的构造函数。 (a)中
如果类有超类,在执行类构造逻辑之前调用超类构造函数;
(即,对于超类递归执行点(a),然后从这里继续执行)
如果该类具有属性初始值设定项或init
块,则它们的执行顺序与它们在类体中的显示顺序相同;
如果构造函数有一个正文(即它是secondary constructor),则执行正文。
在本说明中,您可以看到,在构造B
时,A
的构造函数在执行B
初始化逻辑之前被调用,特别是init
所有{{} 1}} A
块被执行。
关于术语的一个小注释:init
块实际上不是一个单独的方法。相反,所有init
块与成员属性初始值设定项一起编译到构造函数的代码中,因此它们应该被视为构造函数的一部分。