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保护关键方法

相关推荐
jinanwuhuaguo2 小时前
OpenClaw协议霸权——从 MCP 标准到意图封建化的政治经济学(第十八篇)
android·人工智能·kotlin·拓扑学·openclaw
zhangphil6 小时前
Android sql查媒体数据封装room Dao构造AndroidViewModel,RecyclerView宫格展示,Kotlin
android·kotlin
jinanwuhuaguo7 小时前
反熵共同体——OpenClaw的宇宙热力学本体论(第十七篇)
大数据·人工智能·安全·架构·kotlin·openclaw
pengyu7 小时前
【Kotlin 协程修仙录 · 筑基境 · 中阶】 | 身份证与通行证:CoroutineContext 的深度解剖
android·kotlin
夏沫琅琊8 小时前
android 短信读取与导出技术
android·kotlin
Kapaseker9 小时前
客官,你误会 Compose Strong Skipping 了
android·kotlin
我命由我1234510 小时前
Kotlin 开发 - 双冒号操作符(引用顶层函数、引用成员函数、引用构造函数、引用属性、引用类)
android·java·开发语言·kotlin·android studio·android jetpack·android-studio
我命由我1234510 小时前
Kotlin 开发 - sealed 关键字
android·java-ee·kotlin·android studio·android jetpack·android-studio·android runtime
我命由我123451 天前
Java 开发 - CountDownLatch 不需要手动关闭
android·java·开发语言·jvm·kotlin·android studio·android-studio
pengyu1 天前
【Kotlin 协程修仙录 · 筑基境 · 初阶】 | 根本大法:结构化并发的父子约束与取消传播
android·kotlin