我不明白为什么在这段代码中 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
我需要一些解释。
该代码中有 2 个警告,都是
Accessing non-final property X in constructor
(一个用于 i
,一个用于 s
)。请阅读此处 Kotlin 在构造函数中调用非最终函数。
这就是您首先获得
0
和 null
的原因。
您得到
200
和 param2
的原因是因为这就是您在这里告诉它要做的事情 B(200, "param2","param3")
。
您不是使用
A
中的值创建它,而是使用这些预定义值调用该构造函数。
之后,这些值会被
i
内的 s
和 A
覆盖。
奇怪的是,我发现将属性放置在 init 块之前是有效的。
var thing = ""
init {
if (thing.isEmpty())
thing = "something" // this will now work
}