You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Kotlin中被final修饰的var变量仍可被修改?

为什么标注final的Kotlin变量仍可修改?

我在学习Kotlin面向对象编程(OOPS)时编写了如下示例代码:

open class OpenBase(open val value: Int)

interface AnotherExample {
    val anotherValue: OpenBase
}

open class OpenChild(value: Int) : OpenBase(value), AnotherExample {
    override var value: Int = 1000
        get() = field - 7
    override val anotherValue: OpenBase = OpenBase(value)
}

open class AnotherChild(value: Int) : OpenChild(value) {
    final override var value: Int = value
        get() = field
        set(value) { field = value * 2 }
    final override val anotherValue: OpenChild = OpenChild(value)
}

fun main() {
    val openChild = OpenChild(42)
    println("OpenChild value: ${openChild.value}")
    println("OpenChild anotherValue: ${openChild.anotherValue.value}")

    val anotherChild = AnotherChild(42)
    println("AnotherChild value: ${anotherChild.value}")
    println("AnotherChild anotherValue: ${anotherChild.anotherValue.value}")
    
    anotherChild.value=69 //HERE
    println("AnotherChild value: ${anotherChild.value}")
    println("AnotherChild anotherValue: ${anotherChild.anotherValue.value}")
}

原本预期修改标注了final的value变量会报错,但实际未出现错误,想请教这是为什么?


问题解析

Kotlin中的final override关键字作用是禁止该类的子类重写这个成员属性,而非将属性设置为只读不可修改的状态:

  • 你在AnotherChild中声明的final override var value,其中final仅限制后续子类不能再重写value属性,但value本身是var类型——var代表可变属性,自带setter方法,因此外部可以正常赋值修改。
  • 如果想要让value变成只读、无法被外部修改,需要将var改为val,或者给setter添加private修饰符(如set(value) private { field = value * 2 }),这样外部就无法调用setter修改属性值了。

内容的提问来源于stack exchange,提问作者cheems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:52:40