Init方法继承

时间:2017-05-03 17:24:13

标签: kotlin

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

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

然后是扩展A

的B类
class B(): A()

如果我像这样实例化

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

A中的init方法是否仍然运行并且Hello被打印?

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

1 个答案:

答案 0 :(得分:12)

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

在Kotlin中,与Java类似,类的实例按以下方式构造:

  1. 分配了一个对象。

  2. 调用类的构造函数。 (a)中

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

    2. 如果该类具有属性初始值设定项或init块,则它们的执行顺序与它们在类体中的显示顺序相同;

    3. 如果构造函数有一个正文(即它是secondary constructor),则执行正文。

  3. 在本说明中,您可以看到,在构造B时,A的构造函数在执行B初始化逻辑之前被调用,特别是init所有{{} 1}} A块被执行。

    (runnable demo of this logic)

    关于术语的一个小注释:init块实际上不是一个单独的方法。相反,所有init块与成员属性初始值设定项一起编译到构造函数的代码中,因此它们应该被视为构造函数的一部分。