提前定义及对象构造顺序

来源:互联网 发布:淘宝达人好做吗 编辑:程序博客网 时间:2024/06/10 00:22

//动物类,表示一般的动物可以感知前方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

0 0
原创粉丝点击