types inheritance java single vs multiple inheritance
सरल उदाहरणों की मदद से जावा में विभिन्न प्रकार के वंशानुक्रम के बारे में जानें। पता लगाएँ कि क्या जावा कई विरासत का समर्थन करता है:
हमने अपने अंतिम ट्यूटोरियल में पाठकों से विरासत से संबंधित विभिन्न बुनियादी अवधारणाओं के साथ-साथ जावा में वंशानुक्रम की शुरुआत की।
इस ट्यूटोरियल में, हम आगे चलकर इनहेरिटेंस विषय के बारे में जानेंगे और इनहेरिटेंस के प्रकारों के बारे में अधिक जानेंगे।
=> यहाँ सभी जावा ट्यूटोरियल की जाँच करें।
दो फ़ाइलों की तुलना करने के लिए अलग-अलग कमांड का उपयोग कैसे करें
आप क्या सीखेंगे:
जावा में इनहेरिटेंस के प्रकार
जिस तरह से कक्षाएं विरासत में मिली हैं और कितनी कक्षाएं विरासत में मिली हैं, इसके आधार पर, हमारे पास निम्न प्रकार की विरासत हैं जैसा कि नीचे दिए गए आंकड़े में दिखाया गया है।
जैसा कि ऊपर दिए गए चित्र में दिखाया गया है, ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में पाँच प्रकार की विरासत हैं जैसा कि नीचे वर्णित है:
# 1) एकल वंशानुक्रम: जब एक व्युत्पन्न वर्ग या उपवर्ग केवल एक आधार या सुपरक्लास से विरासत में मिलता है तो यह एकल वंशानुक्रम होता है।
# 2) बहुस्तरीय विरासत: मल्टीलेवल इनहेरिटेंस में, हमारे पास एक से अधिक स्तर होते हैं, जिसमें एक वर्ग आधार वर्ग से विरासत में मिलता है और बदले में व्युत्पन्न वर्ग दूसरे वर्ग से विरासत में मिलता है।
# 3) पदानुक्रमित वंशानुक्रम: एक वंशानुक्रम पदानुक्रम इस प्रकार की विरासत में बनता है जब एक सुपरक्लास एक से अधिक वर्गों द्वारा विरासत में मिला है।
# 4) एकाधिक वंशानुक्रम: मल्टीपल इनहेरिटेंस वह है जिसमें एक वर्ग एक से अधिक अभिभावकों से गुण और व्यवहार विरासत में ले सकता है।
# 5) हाइब्रिड वंशानुक्रम: जब एक या अधिक प्रकार के वंशानुक्रम संयुक्त होते हैं, तो यह एक संकर विरासत बन जाता है।
ध्यान दें कि जावा कक्षाओं का उपयोग करके केवल एकल, बहुस्तरीय और श्रेणीबद्ध प्रकार का समर्थन करता है। जावा कक्षाओं के साथ कई और हाइब्रिड वंशानुक्रम का समर्थन नहीं करता है।
अब हम प्रोग्रामिंग उदाहरणों के साथ प्रत्येक प्रकार की विरासत के बारे में विस्तार से चर्चा करेंगे।
जावा में एकल वंशानुक्रम
एक एकल विरासत को नीचे दिखाए अनुसार दर्शाया गया है:
यहाँ एक सुपरक्लास एक एकल सुपरक्लास से विरासत में मिला है। यह एकल वंशानुक्रम है। डॉग जैसा कोई भी जानवर एनिमल प्रजाति से विरासत में मिला है। यह वंशानुक्रम का सबसे सरल रूप है।
नीचे दिए गए एक जावा प्रोग्राम है जो एकल वंशानुक्रम की व्याख्या करता है।
//base class:Animal class Animal { void Action_eat() { System.out.print('eating...'); } } //derived class:Dog class Dog extends Animal { void Action_bark() { System.out.print('barking...'); } } class Main{ public static void main(String args()){ Dog d=new Dog(); //create an object of derived class System.out.print('The dog is '); d.Action_bark(); //call derived class method System.out.print('
The dog is '); d.Action_eat(); //call base class method } }
आउटपुट:
यहाँ, हमारे पास बेस क्लास एनीमल में एक विधि (एक्शन_एट) है जो एनिमल प्रजाति के लिए आम है। हमारे पास एक व्युत्पन्न वर्ग का कुत्ता है जो पशु वर्ग से प्राप्त होता है। डॉग क्लास में, हमारे पास डॉग प्रजाति, छाल (एक्शन_बार्क) के लिए विशिष्ट विधि है।
फिर हम मुख्य विधि में एक डॉग ऑब्जेक्ट बनाते हैं और डॉग क्लास को एनिमल क्लास विरासत में मिली है, इस ऑब्जेक्ट को खाने के साथ-साथ क्वार्क विधि भी कह सकते हैं।
जावा में मल्टीलेवल इनहेरिटेंस
बहु-स्तरीय विरासत में, हमारे पास विरासत की एक श्रृंखला है। इसका मतलब है कि हमारे पास एक मूल वर्ग है जो एक व्युत्पन्न वर्ग द्वारा विरासत में मिला है। बदले में व्युत्पन्न वर्ग एक माता-पिता के रूप में दूसरी कक्षा में काम करता है।
बहु-स्तरीय विरासत को नीचे के रूप में दर्शाया जा सकता है:
जैसा कि ऊपर की आकृति में देखा गया है कि कक्षा ए से एक मूल वर्ग ए क्लास बी विरासत में मिला है, फिर एक और वर्ग सी है जो बदले में कक्षा बी से विरासत में मिला है। इस प्रकार हम देख सकते हैं कि यह विरासत की एक श्रृंखला बनाता है। यहाँ कक्षा B एक मध्यस्थ वर्ग बन जाता है जो वर्गों A और C को जोड़ता है।
नीचे हमारे पशु वर्ग के उदाहरण के साथ जारी रखते हुए, हमारे पास एक कुत्ता वर्ग है जो पशु वर्ग से प्राप्त किया जा सकता है। फिर हमारे पास एक और क्लास पप्पी हो सकती है जो कि डॉग क्लास से निकला एक बेबी डॉग है। इस तरह, हम बहुस्तरीय विरासत हो सकते हैं।
मल्टीलेवल इनहेरिटेंस के लिए एक उदाहरण कार्यक्रम नीचे दिखाया गया है।
import java.util.*; import java.lang.*; import java.io.*; //parent class A class A { public void print_A() { System.out.print('SoftwareTestingHelp '); } } //Derived class B - intermediary class B extends A { public void print_B() { System.out.print('Java Series '); } } //Derived Class C class C extends B { public void print_C() { System.out.print('Tutorials'); } } public class Main { public static void main(String() args) { C c_obj = new C(); //create Class C obj c_obj.print_A(); //call grandparent class method c_obj.print_B(); //call parent class method c_obj.print_C(); //call member method } }
आउटपुट:
हमने ऊपर दिखाई गई सटीक श्रृंखला को क्रमादेशित किया है। फिर मुख्य विधि में, हम वर्ग C की एक वस्तु बनाते हैं। वर्ग C की वस्तु तब उसके मूल B के तरीकों के साथ-साथ वानस्पतिक A तक भी पहुँच सकती है।
जावा में पदानुक्रमित वंशानुक्रम
एक वर्ग में एक से अधिक वर्ग हो सकते हैं। इसलिए हमारे पास एक आधार या सुपरक्लास और एक से अधिक उपवर्ग हैं। इस प्रकार की विरासत को 'श्रेणीबद्ध विरासत' कहा जाता है।
पदानुक्रमित वंशानुक्रम का चित्र नीचे दिया गया है:
पदानुक्रमित विरासत के एक उदाहरण के रूप में, हम पशु वर्ग को एक सुपरक्लास के रूप में दर्शा सकते हैं और फिर उसके पास बिल्ली, कुत्ता, गाय आदि जैसे एक से अधिक जानवर हैं।
नीचे दिया गया जावा प्रोग्राम जावा में पदानुक्रमित वंशानुक्रम प्रदर्शित करता है।
//class Parent class Parent { public void print_parent() { System.out.println('In ::Parent class'); } } //child1 class class Child1 extends Parent { public void print_child1() { System.out.println('In ::Child1 class'); } } //child2 class class Child2 extends Parent { public void print_child2() { System.out.println('In ::Child2 class'); } } //child3 class class Child3 extends Parent { public void print_child3() { System.out.println('In ::Child3 class'); } } public class Main { public static void main(String() args) { Child1 ch1 = new Child1(); //create a Child1 class object ch1.print_child1(); //call its member method Child2 ch2 = new Child2(); //create a Child2 class object ch2.print_child2(); //call its member method Child3 ch3 = new Child3(); //create a Child3 class object ch3.print_child3(); //call its member method ch3.print_parent(); //call parent class method with any object } }
आउटपुट:
जैसा कि हम इस कार्यक्रम से देखते हैं कि हमारे पास एक पैरेंट क्लास है और इस पेरेंट से प्राप्त तीन चाइल्ड क्लास हैं। मुख्य विधि में, हम प्रत्येक बाल वर्ग की एक वस्तु बनाते हैं और उनके संबंधित सदस्य तरीकों को कहते हैं।
पैरेंट क्लास के तरीकों को कॉल करने के लिए, ध्यान दें कि हम किसी भी चाइल्ड क्लास ऑब्जेक्ट का उपयोग कर सकते हैं क्योंकि सभी की पेरेंट क्लास तक पहुंच है।
जावा में कई वंशानुक्रम
मल्टीपल इनहेरिटेंस एक ऐसी स्थिति है जिसमें एक वर्ग एक से अधिक वर्ग से वारिस हो सकता है यानी एक वर्ग में एक से अधिक अभिभावक हो सकते हैं। ऐसा करने से, वर्ग में एक से अधिक सुपरक्लास हो सकते हैं और इस प्रकार अपने सभी सुपरक्लास के गुणों और व्यवहार को प्राप्त कर सकते हैं।
एकाधिक वंशानुक्रम का चित्रण प्रतिनिधित्व नीचे दिखाया गया है:
जैसा कि ऊपर दिखाया गया है, हम एक वर्ग को एक से अधिक वर्गों से एक साथ प्राप्त कर सकते हैं। इस तरह से व्युत्पन्न वर्ग अपने सभी मूल वर्गों की सुविधाओं का अधिग्रहण करेगा। यह गंभीर अस्पष्टताओं को जन्म दे सकता है, खासकर जब विरासत में मिली विशेषताएं समान हों।
ध्यान दें:जावा कक्षाओं का उपयोग करके कई विरासत का समर्थन नहीं करता है। लेकिन यह इंटरफेस का उपयोग करते हुए कई विरासत का समर्थन करता है जो हम विरासत पर हमारे अगले ट्यूटोरियल में चर्चा करेंगे।
चूंकि जावा कक्षाओं के साथ कई विरासत का समर्थन नहीं करता है, इसलिए हम विवरण में नहीं जाएंगे। हालांकि, बाद में ट्यूटोरियल में, हम जावा के पीछे के कारणों को समझने की कोशिश करेंगे कि एकाधिक उत्तराधिकार का समर्थन न करें।
जावा में हाइब्रिड इनहेरिटेंस
हाइब्रिड इनहेरिटेंस एक या एक से अधिक प्रकार की इनहेरिटेंस का संयोजन है जिसकी हमने ऊपर चर्चा की है। हालाँकि किसी भी संयोजन में कई प्रकार के वंशानुक्रम होते हैं जो जावा द्वारा समर्थित नहीं होते हैं।
एक संकर वंशानुक्रम को नीचे के रूप में आरेखित किया जा सकता है।
इसलिए जावा हाइब्रिड विरासत के साथ-साथ कक्षाओं का समर्थन नहीं करता है। लेकिन कई विरासत की तरह, हम इंटरफेस का उपयोग करके जावा में हाइब्रिड विरासत को लागू कर सकते हैं। हम अपने अगले ट्यूटोरियल में इस पर विस्तार से चर्चा करेंगे।
जावा बहुविध सहायता का समर्थन क्यों नहीं करता है?
जावा का उद्देश्य कार्यक्रमों में सरलता है। यह OOP सुविधाओं पर भी लागू होता है। इसलिए जब यह कई विरासत में आता है, तो कुछ अस्पष्ट परिस्थितियां उत्पन्न हो सकती हैं जब हम एक वर्ग को एक से अधिक वर्ग से प्राप्त करते हैं।
अब हम उन समस्याओं को समझते हैं जो हमारे कार्यक्रम में एक से अधिक विरासत होने पर उत्पन्न हो सकती हैं।
निम्नलिखित कई विरासत प्रणालियों पर विचार करें।
यदि हम उपरोक्त प्रणाली को देखते हैं, तो यह स्व-व्याख्यात्मक है। यहां क्लास ए और क्लास बी, क्लास सी द्वारा विरासत में दिए गए दो-अभिभावक वर्ग हैं। अब हमने दिखाया है कि ए और बी दोनों वर्गों का एक ही नाम यानी प्रिंट () है। इसलिए जब क्लास सी को ए और बी विरासत में मिलते हैं, तो उसे प्रिंट () विधि के दोनों संस्करण मिलेंगे।
इस स्थिति में, क्लास C को यह पता नहीं होगा कि उसे कौन सी विधि विरासत में लेनी चाहिए। यह ऊपर बताई गई अस्पष्ट स्थिति है जो कई उत्तराधिकार के मामले में उत्पन्न होती है।
इसलिए, जब क्लास एक से अधिक क्लास से इनहेरिट करता है, तो Java कंपाइलर एरर जारी करता है।
निम्नलिखित जावा कार्यक्रम यह प्रदर्शित करेगा।
class A{ void print(){ System.out.println('Class A :: print()'); } } class B{ void print(){ System.out.println('Class B :: print()'); } } class C extends A , B{ //let C inherit from A and B } public class Main { public static void main(String() args) { C cObj = new C(); c.print(); } }
आउटपुट:
जैसा कि आउटपुट से देखा गया है, जावा कंपाइलर एक त्रुटि जारी करता है जब यह पाता है कि कक्षा दो वर्गों तक फैली हुई है।
हालाँकि जावा दो वर्गों को एक साथ विरासत में लेने की अनुमति नहीं देता है, लेकिन यह हमें इस सीमा के आसपास एक रास्ता प्रदान करता है। हम कक्षाओं के बजाय इंटरफेस का उपयोग करके कई विरासत का अनुकरण कर सकते हैं। हम अपने बाद के ट्यूटोरियल में इस पर चर्चा करेंगे।
हीरा समस्या
'डायमंड समस्या' नामक स्थिति में एकाधिक वंशानुक्रम परिणाम होता है।
विचार करें कि हमारे पास निम्नलिखित विरासत प्रणाली है।
class Super{ void show(){} } class Sub1 extends super{ void show1(){} } class Sub2 extends super{ void show2(){} } class sample extends Sub1,Sub2{ //Sample class code here }
हम नीचे दिखाए गए अनुसार इस प्रणाली का चित्रण कर सकते हैं:
जैसा कि हम उपरोक्त आरेख से देख सकते हैं, संपूर्ण विरासत प्रणाली हीरे के आकार में दिखाई देती है। इस हीरे की संरचना के कारण, अस्पष्टता को 'डायमंड समस्या' का नाम दिया गया है।
जैसा कि पहले कई वंशानुक्रम के लिए समझाया गया था, यहाँ अस्पष्टता शो () विधि की कई प्रतियाँ हैं जो नमूना वर्ग विरासत के परिणामस्वरूप प्राप्त करता है। जैसा कि कई रास्ते हैं यह शो () विधि को प्राप्त करता है और एक अस्पष्टता होती है जिसके बारे में नकल विरासत में मिलती है।
एकाधिक वंशानुक्रम के साथ, हीरे की समस्या को भी इंटरफेस का उपयोग करके हल किया जा सकता है।
कैसे वाईफाई के लिए नेटवर्क सुरक्षा कुंजी खोजने के लिए
जावा में वंशानुक्रम नियम
अब तक हमने उत्तराधिकार की मूल बातों के साथ-साथ जावा में विरासत के प्रकार भी देखे हैं, आइए कुछ नियमों को सूचीबद्ध करें जिन्हें हमें विरासत के साथ अनुप्रयोगों को विकसित करते समय पालन करने की आवश्यकता है।
नियम # 1: जावा एकाधिक वंशानुक्रम का समर्थन नहीं करता है
जैसा कि हमने पहले ही देखा है, जावा किसी भी रूप में कई विरासत का समर्थन नहीं करता है। जब एक प्रोग्राम में कई उत्तराधिकार का प्रयास किया जाता है, तो जावा कंपाइलर कंपाइलर त्रुटि जारी करता है।
नियम # 2: जावा चक्रीय वंशानुक्रम की अनुमति नहीं देता है
एक चक्र बनाने के लिए खुद को विरासत में लेने वाले वर्ग को साइक्लिक इनहेरिटेंस कहा जाता है।
निम्नलिखित कक्षाओं, क्लास 1 और क्लास 2 पर विचार करें।
वर्ग class1 का विस्तार वर्ग 2 {}
कक्षा 2 कक्षा का विस्तार कक्षा 1 {}
उपरोक्त स्थिति एक लूप बनाती है। यह जावा में अनुमति नहीं है।
नियम # 3: हम निजी डेटा सदस्यों को विरासत में नहीं दे सकते
हम पहले से ही 'एक्सेस संशोधक' विषय में जान चुके हैं कि निजी पहुंच वाले सदस्यों को विरासत में नहीं मिला जा सकता है।
नियम # 4: कंस्ट्रक्टर्स को विरासत में नहीं मिला है
चूंकि क्लास ऑब्जेक्ट बनाने के लिए कंस्ट्रक्टर का उपयोग किया जाता है, इसलिए उन्हें एक वर्ग से दूसरे में विरासत में नहीं मिला है।
नियम # 5: हम बाल वस्तुओं का उपयोग करने के लिए माता-पिता के संदर्भ का उपयोग कर सकते हैं
हमने विरासत के विभिन्न उदाहरण पहले ही देखे हैं। हम टाइप पैरेंट क्लास का एक संदर्भ बना सकते हैं और फिर नए कीवर्ड का उपयोग करके बनाई गई एक व्युत्पन्न क्लास ऑब्जेक्ट असाइन कर सकते हैं।
यदि सुपर एक सुपरक्लास है और सब सुपर से लिया गया वर्ग है जैसा कि नीचे दिखाया गया है।
class super{} class sub extends super{ public static void main(String() args){ super s_obj = new sub(); } }
नियम # 6: व्युत्पन्न कंस्ट्रक्टरों में सुपर () के कारण पैरेंट कंस्ट्रक्टर्स को निष्पादित किया जाता है
नियमों में से एक है कि कंस्ट्रक्टरों को विरासत में नहीं दिया जा सकता है। लेकिन सुपरक्लास के कंस्ट्रक्टर को सुपर () कॉल का उपयोग करके व्युत्पन्न वर्ग के कंस्ट्रक्टर के अंदर निष्पादित किया जा सकता है।
बार बार पूछे जाने वाले प्रश्न
Q # 1) किस प्रकार की विरासत जावा द्वारा समर्थित नहीं है?
उत्तर: जावा कई विरासत का समर्थन नहीं करता है क्योंकि यह हीरे की समस्या जैसे अनुप्रयोगों में समस्याओं को जन्म दे सकता है। जावा हाइब्रिड इनहेरिटेंस का भी समर्थन नहीं करता है क्योंकि यह एक या एक से अधिक इनहेरिटेंस प्रकारों का एक संयोजन है और अंततः एकाधिक उत्तराधिकार में बदल सकता है।
Q # 2) वर्ग के कौन से सदस्य विरासत में मिल सकते हैं?
उत्तर: एक वर्ग अपने आधार वर्ग के सार्वजनिक और संरक्षित सदस्यों को विरासत में दे सकता है लेकिन आधार वर्ग के निजी सदस्यों तक नहीं पहुँच सकता है।
Q # 3) मल्टीपल इनहेरिटेंस की अनुमति क्यों नहीं है?
उत्तर: जब दो-माता-पिता वर्गों में एक ही प्रोटोटाइप के साथ तरीके होते हैं, तो एकाधिक विरासत में अस्पष्टता होती है। इस मामले में, व्युत्पन्न वर्ग को एक अस्पष्टता का सामना करना पड़ता है कि किस आधार से उसे विधि का उत्तराधिकार प्राप्त करना चाहिए।
एकाधिक वंशानुक्रम के परिणामस्वरूप जावा में हीरे की समस्या हो सकती है। इसलिए जावा कई उत्तराधिकार का समर्थन नहीं करता है।
Q # 4) आपको मल्टीपल इनहेरिटेंस की आवश्यकता क्यों है?
उत्तर: जावा और सी # जैसी भाषाएं कई इंटरफेस का उपयोग करके कई विरासत को लागू करती हैं। इसलिए जब हमें एक से अधिक इंटरफ़ेस से इनहेरिट करने की आवश्यकता होती है, तो हमें कई इनहेरिटेंस की आवश्यकता होती है।
Q # 5) मल्टीलेवल इनहेरिटेंस का प्रमुख उपयोग क्या है?
उत्तर: एक वर्ग जिसे दूसरे वर्ग से प्राप्त किया जाता है, जो तीसरी कक्षा से प्राप्त होता है, जिसे बहुस्तरीय विरासत प्रदर्शित किया जाता है। इस प्रकार की विरासत में स्तरों को किसी भी संख्या तक बढ़ाया जा सकता है जब तक कि यह स्पष्टता और सरलता बनाए रखता है।
हम बहुस्तरीय विरासत के उपयोग से प्रजातियों के विभिन्न स्तरों को चित्रित कर सकते हैं। प्रोग्रामिंग की दृष्टि से, जब हम विभिन्न स्तरों के अनुप्रयोग वर्गों का प्रतिनिधित्व करना चाहते हैं, तब हम बहुस्तरीय विरासत के लिए जाते हैं।
निष्कर्ष
इस ट्यूटोरियल में, हमने जावा में इनहेरिटेंस के प्रकारों पर चर्चा की है। जावा केवल एकल, बहुस्तरीय और वंशानुगत प्रकार के वंशानुक्रम का समर्थन करता है। जावा मल्टीपल और हाइब्रिड इनहेरिटेंस का समर्थन नहीं करता है। हमने जावा में मल्टीपल इनहेरिटेंस अस्पष्टता और डायमंड समस्या पर चर्चा की है।
फिर हमने विभिन्न नियमों पर चर्चा की, जिन्हें हमें जावा में विरासत को लागू करते समय पालन करना चाहिए। इसके साथ, हमने जावा में आईएस-ए संबंध पर अपनी चर्चा पूरी कर ली है।
=> यहाँ सरल जावा प्रशिक्षण श्रृंखला देखें।
अनुशंसित पाठ
- जावा में इनहेरिटेंस क्या है - उदाहरणों के साथ ट्यूटोरियल
- C ++ में वंशानुक्रम
- C ++ में इनहेरिटेंस के प्रकार
- जावा बेसिक्स: जावा सिंटैक्स, जावा क्लास और कोर जावा कॉन्सेप्ट
- जावा इंटेगर एंड जावा बिगइन्टेगर क्लास विद एग्जाम्पल्स
- जावा में कक्षाओं के प्रकार: सार, ठोस, अंतिम, स्थैतिक
- जावा चर और उदाहरणों के साथ उनके प्रकार
- उदाहरण के साथ जावा स्कैनर क्लास ट्यूटोरियल