Я столкнулся с этим примером о наследовании в Интернете, и мне нелегко с его результатами. Я упускаю что-то критическое.
public class A {
int i = 5;
public A() {
foo();
}
private void foo() {
System.out.println(i);
}}
public class B extends A {
int i = 6;}
public class C extends B {
int i = 7;
public void foo() {
System.out.println("C's foo");
System.out.println(super.i);
}}
Я пытаюсь выяснить, что происходит, с помощью следующей команды: C c = new C();
System.out.println(C.i);
Я знаю, что когда мы создаем новый экземпляр C
, мы приближаемся к конструкциям A и B, поэтому мы достигаем A()
- (вопрос 1) Инициализируется ли i
(из A) в пути?
Теперь нам нужно обратиться к foo()
- (вопрос 2) - Считает ли C foo()
переопределением A 1012 *? а что если у B foo()
самого себя? тогда это рассматривалось как переопределение и C foo()
был оперирован?
Насколько я знаю, нет переопределения, когда оно относится к локальным переменным. Почему System.out.println(c.i)
равно 7, а не 5? не должно ли это быть i
от высшего отца?
РЕДАКТИРОВАТЬ: Мой вопрос не о том, какой foo и я буду использовать, когда я использую c, а о том, что происходит во время этих двух конкретных команд, потому что, очевидно, использовался foo A, а не C.
Большое спасибо.