उदाहरण के साथ जावा ओओपी अवधारणाएं
मूल रूप से आयुषी जौहरी द्वारा प्रकाशित https://www.edureka.co
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग एक प्रोग्रामिंग शैली है जो क्लास, ऑब्जेक्ट, इनहेरिटेंस, एनकैप्सुलेशन, एब्स्ट्रक्शन, पॉलीमॉर्फिज्म जैसी अवधारणाओं से जुड़ी है। सबसे लोकप्रिय प्रोग्रामिंग भाषाएं जैसे जावा , सी ++ , सी # , माणिक , आदि एक वस्तु-उन्मुख प्रोग्रामिंग प्रतिमान का पालन करें। जैसा जावा सबसे अधिक मांग वाला कौशल होने के नाते, हम जावा में वस्तु-उन्मुख प्रोग्रामिंग अवधारणाओं के बारे में बात करेंगे। जावा में ऑब्जेक्ट-आधारित एप्लिकेशन कक्षाओं की घोषणा करने, उनसे ऑब्जेक्ट बनाने और इन ऑब्जेक्ट्स के बीच इंटरैक्ट करने पर आधारित है।
इस पोस्ट में, हम नीचे दी गई मुख्य अवधारणाओं को समझेंगे: वस्तु उन्मुख कार्यकर्म निम्नलिखित क्रम में:
- विरासत
- कैप्सूलीकरण
- मतिहीनता
- बहुरूपता
आइए पहले ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग कॉन्सेप्ट यानी इनहेरिटेंस के साथ शुरुआत करें।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग: इनहेरिटेंस
OOP में, कंप्यूटर प्रोग्राम इस तरह से डिज़ाइन किए जाते हैं जहाँ सब कुछ एक वस्तु है जो एक दूसरे के साथ बातचीत करती है। वंशानुक्रम एक ऐसी अवधारणा है जिसमें एक वर्ग के गुण दूसरे वर्ग को विरासत में मिल सकते हैं। यह कोड का पुन: उपयोग करने और विभिन्न वर्गों के बीच संबंध स्थापित करने में मदद करता है।
जैसा कि हम छवि में देख सकते हैं, एक बच्चे को अपने पिता से संपत्ति विरासत में मिलती है। इसी तरह, जावा में, दो वर्ग हैं:
1. मूल वर्ग (सुपर या बेस क्लास)
2. बाल वर्ग (उपवर्ग या व्युत्पन्न वर्ग)
एक वर्ग जो गुणों को प्राप्त करता है उसे चाइल्ड क्लास के रूप में जाना जाता है जबकि एक वर्ग जिसकी संपत्ति विरासत में मिली है उसे जनक वर्ग के रूप में जाना जाता है।
वंशानुक्रम को आगे 4 प्रकारों में वर्गीकृत किया गया है:
तो चलिए पहले प्रकार की इनहेरिटेंस यानी सिंगल इनहेरिटेंस से शुरू करते हैं:
1 - एकल वंशानुक्रम:
एकल वंशानुक्रम में, एक वर्ग को दूसरे वर्ग के गुण विरासत में मिलते हैं। यह एक व्युत्पन्न वर्ग को एकल मूल वर्ग से गुणों और व्यवहार को प्राप्त करने में सक्षम बनाता है। यह बदले में कोड पुन: प्रयोज्य को सक्षम करेगा और साथ ही मौजूदा कोड में नई सुविधाएँ भी जोड़ेगा।
यहां, कक्षा ए आपका मूल वर्ग है और कक्षा बी आपका बाल वर्ग है जो मूल वर्ग के गुणों और व्यवहार को प्राप्त करता है।
आइए एकल वंशानुक्रम के लिए सिंटैक्स देखें:
Class A { --- } Class B extends A { --- }
2 - बहुस्तरीय विरासत:
जब एक वर्ग एक वर्ग से प्राप्त होता है जो दूसरे वर्ग से भी प्राप्त होता है, अर्थात एक वर्ग जिसमें एक से अधिक मूल वर्ग होते हैं लेकिन विभिन्न स्तरों पर, इस प्रकार की विरासत को बहुस्तरीय वंशानुक्रम कहा जाता है।
अगर हम फ़्लोचार्ट के बारे में बात करते हैं, तो क्लास बी को क्लास ए के गुण और व्यवहार विरासत में मिलते हैं और क्लास सी को क्लास बी के गुण विरासत में मिलते हैं। यहाँ ए, बी के लिए पैरेंट क्लास है और क्लास बी, सी के लिए पेरेंट क्लास है। तो इस मामले में क्लास सी को कक्षा ए के साथ-साथ कक्षा ए के गुणों और विधियों को निहित रूप से विरासत में मिला है। यही बहुस्तरीय विरासत है।
स्ट्रिंग पायथन में वर्णों की अदला-बदली करें
आइए जावा में बहुस्तरीय वंशानुक्रम के लिए सिंटैक्स देखें:
Class A{ --- } Class B extends A{ --- } Class C extends B{ --- }
3 - पदानुक्रमित विरासत:
जब एक वर्ग में एक से अधिक बच्चे वर्ग (उपवर्ग) होते हैं या दूसरे शब्दों में, एक से अधिक बाल वर्गों में एक ही मूल वर्ग होता है, तो इस तरह की विरासत को कहा जाता है श्रेणीबद्ध .
अगर हम फ़्लोचार्ट के बारे में बात करते हैं, तो कक्षा बी और सी बाल वर्ग हैं जो मूल वर्ग यानी कक्षा ए से विरासत में मिले हैं।
आइए जावा में पदानुक्रमित वंशानुक्रम के लिए सिंटैक्स देखें:
Class A{ --- } Class B extends A{ --- } Class C extends A{ --- }
4 - हाइब्रिड वंशानुक्रम:
हाइब्रिड विरासत का एक संयोजन है विभिन्न विरासत और बहुस्तरीय विरासत। चूंकि जावा में एकाधिक वंशानुक्रम समर्थित नहीं है क्योंकि यह अस्पष्टता की ओर ले जाता है, इसलिए इस प्रकार की विरासत केवल इंटरफेस के उपयोग के माध्यम से प्राप्त की जा सकती है।
अगर हम फ्लोचार्ट के बारे में बात करते हैं, तो क्लास ए क्लास बी और सी के लिए एक पैरेंट क्लास है, जबकि क्लास बी और सी, डी के पैरेंट क्लास हैं जो कि बी और सी का इकलौता चाइल्ड क्लास है।
अब हमने वंशानुक्रम और उनके विभिन्न प्रकारों के बारे में सीखा। आइए किसी अन्य ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग कॉन्सेप्ट यानी एनकैप्सुलेशन पर स्विच करें।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग: एनकैप्सुलेशन
एनकैप्सुलेशन एक ऐसा तंत्र है जहां आप अपने डेटा और कोड को एक इकाई के रूप में एक साथ बांधते हैं। इसका मतलब अपने डेटा को किसी भी संशोधन से सुरक्षित बनाने के लिए छिपाना भी है। इसका क्या मतलब है? एनकैप्सुलेशन को समझने का सबसे अच्छा तरीका एक मेडिकल कैप्सूल के उदाहरण को देखना है, जहां कैप्सूल के अंदर दवा हमेशा सुरक्षित रहती है। इसी तरह, एनकैप्सुलेशन के माध्यम से एक वर्ग के तरीके और चर अच्छी तरह से छिपे हुए और सुरक्षित होते हैं।
हम जावा में इनकैप्सुलेशन प्राप्त कर सकते हैं:
- एक वर्ग के चर को निजी घोषित करना।
- चर मानों को संशोधित करने और देखने के लिए सार्वजनिक सेटर और गेट्टर विधियाँ प्रदान करना।
आइए इनकैप्सुलेशन की बेहतर समझ प्राप्त करने के लिए नीचे दिए गए कोड को देखें:
public class Employee { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { } }
आइए ऊपर दिए गए कोड को समझने की कोशिश करते हैं। मैंने एक वर्ग कर्मचारी बनाया है जिसमें एक निजी चर है नाम। फिर हमने एक गेट्टर और सेटर तरीके बनाए हैं जिसके माध्यम से हम एक कर्मचारी का नाम प्राप्त कर सकते हैं और सेट कर सकते हैं। इन विधियों के माध्यम से, कोई भी वर्ग जो नाम चर का उपयोग करना चाहता है, उसे इन गेट्टर और सेटर विधियों का उपयोग करके ऐसा करना होगा।
आइए अपने तीसरे ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग कॉन्सेप्ट यानी एब्स्ट्रेक्शन की ओर बढ़ते हैं।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग: एब्स्ट्रैक्शन
अमूर्तता का तात्पर्य घटनाओं के बजाय विचारों से निपटने की गुणवत्ता से है। यह मूल रूप से विवरण छिपाने और उपयोगकर्ता को आवश्यक चीजें दिखाने से संबंधित है। यदि आप यहां की छवि को देखते हैं, तो जब भी हमें कोई कॉल आती है, तो हमें इसे लेने या इसे अस्वीकार करने का विकल्प मिलता है। लेकिन वास्तव में, बहुत सारे कोड हैं जो पृष्ठभूमि में चलते हैं। तो आप नहीं जानते कि कॉल कैसे उत्पन्न होती है, इसकी आंतरिक प्रक्रिया अमूर्तता की सुंदरता है। इसलिए, अमूर्तता जटिलता को कम करने में मदद करती है। आप दो तरीकों से अमूर्तता प्राप्त कर सकते हैं:
ए) सार वर्ग
बी) इंटरफ़ेस
आइए इन अवधारणाओं को और अधिक विस्तार से समझते हैं।
सार वर्ग: जावा में एब्सट्रैक्ट क्लास में 'एब्सट्रैक्ट' कीवर्ड होता है। अब सार कीवर्ड का क्या अर्थ है? यदि किसी वर्ग को अमूर्त घोषित किया जाता है, तो उसे तत्काल नहीं किया जा सकता है, जिसका अर्थ है कि आप एक अमूर्त वर्ग की वस्तु नहीं बना सकते। साथ ही, एक अमूर्त वर्ग में अमूर्त के साथ-साथ ठोस तरीके भी हो सकते हैं।
ध्यान दें : आप अमूर्त वर्ग का उपयोग करके 0-100% अमूर्तता प्राप्त कर सकते हैं।
एक अमूर्त वर्ग का उपयोग करने के लिए, आपको इसे किसी अन्य वर्ग से प्राप्त करना होगा जहां आपको स्वयं अमूर्त विधियों के लिए कार्यान्वयन प्रदान करना होगा, अन्यथा यह एक अमूर्त वर्ग भी बन जाएगा।
आइए एक अमूर्त वर्ग के सिंटैक्स को देखें:
Abstract class Mobile { // abstract class mobile Abstract void run(); // abstract method
इंटरफेस: जावा में इंटरफ़ेस एक वर्ग का खाका है या आप कह सकते हैं कि यह अमूर्त विधियों और स्थिर स्थिरांक का एक संग्रह है। एक इंटरफ़ेस में, प्रत्येक विधि सार्वजनिक और अमूर्त होती है लेकिन इसमें कोई कंस्ट्रक्टर नहीं होता है। अमूर्तता के साथ, इंटरफ़ेस जावा में एकाधिक वंशानुक्रम प्राप्त करने में भी मदद करता है।
ध्यान दें : आप इंटरफेस का उपयोग करके 100% अमूर्तता प्राप्त कर सकते हैं।
तो एक इंटरफ़ेस मूल रूप से खाली निकायों के साथ संबंधित विधियों का एक समूह है। आइए हम इसके संबंधित तरीकों के साथ 'पेरेंटकार' इंटरफेस का उदाहरण लेकर इंटरफेस को बेहतर ढंग से समझते हैं।
public interface ParentCar { public void changeGear( int newValue); public void speedUp(int increment); public void applyBrakes(int decrement); }
ये तरीके हर कार के लिए मौजूद होने चाहिए, है ना? लेकिन उनका काम अलग होने वाला है।
मान लीजिए कि आप मैनुअल कार के साथ काम कर रहे हैं, वहां आपको एक-एक करके गियर बढ़ाना होगा, लेकिन अगर आप एक स्वचालित कार के साथ काम कर रहे हैं, तो उस समय आपका सिस्टम तय करता है कि गति के संबंध में गियर कैसे बदला जाए। इसलिए, मेरे सभी उपवर्गों के लिए समान तर्क नहीं लिखा गया है गियर बदलें . ऐसा ही मामला जल्दी करो , अब मान लें कि जब आप किसी एक्सीलरेटर को दबाते हैं, तो यह 10kms या 15kms की गति से गति करता है। लेकिन मान लीजिए, कोई और सुपर कार चला रहा है, जहां यह 30 किमी या 50 किमी बढ़ जाती है। फिर से तर्क बदलता है। इसी तरह के लिए ब्रेक लगाना , जहां एक व्यक्ति के पास शक्तिशाली ब्रेक हो सकते हैं, दूसरे के पास नहीं हो सकता है।
चूंकि मेरे सभी उपवर्गों के साथ सभी कार्यात्मकताएं समान हैं, इसलिए मैंने एक इंटरफ़ेस 'पेरेंटकार' बनाया है जहां सभी कार्य मौजूद हैं। उसके बाद, मैं एक चाइल्ड क्लास बनाउंगा जो इस इंटरफ़ेस को लागू करता है, जहां इन सभी विधियों की परिभाषा भिन्न होती है।
इसके बाद, आइए कार्यक्षमता पर गौर करें कि आप इस इंटरफ़ेस को कैसे कार्यान्वित कर सकते हैं।
तो इस इंटरफ़ेस को लागू करने के लिए, आपकी कक्षा का नाम कार के किसी विशेष ब्रांड में बदल जाएगा, मान लीजिए कि मैं एक ऑडी लूंगा। क्लास इंटरफेस को लागू करने के लिए, मैं नीचे देखे गए 'कार्यान्वयन' कीवर्ड का उपयोग करूंगा:
public class Audi implements ParentCar { int speed=0; int gear=1; public void changeGear( int value){ gear=value; } public void speedUp( int increment) { speed=speed+increment; } public void applyBrakes(int decrement) { speed=speed-decrement; } void printStates(){ System.out.println('speed:'+speed+'gear:'+gear); } public static void main(String[] args) { // TODO Auto-generated method stub Audi A6= new Audi(); A6.speedUp(50); A6.printStates(); A6.changeGear(4); A6.SpeedUp(100); A6.printStates(); } }
यहां जैसा कि आप देख सकते हैं, मैंने अपने इंटरफ़ेस वर्ग में घोषित विभिन्न विधियों के लिए कार्यात्मकता प्रदान की है। एक इंटरफ़ेस को लागू करने से एक वर्ग को उस व्यवहार के बारे में अधिक औपचारिक बनने की अनुमति मिलती है जो वह प्रदान करने का वादा करता है। आप एक और वर्ग भी बना सकते हैं, उदाहरण के लिए बीएमडब्ल्यू वर्ग जो विभिन्न कार्यात्मकताओं के साथ एक ही इंटरफ़ेस 'कार' को इनहेरिट कर सकता है।
तो मुझे आशा है कि आप लोग इंटरफ़ेस के साथ स्पष्ट हैं और आप इसका उपयोग करके अमूर्तता कैसे प्राप्त कर सकते हैं।
अंत में, अंतिम वस्तु उन्मुख प्रोग्रामिंग अवधारणा बहुरूपता है।
वस्तु उन्मुख प्रोग्रामिंग: बहुरूपता
बहुरूपता का अर्थ है कई रूप लेना, जहाँ 'पॉली' का अर्थ है कई और 'रूप' का अर्थ है रूप। यह एक चर, कार्य या वस्तु की कई रूपों को लेने की क्षमता है। दूसरे शब्दों में, बहुरूपता आपको एक इंटरफ़ेस या विधि को परिभाषित करने और कई कार्यान्वयन करने की अनुमति देता है।
आइए इसे वास्तविक जीवन के उदाहरण से समझते हैं और यह अवधारणा ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में कैसे फिट होती है।
आइए क्रिकेट में इस वास्तविक दुनिया के परिदृश्य पर विचार करें, हम जानते हैं कि विभिन्न प्रकार के गेंदबाज हैं यानी तेज गेंदबाज, मध्यम गति के गेंदबाज और स्पिनर। जैसा कि आप ऊपर की आकृति में देख सकते हैं, एक मूल वर्ग है- गेंदबाज वर्ग और इसमें तीन बाल वर्ग हैं: फास्टपेसर , मध्यम तेज गेंदबाज तथा स्पिनर . गेंदबाज वर्ग है गेंदबाजी विधि () जहां सभी बाल वर्ग इस विधि को विरासत में प्राप्त कर रहे हैं। जैसा कि हम सभी जानते हैं कि एक तेज गेंदबाज मध्यम तेज गेंदबाज और स्पिनर की तुलना में गेंदबाजी की गति, लंबी दौड़ और गेंदबाजी के तरीके आदि के मामले में अलग तरह से गेंदबाजी करेगा। इसी तरह एक मध्यम तेज गेंदबाज का कार्यान्वयन गेंदबाजी विधि () अन्य गेंदबाजों की तुलना में भी अलग होने जा रहा है। और स्पिनर वर्ग के साथ भी ऐसा ही होता है।
उपरोक्त चर्चा का सार यह है कि एक ही नाम के कई रूप होते हैं। उपरोक्त तीनों वर्गों को विरासत में मिला है गेंदबाजी विधि () लेकिन उनका कार्यान्वयन एक दूसरे से बिल्कुल अलग है।
जावा में बहुरूपता दो प्रकार की होती है:
- रन टाइम बहुरूपता
- संकलन समय बहुरूपता
रन टाइम बहुरूपता: जावा में, रनटाइम पॉलीमॉर्फिज्म एक ऐसी प्रक्रिया को संदर्भित करता है जिसमें ओवरराइड विधि के लिए कॉल को संकलन-समय के बजाय रनटाइम पर हल किया जाता है। इसमें रन टाइम पर सुपरक्लास के ओवरराइड मेथड को कॉल करने के लिए रेफरेंस वेरिएबल का इस्तेमाल किया जाता है। मेथड ओवरराइडिंग रन टाइम पॉलीमॉर्फिज्म का एक उदाहरण है। ओवरराइडिंग विधि कैसे काम करती है, इसे समझने के लिए आइए निम्नलिखित कोड देखें:
public Class BowlerClass{ void bowlingMethod() { System.out.println(' bowler '); } public Class FastPacer{ void bowlingMethod() { System.out.println(' fast bowler '); } Public static void main(String[] args) { FastPacer obj= new FastPacer(); obj.bowlingMethod(); } }
संकलन समय बहुरूपता: जावा में, संकलन समय बहुरूपता एक ऐसी प्रक्रिया को संदर्भित करता है जिसमें एक अतिभारित विधि को कॉल रन टाइम के बजाय संकलन समय पर हल किया जाता है। विधि अधिभार संकलन समय बहुरूपता का एक उदाहरण है। मेथड ओवरलोडिंग एक ऐसी सुविधा है जो एक वर्ग को समान नाम वाली दो या दो से अधिक विधियों की अनुमति देती है लेकिन विधियों को दिए गए तर्क भिन्न होते हैं। विधि अधिभावी के विपरीत, तर्क भिन्न हो सकते हैं:
- एक विधि को पारित मापदंडों की संख्या
- पैरामीटर का डेटाटाइप
- किसी विधि को पास करने पर डेटाटाइप का अनुक्रम।
ओवरलोडिंग की विधि कैसे काम करती है, इसे समझने के लिए आइए निम्नलिखित कोड को देखें:
class Adder { Static int add(int a, int b) { return a+b; } static double add( double a, double b) { return a+b; } public static void main(String args[]) { System.out.println(Adder.add(11,11)); System.out.println(Adder.add(12.3,12.6)); } }
मुझे उम्मीद है कि आप सभी ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग कॉन्सेप्ट्स के साथ स्पष्ट हैं, जिनकी हमने ऊपर चर्चा की है यानी इनहेरिटेंस, एनकैप्सुलेशन, एब्स्ट्रैक्शन और पॉलीमॉर्फिज्म। अब आप जावा ओओपी अवधारणाओं का उपयोग करके अपने जावा एप्लिकेशन को अधिक सुरक्षित, सरल और पुन: प्रयोज्य बना सकते हैं।
पढ़ने के लिए धन्यवाद ❤
अगर आपको यह पोस्ट पसंद आया है, तो इसे अपने सभी प्रोग्रामिंग मित्रों के साथ साझा करें!
हमारा अनुसरण इस पर कीजिये फेसबुक | ट्विटर
आगे की पढाई
मैं 2019 में 100+ जावा साक्षात्कार प्रश्न और उत्तर
पायथन बनाम जावा: ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग को समझें
मैं कोणीय 7 + स्प्रिंग बूट CRUD उदाहरण
स्प्रिंग बूट और Vue.js के साथ एक साधारण CRUD ऐप बनाएं
स्प्रिंग बूट, सुरक्षा और डेटा MongoDB के साथ RESTful API को सुरक्षित करना
#जावा #ओप