如果我实例化Base2,它运行正常
class Base2 {
class Benchmark {
def onTrade() {
println("base onTrade")
}
}
protected val benchmark = new Benchmark
benchmark.onTrade
}
class Base3 extends Base2 {
override val benchmark = new Benchmark {
override def onTrade() {
println("sub onTrade")
}
}
}
// to run
new Base3
异常信息:
java.lang.NullPointerException
at Base2.<init>(<console>:16)
at Base3.<init>(<console>:19)
at .<init>(<console>:10)
at .<clinit>(<console>)
at .<init>(<console>:11)
...
答案 0 :(得分:4)
Base2首先初始化,此时benchmark.onTrade
被执行,但是由于覆盖({{}而正在使用来自Base3(而不是Base2!)的成员benchmark
Base2中的1}}实际上是先被初始化的,但它并不重要,因为另一个benchmark
被“绑定”到!)。我很确定这与val是虚拟 ...
Base3的初始化不会在Base2完成之后开始(或恢复?),因此benchmark
的{{1}}仍然为空。
FWIW,“懒惰的val”似乎“解决了”这个问题。
快乐的编码。
答案 1 :(得分:1)
我不知道scala,但它可能是这样的:
在Base3
(benchmark
)中的所有代码执行完毕之后,才会构建{p> Base2
的{{1}}实例?