ทั้งสองนำมาใช้ใหม่ ชื่อเมธอด แต่มีความแตกต่างพื้นฐาน Overloading = ชื่อเดียวกัน พารามิเตอร์ต่างกัน ในคลาสเดียวกัน ได้รับการแก้ไข = subclass เมธอด parent ด้วย ได้รับการแก้ไข
ทั้งสองนำมาใช้ใหม่ ชื่อเมธอด แต่มีความแตกต่างพื้นฐาน Overloading = ชื่อเดียวกัน พารามิเตอร์ต่างกัน ในคลาสเดียวกัน ได้รับการแก้ไข = subclass เมธอด parent ด้วย ได้รับการแก้ไข
| Overloading | Overriding | |
|---|---|---|
| ลายเซ็น | ต้องแตกต่างกัน (พารามิเตอร์) | ต้องเหมือนกันทุกประการ |
| ความสัมพันธ์ | คลาสเดียวกัน | Parent ↔ subclass |
| ได้รับการแก้ไข | เวลาคอมไพล์ (static) | เวลารันไทม์ (dynamic) |
| วัตถุประสงค์ | ความสะดวก / variants | Polymorphism |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
คอมไพเลอร์เลือก print ไหนโดยยึดตามชนิดอาร์กิวเมนต์ — ไม่มีการสืบทอด
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
ความผิดพลาดทั่วไป คือ โดยไม่ตั้งใจ overload เมื่อคุณตั้งใจจะ override (เช่น การสะกดผิดในลายเซ็น) ใช้ @Override (Java) หรือ override (C#) เสมอ เพื่อให้คอมไพเลอร์จับได้
Overriding คือหัวใจของ polymorphism — กลไกรันไทม์ที่ทำให้ "อินเตอร์เฟซหนึ่ง การนำไปใช้หลายแบบ" ทำงาน
การรู้ความแตกต่างหลีกเลี่ยงข้อผิดพลาดแบบดั้งเดิม: คิดว่าคุณแทนที่พฤติกรรม เมื่อจริง ๆ แล้วคุณสร้างเมธอดที่สอง ที่ไม่เคยถูกเรียก