具有一个基类和一个从其派生的Child:

open class Base(var data: String) {

    init {
        doInit()
    }
    open protected fun doInit() {
       data += " in Base doInit()"
    }
}

class Child(data: String): Base(data) {

    init {
        doInit()
    }
    override fun doInit() {

        data += super.doInit() + " in Child doInit()"
    }
}

val obj = Child("child")

在Child(“child”)中,将调用Base的init {}。应该从基地的init {}或从 child 的init {}调用哪种doInit()

最佳答案

如果我们定义这样的类:

open class Base(var data: String) {

    init {
        doInit()
    }

    protected open fun doInit() {
        data += " in Base doInit()"
        println("in Base doInit()")
    }
}

class Child(data: String): Base(data) {

    override fun doInit() {
        data += " in Child doInit()"
        println("in Child doInit()")
    }
}

并创建一个子对象:
val obj = Child("child")

我们将看到输出:



因此,当创建子对象并在被子类覆盖的基类中调用函数时,将调用子函数。这就是Polymorphism

关于kotlin - kotlin,该函数在基类的init块中调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62460891/

10-10 19:50