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).
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.
Method hiding happens when a subclass declares a static method with the parent's signature → not overriding, but hiding.
The JVM dispatches by reference type (compile-time).
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, dispatched by reference
p.instanceWho(); // "Child" ← OVERRIDING, dispatched by actual object| Hiding | Overriding | |
|---|---|---|
| Applies to | static methods | Instance methods |
| Dispatch | By reference type | By object type (vtable) |
@Override | ❌ | ✅ |
| Polymorphism | ❌ | ✅ |
Rules:
- Always call statics via the class name: Parent.who() — IDEs warn when called via an instance.
- Do not "override" static — switch to instance methods if you need polymorphism.
- Fields are also "hidden" — parent.field reads by reference type, not actual object.
Only instance methods are overridden (dynamic dispatch). Statics/fields/private/final can only be hidden.