Ошеломляющий вывод в Java с помощью методов наследования и переопределения

Я наткнулся на этот кусок кода.
Я пытался угадать, каков будет результат его запуска, прежде чем делать это. Я был очень смущен, когда увидел их и нуждался в каких-то объяснениях.
Это код:

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

Выход:

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

Это почему?

Какbar = null?Почемуa.bar = A.bar хотя бы появиться? Я не создалA совсем.И еслиA появляется, почему этопосле B?

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

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