提前定义及对象构造顺序
来源:互联网 发布:淘宝达人好做吗 编辑:程序博客网 时间: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
- 提前定义及对象构造顺序
- Scala构造顺序 提前定义
- 对于派生类的构造函数,在定义对象时构造函数的执行顺序
- 对象构造的顺序
- 对象构造顺序
- 对象的构造顺序
- C++的对象构造顺序
- Java对象的构造顺序
- C++对象的构造顺序
- 21-对象的构造顺序
- java类构造对象的构造顺序
- Java对象的构造过程---子类继承父类时(非)静态块及构造函数等的执行顺序
- 派生类对象初始化构造过程顺序
- 含对象成员类的构造顺序
- new对象构造函数执行顺序
- C++ 构造,析构顺序(静态对象)
- 含对象成员类的构造顺序
- 派生类对象初始化构造过程顺序
- java设计模式_状态模式
- sem_open、sem_close、sem_unlink
- 工厂模式
- svn 设置用户组
- 快速幂
- 提前定义及对象构造顺序
- 指针和引用的区别
- 聊天机器人中对话模板的高效匹配方法
- 基本选择器使用一
- Mysql在大型网站的应用架构演变
- Java中boolean和它的包装类的区别在哪里?
- HDU-2546 饭卡 【01背包模板题】
- 贪心——HDU 5813 ( 2016 Multi-University Training Contest 7 1005 )
- 【刷题】【C++】Distinct Subsequences问题