trait Foo { def a: String val b = a + " " } class Bar extends Foo { override val a = "a" } class Baz extends Foo { override def a = "a" } class Bla extends Foo { override lazy val a = "a" } // guess what the code below prints println(new Bar().b) println(new Baz().b) println(new Bla().b) trait Foo2 { def a: String = "b" val b = a + " " } class Bar2 extends Foo2 { override val a = "a" } class Baz2 extends Foo2 { override def a = "a" } class Bla2 extends Foo2 { override lazy val a = "a" } // And for the kicker, guess what the code below prints println(new Bar2().b) println(new Baz2().b) println(new Bla2().b)