在Scala中重写val遇到DelayedInit时的奇怪初始化
下面代码的输出让我感到困惑 代码 输出 尝试了scala 2.10.2和2.11.0-M3 在我的理解中,Test1应该与Test2相同。这里有两个问题:在Scala中重写val遇到DelayedInit时的奇怪初始化,scala,init,Scala,Init,下面代码的输出让我感到困惑 代码 输出 尝试了scala 2.10.2和2.11.0-M3 在我的理解中,Test1应该与Test2相同。这里有两个问题: 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性 为什么Test1.C中的s==null 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性 这看起来像个bug,请尝试向Scala JIRA报告 为什么Test1.C中的s==null 我认为这是因为val在 override val s
- 为什么在Test1.C中它被调用了两次?在类层次结构中没有其他类继承该特性
- 为什么Test1.C中的
s==null
为什么
Test1.C
中的s==null
我认为这是因为val
在
override val s: String = "C"
由内部变量支持,该变量在C
的初始化过程中初始化。由于DelayedInit
不捕获trait
s,因此A
的初始化在DelayedInit
之前执行,即在C
和val s
初始化之前执行
(如果有人发布这些类的反编译Java代码,那会很有趣。)谢谢你的建议。我只是为它放了一只虫子
Test1
-- new B begin
s = A
B 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new B context
B 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new B end
-- new C begin
s = null
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new C context
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new C end
Test2
-- new B begin
s = A
B 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new B context
B 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new B end
-- new C begin
s = C
C 11111111111111111111111111111111111111111111111111111111111111111111111111111111
new C context
C 22222222222222222222222222222222222222222222222222222222222222222222222222222222
-- new C end
override val s: String = "C"