问题1:抽象成员初始化规则
① 父类先初始化
② 在初始化的过程中,如果 val 发生重写,只有最后一个重写生效。前面的会变成零值,后面的会直接继承。
参考资料:https://docs.scala-lang.org/tutorials/FAQ/initialization-order.html
示例:
abstract class A { val x1: String val x2: String = "mom" println("A: " + x1 + ", " + x2) } class B extends A { val x1: String = "hello" println("B: " + x1 + ", " + x2) } class C extends B { override val x2: String = "dad" println("C: " + x1 + ", " + x2) } new C
输出:
A: null, null B: hello, null C: hello, dad
解析:
当一个 val 被重写时,只能初始化一次。例如,x2 在 B处初始化了,并且在 C处也初始化了,只有C处的生效。
如果 x2 同时在 B、C 两处初始化,打印的结果是
A: null, null B: hello, null C: hello, dad
如果 x2 仅在B处初始化则,打印的结果是
A: null, null B: hello, dad C: hello, dad
如果 x2不发生重写,初始值就是默认初始值。打印的结果是
A: null, mom B: hello, mom C: hello, mom
233