2 Stimmen

Warum ist das Ergebnis bei einer winzigen Änderung in Bezug auf die Initialisierung von abstrakten Eigenschaftswerten anders?

Der folgende Codeschnipsel bezieht sich auf ein Beispiel in Kapitel 6 von "Programming Scala":

object HelloWorld {
  def main(args: Array[String]) {
    trait AbstractT2 {
      println("In AbstractT2:")
      val value: Int
      val inverse = 1.0 / value // ???
      println("AbstractT2: value = " + value + ", inverse = " + inverse)
    }

    val c2b = new AbstractT2 {
      println("In c2b:")   //---->line 1
      val value = 10       //---->line 2
    }
    println("c2b.value = " + c2b.value + ", inverse = " + c2b.inverse)
  }
}

Das Ergebnis des obigen Codes ist:

In AbstractT2:
AbstractT2: value = 0, inverse = Infinity
In c2b:
c2b.value = 10, inverse = Infinity

Da die Initialisierung der anonymen Klasse nach der Initialisierung des Traits erfolgt, ist das Ergebnis verständlich. Wenn ich aber im obigen Beispiel Zeile 1 und Zeile 2 vertausche, so dass val value = 10 steht vor println("In c2b:") wird das Ergebnis sein:

In AbstractT2:
AbstractT2: value = 10, inverse = 0.1
In c2b:
c2b.value = 10, inverse = 0.1

Diesmal scheint die Initialisierung erfolgreich zu sein, obwohl sie aus sprachlicher Sicht falsch ist. Ich kann nicht verstehen, warum. Kann mir jemand dabei helfen? Ich danke Ihnen vielmals.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X