دونوں ایک method کے نام کو دوبارہ استعمال کرتے ہیں، لیکن وہ بنیادی طور پر مختلف ہیں۔ = ایک جیسا نام، ، ایک ہی class میں، پر حل ہوتا ہے۔ = ایک subclass ایک parent method کو کے ساتھ ، پر حل ہوتا ہے۔
دونوں ایک method کے نام کو دوبارہ استعمال کرتے ہیں، لیکن وہ بنیادی طور پر مختلف ہیں۔ = ایک جیسا نام، ، ایک ہی class میں، پر حل ہوتا ہے۔ = ایک subclass ایک parent method کو کے ساتھ ، پر حل ہوتا ہے۔
| Overloading | Overriding | |
|---|---|---|
| Signature | مختلف ہونا ضروری ہے (params) | ایک جیسی ہونا ضروری ہے |
| رشتہ | ایک جیسی class | Parent ↔ subclass |
| حل ہونا | Compile time (static) | Runtime (dynamic) |
| مقصد | سہولت / متغیرات | 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) { /* ... */ }
}
Compiler argument types کی بنیاد پر کون سا print استعمال کرے گا یہ فیصلہ کرتا ہے — کوئی inheritance شامل نہیں۔
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)
ایک عام غلطی یہ ہے کہ آپ overriding کے لیے سوچ رہے تھے لیکن غیر ارادی طور پر overloading ہو گیا (مثال کے طور پر signature میں ایک غلطی)۔ ہمیشہ @Override (Java) یا override (C#) استعمال کریں تاکہ compiler اسے پکڑ لے۔
Overriding polymorphism کا انجن ہے — runtime mechanism جو "ایک interface، بہت سی تعمیرات" کو کام کرتا ہے۔
فرق جاننا ایک روایتی bug سے بچاتا ہے: سوچنا کہ آپ نے رویہ بدل دیا جبکہ آپ نے دراصل ایک دوسرا، کبھی نہ بلایا جانے والا method بنایا۔