令人困惑的施工订单与懒惰的val

时间:2013-12-27 01:09:34

标签: scala

据我了解,

  

创建子类的对象时,子类的构造函数   首先调用父类的构造函数。在父母   构造函数,如果有一个被覆盖的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解决了这个问题。

1 个答案:

答案 0 :(得分:1)

一问题常见问题转移到:

http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html

lazy val是按需初始化,而“渴望”val,一个用词不当,耐心等待,即使是漠不关心,对于定义它的运行的构造函数也是如此。