Этот вопрос вдохновлен этим другим Я наткнулся на.
Учитывая следующий код:
public class Test {
public static void main(String[] args) {
Derived b = new Derived();
Base a = b;
System.out.println("b.i -> " + b.i);
System.out.println("a.i -> " + a.i);
System.out.println("b.getI() -> " + b.getI());
System.out.println("a.getI() -> " + a.getI());
}
}
class Base {
int i = 1;
public int getI() {
return i;
}
}
class Derived extends Base {
int i = 2;
public int getI() {
return -i;
}
}
// Output:
// b.i -> 2
// a.i -> 1
// b.getI() -> -2
// a.getI() -> -2
Может кто-нибудь объяснить, почему a.i
возвращается 1
? Разве он не должен обращаться к полю i
в классе Derived
?
Кроме того, при отладке кода я вижу что-то вроде этого:
Там вы можете видеть, что класс Derived
хранит ссылку на Base.i
.
Почему это происходит? Разве Base.i
не должен наследоваться и перезаписываться Derived.i
?