java override method overriding
यह ट्यूटोरियल बताता है कि सिंपल ओवरराइडिंग और सिंपल एनोटेशन के साथ सरल तरीके से प्रयोग करके जावा में रनटाइम पॉलीमॉर्फिज्म कैसे हासिल किया जाए:
हमने पहले ही बहुरूपता अवधारणा और संकलन-समय बहुरूपता पर विस्तार से चर्चा की है। इस ट्यूटोरियल में, हम जावा में रनटाइम पॉलीमॉर्फिज्म के साथ आगे बढ़ेंगे।
संकलन-समय के बहुरूपता के विपरीत, जिसमें विधि-समय पर संकलन कॉल को हल किया जाता है, रनटाइम बहुरूपता में, विधि कॉल को रनटाइम पर हल किया जाता है।
=> यहाँ सभी जावा ट्यूटोरियल की जाँच करें।
आप क्या सीखेंगे:
जावा में रनटाइम पॉलिमोर्फिज्म
एक रनटाइम बहुरूपता जिसे के रूप में भी जाना जाता है गतिशील बहुरूपता या डायनेमिक विधि डिस्पैच एक है ऐसी तकनीक जिसमें एक ओवरराइड विधि कॉल को गतिशील रूप से रनटाइम पर हल किया जाता है।
जावा में रनटाइम पॉलीमॉर्फिज़्म का उपयोग करके प्राप्त किया जाता है ओवरराइड करने की विधि ”। मेथड ओवरराइडिंग एक ऐसी तकनीक है जिसके द्वारा पैरेंट क्लास में एक विधि को फिर से परिभाषित या चाइल्ड क्लास में ओवरराइड किया जाता है।
जब विधि को किसी कक्षा में ओवरराइड किया जाता है, तो गतिशील विधि प्रेषण तकनीक रनटाइम पर ओवरराइड विधि कॉल को हल करती है और संकलन समय पर नहीं।
जावा में रनटाइम पॉलीमोर्फिज्म प्राप्त करें - विधि ओवरराइडिंग
ओवरराइडिंग विधि वह दृष्टिकोण है जिसका उपयोग हम जावा में रनटाइम पॉलीमोर्फिज़्म को प्राप्त करने के लिए करते हैं। जैसा कि पहले ही उल्लेख किया गया है, विधि ओवरराइडिंग एक ऐसी तकनीक है जिसमें उपवर्ग एक ऐसी विधि जोड़ता है जो पहले से ही अपने मूल वर्ग में मौजूद है और इस पद्धति में नई कार्यक्षमता जोड़ता है। तब हम कहते हैं कि आधार वर्ग विधि अधिक है।
उपवर्ग में जिस नई पद्धति को हमने मूल कक्षा की पद्धति के समान प्रोटोटाइप के साथ परिभाषित किया है, लेकिन अलग-अलग कार्यान्वयन को 'कहा जाता है' ओवरराइडिंग विधि ” । मूल वर्ग में विधि को 'के रूप में जाना जाता है' ओवरराइड करने की विधि ”।
कैसे सरणी जावा की सामग्री मुद्रित करने के लिए
एक बार विधि के ओवरराइड हो जाने के बाद, यह सवाल बना रहता है कि इस ओवरराइड विधि का कॉल कैसे हल किया जाए?
हम आमतौर पर आधार वर्ग के संदर्भ के माध्यम से ओवरराइड विधि को कहते हैं। हम टाइप बेस का एक संदर्भ बनाएंगे और फिर नए कीवर्ड का उपयोग करके एक चाइल्ड क्लास ऑब्जेक्ट असाइन करेंगे।
इस प्रकार यह संदर्भ चर की सामग्री पर निर्भर करता है या कौन सी वस्तु को आधार वर्ग संदर्भ द्वारा संदर्भित किया जाता है जो निर्धारित करता है कि किस विधि को बुलाया जाना है। इसलिए यदि संदर्भ ऑब्जेक्ट बाल वर्ग के ऑब्जेक्ट को इंगित करता है, तो ओवरराइडिंग विधि कहा जाता है।
अन्यथा, यदि संदर्भ ऑब्जेक्ट में बेस क्लास ऑब्जेक्ट होता है तो ओवरराइड विधि कहा जाता है। एक विषय जो हमें विशेष रूप से गतिशील विधि प्रेषण के लिए रनटाइम बहुरूपता में स्पष्ट होने की आवश्यकता है, जो कि 'अपकास्टिंग' है जिसे नीचे समझाया गया है।
ऊपर की ओर बढ़ना
जब अभिभावक वर्ग की एक संदर्भ वस्तु हमने उपर्युक्त बिंदुओं पर चर्चा की या संदर्भित की है, तो हम इसे उपकास्टिंग कहते हैं।
एक सरल उदाहरण का उपयोग करते हुए इसे समझने दें।
इस बात पर विचार करें कि हमारे पास एक वर्ग है 'बेसक्लास' और हम इस बेसक्लास का विस्तार एक नया वर्ग डेरीवेडक्लास बनाने के लिए करते हैं। यह ढांचा नीचे दिखाया गया है।
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
अब अपकास्टिंग को लागू करने के लिए हम बेसक्लास प्रकार का एक संदर्भ चर घोषित करेंगे। इसके बाद, हम नीचे दिए गए कोड स्टेटमेंट में किए गए क्लास बेसक्लास के संदर्भ में DerivedClass की एक वस्तु प्रदान करते हैं।
BaseClass base = new DerivedClass (); //Upcasting
तो यहाँ हम कह सकते हैं कि हमने बेसक्लास को डेरेवल्डक्लास ऑब्जेक्ट को बना दिया है। जहां तक रनटाइम पॉलीमॉर्फिज्म का सवाल है तो अपकमिंग की अवधारणा बहुत महत्वपूर्ण है।
इस प्रकार, सामान्य रूप से, माता-पिता या सुपरक्लास के संदर्भ में, बच्चे या उपवर्ग वस्तुओं को सौंपने की प्रक्रिया है।
SuperClass reference = new Subclass Object;
नीचे जावा प्रोग्राम ओवरराइडिंग विधि को प्रदर्शित करता है और यह भी दर्शाता है कि रनटाइम के दौरान ओवरराइड विधि कॉल को हल करने के लिए कैसे अपचिंग की जाती है।
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String[] args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
आउटपुट:
उपरोक्त कार्यक्रम में, हमारे पास दो कक्षाएँ हैं जैसे कि चाइल्ड 1 और चाइल्ड 2 जो दोनों एक 'पैरेंट' क्लास से ली गई हैं। पैरेंट क्लास में एक विधि 'प्रिंट' होती है, जिसे चाइल्ड 1 और चाइल्ड 2 दोनों वर्गों में ओवरराइड किया जाता है। फिर मुख्य विधि में, हम 'पैरेंट' नामक पेरेंट क्लास की एक रेफरेंस ऑब्जेक्ट बनाते हैं।
सबसे पहले, हम इसे मूल वर्ग की एक वस्तु प्रदान करते हैं और फिर 'प्रिंट ()' विधि कहते हैं। फिर हम पहले चाइल्ड 1 ऑब्जेक्ट और फिर चाइल्ड 2 ऑब्जेक्ट को पेरेंट रेफरेंस में असाइन करके इसे दोहराते हैं।
कैसे जावा में arrays जोड़ने के लिए - -
आउटपुट दिखाता है, मूल संदर्भ की सामग्री पर निर्भर करता है, और उपयुक्त प्रिंट विधि कहा जाता है।
डायनेमिक / रनटाइम पॉलीमॉर्फिज्म के लाभ
- गतिशील बहुरूपता के साथ, प्रोग्रामर को विधियों को ओवरराइड करने की अनुमति है।
- यह कक्षाओं को सामान्य कार्यान्वयन के साथ एक विधि को परिभाषित करने की अनुमति देता है जो इसके व्युत्पन्न तब ओवरराइड कर सकता है और विशिष्ट कार्यान्वयन प्रदान कर सकता है।
- डायनेमिक विधि प्रेषण के साथ, विधि कॉल को ओवरलोडिंग के विपरीत, रनटाइम पर हल किया जाता है, जो संकलन समय पर तय किया जाता है। यह प्रोग्रामर्स के लिए अधिक लचीलापन देता है।
जैसा कि रनटाइम पॉलीमॉर्फिज्म रन टाइम पर कॉल करने के लिए उपयुक्त विधि को बांधता है और हम इसे कॉल भी करते हैं गतिशील बंधन या देर से बाध्यकारी । दूसरी ओर संकलन-समय का बहुरूपता समर्थन करता है स्थैतिक बंधन या प्रारंभिक बंधन ।
स्टेटिक बनाम डायनामिक बाइंडिंग
स्थैतिक बंधन | गतिशील बंधन |
---|---|
संकलन समय पर हल की गई विधि कॉल स्थिर बंधन है। | रनटाइम पर हल की गई विधि कॉल डायनेमिक बाइंडिंग है। |
विधि अतिभार स्थैतिक बंधन का एक उदाहरण है। | मेथड ओवरराइडिंग डायनेमिक बाइंडिंग का एक उदाहरण है। |
स्थिर बंधन के लिए वर्ग और फ़ील्ड प्रकार का उपयोग किया जाता है। | वस्तुओं का उपयोग गतिशील बंधन के लिए किया जाता है। |
निजी, अंतिम और स्थिर निकाय स्थैतिक बंधन का उपयोग करते हैं। | वर्चुअल विधियां गतिशील बंधन का उपयोग करती हैं। |
जावा में वर्चुअल फंक्शन / मेथड
Java में वर्चुअल फंक्शन या मेथड एक ऐसी सुविधा है जिसका उपयोग Runtime polymorphism के साथ किया जाता है। C ++ के विपरीत, जावा में विशेष 'वर्चुअल' कीवर्ड नहीं है निरूपित करने के लिए कि एक विधि आभासी है। एक विधि जिसे आधार वर्ग में परिभाषित किया गया है और व्युत्पन्न वर्ग में अधिलेखित आभासी है।
जावा में, डिफ़ॉल्ट रूप से, निजी और अंतिम को छोड़कर हर गैर-स्थिर विधि एक आभासी फ़ंक्शन है। तो ध्यान दें कि रनटाइम पोलिमोर्फ़िज्म को लागू करने के लिए हमने जिन तरीकों पर चर्चा की, वे भी आभासी तरीके हैं।
चूंकि स्टैटिक विधि क्लास के लिए बाध्य है और इसे ऑब्जेक्ट का उपयोग करके कॉल नहीं किया जा सकता है, इसलिए इसे रनटाइम पॉलीमॉर्फिज़्म के साथ उपयोग नहीं किया जा सकता है और यह वर्चुअल फ़ंक्शन भी नहीं है।
जावा में इंटरफेस डिफॉल्ट वर्चुअल हैं। इंटरफेस को लागू करने वाली कक्षाएं इंटरफ़ेस विधियों के लिए कार्यान्वयन प्रदान करती हैं। रनटाइम बहुरूपता के रूप में, इंटरफ़ेस विधियों के लिए कॉल रनटाइम पर भी हल किया जाता है।
याद रखें कि चूंकि किसी इंटरफ़ेस में विधियों को ओवरराइड करने के लिए डिज़ाइन किया गया है, सभी इंटरफ़ेस विधियाँ वर्चुअल फ़ंक्शंस हैं।
उदाहरण के लिए निम्नलिखित कोड पर विचार करें:
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
उपरोक्त कोड में, विधि त्वरण () एक आभासी फ़ंक्शन है क्योंकि यह इंटरफ़ेस कार का एक हिस्सा है और इसे ओवरराइड करने के लिए डिज़ाइन किया गया है।
जावा में @override एनोटेशन
Java में @override एनोटेशन डिफ़ॉल्ट एनोटेशन है। यह एनोटेशन जावा 1.5 में पेश किया गया था। @क्वराइड एनोटेशन का उपयोग तब किया जाता है जब उप-वर्ग विधि अपनी सुपरक्लास विधि से आगे निकल जाती है।
जावा @override एनोटेशन का उपयोग करके यह इंगित करने के लिए कि विधि अपने मूल वर्ग विधि को ओवरराइड कर रही है, एक संकलक चेतावनी जारी करता है यदि एनोटेट विधि को ओवरराइड नहीं किया जाता है। तो जब @override एनोटेशन का उपयोग किया जाता है तो यह विधि को ओवरराइड करने के लिए अनिवार्य बनाता है।
दूसरी बात, @override एनोटेशन का उपयोग करके हम कोड को अधिक पठनीय बनाते हैं। हम एक बार महसूस कर सकते हैं कि घोषित की जा रही विधि को ओवरराइड किया जाना है।
Java @override एनोटेशन का सामान्य सिंटैक्स है
public @interface override
नीचे दिए गए जावा प्रोग्राम @override एनोटेशन के उपयोग को दर्शाता है।
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args[]) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
आउटपुट:
उपरोक्त कार्यक्रम में, हमारे पास एक बेसक्लास है जो एक प्रदर्शन विधि को परिभाषित करता है। फिर हम इस बेसक्लास से एक क्लास DerivedClass प्राप्त करते हैं और @override एनोटेशन के साथ प्रदर्शन विधि को चिह्नित करते हैं। यह विधि DerivedClass में ओवरराइड की गई है।
मुख्य विधि में, हम बेसक्लास ऑब्जेक्ट संदर्भ बनाते हैं और इसे डेरिव्डक्लास ऑब्जेक्ट पर इंगित करते हैं जो कि डेरिवेडक्लास डिस्प्ले विधि को कॉल करने के लिए संदर्भ का कारण बनता है।
यदि हमने व्युत्पन्न वर्ग में डिस्प्ले () विधि को लागू नहीं किया है, तो कंपाइलर ने कंपाइलर चेतावनी दी होगी क्योंकि यह @override एनोटेशन के साथ चिह्नित है।
ओवरलोडिंग और जावा में ओवरराइडिंग
अब जब हमने जावा में ओवरलोडिंग और ओवरराइडिंग दोनों पर चर्चा की है, तो आइए इन दोनों अवधारणाओं को संक्षेप में प्रस्तुत करें।
ओवरलोडिंग संकलन-समय के बहुरूपता से संबंधित है यानी हम ओवरलोडिंग का उपयोग करके संकलन-समय के बहुरूपता को लागू करते हैं। ओवरलोडिंग दो तरीकों से की जाती है यानी मेथड ओवरलोडिंग और ऑपरेटर ओवरलोडिंग।
मेथड ओवरलोडिंग वह तकनीक है, जिसमें हमारे पास एक ही नाम के साथ एक से अधिक तरीके होते हैं, लेकिन अलग-अलग पैरामीटर लिस्ट होती है। मापदंडों की संख्या, मापदंडों के प्रकार या मापदंडों के अनुक्रम के आधार पर पैरामीटर सूची को विभेदित किया जाता है।
जावा में ऑपरेटर ओवरलोडिंग सीमित है और यह हमें केवल ’+ 'ऑपरेटर को ओवरलोड करने की अनुमति देता है जिसका उपयोग दो संख्याओं को जोड़ने और दो स्ट्रिंग वस्तुओं को जोड़ने के लिए किया जाता है।
ओवरलोडिंग को संकलन समय पर हल किया जाता है और स्थिर होता है। इसे भी कहा जाता है ‘अर्ली बाइंडिंग’ ।
मेथड ओवरराइडिंग एक ऐसी सुविधा है जिसके उपयोग से हम रनटाइम पॉलिमोर्फिज्म को लागू करते हैं। ओवरराइडिंग में, चाइल्ड क्लास में पैरेंट क्लास की एक विधि ओवरराइड की जाती है। इसका मतलब यह है, कि सुपर और सबक्लास दोनों में विधि प्रोटोटाइप एक ही रहता है, लेकिन कार्यान्वयन अलग-अलग होते हैं।
ओवरराइडिंग विधि कॉल को हल करने के लिए डायनेमिक विधि प्रेषण तकनीक का उपयोग करती है और यह तय करती है कि सुपरक्लास या उपवर्ग विधि को कॉल किया जाए या नहीं।
इसलिए रनटाइम पॉलीमॉर्फिज्म को डायनेमिक पॉलीमोर्फिज्म या लेट बाइंडिंग भी कहा जाता है।
अगला, जावा में ओवरलोडिंग और ओवरराइडिंग के बीच अंतर को सारणीबद्ध करें।
ओवरलोडिंग बनाम जावा में ओवरराइडिंग
अधिक भार | अधिभावी |
---|---|
ओवरलोडिंग का उपयोग संकलन-समय के बहुरूपता में किया जाता है। | ओवरराइडिंग को रनटाइम पॉलीमॉर्फिज्म में लागू किया जाता है। |
एक ही कक्षा में किया जा सकता है। मई या विरासत की आवश्यकता नहीं हो सकती है। | ओवरराइडिंग को हमेशा विरासत की आवश्यकता होती है। |
विधियों को एक ही विधि के नाम और विभिन्न पैरामीटर सूची के साथ अतिभारित किया जाता है। | ओवरराइड किए गए तरीकों में एक ही प्रोटोटाइप है। |
ओवरलोडिंग में रिटर्न टाइप को विधि नहीं माना जाता है। | ओवरराइड और ओवरराइडिंग तरीकों में रिटर्न टाइप समान होना चाहिए। |
कार्यक्रम की पठनीयता में सुधार करता है। | ओवरराइडिंग विशिष्ट कार्यान्वयन वर्ग वार होने की अनुमति देता है। |
बार बार पूछे जाने वाले प्रश्न
Q # 1) क्या हम स्टेटिक मेथड को ओवरराइड कर सकते हैं?
उत्तर: नहीं। जावा में स्थिर तरीकों को ओवरराइड नहीं किया जा सकता है। इसका कारण यह है कि स्थैतिक विधियाँ वर्ग-आधारित होती हैं और उन्हें कक्षा द्वारा सीधे बुलाया जाता है। उन्हें रनटाइम पर आह्वान करने के लिए वस्तुओं की आवश्यकता नहीं है। इसलिए स्थिर विधि प्रेषण संकलक द्वारा निर्धारित किया जाता है।
Q # 2) क्या हम कंस्ट्रक्टर को ओवरराइड कर सकते हैं?
उत्तर: नहीं, हम एक निर्माणकर्ता को ओवरराइड नहीं कर सकते। जब ऑब्जेक्ट बनाया जाता है तो एक कंस्ट्रक्टर को कहा जाता है। इसे ऑब्जेक्ट नहीं कहा जाता है। इसके अलावा, ओवरराइडिंग की आवश्यकताओं में से एक ओवरराइड विधि है और ओवरराइडिंग विधि में एक ही विधि हस्ताक्षर होना चाहिए जो निर्माणकर्ताओं के मामले में संभव नहीं है।
Q # 3) पद्धति को ओवरराइडिंग को डायनेमिक पॉलीमोर्फिज़्म क्यों कहा जाता है?
उत्तर: ओवरराइडिंग विधि के मामले में, रनटाइम के दौरान विधि कॉल को गतिशील रूप से हल किया जाता है। इसलिए इसे गतिशील बहुरूपता कहा जाता है।
Q # 4) जावा में डायनामिक पॉलिमॉर्फिज्म का उपयोग क्या है?
उत्तर: गतिशील बहुरूपता एक गतिशील विधि प्रेषण तकनीक का उपयोग करता है जो विधि को ओवरराइड करने का समर्थन करता है ताकि उपवर्ग ओवरराइड पद्धति को विशिष्ट कार्यान्वयन प्रदान कर सके। इस तरह हम उन विशिष्ट विशेषताओं को लागू कर सकते हैं जो हमें कुशल कार्यक्रम लिखने की अनुमति देती हैं।
दूसरे, हमें विधि कॉल को हल करने के बारे में भी चिंता करने की आवश्यकता नहीं है क्योंकि डायनेमिक विधि प्रेषण यह तय करता है कि किस विधि को कॉल करना है।
Q # 5) स्टेटिक और डायनामिक बाइंडिंग में क्या अंतर है?
उत्तर: एक विधि कॉल और इसके कार्यान्वयन के बीच लिंकिंग को बंधन कहा जाता है। जब यह लिंकिंग संकलन-समय पर हल हो जाती है, तो हम इसे स्टेटिक बाइंडिंग कहते हैं। जब बाइंडिंग को रन टाइम पर गतिशील रूप से किया जाता है, तो हम इसे डायनामिक बाइंडिंग कहते हैं।
स्टैटिक बाइंडिंग मेथड कॉल को हल करने के लिए क्लास और फ़ील्ड्स के डेटा प्रकार का उपयोग करता है। डायनामिक बाइंडिंग ऑब्जेक्ट को कॉल विधि को हल करने के लिए उपयोग करता है। स्टैटिक बाइंडिंग को कंपाइल-टाइम पॉलिमोर्फिज्म भी कहा जाता है और डायनेमिक बाइंडिंग को रनटाइम पॉलिमॉर्फिज्म भी कहा जाता है।
निष्कर्ष
इस ट्यूटोरियल में, हमने जावा में रनटाइम पॉलिमॉर्फिज्म पर विस्तार से चर्चा की है।
ओवरटाइमिंग विधि का उपयोग करके रनटाइम पॉलीमॉर्फिज़्म लागू किया जाता है। ओवरक्लाइडिंग का तरीका सबक्लास में किया जाता है, जिसमें सुपरक्लास में परिभाषित एक विधि को उसके उप-वर्ग में पुनर्परिभाषित या ओवरराइड किया जाता है। सुपर और उपवर्ग में विधि हस्ताक्षर समान रहता है।
ओवरराइडिंग पद्धति का उपयोग करके हम उपवर्ग में उसी विधि को विशिष्ट कार्यान्वयन प्रदान कर सकते हैं। इस तरह, हम अधिक कुशल कार्यक्रम लिख सकते हैं जिसमें विरासत शामिल है। जावा यह इंगित करने के लिए @override एनोटेशन प्रदान करता है कि विधि को ओवरराइड किया जाना है।
परीक्षण की रणनीति और परीक्षण योजना के बीच अंतर
डिफ़ॉल्ट रूप से, सभी गैर-स्थिर तरीके जो अंतिम नहीं हैं जावा में आभासी हैं। सभी आभासी तरीकों को ओवरराइड किया जा सकता है।
=> यहाँ सरल जावा प्रशिक्षण श्रृंखला देखें।
अनुशंसित पाठ
- ओवरराइडिंग पूर्वनिर्धारित तरीके जावा में
- जावा स्ट्रिंग लंबाई () उदाहरणों के साथ विधि
- जावा में बहुरूपता क्या है - उदाहरणों के साथ ट्यूटोरियल
- जावा को कैसे उपयोग करें स्ट्रींग विधि?
- जावा स्ट्रिंग इंडेक्सऑफ विधि कोड उदाहरणों के साथ
- जावा स्ट्रिंग में () विधि ट्यूटोरियल विथ उदाहरण हैं
- जावा स्ट्रिंग स्प्लिट () विधि - जावा में स्ट्रिंग को कैसे विभाजित करें
- जावा स्ट्रिंग तुलनात्मक उदाहरण प्रोग्रामिंग के साथ विधि