2015-07-03 12 views
5

यदि रचनाकारों को जावा में विरासत में नहीं मिलता है, तो मुझे संकलन त्रुटि क्यों मिलती है (लागू सुपर कन्स्ट्रक्टर ए() डिफ़ॉल्ट कन्स्ट्रक्टर के लिए दृश्यमान नहीं है। परिभाषित करना चाहिए एक स्पष्ट निर्माता)?"निजी सुपर कन्स्ट्रक्टर का परिणाम क्यों दिखाई देता है"

class A { 
    private A() { 
    } 
} 

public class B extends A { 

} 

यूपीडी। मुझे पता है कि super() को अंतर्निहित बी कन्स्ट्रक्टर में बुलाया जाता है। लेकिन मुझे नहीं लगता कि यह super() के साथ निजी कन्स्ट्रक्टर तक क्यों नहीं पहुंच सकता है। तो, अगर हमारे पास केवल निजी निर्माता हैं, तो कक्षा डी वास्तव में final है?

+0

(आपके अंतिम प्रश्न का उत्तर "हां" है, बशर्ते आपका मतलब "अंतिम" है, "इसे उप-वर्गीकृत नहीं किया जा सकता"। इसे (शायद, मुझे लगता है) माना जाना चाहिए कि संकलक भी स्पॉट करेगा यह और क्लास ए का बिल्कुल वैसा ही व्यवहार करता है जैसे कि इसे स्पष्ट रूप से "अंतिम" घोषित किया गया था।) –

+0

[लागू सुपर कन्स्ट्रक्टर क्लास ए) को हल करने के लिए संभावित डुप्लिकेट दिखाई नहीं दे रहा है। स्पष्ट रूप से एक और कन्स्ट्रक्टर का आह्वान करना चाहिए?] (Http://stackoverflow.com/questions/3904355/how-to-resolve-implicit-super-constructor-classa-is-not-visible-must-explici) – Raedwald

उत्तर

10

यदि B extends A, B को A कन्स्ट्रक्टर तक पहुंच होनी चाहिए।

ध्यान रखें कि एक निर्माता हमेशा super() पर कॉल करता है। तो यहां, B के अंतर्निहित पैरामीटर रहित कन्स्ट्रक्टर A कन्स्ट्रक्टर को कॉल नहीं कर सकते हैं।

+0

मुझे पता है कि सुपर() को अंतर्निहित बी कन्स्ट्रक्टर में बुलाया जाता है। लेकिन मुझे नहीं लगता कि यह सुपर() के साथ निजी कन्स्ट्रक्टर तक क्यों नहीं पहुंच सकता है। तो, अगर हमारे पास केवल निजी कन्स्ट्रक्टर क्लास डी वास्तव में अंतिम है? –

+0

@ ओलेगुट्स आप यहां कुछ सामान उलझन में हैं! एक कन्स्ट्रक्टर 'अंतिम' नहीं हो सकता है, असल में, जेएलएस निर्दिष्ट एक कन्स्ट्रक्टर को ओवरराइड नहीं किया जा सकता है। इसलिए, 'बी 'कन्स्ट्रक्टर' ए 'कन्स्ट्रक्टर को ओवरराइड नहीं कर रहा है, लेकिन बस इसे कॉल कर रहा है। अपने 'ए' कन्स्ट्रक्टर 'प्राइवेट' को सेट करने का मतलब है कि इसका उपयोग 'ए' वर्ग के बाहर नहीं किया जा सकता है, और इसलिए 'बी' कक्षा में इसका उपयोग नहीं किया जा सकता है, लेकिन 'बी' कन्स्ट्रक्टर को 'ए' कन्स्ट्रक्टर की आवश्यकता होती है, और यही वजह है कि आपको त्रुटि मिली है 'सुपर कन्स्ट्रक्टर ए() डिफ़ॉल्ट कन्स्ट्रक्टर के लिए दृश्यमान नहीं है :) :) उम्मीद है कि यह मदद करें! – NiziL

+0

शायद मुझे कॉमा का उपयोग करना चाहिए ...) मेरा मतलब है कि कक्षा अंतिम हो गई, जब सभी रचनाकार निजी पर सेट हो गए। –

3

जावा में, यदि आप Child Class का उदाहरण बनाते हैं, तो Parent Class उदाहरण अंतर्निहित रूप से बनाया जाता है। तो चाइल्ड क्लास कन्स्ट्रक्टर Child Class पर दिखाई दे सकता है क्योंकि यह पहले ही कथन में super() का उपयोग कर Parent Class कन्स्ट्रक्टर के निर्माता को कॉल करता है।

तो अगर आप private करने के लिए Parent Class के निर्माता बदलने के लिए, Child Class उस तक पहुँच सकता है और अपने स्वयं के के किसी भी मामले नहीं बना सका, इसलिए सबसे पहले हाथ पर संकलक बस सब पर इस अनुमति नहीं है।

लेकिन अगर आप Parent Class में private डिफ़ॉल्ट निर्माता चाहते हैं, तो आप स्पष्ट रूप से Child class निर्माता में तो Parent Class & में एक ओवरलोड public निर्माता बनाने के लिए आप super(param)Parent Class की सार्वजनिक अतिभारित निर्माता का उपयोग कर कॉल करने की आवश्यकता की जरूरत है।

इसके अलावा, आपको लगता है कि private रचनाकारों का उपयोग क्या है। private कन्स्ट्रक्टर का अधिकतर उपयोग तब किया जाता है जब आप किसी अन्य कक्षा से दूसरों को अपनी कक्षा में new() पर कॉल नहीं करना चाहते हैं। तो उस स्थिति में, हम कक्षा object प्रदान करने के लिए कुछ getter() विधि प्रदान करते हैं। उस विधि में आप अपनी कक्षा & के मौजूदा ऑब्जेक्ट को बना/उपयोग कर सकते हैं, इसे उस विधि से वापस कर सकते हैं।

ईजी। Calendar cal = Calendar.getInstance();। यह वास्तव में Singleton डिज़ाइन पैटर्न का आधार बनाता है।

+0

धन्यवाद, मुझे पता है। मेरा सवाल यह है कि क्यों सुपर() निजी कन्स्ट्रक्टर को कॉल नहीं कर सकता? क्या निजी तरीकों के लिए यह वही कारण ओवरराइड नहीं किया जा सकता है? –

+1

सुपर() 'माता-पिता' वर्ग 'निजी' कन्स्ट्रक्टर को कॉल नहीं कर सकता क्योंकि केवल 'निजी' सदस्य एक ही कक्षा के भीतर ही पहुंच योग्य होते हैं, इसलिए 'चाइल्ड क्लास एक अलग वर्ग है जिसे आप बस इसे एक्सेस नहीं कर सकते हैं। –

+0

@OlegKuts यदि यह आपके लिए काम करता है, तो आप इसे सही उत्तर के रूप में सेट कर सकते हैं –

1

महत्वपूर्ण बात यह समझना है कि किसी भी कन्स्ट्रक्टर की पहली पंक्ति सुपर कन्स्ट्रक्टर को कॉल करना है। यदि आप सुपर कन्स्ट्रक्टर को स्वयं नहीं बुलाते हैं तो कंपाइलर कवर के तहत सुपर() डालने से आपका कोड छोटा बनाता है।

अब यदि आप सुपरक्लस निजी में उस निर्माता को बनाते हैं, तो ऊपर उल्लिखित अवधारणा विफल हो जाएगी।

0

काम

class A { 
    private A() { 
    } 
    public A(int i){ 
    } 
} 

public class B extends A { 
    private A(){ 
     super(10); 
    } 
} 

या निजी ए() हटा सकते हैं, सार्वजनिक ए() में डिफ़ॉल्ट, जब तक आप एक और निर्माता

class A { 

} 

public class B extends A { 
    private A(){ 
     super(); 
    } 
} 
0

है वर्ग B का एक उदाहरण का एक उदाहरण बनाता है कक्षा A तो B को super(...) का आह्वान करना चाहिए यदि A एक गैर डिफ़ॉल्ट नियंत्रक लागू करता है। तो निर्माता होना चाहिए B के लिए protectedsuper(...)

0
public class B extends A { 

/* 
* The default constructor B means 
* public() B {super();} 
*/ 
    public B() { 
    } 
} 

कॉल करने के लिए सक्षम किया जा रहा तो तुम एक निर्माता जो वर्ग द्वारा पहुँचा जा सकता है B

  1. आप माता-पिता निर्माता
  2. के लिए पहुँच संशोधक बदल सकते हैं परिभाषित करना चाहिए
  3. अन्यथा आप पेरेंट क्लास में अन्य कन्स्ट्रक्टर को परिभाषित कर सकते हैं जो कक्षा B द्वारा एक्सेस किया जा सकता है और उस कन्स्ट्रक्टर को कॉल कर सकता है।
1

आपकी कक्षा बी में एक डिफ़ॉल्ट कन्स्ट्रक्टर, बी() है - क्योंकि आपने स्पष्ट रूप से किसी अन्य को परिभाषित नहीं किया है। वह कन्स्ट्रक्टर पूरी तरह से अपने सुपर कन्स्ट्रक्टर, ए() को कॉल करता है। लेकिन आपने स्पष्ट रूप से क्लास ए के लिए एक निजी बनाया है, इसलिए आपने स्पष्ट रूप से घोषित किया है कि बी सहित किसी भी अन्य वर्ग में इसका उपयोग नहीं हो सकता है।

संबंधित मुद्दे