Scala comportamiento extraño en la clase / inicialización de objetos [duplicado]

Posible duplicado:
Scala y referencias avanzadas.

¿Hay alguna razón por la que los siguientes trabajos en Scala:

Versión 1
object Strange extends App {
  val x = 42
  Console.println(x) // => outputs "42", as expected
}
Versión 2
object Strange extends App {
  Console.println(x) // => "0" ?!
  val x = 42
}

Porque lo hacecompilar en absoluto y por qué se comporta tan raro sinalguna advertencias o lo que sea?

También es el mismo problema conclass:

class StrangeClass {
  Console.println(x) // => still "0"
  val x = 42
}

object TestApp extends App {
  new StrangeClass()
}

No hay tal problema con el cuerpo del método regular:

def nonStrangeMethod {
  Console.println(y) // => fails with "not found: value y", as expected
  y = 42
}

Y el comportamiento cambia drásticamente si añadiéramos "final" a la declaración val:

class StrangeClass {
  Console.println(x) // => "42", but at least that's expected
  final val x = 42
}

Para los registros, el siguiente Java estático (de Scalaobject) contrapartida:

public class Strange {
    static {
        System.out.println(x);
    }
    static int x = 42;

    public static void main(String[] args) {}
}

falla la compilación con un error simple y comprensible "No se puede hacer referencia a un campo antes de que se defina" en la línea # 3 y Java no estático (Scala'sclass) contrapartida:

public class Strange {
    Strange() {
        System.out.println(x);
        int x = 42;
    }

    public static void main(String[] args) {
        new Strange();
    }
}

obviamente falla con "x no se puede resolver en una variable" en la línea # 3.

Respuestas a la pregunta(2)

Su respuesta a la pregunta