Hai lớp học của bạn có trong các gói khác nhau không? Và các phương thức lớp foo của bạn có được khai báo công khai, được bảo vệ hay riêng tư hay gói cục bộ không? Rõ ràng nếu chúng là riêng tư, điều này sẽ không hoạt động. Có lẽ ít rõ ràng hơn, là nếu chúng là gói địa phương (nghĩa là không có phạm vi công cộng/được bảo vệ/riêng tư) thì bạn chỉ có thể ghi đè chúng nếu bạn ở trong cùng một gói với lớp gốc.
Ví dụ:
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();
}
}
Trong trường hợp này, bạn vẫn sẽ nhận được 'A'. Nếu bạn khai báo phương thức a() ban đầu trong Foo công khai hoặc được bảo vệ, bạn sẽ nhận được kết quả mong đợi.
Xin lỗi giáo lý: Nó được gọi là "ghi đè" chứ không phải "ghi đè". – erickson
Mã như bạn đã viết nó sẽ hoạt động như bạn mong đợi - vì nhiều câu trả lời dưới đây gợi ý để có được kết quả bạn đang nhận được, bạn phải làm điều gì đó khác trong mã mà bạn không hiển thị ở đây. – Eborbob