据我了解,
创建子类的对象时,子类的构造函数 首先调用父类的构造函数。在父母 构造函数,如果有一个被覆盖的
def
那么 被覆盖的副本被称为。
由于这一切,在下面的代码中' env'变量未设置为(直观地)正确的长度为1。
class C {
val range: Int = 10
val env = new Array[Int](range)
}
class A extends C {
override val range = 1
}
val a = new A
a.env.length //0 instead of 1 or 10
现在,如果我们将range
定义为lazy val
,那么问题就会消失,a.env.length
会产生1.我无法理解为什么? (因为调用时刻new Array[Int](range)
,我想,它将从子类调用getter
range
并返回0。
有人可以澄清,为什么lazy val
解决了这个问题。
答案 0 :(得分:1)
一问题常见问题转移到:
http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
lazy val
是按需初始化,而“渴望”val
,一个用词不当,耐心等待,即使是漠不关心,对于定义它的运行的构造函数也是如此。