为什么每个二级构造函数都需要委派给Kotlin中的一级构造函数?

Rya*_*nqy 3 kotlin

正如科特林参考类和继承所言,

如果类具有主要构造函数,则每个次要构造函数都需要直接或间接通过另一个次要构造函数委托给主要构造函数。

我不明白为什么Kotlin二级构造函数需要这样做?是可以防止Java中出现一些问题吗?

zsm*_*b13 5

这是因为init块和属性初始化程序始终需要正常运行才能构造一个类的实例,并且它们可能依赖传递给主构造函数的属性进行初始化-这是主构造函数为您提供的便利(以及能够在类的标题中具有属性)。

例如,以此类:

class Rectangle(val width: Int, val height: Int) {

    constructor(size: Int) : this(size, size)

    val area = width * height

    init {
        println("New rectangle, $width x $height")
    }

}
Run Code Online (Sandbox Code Playgroud)

area属性和该init块均使用主要构造函数参数-如果次要构造函数未调用到主要构造函数,则无法执行初始化。

widthheight属性,当主构造函数被调用也隐式初始化-再次,如果二次构造没有叫一次,这些将留待初始化。

当然,如果没有主构造函数,则您可以在一个类中有多个辅助构造函数(例如,对于Android Views来说很常见)-如果有初始化逻辑,您将很难。