Сегодня я закончил следующий код кода (который, как я признаю, странно, и с тех пор я реорганизовался). Когда я запустил свой модульный тест, я обнаружил, что инициализация поля не была установлена к моменту запуска конструктора суперкласса. Я понял, что я не совсем понимаю порядок инициализации конструктора/поля, поэтому я отправляю в надежде, что кто-то объяснит мне порядок, в котором они происходят.Что такое инициализация поля объекта и порядок конструктора в Java
class Foo extends FooBase {
String foo = "foobar";
@Override
public void setup() {
if (foo == null) {
throw new RuntimeException("foo is null");
}
super.setup();
}
}
class FooBase {
public FooBase() {
setup();
}
public void setup() {
}
}
@Test
public void testFoo() {
new Foo();
}
Сокращенный backtrace от JUnit выглядит следующим образом, я предполагаю, что ожидал $ Foo. <init> установить foo.
$Foo.setup
$FooBase.<init>
$Foo.<init>
.testFoo