Perplexing Ausgabe in Java mit Vererbung und überschreibenden Methoden

Ich bin über dieses Stück Code gestolpert.
Ich habe versucht zu erraten, was das Ergebnis der Ausführung sein wird, bevor ich das tatsächlich tue. Ich war wirklich verwirrt, als ich sie sah und brauchte einige Erklärungen.
Dies ist der Code:

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

Die Ausgabe ist:

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

Warum das

Wie istbar = null?Warum ista.bar = A.bar sogar erscheinen? Ich habe @ nicht instanziieA überhauptUnd wennA erscheint, warum ist esnac B?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage