किसी विधि को ओवरलोड करने और जावा में ओवरराइड करने के बीच क्या अंतर है?


10

किसी विधि को ओवरलोड करने और जावा में ओवरराइड करने के बीच क्या अंतर है?

क्या विधि हस्ताक्षर, एक्सेस स्पेसियर, रिटर्न प्रकार, आदि में अंतर है?


3
PHP में ओवरलोडिंग का एक बिल्कुल अलग अर्थ है
lortabac

जवाबों:


41

एक नई विधि के साथ एक विधि को अधिभारित करने के लिए, नई विधि में एक अलग हस्ताक्षर होना चाहिए। यानी दो अतिभारित तरीकों का एक ही नाम है, लेकिन विभिन्न पैरामीटर। यहां दो अतिभारित तरीकों का एक उदाहरण दिया गया है:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

पैरामीटर प्रकारों के आधार पर, संबंधित विधि को बुलाया जाएगा। ध्यान दें कि रिटर्न प्रकार बदलना पर्याप्त नहीं है (हालांकि आप इसके अतिरिक्त कर सकते हैं)।

जब किसी विधि को ओवरराइड किया जाता है, तो नई विधि में एक ही हस्ताक्षर होता है और कुछ मामलों में ओवरराइड विधि की जगह ले लेता है। यहां ओवरराइड विधि का एक उदाहरण दिया गया है:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

ऑब्जेक्ट प्रकार के आधार पर चुनाव किया जाता है। उदाहरण के लिए,

A someA = new B();
someA.someMethod();

कॉल करेंगे someMethodकी B। आप कर सकते हैं (और चाहिए) @Override एनोटेशन:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

अब, यदि आप गलती से बी में मापदंडों को बदलते हैं, तो संकलक आपको सूचित करेगा, कि आप कुछ मेथोड () को ओवरराइड नहीं कर रहे हैं, लेकिन इसे ओवरलोड कर रहे हैं।


@scarfridge, संपादन के लिए धन्यवाद। उम्र के लिए जावा के साथ प्रोग्रामिंग नहीं की गई है और बहुत कुछ भूल गया है)))
18

1
@ ऑवरराइड एनोटेशन और इस तथ्य का उल्लेख करने के लिए धन्यवाद कि केवल अलग-अलग रिटर्न प्रकार होने से ओवरराइड करने की विधि नहीं होती है, बल्कि ओवरलोड के लिए।
डैनियल डायनीज़

13

ओवरलोडिंग, विधियों का एक ही नाम है, लेकिन विभिन्न पैरामीटर।

ओवरराइडिंग, बेस क्लास में दिए गए कार्यान्वयन को सब क्लास में बदल दिया जाता है।


1
कृपया इसे संपादित / विस्तारित न करें। संक्षिप्तता बिंदु है।
निमचम्पस्की

7

जिन अवधारणाओं के बारे में आप पूछते हैं वे जावा ट्यूटोरियल में शामिल हैं।

ओवरराइडिंग के लिए स्पष्टीकरण निम्नानुसार दिया गया है:

एक ही हस्ताक्षर के साथ एक उपवर्ग में एक आवृत्ति विधि (नाम, प्लस संख्या और उसके मापदंडों के प्रकार) और सुपरक्लास में एक आवृत्ति विधि के रूप में वापसी प्रकार सुपरक्लास की विधि को ओवरराइड करता है।

एक विधि को ओवरराइड करने के लिए एक उपवर्ग की क्षमता एक वर्ग को एक सुपरक्लास से विरासत में प्राप्त करने की अनुमति देती है जिसका व्यवहार "काफी करीब" है और फिर आवश्यकतानुसार व्यवहार को संशोधित करने के लिए। ओवरराइडिंग विधि का एक ही नाम, संख्या और मापदंडों का प्रकार होता है, और जिस प्रकार यह ओवरराइड होता है उसी प्रकार रिटर्न प्रकार। एक ओवरराइडिंग विधि ओवरराइड विधि द्वारा लौटाए गए प्रकार का एक उपप्रकार भी लौटा सकती है। इसे सहसंयोजक वापसी प्रकार कहा जाता है ।

एक विधि को ओवरराइड करते समय, आप @Overrideएनोटेशन का उपयोग कर सकते हैं जो कंपाइलर को निर्देश देता है कि आप सुपरक्लास में एक विधि को ओवरराइड करने का इरादा रखते हैं। यदि, किसी कारण से, संकलक पता लगाता है कि सुपरक्लसेस में से किसी एक में विधि मौजूद नहीं है, तो यह एक त्रुटि उत्पन्न करेगा। अधिक जानकारी के लिए @Override, एनोटेशन देखें ...

ओवरलोडिंग को ट्यूटोरियल में निम्नानुसार समझाया गया है:

जावा प्रोग्रामिंग भाषा ओवरलोडिंग विधियों का समर्थन करती है, और जावा विभिन्न विधि हस्ताक्षरों वाले तरीकों के बीच अंतर कर सकती है। इसका मतलब यह है कि एक वर्ग के भीतर के तरीकों का एक ही नाम हो सकता है यदि उनके पास अलग-अलग पैरामीटर सूचियां हैं (इस के लिए कुछ योग्यताएं हैं जो "इंटरफेसेस एंड इनहेरिटेंस" नामक पाठ में चर्चा की जाएंगी।

मान लीजिए कि आपके पास एक वर्ग है जो विभिन्न प्रकार के डेटा (स्ट्रिंग्स, पूर्णांक, और इसी तरह) को आकर्षित करने के लिए सुलेख का उपयोग कर सकता है और जिसमें प्रत्येक डेटा प्रकार को खींचने के लिए एक विधि है। यह प्रत्येक विधि-उदाहरण के लिए, के लिए एक नया नाम का उपयोग करने बोझिल है drawString, drawInteger, drawFloat, और इतने पर। जावा प्रोग्रामिंग भाषा में, आप सभी ड्राइंग विधियों के लिए एक ही नाम का उपयोग कर सकते हैं लेकिन प्रत्येक विधि के लिए एक अलग तर्क सूची पास करें। इस प्रकार, डेटा ड्रॉइंग क्लास नाम की चार विधियों की घोषणा कर सकती है draw, जिनमें से प्रत्येक की एक अलग पैरामीटर सूची है ...

ओवरलोड तरीकों को संख्या से अलग किया जाता है और विधि में पारित तर्कों के प्रकार ...

आप समान नाम और समान संख्या और तर्कों के साथ एक से अधिक विधि घोषित नहीं कर सकते, क्योंकि कंपाइलर उन्हें अलग नहीं बता सकता।

कंपाइलर रिटर्न प्रकार पर विचार नहीं करता है जब अलग-अलग तरीके, इसलिए आप एक ही हस्ताक्षर के साथ दो तरीकों की घोषणा नहीं कर सकते हैं भले ही उनके पास एक अलग रिटर्न प्रकार हो।


नोट: अतिभारित तरीकों को संयम से इस्तेमाल किया जाना चाहिए, क्योंकि वे कोड को बहुत कम पठनीय बना सकते हैं।


"इंटरफेसेस एंड इनहेरिटेंस" नामक पाठ में चर्चा की गई योग्यता के बारे में अधिक जानकारी के लिए उपरोक्त विवरण :

एक उपवर्ग में, आप सुपरक्लास से विरासत में मिली विधियों को अधिभारित कर सकते हैं। इस तरह के अतिभारित तरीके न तो छिपते हैं और न ही सुपरक्लास विधियों को ओवरराइड करते हैं - वे नए तरीके हैं, जो उपवर्ग के लिए अद्वितीय हैं।


2

एक विधि को ओवरलोड करने को आम तौर पर "एक ही नाम के साथ कई उपलब्ध तरीकों को प्रदान करने, संख्याओं और प्रकारों और आउटपुट के प्रकार से भिन्न" के रूप में परिभाषित किया जाता है। अवधारणा आमतौर पर यह है कि आप इनपुट के अलग-अलग सेट दिए गए एक ही मूल ऑपरेशन को करने में सक्षम होना चाहते हैं: उदाहरण के लिए, आप संख्यात्मक प्रकार के किसी भी दो मूल्यों को "जोड़" सकते हैं, हालांकि यह जानना आम तौर पर महत्वपूर्ण है कि सटीक प्रकार क्या है मूल्य इतना है कि आप उस प्रकार के विशिष्ट व्यवहारों के लिए लाभ उठा सकते हैं या योजना बना सकते हैं। जैसे, आप संख्यात्मक प्रकार (और या संग्रह) के प्रत्येक संयोजन के लिए एक विधि को परिभाषित करेंगे जिसका आप समर्थन करना चाहते हैं। इन सभी विधियों में एक ही नाम है, लेकिन अलग-अलग "हस्ताक्षर"; संकलन-समय पर,

एक विधि को ओवरराइड करने को आम तौर पर "आधार वर्ग में परिभाषित एक विशेष हस्ताक्षर के साथ एक विधि के व्युत्पन्न वर्ग में एक अलग कार्यान्वयन प्रदान करने" के रूप में परिभाषित किया जाता है। एक विधि को ओवरराइड करने के कई कारण हैं; वस्तुतः उन सभी में यह तथ्य है कि व्युत्पन्न वर्ग को अतिरिक्त ज्ञान होना चाहिए कि क्या किया जाना चाहिए, जिसे आधार वर्ग द्वारा नहीं जाना जा सकता है। अधिकांश OO भाषाओं में ओवरराइडिंग के दो स्वाद हैं; ओवरराइडिंग बेस क्लास मेथड को रिप्लेस कर सकती है , या इसे बढ़ा सकती हैआधार वर्ग विधि। अंतर आमतौर पर यह है कि एक व्युत्पन्न वर्ग जो एक बेस क्लास कार्यान्वयन का विस्तार कर रहा है, बेस क्लास के ओवरराइड विधि के निष्पादन के दौरान किसी बिंदु पर विधि के ओवरराइड संस्करण को कॉल करेगा। यह ओवरराइडिंग वर्गों को ऑपरेशन के सामान्य क्षेत्रों को "पुनः उपयोग" करने की अनुमति देता है जो बेस क्लास में निहित हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.