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

相关推荐
我是唐青枫7 小时前
Kotlin Delegation 委托详解
开发语言·kotlin
唐青枫16 小时前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
kotlin
alexhilton1 天前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
唐青枫1 天前
Kotlin Delegation 委托详解
kotlin
传奇开心果3 天前
Compose Multiplatform 共享边界实战:架构契约、互操作同步与可回退设计
android·kotlin
腾讯端服务3 天前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙
传奇开心果3 天前
【Compose Multiplatform跨端声明式UI实用技术】第19课:多平台部署与发布
android·kotlin
红尘伴蝶舞3 天前
加密拦截器让抓包失效,我只能从 4KB 的 logcat 碎片里拼回 JSON
android·kotlin·ai编程
JMchen3 天前
【Jetpack 内核实战 08 】:组件整合——DataStore + Room 构建离线优先架构
架构·kotlin·android jetpack
Kapaseker4 天前
AI 会干掉 React Native 吗?
android·kotlin