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?