Являются ли ваши два класса в разных пакетах? И являются ли ваши методы класса 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'. Если вы объявите оригинальный метод a() в Foo public или protected, вы получите ожидаемый результат.
Простите дидактику: она называется «переопределяющей», а не «переписывающей». – erickson
Код, который вы написали, должен работать так, как вы ожидаете - так как многие из приведенных ниже ответов предлагают получить результат, который вы получаете, вы должны делать что-то еще в своем коде, который вы здесь не показываете. – Eborbob