Reemplazar métodos en Java y luego convertir el objeto en comportamiento de clase primaria

Tengo una clase para padres, A, y una clase para niños, B y B anula un método, f, de A.

public class A
{
    public String f()
    {
        return "A";
    }
}

public class B extends A
{
    ...
    public String f()
    {
        return "B";
    }

    public static void main(String[] args)
    {
        B b = new B();
        A a = (A) b;
        System.out.println(b.f()); //prints: B
    }
}

Creo un objeto de tipo B, b, y lo lanzo al tipo A y lo asigno a una variable de tipo A, a, y luego llamo al método f en a. Ahora esperaría que se llamara al método de la clase padre ya que estoy trabajando con un objeto de Tipo A pero no lo hace, llama a la versión b del método (imprime "B" en lugar de "A" en el código a continuación).

¿Por qué es como este? ¿Es una decisión de diseño o un límite de tecnología?

Respuestas a la pregunta(5)

Su respuesta a la pregunta