Странное поведение Scala при инициализации класса / объекта [дубликат]
Возможный дубликат:
Scala и прямые ссылки
Есть ли обоснование, почему в Scala работает следующее:
Версия 1object Strange extends App {
val x = 42
Console.println(x) // => outputs "42", as expected
}
Версия 2object 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.