You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:57:33