Ваши два класса в разных пакетах? И объявлены ли ваши методы класса foo общедоступными, защищенными, приватными или пакетными локальными? Очевидно, что если они являются частными, это не сработает. Возможно, менее очевидным является то, что если они являются локальными (то есть не имеют публичной / защищенной / закрытой области видимости), вы можете переопределить их, только если вы находитесь в том же пакете, что и исходный класс.
Например:
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();
}
}
В этом случае вы все равно получите «А». Если вы объявите оригинальный метод a () в публичном или защищенном Foo, вы получите ожидаемый результат.