Странно, но я не могу найти дубликат для этого вопроса. У меня есть суперкласс с методом overrideMe() и подкласс, который переопределяет его. Является ли окончательное поле действительно инициализированным до вызова конструктора подкласса? Как я могу видеть на выходе, это так.Инициализация конечного поля в подклассе
Вот результат: Superclass CONSTR значение ул: SomeValue Подкласс CONSTR ул значение: SomeValue
Не могли бы вы объяснить мне это? Я думал, что переменные экземпляра инициализируются внутри вызова конструктора, но не раньше него.
Вот код:
public class Test {
public Test() {
System.out.println("Superclass constr");
overrideMe();
}
public void overrideMe() {
}
}
class Ext extends Test {
private final String str = "someValue";
public Ext() {
System.out.println("Subclass constr");
}
@Override
public void overrideMe() {
System.out.println("str value: " + str);
}
public static void main(String[] args) {
Ext test = new Ext();
test.overrideMe();
}
}
EDIT: если я declasre ул поле неконечное, подкласс вызова его в конструкторе возвращает нуль, как я ожидал.
Каждый конструктор вызывает 'super' (или' this', который вызывает 'super'), чтобы первый класс сначала инициализировался. (За исключением 'java.lang.Object', который не имеет супер) –