Странное поведение Scala при инициализации класса / объекта [дубликат]

Возможный дубликат:

Scala и прямые ссылки

Есть ли обоснование, почему в Scala работает следующее:

Версия 1
object Strange extends App {
  val x = 42
  Console.println(x) // => outputs "42", as expected
}
Версия 2
object Strange extends App {
  Console.println(x) // => "0" ?!
  val x = 42
}

Почему этокомпилировать вообще и почему так странно себя ведетлюбой предупреждения или что?

Это'Также та же проблема с:class

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

object TestApp extends App {
  new StrangeClass()
}

Там нет такой проблемы с обычным методом "тело:

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

И поведение резко меняется, если мыбуду добавлятьокончательный» в декларации:

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

Для записей, следующая статическая Java (Scala'sobject) аналог:

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

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

не компилируется с простым & понятная ошибкаНевозможно ссылаться на поле, пока оно не определено в строке № 3 и Java нестатические (Scala'sclass) аналог:

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

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

очевидно, терпит неудачу сх не может быть преобразован в переменную " на линии № 3.

Ответы на вопрос(2)

Ваш ответ на вопрос