以下代码如何引发参考错误?
trait T1 {
println( " in T1: x = " + x )
val x=1
println( " in T1: x = " + x )
}
class C12 extends T1 {
println( " in C12: c = " + c )
val c="C12"
println( " in C12: c = " + c )
}
new C12
相反,似乎x
默认为0而c
默认为null
。这在scala中如何工作?这些变量何时初始化?
答案 0 :(得分:2)
As explained in the Scala Language Specification:
声明或定义引入的名称范围是包含绑定的整个语句序列。但是,块中的前向引用存在限制:在组成块的语句序列
s1…sn
中,如果si
中的简单名称引用由sj
定义的实体,其中j≥i
1}},然后对于sk
和si
之间的所有sj
,sk
不能是变量定义。如果sk
是值定义,则它必须是惰性的。
特质和类体不是块,因此这里没有前向参考限制。
这些变量何时初始化?
语句(包括val
初始化)只是按顺序执行。