class A {
val x = println("A")
}
class B extends A {
override val x = println("B")
}
(new B).x
输出:
A
B
然而,
class A {
lazy val x = println("A")
}
class B extends A {
override lazy val x = println("B")
}
(new B).x
仅输出:
B
根据Martin Odersky的说法,至少在非惰性情况下,行为是“按规定的方式”。我很好奇为什么会有这样的规定,并且为什么在val是惰性时会有所不同。
(1)
class A { lazy val x: Int = throw new IllegalStateException("AAA"); val z = x; println(z) }(2)
class B extends A { override lazy val x = 5 }(3)
(new B) 打印出 5,没有抛出异常,因为延迟值访问实际上是覆盖方法的方法调用。 - ron