जावा विधि ओवरराइडिंग

इस ट्यूटोरियल में, हम उदाहरणों की मदद से जावा में ओवरराइड करने की विधि के बारे में जानेंगे।

पिछले ट्यूटोरियल में, हमने विरासत के बारे में सीखा। वंशानुक्रम एक ओओपी संपत्ति है जो हमें एक मौजूदा वर्ग (सुपरक्लास) से एक नया वर्ग (उपवर्ग) प्राप्त करने की अनुमति देता है। उपवर्ग सुपरक्लास की विशेषताओं और विधियों को विरासत में मिला है।

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

उदाहरण 1: विधि अधिभावी

 class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) ) 

आउटपुट :

 मैं कुत्ता हूं। 

उपरोक्त कार्यक्रम में, displayInfo()विधि पशु सुपरक्लास और डॉग उपवर्ग दोनों में मौजूद है।

जब हम displayInfo()d1 ऑब्जेक्ट (उपवर्ग की वस्तु) का उपयोग करके कॉल करते हैं, तो उपवर्ग डॉग के अंदर की विधि को कहा जाता है। displayInfo()उपवर्ग की विधि सुपरक्लास की उसी विधि को ओवरराइड करती है।

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

इसका उपयोग करना अनिवार्य नहीं है @Override। हालांकि, जब हम इसका उपयोग करते हैं, तो विधि को ओवरराइडिंग के सभी नियमों का पालन करना चाहिए। अन्यथा, संकलक एक त्रुटि उत्पन्न करेगा।

जावा ओवरराइडिंग नियम

  • सुपरक्लास और उपवर्ग दोनों में समान विधि नाम, समान वापसी प्रकार और समान पैरामीटर सूची होनी चाहिए।
  • हम finalऔर के रूप में घोषित विधि को ओवरराइड नहीं कर सकते static
  • हमें हमेशा सुपरक्लास के सार तरीकों को ओवरराइड करना चाहिए (बाद के ट्यूटोरियल में चर्चा की जाएगी)।

जावा ओवरराइडिंग में सुपर कीवर्ड

एक सामान्य प्रश्न जो जावा में ओवरराइडिंग करते समय उठता है, वह है:

ओवरराइड करने के बाद क्या हम सुपरक्लास की विधि तक पहुँच सकते हैं?

खैर, इसका जवाब हां है । सुपरक्लास की विधि को उपवर्ग से एक्सेस करने के लिए, हम superकीवर्ड का उपयोग करते हैं ।

उदाहरण 2: सुपर कीवर्ड का उपयोग

 class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) ) 

आउटपुट :

मैं एक जानवर हूं। मैं कुत्ता हूं।

उपर्युक्त उदाहरण में, उपवर्ग डॉग displayInfo()सुपरक्लास एनिमल की विधि को ओवरराइड करता है ।

जब हम displayInfo()डॉग सबक्लास की d1 ऑब्जेक्ट का उपयोग करके विधि कहते हैं, तो डॉग उपवर्ग के अंदर की विधि को कहा जाता है; सुपरक्लास के अंदर की विधि को नहीं कहा जाता है।

displayInfo()डॉग उपवर्ग के अंदर , हमने सुपरक्लास के super.displayInfo()कॉल displayInfo()का उपयोग किया है ।

यह ध्यान रखना महत्वपूर्ण है कि जावा में कंस्ट्रक्टरों को विरासत में नहीं मिला है। इसलिए, जावा में कंस्ट्रक्टर ओवरराइडिंग जैसी कोई चीज नहीं है।

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

ऐक्सेस स्पेशिफायर इन मेथड ओवरराइडिंग

सुपरक्लास और उसके उपवर्गों में घोषित एक ही विधि में अलग-अलग पहुंच विनिर्देशक हो सकते हैं। हालांकि, एक प्रतिबंध है।

हम केवल उपवर्गों में उन एक्सेस स्पेसियर का उपयोग कर सकते हैं जो सुपरक्लास के एक्सेस स्पेसियर की तुलना में बड़ा एक्सेस प्रदान करते हैं। उदाहरण के लिए,

मान लीजिए, myClass()सुपरक्लास में एक विधि घोषित की जाती है protected। फिर, myClass()उपवर्ग में एक ही विधि publicया तो हो सकती है protected, लेकिन नहीं private

उदाहरण 3: ओवरराइडिंग में एक्सेस स्पेसिफायर

 class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) ) 

आउटपुट :

 मैं कुत्ता हूं। 

उपर्युक्त उदाहरण में, उपवर्ग डॉग displayInfo()सुपरक्लास एनिमल की विधि को ओवरराइड करता है ।

जब भी हम displayInfo()d1 (उपवर्ग की वस्तु) का उपयोग करके कॉल करते हैं, तो उपवर्ग के अंदर की विधि को कहा जाता है।

ध्यान दें कि, एनिमल सुपरक्लास में displayInfo()घोषित protectedकिया जाता है। publicडॉग उपवर्ग में एक ही विधि की पहुंच निर्दिष्ट है। यह संभव है क्योंकि publicप्रदान की तुलना में बड़ा उपयोग प्रदान करता है protected

ओवरराइडिंग एब्सट्रैक्ट मेथड्स

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

हम बाद के ट्यूटोरियल में अमूर्त कक्षाओं और अमूर्त विधियों के ओवरराइडिंग के बारे में अधिक जानेंगे।

दिलचस्प लेख...