जावा में बहुरूपता क्या है?
जावा में बहुरूपता तब होती है जब वंशानुक्रम द्वारा एक या एक से अधिक कक्षाएं या एक दूसरे से संबंधित वस्तुएं होती हैं। दूसरे शब्दों में, यह एक वस्तु की कई रूपों को लेने की क्षमता है। वंशानुक्रम उपयोगकर्ताओं को विशेषताओं और विधियों को विरासत में देता है, और बहुरूपता विभिन्न कार्यों को करने के लिए इन विधियों का उपयोग करता है। तो, लक्ष्य संचार है लेकिन दृष्टिकोण अलग है।
उदाहरण के लिए, आपके पास संचार के लिए एक स्मार्टफोन है। आपके द्वारा चुना गया संचार मोड कुछ भी हो सकता है। यह एक कॉल, एक पाठ संदेश, एक तस्वीर संदेश, मेल आदि हो सकता है। इसलिए, लक्ष्य आम है जो संचार है, लेकिन उनका दृष्टिकोण अलग है। इसे बहुरूपता कहा जाता है ।
इस ट्यूटोरियल में, आप सीखेंगे-
- बहुरूपता क्या है?
- OOP के उदाहरण में जावा पॉलिमॉर्फिज्म
- विधि ओवरराइडिंग
- ओवरलोडिंग और ओवरराइडिंग के बीच अंतर
- गतिशील बहुरूपता क्या है?
- सुपर कीवर्ड
- स्थैतिक और गतिशील बहुरूपता के बीच अंतर
यदि वीडियो उपलब्ध नहीं है तो यहां क्लिक करें
OOP के उदाहरण में जावा पॉलिमॉर्फिज्म
हमारे पास एक अभिभावक वर्ग है, जो जमा और निकासी के कार्य के साथ 'खाता' है। खाते में 2 बाल वर्ग हैं बचत और चेकिंग खातों के लिए जमा और निकासी का संचालन समान है। इसलिए खाता वर्ग से विरासत में मिली विधियां काम करेंगी।सॉफ्टवेयर की आवश्यकता में परिवर्तन
आवश्यकता विनिर्देश में कुछ परिवर्तन होता है, ऐसा कुछ जो सॉफ्टवेयर उद्योग में आम है। आपको ओवरड्राफ्ट सुविधा के साथ कार्यक्षमता विशेषाधिकार प्राप्त बैंकिंग खाता जोड़ना है।
एक पृष्ठभूमि के लिए, ओवरड्राफ्ट एक सुविधा है जहां आप अपने खाते में उपलब्ध शेष राशि से अधिक राशि निकाल सकते हैं।
इसलिए, विशेषाधिकार के लिए आहरण की विधि को नए सिरे से लागू किया जाना चाहिए। लेकिन आप बचत और चेकिंग खाते में कोड के परीक्षण किए गए टुकड़े को नहीं बदलते हैं। यह OOPS का लाभ है
चरण 1) ऐसा है कि जब खाते को बचाने के लिए "वापस ले लिया" विधि को पैरेंट अकाउंट क्लास से एक विधि कहा जाता है।
चरण 2) लेकिन जब विशेषाधिकार खाते (ओवरड्राफ्ट सुविधा) के लिए "विथड्रॉ" विधि को विशेषाधिकार प्राप्त वर्ग में परिभाषित आहरण विधि कहा जाता है, निष्पादित किया जाता है। यह बहुरूपता है।
विधि ओवरराइडिंग
मेथड ओवरराइडिंग एक सुपर क्लास विधि को सब क्लास में पुनर्परिभाषित कर रहा है।
विधि अधिभाव के लिए नियम
- विधि हस्ताक्षर अर्थात विधि का नाम, पैरामीटर सूची और रिटर्न प्रकार को बिल्कुल मेल खाना है।
- ओवरराइड विधि सुलभता को चौड़ा कर सकती है, लेकिन इसे संकीर्ण नहीं कर सकती है, अर्थात यदि यह आधार वर्ग में निजी है, तो बाल वर्ग इसे सार्वजनिक कर सकता है, लेकिन इसके विपरीत नहीं।
उदाहरण
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 executeddoctorObj.treatPatient();Surgeon surgeonObj = new Surgeon();// treatPatient method in class Surgeon will be executedsurgeonObj.treatPatient();}}
ओवरलोडिंग और ओवरराइडिंग के बीच अंतर
विधि अधिभार | विधि ओवरराइडिंग |
---|---|
मेथड ओवरलोडिंग उसी वर्ग में होती है, जहाँ एक से अधिक विधियों में एक ही नाम होता है, लेकिन अलग-अलग हस्ताक्षर होते हैं। |
ओवरराइडिंग का तरीका तब होता है जब सुपर क्लास में से किसी एक तरीके को सब-क्लास में फिर से परिभाषित किया जाता है। इस स्थिति में, विधि का हस्ताक्षर समान रहता है। |
Ex: void sum (int a , int b);void sum (int a , int b, int c);void sum (float a, double b); |
Ex: class X{public int sum(){// some code}}class Y extends X{public int sum(){//overridden method//signature is same}} |
गतिशील बहुरूपता क्या है?
डायनामिक पॉलीमॉर्फिज्म वह तंत्र है जिसके द्वारा सुपरक्लास और सबक्लास में एक ही नाम और हस्ताक्षर के साथ कई तरीकों को परिभाषित किया जा सकता है। एक ओवरराइड विधि के लिए कॉल को रन टाइम पर हल किया जाता है।
गतिशील बहुरूपता उदाहरण:
सुपर क्लास का एक संदर्भ चर उप क्लास ऑब्जेक्ट को संदर्भित कर सकता है
Doctor obj = new Surgeon();
कथन पर विचार करें
obj.treatPatient();
यहाँ संदर्भ चर "obj" मूल वर्ग का है, लेकिन यह जिस वस्तु की ओर इशारा कर रहा है वह बाल वर्ग का है (जैसा कि आरेख में दिखाया गया है)।
obj.treatPatient () उप-वर्ग - सर्जन के treatPatient () पद्धति को निष्पादित करेगा
यदि किसी विधि को कॉल करने के लिए बेस क्लास संदर्भ का उपयोग किया जाता है, तो जिस विधि को संदर्भित किया जा रहा है, उसके आधार पर जेवीएम द्वारा तय किया जाने वाला तरीका तय किया जाता है।
उदाहरण के लिए, भले ही obj डॉक्टर का संदर्भ है, यह सर्जन की विधि को कहता है, क्योंकि यह एक सर्जन ऑब्जेक्ट को इंगित करता है
यह रन-टाइम के दौरान तय किया जाता है और इसलिए इसे गतिशील या रन-टाइम बहुरूपता कहा जाता है
सुपर कीवर्ड
क्या होगा अगर सर्जन वर्ग में उपचार पद्धति, डॉक्टर वर्ग में परिभाषित कार्यक्षमता को निष्पादित करना चाहती है और फिर अपनी विशिष्ट कार्यक्षमता का प्रदर्शन करती है?
इस स्थिति में, कीवर्ड
super
चाइल्ड क्लास से पैरेंट क्लास के तरीकों तक पहुंचने के लिए इस्तेमाल किया जा सकता है।सर्जन वर्ग में treatPatient विधि के रूप में लिखा जा सकता है:
treatPatient(){super.treatPatient();//add code specific to Surgeon}
सुपर क्लास में किसी भी डेटा सदस्य या सुपर क्लास के तरीकों तक पहुँचने के लिए कीवर्ड सुपर का उपयोग किया जा सकता है।उदाहरण: -शिक्षा, बहुरूपता और सुपर कीवर्ड सीखें
चरण 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 Ypublic void m1(){// overriden methodSystem.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) Uncomments लाइनों # 6-9। कोड सहेजें, संकलित करें और चलाएँ। आउटपुट का निरीक्षण करें।
चरण 4) Uncomment लाइन # 10। कोड सहेजें और संकलित करें।
चरण 5) त्रुटि = ऐसा इसलिए है क्योंकि उप-वर्ग सुपर क्लास के निजी सदस्यों तक नहीं पहुंच सकता है।
स्थैतिक और गतिशील बहुरूपता के बीच अंतर
स्थैतिक बहुरूपता | गतिशील बहुरूपता |
---|---|
यह ओवरलोडिंग की विधि से संबंधित है। | यह ओवरराइड करने की विधि से संबंधित है। |
संकलित समय में त्रुटियों, यदि कोई हो, का समाधान किया जाता है। चूंकि संकलन के दौरान कोड निष्पादित नहीं होता है, इसलिए नाम स्थिर है। Ex: void sum (int a , int b);void sum (float a, double b);int sum (int a, int b); //compiler gives error. |
यदि कोई संदर्भ चर एक ओवरराइड विधि कह रहा है, तो जिस विधि को लागू किया जाना है वह ऑब्जेक्ट द्वारा निर्धारित किया जाता है, आपका संदर्भ चर इंगित कर रहा है। यह केवल रनटाइम पर निर्धारित किया जा सकता है जब निष्पादन के तहत कोड, इसलिए नाम गतिशील। Ex: //reference of parent pointing to child objectDoctor obj = new Surgeon();// method of child calledobj.treatPatient(); |