"result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d
"result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d scala> Foo.d
"result of v" } lazy val lv: String = { println("lv evaluated") "result of lv" } def d: String = { println("d evaluated") "result of d" } } scala> Foo v evaluated res0: Foo.type = Foo$@32f96bba scala> Foo.v res1: String = result of v scala> Foo.lv lv evaluated res2: String = result of lv scala> Foo.lv res3: String = result of lv scala> Foo.d d evaluated res4: String = result of d scala> Foo.d d evaluated res5: String = result of d
String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" }
String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" } class C extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" val d: String = "value of d" }
String = "value of lv in A" def d: String } class B extends A { lazy val v: String = "value of v" override lazy val lv: String = "value of lv" lazy val d: String = "value of d" } class C extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" val d: String = "value of d" } class D extends A { val v: String = "value of v" override lazy val lv: String = "value of lv" def d: String = "value of d" }
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, null
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, null scala> c.resultA res2: String = null, null
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultC res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultA res2: String = hello, dad
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null scala> c.resultB res1: String = hello, null
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@7cfb4736 scala> c.resultA res0: String = null, null scala> c.resultB res1: String = hello, null scala> c.resultC res2: String = hello, dad
c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> new E
c.x1 } class E extends D { val c = new C } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> new E java.lang.NullPointerException ... 30 elided
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 }
= "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@22d9bc14 scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
= "mom" val resultA = x1 + ", " + x2 } class B extends { val x1: String = "hello" } with A { val resultB = x1 + ", " + x2 } class C extends { override val x2: String = "dad" } with B { val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@22d9bc14 scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 }
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 }
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } Only when parent Val is not implemented
= "mom" val resultA = x1 + ", " + x2 } class B extends A { val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override val x2: String = "dad" val resultC = x1 + ", " + x2 } abstract class A { val x1: String lazy val x2: String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 }
String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@2f74900b scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad
String = "mom" val resultA = x1 + ", " + x2 } class B extends A { lazy val x1: String = "hello" val resultB = x1 + ", " + x2 } class C extends B { override lazy val x2: String = "dad" val resultC = x1 + ", " + x2 } scala> val c = new C c: C = C@2f74900b scala> c.resultA res0: String = hello, dad scala> c.resultB res1: String = hello, dad scala> c.resultC res2: String = hello, dad