Kotlin 属性初始化陷阱

复制代码
open class Base {
    open val value: String = "Base class"
    init {
        println("Base class initialized: $value")
    }
}

class Derived: Base() {
    override val value: String = "Derived class"
    init {
        println("Derived class initialized: $value")
    }
}

fun main() {
    val derived = Derived()
}

运行选定的代码时,输出如下:

Base class initialized: null

Derived class initialized: Derived class

我们的疑问就是这个 null,为啥

首选我们要确定一件事情,子类初始化,先会初始化父类。

在 Base 类的 init 块中,value 属性被访问。
由于 Derived 类覆盖了 value 属性,并且 Derived 的 value 尚未初始化(因为 Base 的初始化先于 Derived),此时 value 的值为 null。

Derived 类的初始化顺序:

Derived 的 value 属性被初始化为 "Derived class"。

然后执行 Derived 的 init 块,打印 "Derived class initialized: Derived class"。

其实这里有个警告的 Accessing non-final property value in constructor ,建议我们去掉 open,使value 变成 final 属性不可被子类重写,从而避免警告。这样也不会输出 null。

所以大家要重视警告,避免不必要的异常。

避免在构造函数或init块中调用可被重写的方法

使用final保护关键方法

相关推荐
Coffeeee5 小时前
面试官:说几个同步拿到异步操作结果的方式
android·面试·kotlin
wangz766 小时前
kotlin,编码、解码
kotlin
wangz769 小时前
kotlin,Android,血压记录程序
android·开发语言·kotlin·jetpack compose
老码识土3 天前
Kotlin 协程源代码泛读:Continuation
android·kotlin
louisgeek3 天前
Kotlin 挂起函数的原理
kotlin
ademen3 天前
关于 IntelliJ IDEA 中频繁出现的 Kotlin 及其核心作用
java·开发语言·kotlin
好学人4 天前
Kotlin object 关键字详解
kotlin
好学人4 天前
Kotlin sealed 关键字介绍
kotlin
岸芷漫步4 天前
Kotlin中的序列化应用
kotlin