Предположим, что у вас есть следующий код
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
Теперь, если вы удалите строку с надписью "this line", код будет печатать 4 4
- Я понимаю, что если бы не было int я = 2; line,
A a = new B();
вызовет класс A, инициализирует я как 4, конструктор вызова,
который дает управление методу print()
в class B
и, наконец, печатает 4.
a.print()
вызовет метод print()
в классе B, потому что методы будут привязываться во время выполнения, что также будет использовать значение, определенное в классе A, 4.
(Конечно, если в моих рассуждениях есть какая-то ошибка, дайте мне знать)
- Однако я не понимаю, есть ли int я = 2.
почему, если вы вставляете код, первая часть (создающий объект) будет все внезапно печатать 0 вместо 4? Почему это не инициализирует переменную как я = 4, а вместо этого назначает значение по умолчанию?