Scala继承中的构造顺序与提前定义:子类重写val为何致数组为空?
哈哈,这个Scala里的初始化坑我太熟了!刚好对应《Scala for the Impatient》8.10节的例子,给你拆解明白:
先看这段示例代码:
class Animal { val range: Int = 10 val env: Array[Int] = new Array[Int](range) } class Ant extends Animal { override val range: Int = 2 }
为啥Ant实例里的env最终是空数组?核心原因在于Scala的类初始化顺序和val重写的特性:
- 当创建
Ant对象时,JVM会先执行父类Animal的构造逻辑 - 父类初始化
env数组时,需要调用range的getter方法来获取数组长度 - 但
range已经被Ant重写了,此时子类的range字段还没完成初始化(Scala中val的赋值是在构造器执行到对应代码行时才完成的),所以这个重写的getter会返回Int类型的默认值0 - 最终
env就被初始化为长度为0的空数组,完全不是我们直觉里的长度2或者10
内容的提问来源于stack exchange,提问作者Alina
相关产品推荐
相关产品推荐

