Инициализация в полиморфизме переменных

Предположим, у вас есть следующий код

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, а вместо этого присваивает значение по умолчанию?

Ответы на вопрос(3)

Ваш ответ на вопрос