我正在尝试调试scala程序 . 我发现了一个特征,其行为与以下类似:

trait A {
    val a: Int = b
    val b: Int = a
}

class B extends A

如果我们看一下这个特性,就会有循环分配 . val b 甚至未定义,但在 val a 的定义中使用 .

上面的程序编译成功 . ab 都是 zero . 我尝试使用变量类型字符串,然后值为 null .

有一个第三类覆盖 val a 类似于以下

class C extends A {
    override val a: Int = 10
}

现在,如果创建了类 C 的实例,则值 a 为10但 valval 仍为 0 .

最后,我进一步检查,而不是覆盖类的主体,当我在构造函数参数中覆盖它类似于以下内容:

class D(override val a: Int) extends A
val d = new D(10)

然后将 d.ad.b 初始化为10 .

我想明白:

特质A中val的定义如何有效?换句话说,scala如何解释特征A中的val赋值当在scala类的主体中覆盖特征中定义的val时,如果在特征中使用相同的val,则在特征体中使用什么值?别处