我创建了以下类层次结构:
open class A {
init {
f()
}
open fun f() {
println("In A f")
}
}
class B : A() {
var x: Int = 33
init {
println("x: " + x)
}
override fun f() {
x = 1
println("x in f: "+ x)
}
init {
println("x2: " + x)
}
}
fun main() {
println("Hello World!!")
val b = B()
println("in main x : " + b.x)
}
此代码的输出是
Hello World!!
x in f: 1
x: 33
x2: 33
in main x : 33
但是如果我更改x
from 的初始化
var x: Int = 33
至
var x: Int = 0
与上面的输出相反,输出显示了方法的调用:
Hello World!!
x in f: 1
x: 1
x2: 1
in main x : 1
有谁知道为什么用进行初始化0
会导致行为不同于使用其他值进行初始化的行为?
4
没有直接关系,但是从构造函数中调用可重写方法通常不是一个好习惯,因为它可能导致意外行为(并有效地破坏子类的超类协定/不变量)。
—
AdamHošek