//动物类,表示一般的动物可以感知前方10的单位的范围
class Creature{
val range=10
val env=new ArrayInt
}
//蚂蚁是近视的
class Ant extends Creature{
override val range=2
}
object DefineAdvanced {
def main(args: Array[String]) {
val ant=new Ant
println(ant.env.length) //结果:0
}
}
本来,我以为结果是2,但是结果为0 (在java7中,相同的代码输出10,因为java的字段是不能重写的)
看下书的解释过程
1.Ant在构造之前会去调用Creature的构造,此时range=10
2.Creature在构造env数组,会通过getter去取range的值,但此时range的getter方法已经被Ant重写,但是此时Ant还没有被初始化,所以得到range的值为0
3.Creature构造完毕后再构造Ant,此时数组已经构造完,回天乏力
书中给出了3种解决方法
1.将超类的range声明为finall,不让子类重写 ——-(不灵活)
2.将envs声明为lazy类型(用的适合才去初始化)——-(效率不高)
3.使用“提前定义”,让你可以在超类构造之前初始化子类的 字段: ——(看起来太丑)
class Ant extends{
override val range=2
} with Creature