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

相关推荐
熊猫钓鱼>_>14 小时前
Kotlin Multiplatform for OpenHarmony 实战:为 Landscapist 实现图片加载适配
开发语言·kotlin·华为云·ai编程·harmonyos·鸿蒙·openharmony
ZealSinger15 小时前
Kotlin2.4迁移context parameters
kotlin·协程·迁移·kotlin2.4
墨天梦16 小时前
B16_Material主题与可访问交互
android·kotlin·交互
alexhilton1 天前
模块化Jetpack Compose架构
android·kotlin·android jetpack
mmsx1 天前
Android 测绘计算工程化:七四参数、高程拟合与单位系统
android·kotlin
事圆则缓2 天前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场2 天前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
Kapaseker2 天前
Android 以后可能不会再有横竖屏适配了
android·kotlin
墨天梦2 天前
B13_通知图片相机与影音
android·数码相机·kotlin
传奇开心果编程2 天前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer