init块kotlin中的null属性



我不明白为什么在这段代码中,init{}块中I和s的值分别为0和null,而在类B的第二个构造函数中,这些值分别为200和param2?

class A(override var i: Int, override var s: String) : B(200, "param2","param3") {
init {
println(i)
println(s)
}
}

open class B(open var i: Int, open var s: String) {
init {
println("class B init")
println("i in init B2 is $i")
println("s in init B2 is $s")
}

constructor(i: Int, s: String, s2: String) : this(i, s) {
println("second constructor B")
println(" i = $i in second constructor")
println(" s = $s in second constructor")
println(" s2 = $s2 in second constructor")
}
}

fun main() {
val ins2 = A(500, "500S") 
}

结果:

class B init
i in init B2 is 0
s in init B2 is null
second constructor B
i = 200 in second constructor
s = param2 in second constructor
s2 = param3 in second constructor
500
500S

我需要一些解释。

该代码中有两个警告,均为Accessing non-final property X in constructor(一个用于i,一个用于s(。请阅读此处Kotlin在构造函数中调用非最终函数。

这就是您首先获得0null的原因。

你得到200param2的原因是,这就是你告诉它在这里做的B(200, "param2","param3")

您不是用A中的值创建它,而是用那些预定义的值调用该构造函数。

然后,这些值被A内部的is重写。

相关内容

  • 没有找到相关文章

最新更新