Инициализация в полиморфизме переменных
Предположим, у вас есть следующий код
class A {
int i = 4;
A() {
print();
}
void print () {
System.out.println("A");
}
}
class B extends A {
int i = 2; //"this line"
public static void main(String[] args){
A a = new B();
a.print();
}
void print () {
System.out.println(i);
}
}
это напечатает 0 2
Теперь, если вы удалите строку, помеченную «эта строка», код напечатает 4 4
Я понимаю, что если бы не было int i = 2; линия,A a = new B();
вызовет класс A, инициализирует i как 4, вызовет конструктор,
который дает контроль надprint()
метод вclass B
и, наконец, печатает 4.
a.print()
позвонюprint()
метод в классе B, потому что методы будут связываться во время выполнения, которое также будет использовать значение, определенное в классе A, 4.
(Конечно, если в моих рассуждениях есть какая-либо ошибка, дайте мне знать)
Тем не менее, я не понимаю, есть ли int i = 2.почему при вставке кода первая часть (создание объекта) внезапно выведет 0 вместо 4? Почему он не инициализирует переменную как i = 4, а вместо этого присваивает значение по умолчанию?