बहुरूपता Java (स्थिर एवं गतिशील)
बहुरूपता क्या है? Java?
बहुरूपता in Java यह तब होता है जब एक या एक से अधिक क्लास या ऑब्जेक्ट एक दूसरे से विरासत के द्वारा संबंधित होते हैं। यह किसी ऑब्जेक्ट की कई रूप लेने की क्षमता है। विरासत उपयोगकर्ताओं को विशेषताओं और विधियों को विरासत में लेने देती है, और बहुरूपता इन विधियों का उपयोग विभिन्न कार्यों को करने के लिए करती है। तो, लक्ष्य संचार है, लेकिन दृष्टिकोण अलग है।
उदाहरण के लिए, आपके पास संचार के लिए एक स्मार्टफोन है। आप जो संचार माध्यम चुनते हैं, वह कुछ भी हो सकता है। यह कॉल, टेक्स्ट मैसेज, चित्र संदेश, मेल आदि हो सकता है। इसलिए, लक्ष्य समान है यानी संचार, लेकिन उनका तरीका अलग है। इसे संचार कहा जाता है बहुरूपता. अब हम बहुरूपता (Polymorphism) सीखेंगे। Java उदाहरण सहित.
क्लिक करें यहाँ उत्पन्न करें यदि वीडियो उपलब्ध न हो
Java उदाहरण के साथ OOPs में बहुरूपता
हमारे पास एक पैरेंट क्लास है, 'अकाउंट' जिसमें जमा और निकासी का कार्य है। अकाउंट में 2 चाइल्ड क्लास हैं। जमा और निकासी का संचालन बचत और चेकिंग खातों के लिए समान है। इसलिए अकाउंट क्लास से विरासत में मिली विधियाँ काम करेंगी।
सॉफ़्टवेयर आवश्यकता में परिवर्तन
आवश्यकता विनिर्देश में बदलाव हुआ है, जो सॉफ्टवेयर उद्योग में बहुत आम बात है। आपको ओवरड्राफ्ट सुविधा के साथ विशेषाधिकार प्राप्त बैंकिंग खाते की कार्यक्षमता जोड़नी चाहिए। पृष्ठभूमि के लिए, ओवरड्राफ्ट एक ऐसी सुविधा है जहाँ आप अपने खाते में उपलब्ध शेष राशि से अधिक राशि निकाल सकते हैं। इसलिए, विशेषाधिकार प्राप्त लोगों के लिए निकासी विधि को नए सिरे से लागू करने की आवश्यकता है। लेकिन आप बचत और चेकिंग खाते में कोड के परीक्षण किए गए हिस्से को नहीं बदलते हैं। यह इसका लाभ है ओह
चरण 1) इस प्रकार कि जब बचत खाते के लिए “वापस ली गई” विधि को बुलाया जाता है तो मूल खाता वर्ग से एक विधि निष्पादित की जाती है
चरण 2) लेकिन जब विशेषाधिकार प्राप्त खाते (ओवरड्राफ्ट सुविधा) के लिए “निकासी” विधि को बुलाया जाता है तो विशेषाधिकार प्राप्त वर्ग में परिभाषित निकासी विधि निष्पादित की जाती है। यह है ओ.ओ.पी. में बहुरूपता.
विधि ओवरराइडिंग Java
मेथड ओवरराइडिंग एक सुपर क्लास मेथड को सब क्लास में पुनः परिभाषित करना है।
विधि ओवरराइडिंग के नियम
- विधि हस्ताक्षर अर्थात विधि नाम, पैरामीटर सूची और रिटर्न प्रकार बिल्कुल मेल खाना चाहिए।
- ओवरराइड की गई विधि पहुंच को बढ़ा सकती है लेकिन इसे सीमित नहीं कर सकती, अर्थात यदि यह आधार वर्ग में निजी है, तो चाइल्ड क्लास इसे सार्वजनिक बना सकती है लेकिन इसके विपरीत नहीं।
उदाहरण
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } Class run{ public static void main (String args[]){ Doctor doctorObj = new Doctor() // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
ओवरलोडिंग और ओवरराइडिंग के बीच अंतर
विधि ओवरलोडिंग एक ही क्लास में होती है, जहां एक से अधिक विधियों का नाम समान होता है, लेकिन हस्ताक्षर भिन्न होते हैं। | मेथड ओवरराइडिंग तब होती है जब सुपर क्लास में से किसी एक मेथड को सब-क्लास में फिर से परिभाषित किया जाता है। इस मामले में, मेथड का सिग्नेचर वही रहता है। |
पूर्व:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
पूर्व:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
गतिशील बहुरूपता क्या है?
OOPs में डायनेमिक पॉलीमॉर्फिज्म वह तंत्र है जिसके द्वारा सुपरक्लास और सबक्लास में एक ही नाम और हस्ताक्षर के साथ कई विधियों को परिभाषित किया जा सकता है। ओवरराइड की गई विधि के लिए कॉल को रन टाइम पर हल किया जाता है।
गतिशील बहुरूपता उदाहरण:
सुपर क्लास का संदर्भ चर किसी सब क्लास ऑब्जेक्ट को संदर्भित कर सकता है
Doctor obj = new Surgeon();
इस कथन पर विचार करें
obj.treatPatient();
यहां संदर्भ चर "obj" पैरेंट क्लास का है, लेकिन जिस ऑब्जेक्ट की ओर यह इशारा कर रहा है वह चाइल्ड क्लास का है (जैसा कि पॉलीमॉर्फिज्म के नीचे दिए गए आरेख उदाहरण में दिखाया गया है)।
obj.treatPatient() उप-वर्ग – सर्जन की treatPatient() विधि को निष्पादित करेगा
यदि किसी विधि को कॉल करने के लिए आधार वर्ग संदर्भ का उपयोग किया जाता है, तो जिस विधि को बुलाया जाना है, उसका निर्णय JVM द्वारा किया जाता है, जो संदर्भ द्वारा इंगित की जा रही वस्तु पर निर्भर करता है।
उदाहरण के लिए, भले ही obj डॉक्टर का संदर्भ है, यह सर्जन की विधि को कॉल करता है, क्योंकि यह सर्जन ऑब्जेक्ट की ओर इशारा करता है
यह रन-टाइम के दौरान तय किया जाता है और इसलिए इसे कहा जाता है गतिशील or रन-टाइम बहुरूपता
स्थैतिक और गतिशील बहुरूपता के बीच अंतर
स्थैतिक बहुरूपता Java एक प्रकार का बहुरूपता है जो संकलन समय पर एक विधि को कॉल करने के लिए जानकारी एकत्र करता है, जबकि गतिशील बहुरूपता एक प्रकार का बहुरूपता है जो रनटाइम पर एक विधि को कॉल करने के लिए जानकारी एकत्र करता है।
यह विधि ओवरलोडिंग से संबंधित है। | यह विधि अधिरोहण से संबंधित है। |
यदि कोई त्रुटि हो तो उसे संकलन समय पर हल कर दिया जाता है। चूंकि संकलन के दौरान कोड निष्पादित नहीं होता है, इसलिए इसका नाम स्टैटिक है।
पूर्व: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
यदि कोई संदर्भ चर किसी ओवरराइड विधि को कॉल कर रहा है, तो जिस विधि को बुलाया जाना है, वह उस ऑब्जेक्ट द्वारा निर्धारित की जाती है, जिस पर आपका संदर्भ चर इंगित कर रहा है। यह केवल रनटाइम पर निर्धारित किया जा सकता है जब कोड निष्पादन के अंतर्गत हो, इसलिए इसका नाम डायनेमिक है।
पूर्व: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
सुपर कीवर्ड Java
क्या होगा यदि सर्जन क्लास में treatPatient विधि Doctor क्लास में परिभाषित कार्यक्षमता को निष्पादित करना चाहती है और फिर अपनी विशिष्ट कार्यक्षमता निष्पादित करना चाहती है? इस मामले में, कीवर्ड super
चाइल्ड क्लास से पैरेंट क्लास के तरीकों तक पहुँचने के लिए इस्तेमाल किया जा सकता है। सर्जन क्लास में ट्रीटपैटिएंट विधि को इस प्रकार लिखा जा सकता है:
treatPatient(){ super.treatPatient(); //add code specific to Surgeon }
सुपर कीवर्ड का उपयोग उपवर्ग में सुपर क्लास के किसी भी डेटा सदस्य या विधियों तक पहुंचने के लिए किया जा सकता है।
आगे हम सुपर कीवर्ड के बारे में जानेंगे, विरासत और बहुरूपता Java उदाहरण कार्यक्रमों के साथ.
उदाहरण:- वंशानुक्रम, बहुरूपता और सुपर कीवर्ड सीखने के लिए
चरण 1) निम्नलिखित कोड को संपादक में कॉपी करें
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overriden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
चरण 2) कोड को सेव करें, संकलित करें और चलाएँ। आउटपुट देखें।
चरण 3) पंक्ति # 6-9 को अनकमेंट करें। कोड को सेव करें, संकलित करें और चलाएँ। आउटपुट देखें।
चरण 4) पंक्ति # 10 की टिप्पणी हटाएं। कोड को सहेजें और संकलित करें।
चरण 5) त्रुटि = ? ऐसा इसलिए है क्योंकि उप-वर्ग सुपर क्लास के निजी सदस्यों तक नहीं पहुंच सकता है।
सारांश
- ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में पॉलीमॉर्फिज्म तब होता है जब एक या एक से अधिक क्लास या ऑब्जेक्ट एक दूसरे से वंशानुक्रम द्वारा संबंधित होते हैं। यह किसी ऑब्जेक्ट की कई रूप लेने की क्षमता है।
- मेथड ओवरराइडिंग एक सुपर क्लास मेथड को सब क्लास में पुनः परिभाषित करना है।
- गतिशील बहुरूपता Java वह तंत्र है जिसके द्वारा सुपरक्लास और सबक्लास में समान नाम और हस्ताक्षर के साथ कई विधियों को परिभाषित किया जा सकता है।
- स्थैतिक बहुरूपता Java एक प्रकार का बहुरूपता है जो संकलन समय पर एक विधि को कॉल करने के लिए जानकारी एकत्र करता है, जबकि गतिशील बहुरूपता एक प्रकार का बहुरूपता है जो रनटाइम पर एक विधि को कॉल करने के लिए जानकारी एकत्र करता है।
- सुपर कीवर्ड का उपयोग चाइल्ड क्लास से पैरेंट क्लास की विधियों तक पहुंचने के लिए किया जा सकता है।