为何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
相关产品推荐
相关产品推荐

