Saída desconcertante em Java com métodos de herança e substituição

Eu me deparei com esse pedaço de código.
Tentei adivinhar qual será o resultado de executá-lo antes de realmente fazê-lo. Fiquei realmente confuso quando os vi e precisava de algumas explicações.
Este é o código:

public class A {
    String bar = "A.bar";
    A() { foo(); }

    public void foo() {
        System.out.println("A.foo(): bar = " + bar);
    }
}

public class B extends A {
    String bar = "B.bar";
    B() { foo(); }
    public void foo() {
        System.out.println("B.foo(): bar = " + bar);
    }
}

public class C {
    public static void main(String[] args) {
        A a = new B();
        System.out.println("a.bar = " + a.bar);
        a.foo();
    }
}

A saída é:

B.foo(): bar = null
B.foo(): bar = B.bar
a.bar = A.bar
B.foo(): bar = B.bar

Por que é que?

Como ébar = null?Porque éa.bar = A.bar até aparecer? Eu não instancieiA em absoluto.E seA aparece, por quedepois de B?

questionAnswers(1)

yourAnswerToTheQuestion