Method hiding xảy ra khi subclass khai báo static method trùng signature parent → không override mà che giấu.
JVM dispatch theo kiểu reference (compile-time).
java
class Parent {
static void who() { System.out.println("Parent"); }
void instanceWho() { System.out.println("Parent"); }
}
class Child extends Parent {
static void who() { System.out.println("Child"); }
@Override void instanceWho() { System.out.println("Child"); }
}
Parent p = new Child();
p.who(); // "Parent" ← HIDING, dispatch theo reference
p.instanceWho(); // "Child" ← OVERRIDING, dispatch theo object thực| Hiding | Overriding | |
|---|---|---|
| Áp dụng | static method | Instance method |
| Dispatch | Theo reference type | Theo object type (vtable) |
@Override | ❌ | ✅ |
| Polymorphism | ❌ | ✅ |
Quy tắc:
- Luôn gọi static qua tên class: Parent.who() — IDE cảnh báo nếu gọi qua instance.
- Đừng "override" static — đổi sang instance method nếu cần polymorphism.
- Field cũng "hidden" — parent.field lấy field theo reference type, không theo object.
Chỉ instance method được override (dynamic dispatch). Static/field/private/final chỉ hide được.