दोनों विधि के नाम का पुनः उपयोग करते हैं, लेकिन वे बुनियादी रूप से भिन्न हैं। अधिभार = समान नाम, , एक ही कक्षा में, में हल किया गया। = एक उप-कक्षा एक मूल विधि को के साथ, में हल किया गया।
दोनों विधि के नाम का पुनः उपयोग करते हैं, लेकिन वे बुनियादी रूप से भिन्न हैं। अधिभार = समान नाम, , एक ही कक्षा में, में हल किया गया। = एक उप-कक्षा एक मूल विधि को के साथ, में हल किया गया।
| अधिभार | अधिलेखन | |
|---|---|---|
| हस्ताक्षर | भिन्न होना चाहिए (params) | समान होना चाहिए |
| संबंध | समान कक्षा | मूल ↔ उप-कक्षा |
| हल किया गया | संकलन समय (स्थिर) | रनटाइम (गतिशील) |
| उद्देश्य | सुविधा / प्रकार | बहुरूपता |
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)
एक आम गलती गलती से अधिभार करना है जब आप अधिलेखन करना चाहते हैं (उदाहरण के लिए हस्ताक्षर में एक टाइपो)। हमेशा @Override (Java) या override (C#) का उपयोग करें ताकि संकलक इसे पकड़ ले।
अधिलेखन बहुरूपता का इंजन है — रनटाइम तंत्र जो "एक इंटरफेस, कई कार्यान्वयन" को काम करता है।
अंतर जानना एक शास्त्रीय बग को रोकता है: यह सोचना कि आपने व्यवहार को बदल दिया है जब आपने वास्तव में एक दूसरी, कभी नहीं बुलाई गई विधि बनाई है।