Inicialização no polimorfismo de variáveis

Suponha que você tenha o seguinte código

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);
    }
}

isso imprimirá 0 2

Agora, se você remover a linha "this line", o código será impresso 4 4

Eu entendo que se não houvesse int i = 2; linha,

A a = new B(); chamará a classe A, inicializa i como 4, construtor de chamada,
que dá controle sobreprint() método emclass Be, finalmente, imprime 4.

a.print() chamaráprint() na classe B porque os métodos serão vinculados no tempo de execução, que também usará o valor definido na classe A, 4.

(Obviamente, se houver algum erro no meu raciocínio, me avise)

No entanto, o que eu não entendo é se existe int i = 2.

por que, se você inserir o código, a primeira parte (criando o objeto) imprimirá 0 repentinamente 0 em vez de 4? Por que ela não inicializa a variável como i = 4, mas atribui o valor padrão?

questionAnswers(3)

yourAnswerToTheQuestion