Для
A a1 = new B();
a1 указывает на объект B, который является реальным типом во время выполнения. Следовательно, значение выводится из объекта B.
a1