我不明白为什么在这段代码中,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在构造函数中调用非最终函数。
这就是您首先获得0
和null
的原因。
你得到200
和param2
的原因是,这就是你告诉它在这里做的B(200, "param2","param3")
。
您不是用A
中的值创建它,而是用那些预定义的值调用该构造函数。
然后,这些值被A
内部的i
和s
重写。