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 parent
    Baloon
    时,它访问
    BigBaloon.textSize
    ,此时未初始化,因此它返回零。

    我刚刚检查了您的代码,在
    val bb=bigbloon()
    println(bb.textSize)创建
    val bb=bigbloon()后,它将打印
    30.0
    。唯一的区别是我必须删除
    init
    块,因为我在没有LogCat的Kotlin游乐场中尝试了它…这意味着该值被正确重写,但不是在init中?不要在init块/构造函数中使用非最终属性或函数,感谢有用的资源@IR42!