Ответ 1
Нет, они не эквивалентны. Значения по умолчанию присваиваются немедленно, при создании объектов. Назначение в инициализаторах поля происходит, когда конструктор суперкласса был вызван... что означает, что вы можете увидеть разницу в некоторых случаях. Пример кода:
class Superclass {
public Superclass() {
someMethod();
}
void someMethod() {}
}
class Subclass extends Superclass {
private int explicit = 0;
private int implicit;
public Subclass() {
System.out.println("explicit: " + explicit);
System.out.println("implicit: " + implicit);
}
@Override void someMethod() {
explicit = 5;
implicit = 5;
}
}
public class Test {
public static void main(String[] args) {
new Subclass();
}
}
Вывод:
explicit: 0
implicit: 5
Здесь вы можете видеть, что явная инициализация поля "reset" значение explicit
возвращается к 0 после конструктора Superclass
, но до выполнения куба конструктора подкласса. Значение implicit
все еще имеет значение, назначенное в полиморфном вызове someMethod
из конструктора Superclass
.