Когда вы делаете это в REPL, вы фактически выполняете:
class Foobar { val b = a; val a = 5 }
b и a назначаются по порядку, поэтому в то время, когда вы назначаете b, есть поле a, но он еще не был назначен, поэтому он имеет значение по умолчанию 0. В Java вы не можете сделать это, потому что вы не можете ссылаться на поле до того, как оно будет определено.Я полагаю, что вы можете сделать это в Scala, чтобы разрешить отложенную инициализацию.
Вы можете увидеть это более четко, если будете использовать следующий код:
scala> class Foobar {
println("a=" + a)
val b = a
println("a=" + a)
val a = 5
println("a=" + a)
}
defined class Foobar
scala> new Foobar().b
a=0
a=0
a=5
res6: Int = 0
Вы можете назначить правильные значения, еслисделать метод:
class Foobar { val b = a; def a = 5 }
defined class Foobar
scala> new Foobar().b
res2: Int = 5
или вы можете сделать ба ленивый val:
scala> class Foobar { lazy val b = a; val a = 5 }
defined class Foobar
scala> new Foobar().b
res5: Int = 5