50+ OOPs साक्षात्कार प्रश्न और उत्तर (2026)

क्या आप OOPs इंटरव्यू की तैयारी कर रहे हैं? यह सोचने का समय आ गया है कि आपसे कौन से प्रश्न पूछे जा सकते हैं और आप उनका जवाब कैसे देंगे। इस चरण में महारत हासिल करने के लिए OOPs इंटरव्यू के मूल सिद्धांतों और गहराई, दोनों को समझना ज़रूरी है।

इस क्षेत्र में अवसर तेज़ी से बढ़ रहे हैं, तकनीकी विशेषज्ञता और पेशेवर अनुभव सफलता की आधारशिला बनते जा रहे हैं। चाहे आप बुनियादी सवालों को हल करने की चाहत रखने वाले नए छात्र हों, विश्लेषण कौशल को निखारने वाले मध्यम-स्तरीय डेवलपर हों, या 5 या 10 साल के बुनियादी स्तर के अनुभव वाले वरिष्ठ पेशेवर हों, ये प्रश्न और उत्तर व्यावहारिक अंतर्दृष्टि प्रदान करते हैं। नियुक्ति प्रबंधक, टीम लीडर और वरिष्ठ अधिकारी उम्मीदवारों से ऐसे कौशल की अपेक्षा करते हैं जो सिद्धांत से आगे बढ़कर उद्योग के रुझानों के अनुरूप उन्नत अनुप्रयोगों तक पहुँचें।

हमारा शोध 65 से ज़्यादा तकनीकी विशेषज्ञों की अंतर्दृष्टि, 40 से ज़्यादा प्रबंधकों के फ़ीडबैक और विभिन्न उद्योगों के 120 से ज़्यादा पेशेवरों द्वारा साझा किए गए ज्ञान पर आधारित है। संदर्भों की यह व्यापकता बुनियादी अवधारणाओं से लेकर उन्नत परिदृश्यों तक विश्वसनीय कवरेज सुनिश्चित करती है।

OOPS साक्षात्कार प्रश्न और उत्तर

1) ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) क्या है और यह महत्वपूर्ण क्यों है?

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) एक प्रोग्रामिंग प्रतिमान है जो "ऑब्जेक्ट्स" की अवधारणा पर आधारित है जो डेटा (विशेषताओं) और व्यवहार (विधियों) को समाहित करता है। OOP का महत्व वास्तविक दुनिया की संस्थाओं को मॉडल करने, मॉड्यूलरिटी में सुधार करने और कोड की पुन: प्रयोज्यता को सुगम बनाने की इसकी क्षमता में निहित है। स्थिति और व्यवहार को एक साथ समूहीकृत करके, OOP प्रोग्राम को अधिक संरचित और रखरखाव में आसान बनाता है। उदाहरण के लिए, एक "कार" ऑब्जेक्ट में रंग और मॉडल जैसी विशेषताएँ और त्वरण और ब्रेक जैसी विधियाँ हो सकती हैं। इसके लाभों में टीमों के बीच बेहतर सहयोग, प्रणालियों की मापनीयता और SOLID जैसे सुस्थापित डिज़ाइन सिद्धांतों का अनुप्रयोग शामिल है।

👉 मुफ़्त पीडीएफ़ डाउनलोड: OOPS साक्षात्कार प्रश्न और उत्तर


2) उदाहरण सहित OOP के मूल सिद्धांतों की व्याख्या करें।

ओ.ओ.पी. के चार मूलभूत सिद्धांत हैं:

  1. कैप्सूलीकरण - आवश्यक कार्यक्षमता को उजागर करते हुए आंतरिक कार्यान्वयन को छिपाना। उदाहरण: निजी शेष चर वाला बैंक खाता वर्ग।
  2. मतिहीनता - केवल आवश्यक विवरण प्रदर्शित करना और जटिलता को छिपाना। उदाहरण: सर्किटरी को समझे बिना टीवी रिमोट का उपयोग करना।
  3. विरासत – पैरेंट क्लास से विशेषताओं और व्यवहारों का पुनः उपयोग। उदाहरण: एनिमल से विरासत में प्राप्त डॉग क्लास।
  4. बहुरूपता – कई रूप लेने की क्षमता, जैसे मेथड ओवरलोडिंग और ओवरराइडिंग। उदाहरण: एक फ़ंक्शन draw() जो वृत्त, वर्ग या त्रिभुज के लिए अलग-अलग व्यवहार करता है।
सिद्धांत उद्देश्य उदाहरण
कैप्सूलीकरण प्रवेश निषेध बैंकिंग में निजी शेष
मतिहीनता जटिलता छिपाएँ टीवी रिमोट इंटरफ़ेस
विरासत पुन: उपयोग और विस्तार वाहन → कार, ट्रक
बहुरूपता एकाधिक व्यवहार draw() तरीका

3) क्लास, ऑब्जेक्ट से किस प्रकार भिन्न है?

A कक्षा एक खाका या टेम्पलेट है जो वस्तुओं की संरचना और व्यवहार को परिभाषित करता है, जबकि एक वस्तु एक क्लास का उदाहरण है। एक क्लास विशेषताएँ और विधियाँ निर्दिष्ट करता है, लेकिन ऑब्जेक्ट बनने तक मेमोरी नहीं घेरता। एक ऑब्जेक्ट वास्तविक दुनिया की संस्थाओं का प्रतिनिधित्व करता है और वास्तविक मान रखता है। उदाहरण के लिए, एक Car वर्ग जैसे गुणों को परिभाषित करता है color और engineType, लेकिन वस्तु myCar = Car("Red", "V6") विशिष्ट मान रखता है। किसी वस्तु के जीवनचक्र में आमतौर पर निर्माण, उपयोग और विनाश शामिल होता है।


4) ओ.ओ.पी. में वंशानुक्रम के विभिन्न प्रकार क्या हैं?

वंशानुक्रम एक वर्ग को दूसरे वर्ग की विशेषताओं और व्यवहारों का पुनः उपयोग करने में सक्षम बनाता है। इसके पाँच सामान्य प्रकार हैं:

  1. एकल वंशानुक्रम - एक उपवर्ग एक सुपरक्लास से विरासत में मिलता है।
  2. एकाधिक वंशानुक्रम - एक उपवर्ग कई सुपरक्लासों से विरासत में मिलता है (समर्थित) C++ लेकिन सीधे तौर पर नहीं Java).
  3. मल्टीलेवल इनहेरिटेंस - एक उपवर्ग दूसरे उपवर्ग से व्युत्पन्न होता है, जो एक पदानुक्रम बनाता है।
  4. पदानुक्रमित वंशानुक्रम - एकाधिक वर्ग एक ही आधार वर्ग से विरासत में प्राप्त होते हैं।
  5. संकर वंशानुक्रम – अनेक प्रकार की विरासतों का मिश्रण।
प्रकार उदाहरण
सिंगल छात्र → व्यक्ति
विभिन्न कर्मचारी को व्यक्ति + कार्यकर्ता से विरासत मिलती है (C++)
बहुस्तरीय दादा-दादी → माता-पिता → बच्चे
श्रेणीबद्ध कुत्ते, बिल्ली, घोड़े को जानवरों से विरासत में मिलता है
Hybrid दो या अधिक प्रकारों का संयोजन

5) क्या आप मेथड ओवरलोडिंग और मेथड ओवरराइडिंग के बीच अंतर समझा सकते हैं?

विधि ओवरलोडिंग यह तब होता है जब एक ही क्लास में दो या दो से ज़्यादा मेथड्स का नाम एक जैसा होता है, लेकिन पैरामीटर्स (संख्या या प्रकार) में अंतर होता है। यह कंपाइल-टाइम पॉलीमॉर्फिज़्म को दर्शाता है।

विधि अधिभावी यह तब होता है जब कोई उपवर्ग अपने मूल वर्ग में पहले से परिभाषित किसी विधि का विशिष्ट कार्यान्वयन प्रदान करता है। यह रनटाइम बहुरूपता का प्रतिनिधित्व करता है।

Feature ओवरलोडिंग अधिभावी
बंधन संकलन समय क्रम
पैरामीटर्स भिन्न होना चाहिए एक जैसा होना चाहिए
वापसी प्रकार भिन्न हो सकते हैं एक जैसा होना चाहिए
उदाहरण लचीलापन विशेषज्ञता

उदाहरण:

  • ओवरलोडिंग: add(int, int) और add(double, double) एक कक्षा में.
  • अधिरोहण: Animal.speak() द्वारा ओवरराइड किया गया Dog.speak().

6) एनकैप्सुलेशन से सॉफ्टवेयर विकास को क्या लाभ होता है?

एनकैप्सुलेशन मॉड्यूलरिटी में सुधार करता है, जटिलता को कम करता है, और आंतरिक स्थिति तक सीधी पहुँच को सीमित करके डेटा सुरक्षा को बढ़ाता है। यह डेवलपर्स को बाहरी कोड को प्रभावित किए बिना कार्यान्वयन विवरण बदलने की अनुमति देता है। उदाहरण के लिए, किसी BankAccount वर्ग, balance विशेषता निजी है, और पहुँच सार्वजनिक विधियों के माध्यम से नियंत्रित होती है deposit() और withdraw()यह अनधिकृत हेरफेर को रोकते हुए वैध लेनदेन सुनिश्चित करता है। इसके प्रमुख लाभों में शामिल हैं:

  • अनपेक्षित हस्तक्षेप से सुरक्षा।
  • सत्यापन तर्क लागू करने की क्षमता.
  • ढीले युग्मन के माध्यम से रखरखाव में वृद्धि।

7) वास्तविक दुनिया के उदाहरण के साथ अमूर्तता की व्याख्या करें।

अमूर्तन केवल आवश्यक विशेषताओं को उजागर करते हुए विवरणों को छिपाकर जटिल प्रणालियों को सरल बनाता है। एक वास्तविक दुनिया का उदाहरण है काफी यन्त्र: उपयोगकर्ता पानी गर्म करने, पीसने या छानने जैसी अंतर्निहित प्रक्रियाओं को समझे बिना ही कॉफ़ी बनाने के लिए एक बटन दबाते हैं। प्रोग्रामिंग में, अमूर्तता अमूर्त वर्गों या इंटरफेस के माध्यम से प्राप्त की जाती है। उदाहरण के लिए, Java, एक अमूर्त वर्ग Shape अमूर्त विधि को परिभाषित कर सकते हैं draw(), जबकि उपवर्ग जैसे Circle or Rectangle ठोस कार्यान्वयन प्रदान करें। यह जटिलता को कम करते हुए लचीलेपन और कोड के पुन: उपयोग को बढ़ावा देता है।


8) कंस्ट्रक्टर और डिस्ट्रक्टर क्या हैं? वे कैसे भिन्न हैं?

A निर्माता एक विशेष विधि है जो किसी ऑब्जेक्ट के निर्माण पर स्वचालित रूप से लागू होती है। इसका उद्देश्य ऑब्जेक्ट की स्थिति को आरंभीकृत करना है। अधिकांश भाषाओं में, इसका नाम क्लास के नाम से मेल खाता है। नाशक इसका प्रयोग तब किया जाता है जब कोई वस्तु नष्ट हो जाती है, आमतौर पर संसाधनों को मुक्त करने के लिए।

मुख्य अंतर:

  • निर्माता वस्तुओं को आरंभीकृत करता है; नाशक संसाधनों को साफ करता है.
  • कन्स्ट्रक्टर्स को ओवरलोड किया जा सकता है; डिस्ट्रक्टर्स को नहीं।
  • कंस्ट्रक्टर्स का प्रयोग निर्माण के समय तथा डिस्ट्रक्टर्स का प्रयोग समाप्ति के समय किया जाता है।

उदाहरण C++:

class Student {
public:
    Student() { cout << "Constructor called"; } 
    ~Student() { cout << "Destructor called"; } 
}; 

9) अमूर्त वर्ग और इंटरफ़ेस के बीच क्या अंतर है?

An अमूर्त वर्ग इसमें अमूर्त (गैर-कार्यान्वित) और ठोस (कार्यान्वित) दोनों विधियाँ हो सकती हैं, जबकि इंटरफेस इसमें केवल अमूर्त विधियाँ होती हैं (अधिकांश भाषाओं में, हालाँकि आधुनिक Java डिफ़ॉल्ट विधियों की अनुमति देता है)। अमूर्त वर्ग एकल वंशानुक्रम का समर्थन करते हैं, जबकि इंटरफेस एकाधिक वंशानुक्रम की अनुमति देते हैं।

पहलू सार वर्ग इंटरफेस
तरीके अमूर्त + ठोस सार (डिफ़ॉल्ट विधियाँ संभव)
चर उदाहरण चर हो सकते हैं केवल स्थिरांक
विरासत सिंगल विभिन्न
उदाहरण कुछ कार्यान्वयन के साथ सामान्य आधार कक्षाओं के लिए अनुबंध

उदाहरण:

  • सार वर्ग Animal कार्यान्वित के साथ eat() और सार makeSound().
  • इंटरफेस Flyable साथ में fly() कि कक्षाएं जैसे Bird or Airplane लागू करना होगा.

10) OOP में बहुरूपता कैसे प्रकट होती है?

बहुरूपता एक ही इकाई को कई रूप धारण करने की अनुमति देती है। इसके दो मुख्य प्रकार हैं:

  • संकलन-समय बहुरूपता (स्थिर) - मेथड ओवरलोडिंग या ऑपरेटर ओवरलोडिंग के माध्यम से प्राप्त किया जाता है। उदाहरण: के एकाधिक संस्करण calculate() विभिन्न मापदंडों के साथ विधि.
  • रनटाइम बहुरूपता (गतिशील) - विधि ओवरराइडिंग के माध्यम से प्राप्त किया गया। उदाहरण: A Shape संदर्भ चर कॉलिंग draw() विधि अलग-अलग तरीके से व्यवहार करती है, यह इस बात पर निर्भर करता है कि वह किस ओर इशारा करती है Circle or Square वस्तु।

इससे बड़े अनुप्रयोगों में लचीलापन, विस्तारशीलता और आसान रखरखाव उपलब्ध होता है।


11) ओओपी में विभिन्न एक्सेस मॉडिफायर कौन से हैं और उनका महत्व क्या है?

एक्सेस मॉडिफ़ायर क्लासेस, मेथड्स और वेरिएबल्स की दृश्यता और पहुँच को परिभाषित करते हैं। वे नियंत्रित करते हैं कि डेटा और व्यवहार प्रोग्राम के अन्य भागों के सामने कैसे प्रदर्शित होते हैं, जिससे एनकैप्सुलेशन और सुरक्षा सुनिश्चित होती है।

सामान्य प्रकार:

  • सार्वजनिक - कार्यक्रम में कहीं से भी सुलभ।
  • निजी - केवल परिभाषित वर्ग के भीतर ही पहुंच योग्य।
  • संरक्षित - वर्ग और उसके उपवर्गों के भीतर सुलभ।
  • डिफ़ॉल्ट/आंतरिक (भाषा-विशिष्ट) - एक ही पैकेज या असेंबली के भीतर सुलभ।
संशोधक आसान इस्‍तेमाल उदाहरण
सार्वजनिक सभी के लिए खुला है सार्वजनिक getName() तरीका
निजी केवल समान वर्ग निजी balance परिवर्तनशील
संरक्षित वर्ग + उपवर्ग संरक्षित calculateSalary()
आंतरिक (C#) समान असेंबली आंतरिक Logger कक्षा

एक्सेस संशोधक डेटा छिपाना, मॉड्यूलरिटी और नियंत्रित कोड प्रदर्शन सुनिश्चित करते हैं।


12) OOP में स्टैटिक बाइंडिंग, डायनेमिक बाइंडिंग से किस प्रकार भिन्न है?

स्थैतिक बाइंडिंग (प्रारंभिक बाइंडिंग) संकलन समय पर होती है, जहाँ निष्पादन से पहले मेथड कॉल्स का समाधान किया जाता है। यह तेज़ तो है, लेकिन कम लचीला है। इसके उदाहरणों में मेथड ओवरलोडिंग और प्राइवेट या फ़ाइनल मेथड्स शामिल हैं। Java.

गतिशील बाइंडिंग (लेट बाइंडिंग) रनटाइम पर होता है, जहाँ मेथड कॉल ऑब्जेक्ट के वास्तविक प्रकार पर निर्भर करता है। यह बहुरूपता और लचीलेपन को सक्षम बनाता है, लेकिन प्रदर्शन लागत बढ़ा सकता है।

पहलू स्थैतिक बाइंडिंग गतिशील बाइंडिंग
संकल्प संकलन का समय क्रम
उदाहरण ओवरलोडिंग अधिभावी
लचीलापन निम्न हाई
गति तेज़ थोड़ा धीमा

उदाहरण के लिए, में Java, एक ओवरराइड को कॉल करना toString() विधि वास्तविक ऑब्जेक्ट प्रकार पर निर्भर करती है, जिससे यह गतिशील बाइंडिंग का मामला बन जाता है।


13) OOP में किसी ऑब्जेक्ट का जीवनचक्र क्या है?

ऑब्जेक्ट जीवनचक्र, किसी ऑब्जेक्ट के निर्माण से लेकर विनाश तक के चरणों को दर्शाता है। इस जीवनचक्र को समझने से डेवलपर्स को मेमोरी और संसाधनों का कुशलतापूर्वक प्रबंधन करने में मदद मिलती है।

इंटर्नशिप:

  1. निर्माण -ऑब्जेक्ट को कन्स्ट्रक्टर का उपयोग करके इंस्टैंशिएट किया जाता है।
  2. आरंभीकरण - विशेषताओं को मान निर्दिष्ट किए जाते हैं, अक्सर कन्स्ट्रक्टर पैरामीटर के माध्यम से।
  3. प्रयोग - विधियों को लागू किया जाता है और डेटा में हेरफेर किया जाता है।
  4. अंतिम रूप देना/विनाश - ऑब्जेक्ट दायरे से बाहर चला जाता है या स्पष्ट रूप से नष्ट हो जाता है। C++, विध्वंसक सफाई का काम संभालते हैं; Java या C# में, कचरा संग्रहण मेमोरी को संभालता है।

उदाहरण: ए FileHandler ऑब्जेक्ट फ़ाइल खोलने के लिए बनाया जाता है, डेटा पढ़ने के लिए इस्तेमाल किया जाता है, और अंत में फ़ाइल हैंडल रिलीज़ करने के लिए नष्ट कर दिया जाता है। उचित जीवनचक्र प्रबंधन मेमोरी लीक और संसाधन लॉकिंग को रोकता है।


14) मित्र फलन और मित्र वर्ग की अवधारणा को समझाइए।

In C++, मित्र कार्यों और मित्र वर्ग बाहरी फ़ंक्शन या क्लास को किसी अन्य क्लास के निजी और संरक्षित सदस्यों तक पहुँचने की अनुमति देते हैं। ये एनकैप्सुलेशन के सिद्धांत के अपवाद हैं, जिसका उपयोग उन परिदृश्यों में किया जाता है जहाँ कड़े सहयोग की आवश्यकता होती है।

  • मित्र फ़ंक्शन: का उपयोग करके घोषित किया गया friend किसी क्लास के भीतर कीवर्ड। उदाहरण: एक फ़ंक्शन जो ओवरलोड करता है << ऑपरेटर वर्ग सामग्री प्रदर्शित करने के लिए.
  • मित्र वर्ग: किसी अन्य वर्ग को निजी सदस्यों तक सीधी पहुँच प्रदान करता है। उदाहरण: A Logger कक्षा का मित्र होना BankAccount लेन-देन लॉग करने के लिए.

यद्यपि मित्र शक्तिशाली होते हैं, परन्तु उनका अत्यधिक उपयोग, सम्मिलन को कमजोर कर सकता है, इसलिए उनका उपयोग संयमपूर्वक तथा सोच-समझकर किया जाना चाहिए।


15) वर्चुअल फ़ंक्शन और शुद्ध वर्चुअल फ़ंक्शन क्या हैं?

A आभासी फ़ंक्शन आधार वर्ग में एक सदस्य फ़ंक्शन है जिसे घोषित किया गया है virtual कीवर्ड, व्युत्पन्न वर्गों को इसके व्यवहार को ओवरराइड करने में सक्षम बनाता है। यह रनटाइम बहुरूपता का समर्थन करता है। उदाहरण: Shape::draw() में ओवरराइड किया गया Circle और Square.

A शुद्ध आभासी फ़ंक्शन एक आभासी फ़ंक्शन है जिसका कोई कार्यान्वयन नहीं है, जिसे इस प्रकार परिभाषित किया गया है = 0यह एक वर्ग को अमूर्त बनाता है, यह सुनिश्चित करते हुए कि व्युत्पन्न वर्गों को फ़ंक्शन को लागू करना होगा।

पहलू आभासी कार्य शुद्ध आभासी फलन
कार्यान्वयन डिफ़ॉल्ट बॉडी है कोई कार्यान्वयन नहीं
कक्षा का प्रकार तत्काल बनाया जा सकता है सार वर्ग
आवश्यकता ओवरराइड करना वैकल्पिक है ओवरराइड करना होगा

साक्षात्कार के संदर्भ में, अमूर्तता को लागू करने और विस्तार योग्य आर्किटेक्चर को डिजाइन करने के लिए शुद्ध आभासी फ़ंक्शन महत्वपूर्ण हैं।


16) ओ.ओ.पी. के फायदे और नुकसान क्या हैं?

ओ.ओ.पी. अनेक लाभ प्रदान करता है, लेकिन कुछ सीमाएं भी रखता है।

फायदे:

  • रेस की क्षमता विरासत के माध्यम से.
  • प्रतिरूपकता कोड को कक्षाओं में व्यवस्थित करके.
  • लचीलापन बहुरूपता के साथ.
  • सुरक्षा एनकैप्सुलेशन और डेटा छिपाने के माध्यम से।

नुकसान:

  • जटिलता: ओ.ओ.पी. में तीव्र सीखने की प्रक्रिया शामिल हो सकती है।
  • प्रदर्शन ओवरहेड: ऑब्जेक्ट निर्माण और कचरा संग्रहण निष्पादन को धीमा कर सकते हैं।
  • मेमोरी खपत: ऑब्जेक्ट्स अक्सर प्रक्रियात्मक कोड की तुलना में अधिक मेमोरी का उपभोग करते हैं।
फायदे नुकसान
कोड का पुन: उपयोग बढ़ी हुई जटिलता
बेहतर रखरखाव कुछ मामलों में धीमी गति से निष्पादन
एनकैप्सुलेशन के साथ सुरक्षा बड़े कार्यक्रम का आकार
अनुमापकता छोटे कार्यों के लिए हमेशा उपयुक्त नहीं

इस प्रकार, OOP बड़े पैमाने के अनुप्रयोगों के लिए अत्यधिक प्रभावी है, लेकिन छोटी स्क्रिप्ट के लिए कम अनुकूल हो सकता है।


17) ओ.ओ.पी. में अपवादों को कैसे संभाला जाता है?

अपवाद प्रबंधन, प्रोग्राम को क्रैश किए बिना रनटाइम त्रुटियों को सुचारू रूप से प्रबंधित करने का एक तंत्र है। OOP में, अपवाद त्रुटि स्थितियों का प्रतिनिधित्व करने वाली वस्तुएँ होती हैं।

सामान्य प्रक्रिया में निम्नलिखित शामिल हैं:

  1. ब्लॉक का प्रयास करें - कोड जो अपवाद उत्पन्न कर सकता है।
  2. कैच ब्लॉक - विशिष्ट अपवाद प्रकारों को संभालता है.
  3. अंत में ब्लॉक (में Java/C#) – अपवादों की परवाह किए बिना क्लीनअप कोड निष्पादित करता है।

उदाहरण Java:

try {
    int result = 10 / 0;
} catch (ArithmeticException e) {
    System.out.println("Division by zero not allowed.");
} finally {
    System.out.println("Execution completed.");
}

लाभों में बेहतर त्रुटि प्रबंधन, आकस्मिक विफलताओं की रोकथाम, तथा त्रुटि-नियंत्रक तर्क को व्यावसायिक तर्क से पृथक करना शामिल है।


18) क्या ऑब्जेक्ट हमेशा मेमोरी का उपभोग करते हैं, और मेमोरी का आवंटन कैसे किया जाता है?

हाँ, ऑब्जेक्ट मेमोरी का उपभोग करते हैं, लेकिन आवंटन भाषा कार्यान्वयन पर निर्भर करता है। OOP में:

  • स्थैतिक आवंटन: क्लास-स्तरीय (स्थिर) चरों के लिए मेमोरी संकलन समय पर एक बार आवंटित की जाती है।
  • हीप आवंटन: इंस्टैंस (ऑब्जेक्ट) आमतौर पर हीप मेमोरी में संग्रहीत होते हैं, जो रनटाइम पर गतिशील रूप से आवंटित होते हैं।
  • स्टैक आवंटन: ऑब्जेक्ट्स के संदर्भ या पॉइंटर्स स्टैक पर रह सकते हैं।

उदाहरण Java:

Car myCar = new Car("Red");

यहाँ, संदर्भ myCar स्टैक पर होता है, जबकि वास्तविक ऑब्जेक्ट हीप पर रहता है। कुशल मेमोरी प्रबंधन के लिए कंस्ट्रक्टर, डिस्ट्रक्टर और गार्बेज कलेक्शन को समझना आवश्यक है।


19) संयोजन और वंशानुक्रम में क्या अंतर है?

दोनों ही कोड के पुनः उपयोग के तंत्र हैं, लेकिन वे मौलिक रूप से भिन्न हैं।

  • विरासतएक "है-एक" संबंध जहाँ एक उपवर्ग अपने जनक से व्यवहार प्राप्त करता है। उदाहरण: Car से विरासत में मिला है Vehicle.
  • रचनाएक "है-ए" संबंध जहाँ एक वर्ग अन्य वर्गों के एक या अधिक ऑब्जेक्ट्स से बना होता है। उदाहरण: Car एक है Engine.
पहलू विरासत रचना
रिश्ता एक है एक
युग्मन तंग ढीला
लचीलापन Less लचीला अधिक लचीला
उदाहरण पदानुक्रमिक संरचनाएं गतिशील व्यवहार संरचना

आधुनिक सर्वोत्तम प्रथाएँ अक्सर प्रोत्साहित करती हैं विरासत पर संरचना अधिक लचीलेपन और कम युग्मन के लिए।


20) डिज़ाइन पैटर्न OOP से कैसे संबंधित हैं?

डिज़ाइन पैटर्न बार-बार आने वाली सॉफ़्टवेयर डिज़ाइन समस्याओं के सिद्ध, पुन: प्रयोज्य समाधान हैं, जिन्हें अक्सर OOP सिद्धांतों का उपयोग करके लागू किया जाता है। वे संरचित और रखरखाव योग्य कोड बनाने के लिए अमूर्तता, एनकैप्सुलेशन, इनहेरिटेंस और बहुरूपता का लाभ उठाते हैं।

उदाहरणों में शामिल हैं:

  • रचनात्मक पैटर्न (उदाहरण, सिंगलटन, फैक्ट्री) - ऑब्जेक्ट निर्माण को सरल बनाएं।
  • संरचनात्मक पैटर्न (उदाहरणार्थ, एडाप्टर, डेकोरेटर) - कक्षाओं के बीच संबंध परिभाषित करें।
  • स्वभावजन्य तरीका (उदाहरण, पर्यवेक्षक, रणनीति) - ऑब्जेक्ट संचार का प्रबंधन करें।

उदाहरण के लिए, प्रेक्षक पैटर्न जब कोई विषय वस्तु अपनी स्थिति बदलती है, तो कई वस्तुओं (पर्यवेक्षकों) को अद्यतन करने की अनुमति देता है, जिसका प्रयोग अक्सर इवेंट-संचालित प्रणालियों में किया जाता है। डिज़ाइन पैटर्न को शामिल करने से OOP में बुनियादी बातों से परे गहरी विशेषज्ञता प्रदर्शित होती है।


21) ओ.ओ.पी. में विभिन्न प्रकार के कंस्ट्रक्टर क्या हैं?

कंस्ट्रक्टर ऑब्जेक्ट्स को इनिशियलाइज़ करते हैं, और उनके प्रकार अलग-अलग भाषाओं में अलग-अलग होते हैं। सामान्य प्रकारों में शामिल हैं:

  1. डिफ़ॉल्ट निर्माता - कोई पैरामीटर नहीं लेता, डिफ़ॉल्ट मानों के साथ आरंभ करता है।
  2. परिमापक संवाहक - निर्माण के समय मान निर्दिष्ट करने के लिए पैरामीटर स्वीकार करता है।
  3. कॉपी कंस्ट्रक्टर - किसी मौजूदा ऑब्जेक्ट की प्रतिलिपि के रूप में एक नया ऑब्जेक्ट बनाता है।
class Student {
public:
    string name;
    Student() { name = "Unknown"; }                 // Default
    Student(string n) { name = n; }                 // Parameterized
    Student(const Student &s) { name = s.name; }    // Copy
};
प्रकार उद्देश्य उदाहरण
चूक कोई तर्क नहीं Student()
पैरामिट्रीकृत मानों के साथ आरंभ करें Student("John")
प्रतिलिपि मौजूदा क्लोन Student(s1)

यह लचीलापन डेवलपर्स को ऑब्जेक्ट निर्माण को विभिन्न तरीकों से संभालने की अनुमति देता है।


22) डिस्ट्रक्टर फ़ाइनलाइज़ विधि से किस प्रकार भिन्न है?

A नाशक एक OOP सुविधा है (उदाहरण के लिए, C++ और C#) का उपयोग किसी ऑब्जेक्ट के नष्ट होने पर संसाधन रिलीज़ करने के लिए किया जाता है। जब कोई ऑब्जेक्ट स्कोप से बाहर चला जाता है, तो यह स्वचालित रूप से लागू हो जाता है।

RSI अंतिम रूप दें() विधि in Java एक समान अवधारणा थी लेकिन तब से इसे हटा दिया गया है Java 9 क्योंकि कचरा संग्रहकर्ता पहले से ही मेमोरी का कुशलतापूर्वक प्रबंधन करते हैं, और अंतिम रूप पर निर्भर रहने से अप्रत्याशितता पैदा होती है।

पहलू नाशक अंतिम विधि
भाषा C++, सी# Java (बहिष्कृत)
मंगलाचरण जब वस्तु नष्ट हो जाती है GC द्वारा ऑब्जेक्ट हटाने से पहले
नियंत्रण नियतात्मक गैर नियतात्मक
उदाहरण मुक्त संसाधन विरासत की सफाई

आधुनिक अभ्यास स्पष्ट संसाधन प्रबंधन का पक्षधर है संसाधनों के साथ प्रयास करें in Java or ब्लॉक का उपयोग करके सी# में.


23) की भूमिका क्या है? this सूचक या संदर्भ?

RSI this कीवर्ड वर्तमान ऑब्जेक्ट इंस्टेंस को संदर्भित करता है। इसकी भूमिका भाषा के अनुसार भिन्न होती है, लेकिन आमतौर पर इसमें शामिल हैं:

  • उदाहरण चर और विधि पैरामीटर के बीच अंतर करना।
  • वर्तमान ऑब्जेक्ट को अन्य विधियों में तर्क के रूप में पास करना।
  • किसी विधि से वर्तमान ऑब्जेक्ट को वापस करना (विधि श्रृंखलाबद्ध करना)।

उदाहरण Java:

class Employee {
    String name;
    Employee(String name) {
        this.name = name; // disambiguates parameter vs variable
    }
}

In C++, this एक वास्तविक सूचक है, जबकि Java और C# के लिए, यह एक संदर्भ है। यह स्पष्टता में सुधार करता है और धाराप्रवाह प्रोग्रामिंग पैटर्न को सक्षम बनाता है।


24) क्लास और स्ट्रक्चर में क्या अंतर है?

कक्षाएं और संरचनाएं दोनों उपयोगकर्ता-परिभाषित प्रकार हैं, लेकिन उद्देश्य और कार्यान्वयन में भिन्न हैं।

पहलू वर्ग संरचना
डिफ़ॉल्ट पहुँच निजी सार्वजनिक
विरासत का समर्थन करता है हाँ नहीं (C++ केवल सीमित)
याद ढेर (सामान्यतः) स्टैक (सामान्यतः)
उदाहरण जटिल संस्थाएँ हल्के डेटा कंटेनर

उदाहरण:

  • वर्ग: एक Car विधियों और स्थिति के साथ वर्ग.
  • संरचना: एक Point संरचना का प्रतिनिधित्व (x, y) निर्देशांक।

आधुनिक ओ.ओ.पी. में, वंशानुक्रम और बहुरूपता जैसी उन्नत विशेषताओं के कारण कक्षाएं हावी रहती हैं, जबकि संरचनाएं हल्के, अपरिवर्तनीय डेटा ऑब्जेक्ट्स के लिए आरक्षित होती हैं।


25) स्थैतिक सदस्य, इंस्टैंस सदस्यों से किस प्रकार भिन्न होते हैं?

स्थैतिक सदस्य ये क्लास से ही संबंधित होते हैं, किसी ऑब्जेक्ट इंस्टेंस से नहीं। ये सभी ऑब्जेक्ट्स में साझा किए जाते हैं और एक बार आरंभ किए जाते हैं।

उदाहरण सदस्य प्रत्येक ऑब्जेक्ट से संबंधित, प्रत्येक उदाहरण के लिए अद्वितीय मान के साथ।

उदाहरण Java:

class Counter {
    static int count = 0; // shared
    int id;
    Counter() { id = ++count; }
}

यहाँ, count निर्मित वस्तुओं की संख्या को ट्रैक करता है, जबकि id प्रत्येक वस्तु के लिए अलग-अलग होता है।

Feature स्थिर सदस्य उदाहरण सदस्य
विस्तार कक्षा स्तर वस्तु स्तर
याद एकल प्रति कई प्रतियाँ
पहुँच कक्षा का नाम वस्तु संदर्भ

स्थैतिक सदस्य स्थिरांक, उपयोगिताओं या साझा काउंटरों के लिए आदर्श होते हैं।


26) सीलबंद वर्ग या संशोधक क्या हैं?

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

  • In C#, sealed कीवर्ड आगे की विरासत को रोकता है।
  • In Java (जेडीके 15 से)सीलबंद कक्षाएं स्पष्ट रूप से केवल कुछ उपवर्गों को ही अनुमति देती हैं, जिससे वर्ग पदानुक्रम पर नियंत्रण में सुधार होता है।

उदाहरण (Java 17):

sealed class Shape permits Circle, Square {}
final class Circle extends Shape {}
final class Square extends Shape {}

लाभ:

  • आधार वर्गों के दुरुपयोग को रोकता है।
  • विस्तार को प्रतिबंधित करके रखरखाव में सुधार करता है।
  • स्विच अभिव्यक्तियों में विस्तृत प्रकार पदानुक्रम बनाने के लिए उपयोगी।

27) क्या आप उदाहरणों के साथ संकलन-समय और रनटाइम बहुरूपता के बीच अंतर समझा सकते हैं?

संकलन-समय बहुरूपता (प्रारंभिक बाइंडिंग) संकलन समय पर विधि कॉल का समाधान करता है, जिसे सामान्यतः विधि ओवरलोडिंग का उपयोग करके प्राप्त किया जाता है।

रनटाइम बहुरूपता (लेट बाइंडिंग) निष्पादन के दौरान कॉल को हल करता है, जिसे आमतौर पर विधि ओवरराइडिंग के माध्यम से प्राप्त किया जाता है।

उदाहरण Java:

// Compile-time
class MathOps {
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
}

// Runtime
class Animal { void speak() { System.out.println("Generic"); } }
class Dog extends Animal { void speak() { System.out.println("Bark"); } }
पहलू संकलन समय क्रम
बंधन शीघ्र देर से
Feature ओवरलोडिंग अधिभावी
प्रदर्शन तेज़ लचीला
उदाहरण add(int, int) Dog.speak()

28) OOP में SOLID जैसे डिज़ाइन सिद्धांत क्या हैं?

RSI ठोस सिद्धांत रखरखाव योग्य और स्केलेबल OOP डिज़ाइन बनाने के लिए दिशानिर्देश हैं:

  1. Sएकल उत्तरदायित्व सिद्धांत - एक वर्ग के पास परिवर्तन का एक कारण होना चाहिए।
  2. Oकलम/बंद सिद्धांत - विस्तार के लिए खुला, संशोधन के लिए बंद।
  3. Lइस्कोव प्रतिस्थापन सिद्धांत - उपप्रकारों को आधार प्रकारों के लिए प्रतिस्थापन योग्य होना चाहिए।
  4. Iइंटरफ़ेस पृथक्करण सिद्धांत - छोटे, विशिष्ट इंटरफेस को प्राथमिकता दें।
  5. Dनिर्भरता व्युत्क्रम सिद्धांत - अमूर्तता पर निर्भर रहें, ठोस बातों पर नहीं।

उदाहरण: एक अखंड के बजाय Report क्लास को जनरेशन, एक्सपोर्ट और डिस्प्ले को संभालने के लिए, इसे छोटी क्लासों में विभाजित करें। इससे मॉड्यूलरिटी और टेस्टेबिलिटी में सुधार होता है। SOLID सर्वोत्तम प्रथाओं के अनुरूप है और कई डिज़ाइन पैटर्न का आधार है।


29) उथली प्रतिलिपि और गहरी प्रतिलिपि में क्या अंतर है?

  • उथली प्रतिलिपि: केवल संदर्भों की प्रतिलिपि बनाता है, स्वयं वस्तुओं की नहीं। एक में परिवर्तन दूसरे को प्रभावित करता है।
  • गहरी प्रतिलिपि: हर चीज़ की प्रतिलिपि बनाता है, स्वतंत्र ऑब्जेक्ट बनाता है।

उदाहरण Java:

// Shallow copy
List list1 = new ArrayList<>();
list1.add("A");
List list2 = list1; // both refer to same object

// Deep copy
List list3 = new ArrayList<>(list1); // new object
Feature उथली प्रतिलिपि गहरी प्रतिलिपि
कॉपी स्तर केवल संदर्भ पूर्ण ऑब्जेक्ट ग्राफ़
स्वतंत्रता नहीं हाँ
प्रदर्शन तेज़ और धीमा
उदाहरण अपरिवर्तनीय वस्तुएँ परिवर्तनशील, जटिल संरचनाएं

अनपेक्षित दुष्प्रभावों को रोकने के लिए इस अंतर को समझना महत्वपूर्ण है।


30) वास्तविक जीवन के उदाहरण ओ.ओ.पी. अवधारणाओं को कैसे चित्रित करते हैं?

वास्तविक दुनिया के सादृश्य OOP को स्पष्ट करते हैं:

  • कैप्सूलीकरणएक कैप्सूल गोली कई अवयवों को छुपाती है, ठीक उसी तरह जैसे एक क्लास डेटा को छुपाती है।
  • मतिहीनताटीवी रिमोट में जटिल आंतरिक वायरिंग छिपी होती है, तथा केवल बटन ही दिखाई देते हैं।
  • विरासत: एक कुत्ते को जानवरों से गुण विरासत में मिलते हैं (जैसे, सांस लेना, गति)।
  • बहुरूपता: एक फ़ंक्शन makeSound() बिल्ली (म्याऊं) बनाम कुत्ते (भौंकना) के लिए अलग-अलग व्यवहार करता है।

ऐसी उपमाएँ दर्शाती हैं कि OOP कैसे वास्तविक दुनिया की प्रणालियों को स्वाभाविक तरीके से मॉडल करता है। उदाहरण के लिए, बैंकिंग आवेदन खाता विवरणों को समाहित करता है, खाता प्रकारों के लिए वंशानुक्रम का उपयोग करता है, लेन-देन में बहुरूपता लागू करता है, और उपयोगकर्ताओं से संचालनों को अलग करता है। ये संबंध उम्मीदवारों को साक्षात्कारों में व्यावहारिक स्पष्टता के साथ अवधारणाओं को समझाने में मदद करते हैं।


31) ओवरलोडिंग और ओवरराइडिंग में क्या अंतर है, उदाहरण सहित समझाइये?

ओवरलोडिंग और ओवरराइडिंग OOP में दो अलग-अलग तंत्र हैं जो बहुरूपता को सक्षम करते हैं।

  • ओवरलोडिंग: एक ही क्लास में तब होता है जब मेथड्स का नाम एक ही होता है लेकिन पैरामीटर अलग-अलग होते हैं। इसका समाधान इस प्रकार होता है: संकलन समय.
  • अधिभावी: तब होता है जब कोई उपवर्ग अपने सुपरक्लास में परिभाषित किसी विधि का विशिष्ट कार्यान्वयन प्रदान करता है। इसका समाधान इस प्रकार होता है: क्रम.

उदाहरण Java:

// Overloading
class Calculator {
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
}

// Overriding
class Animal { void speak() { System.out.println("Generic"); } }
class Dog extends Animal { void speak() { System.out.println("Bark"); } }
Feature ओवरलोडिंग अधिभावी
बंधन संकलन समय क्रम
पैरामीटर्स भिन्न होना चाहिए एक जैसा होना चाहिए
वापसी प्रकार भिन्न हो सकते हैं एक जैसा होना चाहिए
उदाहरण लचीलापन विशेषज्ञता

32) ओओपी डिज़ाइन में अमूर्त वर्गों का उपयोग कैसे किया जाता है?

अमूर्त वर्ग अन्य वर्गों के लिए एक आंशिक खाका प्रदान करते हैं। इन्हें सीधे इंस्टैंशिएट नहीं किया जा सकता, लेकिन इनमें अमूर्त विधियाँ (कार्यान्वयन के बिना) और ठोस विधियाँ (कार्यान्वयन के साथ) दोनों शामिल हो सकती हैं। इससे डेवलपर्स उपवर्गों के लिए लचीलापन छोड़ते हुए एक सामान्य संरचना लागू कर सकते हैं।

उदाहरण:

abstract class Shape {
    abstract void draw();
    void info() { System.out.println("I am a shape"); }
}
class Circle extends Shape {
    void draw() { System.out.println("Drawing Circle"); }
}	

यहां, सभी उपवर्गों को लागू करना होगा draw(), स्थिरता सुनिश्चित करते हुए। अमूर्त वर्ग विशेष रूप से फ्रेमवर्क में उपयोगी होते हैं, जहाँ आधार वर्ग पुन: प्रयोज्य तर्क प्रदान करते हैं, जबकि यह सुनिश्चित करते हैं कि व्युत्पन्न वर्ग विशिष्ट विवरण प्रदान करें।


33) इंटरफेस क्या हैं, और वे अमूर्त क्लासों से कैसे भिन्न हैं?

An इंटरफेस एक अनुबंध को परिभाषित करता है जिसे कक्षाओं को अपनी सभी विधियों को लागू करके पूरा करना होगा। यह इस बात पर ज़ोर देता है कि एक वर्ग को "क्या" करना चाहिए, न कि "कैसे"। अमूर्त कक्षाओं के विपरीत, इंटरफ़ेस में आमतौर पर कोई स्थिति नहीं होती है और वे केवल व्यवहार को परिभाषित करते हैं।

उदाहरण Java:

interface Flyable {
    void fly();
}
class Bird implements Flyable {
    public void fly() { System.out.println("Bird flies"); }
}
पहलू सार वर्ग इंटरफेस
तरीके अमूर्त + ठोस सार (आधुनिक में डिफ़ॉल्ट विधियों के साथ) Java)
चर फ़ील्ड हो सकते हैं केवल स्थिरांक
विरासत सिंगल विभिन्न
उद्देश्य सामान्य आधार व्यवहार अनुबंध

इंटरफेस एकाधिक विरासत का समर्थन करते हैं, जिससे वे निम्न जैसी क्षमताओं को परिभाषित करने के लिए उपयुक्त हो जाते हैं Serializable or Comparable.


34) एक्सेस स्पेसिफायर क्या हैं? C++/Java, और वे विभिन्न भाषाओं में किस प्रकार भिन्न होते हैं?

एक्सेस विनिर्देशक वर्ग सदस्यों की दृश्यता निर्धारित करते हैं।

  • C++: निजी (कक्षाओं के लिए डिफ़ॉल्ट), संरक्षित, सार्वजनिक।
  • Java: निजी, संरक्षित, सार्वजनिक, और डिफ़ॉल्ट (पैकेज-निजी)।
विनिर्देशक C++ Java
निजी केवल कक्षा के भीतर केवल कक्षा के भीतर
संरक्षित वर्ग + उपवर्ग वर्ग + उपवर्ग + समान पैकेज
सार्वजनिक कहीं भी कहीं भी
चूक लागू नहीं होता केवल पैकेज के भीतर

उदाहरण के लिए, में C++तक struct करने के लिए चूक सार्वजनिक, जबकि एक class करने के लिए चूक निजी, जबकि में Java, डिफ़ॉल्ट/पैकेज-निजी केवल उसी पैकेज के भीतर पहुंच की अनुमति देता है।


35) ऑपरेटर ओवरलोडिंग क्या है, और इसकी सीमाएँ क्या हैं?

Operaटोर ओवरलोडिंग डेवलपर्स को उपयोगकर्ता-परिभाषित प्रकारों के लिए ऑपरेटरों को पुनर्परिभाषित करने की अनुमति देता है, जिससे कोड की पठनीयता में सुधार होता है। यह मुख्य रूप से C++.

उदाहरण:

class Complex {
public:
    int real, imag;
    Complex operator+(const Complex &c) {
        return {real + c.real, imag + c.imag};
    }
};

यद्यपि यह शक्तिशाली है, फिर भी इसकी सीमाएँ हैं:

  • सभी ऑपरेटरों को ओवरलोड नहीं किया जा सकता (उदाहरण के लिए, ::, .?).
  • अधिक उपयोग से स्पष्टता कम हो सकती है।
  • यह कस्टम ऑपरेटरों से अपरिचित टीमों के लिए सीखने की जटिलता को बढ़ाता है।

इस प्रकार, ऑपरेटर ओवरलोडिंग का उपयोग विवेकपूर्ण तरीके से किया जाना चाहिए, मुख्यतः गणितीय या डोमेन-विशिष्ट वर्गों के लिए जहां प्राकृतिक ऑपरेटर सिमेंटिक्स पठनीयता में सुधार करता है।


36) स्थैतिक विधियाँ इंस्टैंस विधियों से किस प्रकार भिन्न होती हैं?

स्थैतिक विधियाँ किसी वर्ग से संबंधित होती हैं, किसी इंस्टैंस से नहीं, और इन्हें वर्ग नाम का उपयोग करके लागू किया जा सकता है। इंस्टैंस विधियाँ विशिष्ट ऑब्जेक्ट्स पर कार्य करती हैं।

उदाहरण Java:

class MathUtils {
    static int square(int x) { return x * x; }
    int add(int a, int b) { return a + b; }
}

उपयोग:

  • MathUtils.square(4); → स्थैतिक विधि.
  • new MathUtils().add(2, 3); → उदाहरण विधि.
Feature स्थैतिक विधि उदाहरण विधि
विस्तार कक्षा-स्तर वस्तु स्तर
पहुँच केवल स्थिर डेटा स्थिर और उदाहरण डेटा दोनों
मंगलाचरण कक्षा का नाम वस्तु संदर्भ

स्थैतिक विधियां उपयोगिता कार्यों के लिए आदर्श होती हैं, जबकि इंस्टेंस विधियां ऑब्जेक्ट-विशिष्ट डेटा के साथ काम करती हैं।


37) ओ.ओ.पी. के वास्तविक नुकसान क्या हैं?

अपनी खूबियों के बावजूद, OOP में कुछ कमियां हैं:

  • प्रदर्शन ओवरहेड अमूर्त परतों, गतिशील प्रेषण और कचरा संग्रहण के कारण।
  • स्मृति उपयोग ऑब्जेक्ट्स द्वारा अतिरिक्त मेटाडेटा संग्रहीत करने पर यह बढ़ जाता है।
  • जटिलतागहन विरासत पदानुक्रम नाजुक प्रणालियों का निर्माण कर सकते हैं।
  • सर्वत्र उपयुक्त नहींछोटी स्क्रिप्ट या प्रदर्शन-महत्वपूर्ण कार्यों के लिए, प्रक्रियात्मक या कार्यात्मक प्रतिमान बेहतर हो सकते हैं।

उदाहरण: गेम डेवलपमेंट में, उच्च-प्रदर्शन इंजन अक्सर पसंद करते हैं डेटा-उन्मुख डिज़ाइन रनटाइम ओवरहेड से बचने के लिए OOP पर।

इस प्रकार, जबकि OOP रखरखाव और मापनीयता में उत्कृष्ट है, इसकी कमियों को परियोजना आवश्यकताओं के विरुद्ध तौला जाना चाहिए।


38) बहुविध विरासत क्या है, और विभिन्न भाषाएं इसे कैसे संभालती हैं?

मल्टीपल इनहेरिटेंस एक क्लास को एक से ज़्यादा सुपरक्लास से इनहेरिट करने की सुविधा देता है। हालाँकि यह शक्तिशाली है, लेकिन इसमें कुछ जटिलताएँ भी हैं, जैसे हीरे की समस्या, जहां साझा आधार वर्गों से अस्पष्टता उत्पन्न होती है।

  • C++ स्पष्ट स्कोपिंग के साथ बहु विरासत का समर्थन करता है।
  • Java और सी# इससे बचें लेकिन इसके माध्यम से इसका अनुकरण करें इंटरफेस.

उदाहरण C++:

class A { public: void show() {} };
class B { public: void show() {} };
class C : public A, public B {};

इस मामले में, कॉल करना C.show() अस्पष्ट है जब तक कि दायरे में न हो (C.A::show()).

इसलिए, आधुनिक भाषाएं सुरक्षित डिजाइन के लिए संरचना या इंटरफेस को प्राथमिकता देती हैं।


39) OOP भाषाओं में कचरा संग्रहण कैसे काम करता है? Java और सी#?

कचरा संग्रहण (जीसी) स्वचालित रूप से उन वस्तुओं को हटाकर मेमोरी को पुनः प्राप्त करता है, जिनका अब प्रोग्राम द्वारा संदर्भ नहीं दिया जाता।

मुख्य कदम:

  1. मार्क - सभी सक्रिय संदर्भों की पहचान करता है।
  2. स्वीप - गैर-संदर्भित वस्तुओं द्वारा व्याप्त मेमोरी को मुक्त करता है।
  3. कॉम्पैक्ट (वैकल्पिक) - विखंडन को कम करने के लिए मेमोरी को पुनर्व्यवस्थित करता है।

उदाहरण Java:

MyObject obj = new MyObject();
obj = null; // eligible for GC

लाभ: मेमोरी लीक को रोकता है, डेवलपर का बोझ कम करता है।

सीमाएँ: गैर-नियतात्मक समय, संभावित प्रदर्शन विराम।

C++ इसमें अंतर्निहित GC का अभाव है, इसके बजाय यह डिस्ट्रक्टर्स और स्मार्ट पॉइंटर्स पर निर्भर है (std::unique_ptr).


40) प्रक्रियात्मक प्रोग्रामिंग और ओओपी के बीच मुख्य अंतर क्या हैं?

प्रक्रियात्मक प्रोग्रामिंग कोड को प्रक्रियाओं (फ़ंक्शन) में व्यवस्थित करती है, जबकि OOP इसे ऑब्जेक्ट्स में व्यवस्थित करती है।

Feature प्रक्रियात्मक OOP
फोकस कार्य और प्रक्रियाएँ वस्तुएँ (स्थिति + व्यवहार)
जानकारी वैश्विक या फ़ंक्शनों के बीच पारित वस्तुओं में समाहित
कोड का पुन: उपयोग फ़ंक्शन और लूप वंशानुक्रम, बहुरूपता
उदाहरण C Java, C++, Python

उदाहरण:

  • प्रक्रियात्मक प्रोग्रामिंग में, बैंकिंग एप्लिकेशन के लिए अलग-अलग कार्य होते हैं deposit() और withdraw().
  • ओओपी में, एक Account ऑब्जेक्ट इन व्यवहारों को समाहित करता है, जिससे मॉड्यूलरिटी और पुन: प्रयोज्यता में सुधार होता है।

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


41) कॉपी कंस्ट्रक्टर क्या है और यह महत्वपूर्ण क्यों है?

A कॉपी कंस्ट्रक्टर में एक विशेष निर्माता है C++ जो उसी क्लास के किसी अन्य ऑब्जेक्ट का उपयोग करके एक नए ऑब्जेक्ट को इनिशियलाइज़ करता है। यह उन ऑब्जेक्ट्स की सही ढंग से प्रतिलिपि बनाने के लिए महत्वपूर्ण है जो डायनेमिक मेमोरी या फ़ाइल हैंडल जैसे संसाधनों का प्रबंधन करते हैं।

उदाहरण:

class Student {
public:
    string name;
    Student(const Student &s) { name = s.name; }
};

कस्टम कॉपी कंस्ट्रक्टर के बिना, उथली कॉपी हो सकती है, जिससे मेमोरी का दोहरा विलोपन जैसी समस्याएँ हो सकती हैं। कॉपी कंस्ट्रक्टर यह सुनिश्चित करते हैं गहरी नकल जब आवश्यक हो, तो ऑब्जेक्ट्स की स्वतंत्रता को बनाए रखते हुए। ये उन सिस्टम्स में महत्वपूर्ण हैं जो डायनेमिक मेमोरी एलोकेशन, लिंक्ड स्ट्रक्चर्स या फ़ाइल डिस्क्रिप्टर को संभालते हैं।


42) क्या स्थैतिक विधियाँ गैर-स्थैतिक सदस्यों तक पहुँच सकती हैं?

नहीं, स्टैटिक मेथड्स नॉन-स्टैटिक मेंबर्स तक सीधे पहुँच नहीं सकते क्योंकि वे किसी विशिष्ट ऑब्जेक्ट के बजाय क्लास से संबंधित होते हैं। नॉन-स्टैटिक मेंबर्स केवल ऑब्जेक्ट के इंस्टैंशिएट होने के बाद ही मौजूद होते हैं, जबकि स्टैटिक मेथड्स क्लास स्तर पर काम करते हैं।

उदाहरण Java:

class Example {
    int x = 10;
    static void show() {
        // System.out.println(x); // Error
    }
}

हालाँकि, स्थैतिक विधियाँ ऑब्जेक्ट बनाकर अप्रत्यक्ष रूप से गैर-स्थैतिक सदस्यों तक पहुँच सकती हैं:

Example e = new Example();
System.out.println(e.x);

यह प्रतिबंध तार्किक संगति सुनिश्चित करता है क्योंकि स्थैतिक विधियां ऑब्जेक्ट्स से स्वतंत्र रूप से मौजूद होती हैं।


43) आधार वर्ग, उपवर्ग और सुपरक्लास क्या हैं?

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

उदाहरण:

class Vehicle { void move() { System.out.println("Moving"); } }
class Car extends Vehicle { void honk() { System.out.println("Horn"); } }

यहाँ, Vehicle आधार/सुपरक्लास है, और Car उपवर्ग है। यह पदानुक्रम सक्षम बनाता है कोड का पुन: उपयोग और वास्तविक दुनिया के रिश्तों को मॉडल करता है। ओओपी डिज़ाइन में, बेस क्लास के लिए सही अमूर्तता का चयन मापनीयता और रखरखाव के लिए आवश्यक है।


44) स्थैतिक और गतिशील बंधन के बीच क्या अंतर है?

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

उदाहरण:

// Static Binding
class MathOps {
    int add(int a, int b) { return a + b; }
}

// Dynamic Binding
class Animal { void speak() { System.out.println("Generic"); } }
class Dog extends Animal { void speak() { System.out.println("Bark"); } }
Feature स्थैतिक बाइंडिंग गतिशील बाइंडिंग
संकल्प संकलन का समय क्रम
उदाहरण ओवरलोडिंग अधिभावी
लचीलापन निम्न हाई
गति तेज़ थोड़ा धीमा

स्थैतिक बाइंडिंग प्रदर्शन में सुधार करती है, जबकि गतिशील बाइंडिंग बहुरूपता और विस्तारशीलता का समर्थन करती है।


45) अमूर्त वर्गों को तत्काल क्यों नहीं बनाया जा सकता?

अमूर्त वर्गों में अमूर्त विधियाँ हो सकती हैं जिनका कार्यान्वयन नहीं होता। चूँकि वे डिज़ाइन में अपूर्ण हैं, इसलिए वे प्रयोग करने योग्य ऑब्जेक्ट नहीं बना सकते। उन्हें इंस्टैंसिएट करने का प्रयास करने से ऐसे ऑब्जेक्ट बनेंगे जिनमें व्यवहार अनुपस्थित होंगे।

उदाहरण Java:

abstract class Shape {
    abstract void draw();
}
Shape s = new Shape(); // Error

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


46) एक अमूर्त वर्ग के लिए कितने उदाहरण बनाए जा सकते हैं?

किसी अमूर्त वर्ग के लिए शून्य उदाहरण बनाए जा सकते हैं। चूँकि अमूर्त वर्गों में अक्रियान्वित विधियाँ शामिल हो सकती हैं, वे अपूर्ण होती हैं और उन्हें सीधे इंस्टैंशिएट नहीं किया जा सकता।

हालाँकि, डेवलपर्स यह कर सकते हैं:

  1. बनाएं उपवर्गों जो सभी अमूर्त विधियों को क्रियान्वित करते हैं।
  2. उन ठोस उपवर्गों की वस्तुओं को तत्कालित करें।

उदाहरण:

abstract class Animal {
    abstract void makeSound();
}
class Dog extends Animal {
    void makeSound() { System.out.println("Bark"); }
}
Animal a = new Dog(); // Valid

इस प्रकार, जबकि अमूर्त वर्ग स्वयं उदाहरण उत्पन्न नहीं कर सकते, वे एक उदाहरण के रूप में कार्य करते हैं। ब्लूप्रिंट पूर्णतः क्रियान्वित उपवर्गों के उदाहरण उत्पन्न करने के लिए।


47) कौन सी OOP अवधारणा कोड पुन: प्रयोज्यता का समर्थन करती है?

विरासत यह प्राथमिक OOP अवधारणा है जो कोड पुन: प्रयोज्यता का समर्थन करती है। उपवर्गों को मूल वर्ग से विधियों और फ़ील्ड का पुन: उपयोग करने की अनुमति देकर, यह अतिरेक को कम करता है और रखरखाव को सरल बनाता है।

उदाहरण:

class Vehicle { void move() { System.out.println("Moving"); } }
class Car extends Vehicle {}

यहाँ, Car स्वचालित रूप से विरासत में मिलता है move() इसे पुनः परिभाषित किये बिना.

पुन: प्रयोज्यता में योगदान देने वाले अन्य कारकों में शामिल हैं:

  • बहुरूपता, एकाधिक ऑब्जेक्ट प्रकारों के लिए जेनेरिक कोड सक्षम करना।
  • रचनालचीले पुन: उपयोग के लिए कक्षाओं को एक साथ जोड़ना। साथ में, ये तंत्र मॉड्यूलरिटी में सुधार करते हैं और बड़ी प्रणालियों में दोहराव को कम करते हैं।

48) क्लास परिभाषा में डिफ़ॉल्ट एक्सेस विनिर्देशक क्या है?

डिफ़ॉल्ट एक्सेस निर्दिष्टकर्ता भाषा के अनुसार भिन्न होता है:

  • C++: कक्षाओं में, सदस्य डिफ़ॉल्ट रूप से निजी होते हैं। निर्देशों में, सदस्य डिफ़ॉल्ट रूप से सार्वजनिक होते हैं।
  • Java: डिफ़ॉल्ट (जिसे पैकेज-प्राइवेट भी कहा जाता है), जिसका अर्थ है कि सदस्य केवल उसी पैकेज के भीतर ही पहुंच योग्य होते हैं।
  • C#: कक्षाएं डिफ़ॉल्ट रूप से आंतरिक होती हैं, जिसका अर्थ है कि वे एक ही असेंबली के भीतर पहुंच योग्य होती हैं।

उदाहरण C++:

class Example { int x; }; // x is private by default
struct Example2 { int x; }; // x is public by default

डिफ़ॉल्ट को समझने से वर्ग सदस्यों के अनपेक्षित प्रदर्शन या प्रतिबंध को रोका जा सकता है।


49) किस OOP अवधारणा को पुन: उपयोग तंत्र माना जाता है?

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

उदाहरण:

class Employee { void work() { System.out.println("Working"); } }
class Manager extends Employee {}

Manager स्वचालित रूप से विरासत में मिलता है work() विधि.

विरासत से परे, रचना इसे आधुनिक OOP में एक पुन: उपयोग तंत्र भी माना जाता है, क्योंकि यह गहरे पदानुक्रम बनाए बिना छोटे, पुन: प्रयोज्य घटकों से जटिल व्यवहारों का निर्माण करने में सक्षम बनाता है। कई विशेषज्ञ इसकी अनुशंसा करते हैं विरासत पर संरचना लचीलेपन और कम युग्मन के लिए।


50) कौन सा OOP सिद्धांत सुनिश्चित करता है कि केवल आवश्यक जानकारी ही उजागर हो?

सिद्धांत यह है मतिहीनतायह कार्यान्वयन विवरण को छुपाता है और केवल आवश्यक विशेषताओं को ही बाहरी दुनिया के सामने उजागर करता है।

उदाहरण:

जब प्रयोग एक कार, चालक स्टीयरिंग व्हील और पैडल जैसे नियंत्रणों के साथ बातचीत करता है, लेकिन आंतरिक दहन प्रक्रिया से उसका कोई सरोकार नहीं होता। इसी तरह, प्रोग्रामिंग में:

abstract class Database {
    abstract void connect();
}

का उपयोगकर्ता Database केवल इसकी परवाह करता है connect() विधि पर ध्यान केंद्रित करें, न कि कनेक्शन कैसे स्थापित किया जाता है, इसके जटिल विवरणों पर। अमूर्तता सरलता को बढ़ावा देती है, जटिलता को कम करती है, और रखरखाव में सुधार करती है।


51) OOP में SOLID सिद्धांत क्या हैं, और वे महत्वपूर्ण क्यों हैं?

RSI ठोस सिद्धांत रखरखाव योग्य, स्केलेबल और लचीले ऑब्जेक्ट-ओरिएंटेड सिस्टम के निर्माण के लिए पांच प्रमुख दिशानिर्देश हैं:

  1. एकल जिम्मेदारी सिद्धांत - किसी वर्ग के पास परिवर्तन का केवल एक ही कारण होना चाहिए।
  2. खुला/बंद सिद्धांत - सॉफ्टवेयर इकाइयों को विस्तार के लिए खुला होना चाहिए लेकिन संशोधन के लिए बंद होना चाहिए।
  3. लिस्कोव प्रतिस्थापन सिद्धांत - उपप्रकारों को उनके मूल प्रकारों के लिए शुद्धता में परिवर्तन किए बिना प्रतिस्थापित किया जा सकने योग्य होना चाहिए।
  4. इंटरफ़ेस पृथक्करण सिद्धांत - कई छोटे, विशिष्ट इंटरफेस एक बड़े, सामान्य इंटरफेस से बेहतर होते हैं।
  5. निर्भरता व्युत्क्रम सिद्धांत - ठोस कार्यान्वयन पर नहीं, बल्कि अमूर्तता पर निर्भर रहें।

ये सिद्धांत युग्मन को कम करते हैं, मॉड्यूलरिटी को प्रोत्साहित करते हैं, तथा डिजाइन पैटर्न के साथ संरेखित करते हैं, जिससे प्रणालियों का परीक्षण, विस्तार और रखरखाव आसान हो जाता है।


52) डिज़ाइन पैटर्न OOP को कैसे पूरक बनाते हैं?

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

  • रचनात्मक पैटर्न (उदाहरण के लिए, सिंगलटन, फैक्ट्री) ऑब्जेक्ट निर्माण को सरल बनाते हैं।
  • संरचनात्मक पैटर्न (उदाहरणार्थ, एडाप्टर, कम्पोजिट, डेकोरेटर) वर्ग संरचनाओं को व्यवस्थित करते हैं।
  • स्वभावजन्य तरीका (उदाहरण के लिए, पर्यवेक्षक, रणनीति, कमांड) वस्तुओं के बीच अंतःक्रियाओं का प्रबंधन करते हैं।

उदाहरण के लिए, फैक्टरी पैटर्न ऑब्जेक्ट निर्माण को अमूर्त बनाता है, जिससे यह सुनिश्चित होता है कि क्लाइंट ठोस क्लासेस के बजाय अमूर्तता पर निर्भर रहें। यह SOLID के निर्भरता व्युत्क्रम सिद्धांत के अनुरूप है। साक्षात्कारों में, डिज़ाइन पैटर्न का संदर्भ न केवल सैद्धांतिक ज्ञान प्रदर्शित करता है, बल्कि वास्तविक दुनिया की चुनौतियों पर OOP अवधारणाओं को लागू करने का व्यावहारिक अनुभव भी प्रदर्शित करता है।


53) संयोजन और वंशानुक्रम में क्या अंतर है, और संयोजन को अक्सर क्यों प्राथमिकता दी जाती है?

विरासत एक "है-एक" संबंध का प्रतिनिधित्व करता है (उदाहरण के लिए, कुत्ता एक जानवर है), जबकि रचना एक “एक है” संबंध का प्रतिनिधित्व करता है (उदाहरण के लिए, कार में एक इंजन है)।

पहलू विरासत रचना
युग्मन तंग ढीला
पुन: उपयोग पदानुक्रम के माध्यम से वस्तु सहयोग के माध्यम से
लचीलापन सीमित (स्थिर) उच्च (गतिशील)
उदाहरण Car extends Vehicle Car has Engine

संरचना को अक्सर पसंद किया जाता है क्योंकि यह गहरे पदानुक्रम से बचती है, रनटाइम लचीलेपन का समर्थन करती है, और के सिद्धांत का पालन करती है विरासत की तुलना में संरचना को प्राथमिकता देनाइससे प्रणालियों की नाजुकता कम होती है और अनुकूलन क्षमता बढ़ती है।


54) बड़े पैमाने की प्रणालियों में ओ.ओ.पी. के मुख्य नुकसान क्या हैं?

यद्यपि OOP को व्यापक रूप से अपनाया गया है, लेकिन बड़े पैमाने पर या प्रदर्शन-महत्वपूर्ण प्रणालियों में इसकी उल्लेखनीय सीमाएँ हैं:

  • मेमोरी ओवरहेड: वस्तुएं मेटाडेटा ले जाती हैं, जिससे फुटप्रिंट बढ़ता है।
  • प्रदर्शन के कारणवर्चुअल फ़ंक्शन और कचरा संग्रहण जैसी सुविधाएं रनटाइम लागत बढ़ाती हैं।
  • जटिलता: गहन पदानुक्रम नाजुक कोड और "ईश्वरीय वस्तुएं" बना सकते हैं।
  • हमेशा इष्टतम नहीं: डेटा-भारी या उच्च-प्रदर्शन अनुप्रयोगों (जैसे, गेम इंजन) के लिए, डेटा-उन्मुख डिज़ाइन अधिक कुशल हो सकता है.

इन नुकसानों को डिजाइन पैटर्न के सावधानीपूर्वक उपयोग, अनावश्यक विरासत से बचने और कार्यात्मक प्रोग्रामिंग जैसे अन्य प्रतिमानों के साथ OOP को संयोजित करके कम किया जाता है।


55) मेमोरी प्रबंधन को किस प्रकार अलग ढंग से संभाला जाता है? C++, Java, तथा Python?

  • C++: डेवलपर्स मैन्युअल रूप से मेमोरी का प्रबंधन करते हैं new और deleteस्मार्ट पॉइंटर्स (unique_ptr, shared_ptr) रिसाव के जोखिम को कम करना।
  • Java: स्वचालित कचरा संग्रहण आवंटन और आवंटन-विमुक्ति को संभालता है, हालांकि समय निर्धारण अनिश्चित है।
  • Python: संदर्भ गणना और कचरा संग्रहण (चक्र पहचान) का उपयोग करता है।
भाषा आवंटन आवंटन रद्द
C++ नियमावली (new) नियमावली (delete)
Java हीप आवंटन कचरा इकट्ठा करने वाला
Python गतिशील संदर्भ गणना + जीसी

साक्षात्कारों में इन अंतरों को समझना महत्वपूर्ण है, क्योंकि वे नियंत्रण (C++) और डेवलपर उत्पादकता (Java, Python).


56) कौन से कारक इस बात को प्रभावित करते हैं कि वंशानुक्रम या इंटरफेस का उपयोग किया जाए?

चुनाव कई कारकों पर निर्भर करता है:

  • विरासत: इसका उपयोग तब करें जब एक सच्चा "is-a" संबंध मौजूद हो, और उपवर्गों को मूल कार्यान्वयन का पुनः उपयोग करने की आवश्यकता हो। उदाहरण: Dog extends Animal.
  • इंटरफेस: जब एकाधिक, असंबंधित वर्गों को व्यवहार साझा करना आवश्यक हो, तो इसका उपयोग करें। उदाहरण: Bird और Airplane कार्यान्वयन Flyable.
  • भाषा की बाध्यता: Java कक्षाओं की केवल एकल विरासत का समर्थन करता है लेकिन एकाधिक इंटरफेस की अनुमति देता है।
  • लक्ष्य डिज़ाइन करें: अनुबंधों और ढीले युग्मन के लिए इंटरफेस का पक्ष लें; पुन: प्रयोज्य आधार तर्क के लिए विरासत का उपयोग करें।

आधुनिक डिजाइन में, इंटरफेस और संरचना गहरी विरासत श्रृंखलाओं की कठोरता से बचने के लिए अक्सर इन्हें प्राथमिकता दी जाती है।


57) क्या आप सॉफ्टवेयर सिस्टम में एनकैप्सुलेशन के वास्तविक उदाहरण दे सकते हैं?

हाँ। वास्तविक दुनिया के सॉफ़्टवेयर बड़े पैमाने पर एनकैप्सुलेशन का उपयोग करते हैं:

  • बैंकिंग अनुप्रयोग: खाता शेष निजी है, केवल इसके माध्यम से ही पहुँचा जा सकता है deposit() or withdraw().
  • वेब एपीआई: एंडपॉइंट केवल आवश्यक ऑपरेशनों को प्रदर्शित करते हैं, आंतरिक डेटाबेस तर्क को छिपाते हैं।
  • लाइब्रेरी/फ्रेमवर्क: डेवलपर्स सार्वजनिक विधियों के साथ इंटरैक्ट करते हैं (उदाहरण के लिए, ArrayList.add() in Java) आंतरिक सरणी आकार बदलने के तर्क को जाने बिना।

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


58) इंटरफेस की तुलना में अमूर्त कक्षाओं को कब प्राथमिकता दी जानी चाहिए?

अमूर्त वर्ग तब बेहतर होते हैं जब:

  • वहाँ है साझा कार्यान्वयन जिसे एकाधिक उपवर्गों को विरासत में मिलना चाहिए।
  • कक्षाएं एक मजबूत पदानुक्रमिक संबंध साझा करती हैं (उदाहरण के लिए, Shape → Circle, Rectangle).
  • मौजूदा उपवर्गों को तोड़े बिना अधिक गैर-अमूर्त विधियों को जोड़ने के लिए भविष्य-प्रूफिंग की आवश्यकता है।

इंटरफ़ेस तब बेहतर होते हैं जब क्लासेस असंबंधित हों, लेकिन उनका व्यवहार साझा होना ज़रूरी हो। उदाहरण के लिए: Bird और Drone दोनों कार्यान्वयन Flyable.

सारांश में:

  • अमूर्त वर्गों का उपयोग करें जब आंशिक कार्यान्वयन के साथ निकट से संबंधित संस्थाओं का मॉडलिंग किया जाता है।
  • इंटरफेस का उपयोग करें असंबंधित संस्थाओं में क्षमताओं को परिभाषित करते समय।

59) किसी वस्तु का जीवनचक्र विभिन्न भाषाओं में किस प्रकार भिन्न होता है?

  • C++ऑब्जेक्ट जीवनचक्र में निर्माण (स्टैक या हीप), उपयोग और विनाश (स्पष्ट या स्वचालित) शामिल हैं। डिस्ट्रक्टर नियतात्मक सफ़ाई प्रदान करते हैं।
  • Java: ऑब्जेक्ट जीवनचक्र में निर्माण शामिल है (के माध्यम से new), उपयोग, और कचरा संग्रहण। विनाश गैर-नियतात्मक है, जिसे GC द्वारा नियंत्रित किया जाता है।
  • Python: ऑब्जेक्ट गतिशील रूप से बनाए जाते हैं और संदर्भ संख्या शून्य हो जाने पर नष्ट हो जाते हैं। GC चक्रों को संभालता है।
भाषा निर्माण विनाश
C++ निर्माता विध्वंसक (नियतात्मक)
Java new जीसी (गैर-नियतात्मक)
Python गतिशील रेफ गिनती + जीसी

इन जीवनचक्रों को समझना संसाधन प्रबंधन और प्रणाली अनुकूलन के लिए महत्वपूर्ण है।


60) आधुनिक भाषाएं OOP को अन्य प्रतिमानों के साथ कैसे जोड़ती हैं?

भाषाएँ तेजी से समर्थन कर रही हैं बहु-प्रतिमान प्रोग्रामिंग OOP की सीमाओं पर काबू पाने के लिए:

  • Java: लैम्ब्डा एक्सप्रेशन और स्ट्रीम के माध्यम से कार्यात्मक प्रोग्रामिंग को एकीकृत करता है।
  • C#: OOP को LINQ और async प्रोग्रामिंग के साथ संयोजित करता है।
  • Python: OOP, प्रक्रियात्मक और कार्यात्मक शैलियों को सहजता से मिश्रित करता है।

उदाहरण Java (कार्यात्मक + ओओपी):

List nums = Arrays.asList(1,2,3,4);
nums.stream().map(n -> n * n).forEach(System.out::println);

यह मिश्रण डेवलपर्स को किसी कार्य के लिए सबसे कुशल प्रतिमान चुनने की अनुमति देता है, जिससे उत्पादकता और लचीलापन बढ़ता है और साथ ही OOP के लाभ भी बरकरार रहते हैं।


🔍 वास्तविक दुनिया के परिदृश्यों और रणनीतिक प्रतिक्रियाओं के साथ शीर्ष OOPS साक्षात्कार प्रश्न

यहाँ 10 सावधानीपूर्वक तैयार किए गए OOPS (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सिस्टम) साक्षात्कार प्रश्न दिए गए हैं जिनके व्यावहारिक और उद्योग-प्रासंगिक उत्तर हैं। ये प्रश्न तकनीकी ज्ञान, व्यवहारिक अनुकूलनशीलता और परिस्थितिजन्य निर्णय लेने की क्षमता का परीक्षण करने के लिए डिज़ाइन किए गए हैं।

1) क्या आप ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के चार मुख्य सिद्धांतों की व्याख्या कर सकते हैं?

उम्मीदवार से अपेक्षित: एनकैप्सुलेशन, वंशानुक्रम, बहुरूपता और अमूर्तता का स्पष्ट स्पष्टीकरण।

उदाहरण उत्तर:

"OOPS के चार स्तंभ हैं एनकैप्सुलेशन, इनहेरिटेंस, पॉलीमॉर्फिज्म और एब्स्ट्रैक्शन। एनकैप्सुलेशन किसी ऑब्जेक्ट के आंतरिक विवरणों को छुपाता है और केवल आवश्यक विवरणों को ही प्रदर्शित करता है। इनहेरिटेंस क्लासेस को कोड का पुनः उपयोग करने और संबंध स्थापित करने की अनुमति देता है। पॉलीमॉर्फिज्म ऑब्जेक्ट्स को संदर्भ के आधार पर अलग-अलग व्यवहार करने देता है, जैसे कि मेथड ओवरलोडिंग या ओवरराइडिंग। एब्स्ट्रैक्शन, कार्यान्वयन विवरणों को छिपाते हुए आवश्यक विशेषताओं को परिभाषित करने पर केंद्रित होता है।"


2) आपने किसी परियोजना की रखरखाव क्षमता में सुधार के लिए पिछली भूमिका में OOPS सिद्धांतों को कैसे लागू किया?

उम्मीदवार से अपेक्षित: वास्तविक परियोजनाओं में OOPS का व्यावहारिक अनुप्रयोग।

उदाहरण उत्तर:

"अपनी पिछली भूमिका में, मैंने हमारे भुगतान गेटवे एकीकरण को सरल बनाने के लिए अमूर्तता और बहुरूपता का प्रयोग किया। प्रत्येक भुगतान प्रदाता के लिए अलग-अलग तर्क बनाने के बजाय, मैंने साझा कार्यक्षमता वाला एक अमूर्त वर्ग डिज़ाइन किया और प्रत्येक भुगतान विधि को इसे विस्तारित करने की अनुमति दी। इससे कोड दोहराव कम हुआ, मापनीयता में सुधार हुआ, और नए प्रदाताओं को शामिल करना काफ़ी तेज़ हो गया।"


3) संयोजन और विरासत में क्या अंतर है, और आप कब एक को दूसरे पर प्राथमिकता देंगे?

उम्मीदवार से अपेक्षित: विश्लेषणात्मक सोच और डिजाइन ट्रेड-ऑफ की समझ।

उदाहरण उत्तर:

"इनहेरिटेंस एक 'है-ए' संबंध को मॉडल करता है, जबकि कंपोजिशन एक 'है-ए' संबंध को मॉडल करता है। जब मैं ढीला युग्मन और लचीलापन बनाए रखना चाहता हूँ, तो मैं कंपोजिशन को प्राथमिकता देता हूँ, क्योंकि यह पैरेंट क्लास को प्रभावित किए बिना गतिशील परिवर्तनों की अनुमति देता है। उदाहरण के लिए, पिछली स्थिति में, मैंने लॉगिंग सिस्टम में डीप इनहेरिटेंस पदानुक्रमों को कंपोजिशन से बदल दिया, जिससे जटिलता कम हुई और पुन: प्रयोज्यता में सुधार हुआ।"


4) आप गैर-तकनीकी हितधारक को बहुरूपता कैसे समझाएंगे?

उम्मीदवार से अपेक्षित: व्यावसायिक संचार के लिए जटिल अवधारणाओं को सरल बनाने की क्षमता।

उदाहरण उत्तर:

"बहुरूपता का अर्थ है कि एक फ़ंक्शन संदर्भ के आधार पर अलग-अलग व्यवहार कर सकता है। उदाहरण के लिए, 'ड्राइव' शब्द के बारे में सोचें। एक व्यक्ति कार, नाव या ट्रक चला सकता है, लेकिन इस क्रिया को फिर भी ड्राइविंग ही कहा जाता है। सॉफ़्टवेयर में, बहुरूपता हमें एक ऐसी एकल विधि लिखने की सुविधा देती है जो उसे कॉल करने वाले ऑब्जेक्ट के आधार पर अपने व्यवहार को अनुकूलित कर सकती है।"


5) क्या आप ऑब्जेक्ट-ओरिएंटेड डिज़ाइन से जुड़ी किसी चुनौतीपूर्ण समस्या का वर्णन कर सकते हैं? आपने उसका समाधान कैसे किया?

उम्मीदवार से अपेक्षित: समस्या समाधान और डिबगिंग कौशल।

उदाहरण उत्तर:

"मेरी पिछली नौकरी में, हमें एक इन्वेंट्री मैनेजमेंट सिस्टम में एक बग का सामना करना पड़ा, जहाँ ओवरराइड किए गए मेथड्स सही तरीके से कॉल नहीं हो रहे थे। डिबगिंग के बाद, मुझे पता चला कि समस्या डायनेमिक डिस्पैच के बजाय स्टैटिक बाइंडिंग के इस्तेमाल के कारण थी। मैंने डिज़ाइन को उचित इंटरफेस और वर्चुअल मेथड्स पर आधारित करने के लिए रीफैक्टोर किया, जिससे अपेक्षित पॉलीमॉर्फिक व्यवहार बहाल हो गया और समस्या दूर हो गई।"


6) कल्पना कीजिए कि आप एक ऐसे प्रोजेक्ट में शामिल होते हैं जिसका कोडबेस बहुत ज़्यादा प्रक्रियात्मक है। आप मौजूदा कार्यक्षमता को बाधित किए बिना इसे OOPS में कैसे बदलेंगे?

उम्मीदवार से अपेक्षित: रणनीतिक सोच और सतर्क कार्यान्वयन।

उदाहरण उत्तर:

"मैं दोहरावदार प्रक्रियात्मक तर्क की पहचान करके और धीरे-धीरे उसे कक्षाओं में समाहित करके शुरुआत करूँगा। मैं छोटे मॉड्यूल से शुरुआत करके और गहन परीक्षण करके, रिफैक्टरिंग दृष्टिकोण अपनाऊँगा। विचार यह है कि OOPS सिद्धांतों को क्रमिक रूप से लागू किया जाए, जैसे डेटा प्रबंधन के लिए कक्षाएँ बनाना, फिर लचीलेपन के लिए इंटरफ़ेस जोड़ना। यह दृष्टिकोण यह सुनिश्चित करता है कि कोडबेस का क्रमिक आधुनिकीकरण करते हुए कार्यक्षमता बरकरार रहे।"


7) आप अधिकतम लचीलेपन के लिए कक्षा को डिजाइन करने और उसे सरल बनाए रखने के बीच संतुलन कैसे बनाते हैं?

उम्मीदवार से अपेक्षित: निर्णय लेने और वास्तुकला जागरूकता।

उदाहरण उत्तर:

"अपनी पिछली भूमिका में, मैंने सीखा कि अति-इंजीनियरिंग से फ़ायदे से ज़्यादा नुकसान हो सकता है। मैं सरलता से शुरुआत करता हूँ और लचीलापन तभी जोड़ता हूँ जब उपयोग की स्थिति इसकी माँग करे। उदाहरण के लिए, अगर किसी क्लास को निकट भविष्य में वास्तव में केवल एक एक्सटेंशन की आवश्यकता होगी, तो मैं अनावश्यक अमूर्त परतों को शामिल करने से बचता हूँ। डिज़ाइन संबंधी समझौतों को संतुलित करने के लिए मैं YAGNI (आपको इसकी ज़रूरत नहीं पड़ेगी) को एक मार्गदर्शक सिद्धांत के रूप में अपनाता हूँ।"


8) आप यह कैसे सुनिश्चित करते हैं कि टीम सेटिंग में एनकैप्सुलेशन बनाए रखा जाए, जहां एक ही क्लास पर कई डेवलपर्स काम कर रहे हैं?

उम्मीदवार से अपेक्षित: टीम सहयोग और कोडिंग अनुशासन।

उदाहरण उत्तर:

"मैं एक्सेस मॉडिफ़ायर को सख्ती से परिभाषित करके, और केवल आवश्यक होने पर ही पब्लिक गेटर्स और सेटर्स के साथ प्राइवेट फ़ील्ड्स का उपयोग करके, एनकैप्सुलेशन को बढ़ावा देता हूँ। मैं टीम को ऐसे यूनिट टेस्ट लिखने के लिए भी प्रोत्साहित करता हूँ जो आंतरिक स्थिति पर निर्भर हुए बिना व्यवहार को सत्यापित करते हैं। कोड समीक्षाओं के दौरान, मैं इस बात पर विशेष ध्यान देता हूँ कि कोई भी अनावश्यक विवरण उजागर न करे जिससे एनकैप्सुलेशन बाधित हो सकता है।"


9) मुझे उस समय के बारे में बताइए जब आपको OOPS की सर्वोत्तम प्रथाओं से अपरिचित टीम को डिज़ाइन पैटर्न का महत्व समझाना पड़ा था।

उम्मीदवार से अपेक्षित: संचार और नेतृत्व कौशल।

उदाहरण उत्तर:

"पिछले प्रोजेक्ट में, जब टीम अलग-अलग मॉड्यूल में डुप्लिकेट कोड से जूझ रही थी, तब मैंने डिज़ाइन पैटर्न की अवधारणा पेश की थी। मैंने सिंगलटन और फ़ैक्टरी जैसे पैटर्न को सरल वास्तविक दुनिया के उदाहरणों से समझाया, फिर दिखाया कि कैसे इन्हें लागू करने से दोहराव कम होगा और रखरखाव में सुधार होगा। पठनीयता और डिबगिंग में प्रत्यक्ष सुधार दिखाकर, टीम ने इन प्रथाओं को तुरंत अपना लिया।"


10) आप कार, बाइक और स्कूटर जैसे वाहनों के साथ राइड-शेयरिंग एप्लिकेशन के लिए वर्ग पदानुक्रम डिजाइन करने का तरीका कैसे अपनाएंगे?

उम्मीदवार से अपेक्षित: ओ.ओ.पी.एस. डिजाइन का व्यावहारिक अनुप्रयोग।

उदाहरण उत्तर:

"मैं एक अमूर्त आधार वर्ग 'वाहन' से शुरुआत करूँगा जिसमें आईडी, क्षमता और गति जैसी साझा विशेषताएँ, साथ ही startRide() और stopRide() जैसी विधियाँ शामिल होंगी। कार, बाइक और स्कूटर इस वर्ग का विस्तार करेंगे और जहाँ आवश्यक हो, विधियों को ओवरराइड करेंगे। मापनीयता सुनिश्चित करने के लिए, मैं चिंताओं को अलग करने के लिए 'इलेक्ट्रिकपावर्ड' या 'फ्यूलपावर्ड' जैसी सुविधाओं के लिए इंटरफेस का भी उपयोग करूँगा। यह डिज़ाइन बिना किसी बड़े बदलाव के नए वाहन प्रकारों को जोड़ने में सक्षम होगा।"


इस पोस्ट को संक्षेप में इस प्रकार लिखें: