¿Están sus dos clases en paquetes diferentes? ¿Y sus métodos de clase Foo se declaran públicos, protegidos o privados o de paquete local? Obviamente, si son privados, esto no funcionará. Tal vez sea menos obvio, si son paquetes locales (es decir, sin alcance público/protegido/privado), entonces solo puede anularlos si está en el mismo paquete que la clase original.
Por ejemplo:
package original;
public class Foo {
void a() { System.out.println("A"); }
public void b() { a(); }
}
package another;
public class Bar extends original.Foo {
void a() { System.out.println("Overwritten A"); }
}
package another;
public class Program {
public static void main(String[] args) {
Bar bar = new Bar();
bar.b();
}
}
En este caso, seguirá recibiendo 'A'. Si declara que el método a() original en Foo es público o está protegido, obtendrá el resultado que esperaba.
Perdón por lo didáctico: Se llama "sobrescribir", no "sobrescribir". – erickson
El código tal como lo ha escrito debe funcionar como espera: como muchas de las respuestas a continuación sugieren obtener el resultado que está obteniendo, debe estar haciendo algo más en su código que no se muestra aquí. – Eborbob