kotlin派生类初始化顺序

派生类初始化顺序

在构造派生类的新实例的过程中,第一步完成其基类的初始化(在之前只有对基类构造函数参数的求值),因此发生在派生类的初始化逻辑运行之前。

open class Base(val name: String) {
​
    init { println("Initializing Base") }
​
    open val size: Int = 
        name.length.also { println("Initializing size in Base: $it") }
}
​
class Derived(
    name: String,
    val lastName: String
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
​
    init { println("Initializing Derived") }
​
    override val size: Int =
        (super.size + lastName.length).also { println("Initializing size in Derived: $it") }
}

这意味着,基类构造函数执行时,派生类中声明或覆盖的属性都还没有初始化。如果在基类初始化逻辑中(直接或通过另一个覆盖的 open 成员的实现间接)使用了任何一个这种属性,那么都可能导致不正确的行为或运行时故障。设计一个基类时,应该避免在构造函数、属性初始化器以及 init 块中使用 open 成员。

发布了58 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_34203714/article/details/102819867
今日推荐