Salida desconcertante en Java con herencia y métodos de anulación

Me topé con este código.
Traté de adivinar cuál será el resultado de ejecutarlo antes de hacerlo. Estaba realmente confundido cuando los vi y necesitaba algunas explicaciones.
Este es el 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();
    }
}

El resultado es:

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

¿Porqué es eso?

Como esbar = null?Por que esa.bar = A.bar incluso aparece? No he instanciadoA en absoluto.Y siA aparece, por qué esdespués B?

Respuestas a la pregunta(1)

Su respuesta a la pregunta