父类的init块中的null值

Ank*_*wal 1 kotlin

我正在创建一个非常简单的kotlin程序,并且看到父类的行为很奇怪。

代码是:

fun makeSalt(name:String) = Spice(name, "non-spicy")
fun main(args: Array<String>) {
    var salt : Spice = Spice("salt", "non-spicy")

    println("Salt heat = ${salt.heat}")

    val spicelist = listOf<Spice>(
        Spice("salt", "non-spicy"),
        Spice("turmeric", "mild"),
        Spice("Pepper", "hot"),
        Spice("Chilli", "hot"),
        Spice("Sugar", "non-spicy")
    )

    val mildSpices = spicelist.filter{it.heat <=5}

    val salt2 = makeSalt("rock salt")

    val bhoot : SubSpice = SubSpice("bhoot", "hot")
}


open class Spice(open var name:String, open var spiciness:String = "mild" ){
    var heat : Int = 5
        get() = when (spiciness){
            "mild"->5
            "hot"->10
            "non-spicy"->1
            else -> 0

        }

    init{
        if(spiciness === null) {println("spiciness is null")}
        else println("Spiciness of ${name} = ${spiciness}; heat = ${heat}")
    }
}

class SubSpice(override var name:String, override var spiciness:String = "hot") : Spice(name, spiciness){

}
Run Code Online (Sandbox Code Playgroud)

当我执行此程序时,输出为:

Spiciness of salt = non-spicy; heat = 1
Salt heat = 1
Spiciness of salt = non-spicy; heat = 1
Spiciness of turmeric = mild; heat = 5
Spiciness of Pepper = hot; heat = 10
Spiciness of Chilli = hot; heat = 10
Spiciness of Sugar = non-spicy; heat = 1
Spiciness of rock salt = non-spicy; heat = 1
spiciness is null
Run Code Online (Sandbox Code Playgroud)

如您所见,当我创建子类的对象时spiciness,父类的变量变为null。有人可以解释为什么吗?我期望它为null,因为它也具有默认参数"mild"

Paw*_*wel 5

open var当您不覆盖任何getter / setter方法时,便在使用。

您正在引入奇怪的初始化冲突,因为Spice.init(父类构造函数)是在调用之前SubSpice.init并通过重写字段而不再与父构造函数一起初始化的,而是一旦Subspice构造,它们便可用。

open从父类和override var子构造函数中的变量中删除关键字,这样字段将在Spice类中正确初始化,并且其init块应成功运行。