Cả hai đều tái sử dụng tên method, nhưng chúng khác nhau về căn bản. = cùng tên, , trong cùng một class, phân giải lúc . = một subclass một method của cha bằng , phân giải lúc .
Cả hai đều tái sử dụng tên method, nhưng chúng khác nhau về căn bản. = cùng tên, , trong cùng một class, phân giải lúc . = một subclass một method của cha bằng , phân giải lúc .
| Overloading | Overriding | |
|---|---|---|
| Signature | Phải khác (tham số) | Phải giống hệt |
| Quan hệ | Cùng class | Cha ↔ subclass |
| Phân giải | Compile-time (tĩnh) | Runtime (động) |
| Mục đích | Tiện lợi / biến thể | Polymorphism |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // cùng tên, khác tham số
void print(String s, int times) { /* ... */ }
}
Compiler chọn print nào dựa trên kiểu của đối số — không liên quan tới inheritance.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // thay thế Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime chọn phiên bản của Dog (dynamic dispatch)
Một lỗi thường gặp là vô tình overloading khi bạn định override (ví dụ gõ sai signature). Luôn dùng @Override (Java) hoặc override (C#) để compiler bắt được lỗi.
Overriding là động cơ của polymorphism — cơ chế runtime khiến "một interface, nhiều cài đặt" hoạt động.
Biết sự khác biệt giúp tránh một bug kinh điển: tưởng rằng bạn đã thay thế hành vi trong khi thực ra bạn tạo ra một method thứ hai không bao giờ được gọi.
Thư viện câu hỏi phỏng vấn IT với đáp án chi tiết — từ Junior đến Senior.
Ủng hộ