Android 如何正确重写Kotlin类中的变量?
我试图覆盖类中的值。我有以下代码:Android 如何正确重写Kotlin类中的变量?,android,class,kotlin,inheritance,Android,Class,Kotlin,Inheritance,我试图覆盖类中的值。我有以下代码: openclass气球(){ 打开变量textSize:Float=20f 初始化{ Log.i(“textSize”,textSize.toString()) } } 类BigBalloon():Balloon(){ 覆盖变量textSize=30f } 但是,日志会打印出这些值: 第一个日志来自Balloon(),第二个日志来自bigbloon()。当我将其改写为30时,它如何打印0.0?我是否错误地实现了所有这些?Kotlin初始化顺序不是您所理解的
openclass气球(){
打开变量textSize:Float=20f
初始化{
Log.i(“textSize”,textSize.toString())
}
}
类BigBalloon():Balloon(){
覆盖变量textSize=30f
}
但是,日志会打印出这些值:
第一个日志来自
Balloon()
,第二个日志来自bigbloon()
。当我将其改写为30
时,它如何打印0.0
?我是否错误地实现了所有这些?Kotlin初始化顺序不是您所理解的那样,在完成重写之前调用了Base(Balloon)类的init块。这一点在本文中得到了更好的解释。这是中给出的初始化顺序
将属性作为以下内容放入主构造函数:
Balloon(变量textSize:Float=20f){
// ...
}
当您想要更改它时,只需将其委托给构造函数:
class BigBalloon:气球(30f)
通常不鼓励在构造函数中访问抽象方法(在本例中是getTextSize
),因为它可能会导致类似您的工件
BigBaloon
属性覆盖实际上做了两件事:
BigBaloon.textSize
textSize
getter和setter以访问该字段Baloon.textSize
字段的值,因为getter/setter不再使用它,所以它保持不变且不可访问
您的问题是当初始化
BigBaloon
s parentBaloon
时,它访问BigBaloon.textSize
,此时未初始化,因此它返回零。我刚刚检查了您的代码,在val bb=bigbloon()
在println(bb.textSize)创建val bb=bigbloon()后,它将打印30.0
。唯一的区别是我必须删除init
块,因为我在没有LogCat的Kotlin游乐场中尝试了它…这意味着该值被正确重写,但不是在init中?不要在init块/构造函数中使用非最终属性或函数,感谢有用的资源@IR42!