提前定义及对象构造顺序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值