2011-03-19 5 views
5

में निजी कन्स्ट्रक्टर उपयोग यदि कोई निजी कन्स्ट्रक्टर है, तो क्या JVM सुपर कन्स्ट्रक्टर को कॉल करता है?कक्षा

मैं उस निजी निर्माता में super() कॉल का जिक्र कर रहा हूं।

class Alpha { 
    static String s=""; 
    protected Alpha(){ 
     s+="alpha"; 
    } 
} 

class SubAlpha extends Alpha{ 
    private SubAlpha(){ 
     s+="sub"; 
    } 
} 

class SubSubAlpha extends Alpha{ 
    private SubSubAlpha(){ 
     s+="subsubAlpha"; 
    } 

    public static void main(String[] args){ 
     new SubSubAlpha(); 
     System.out.print(s); 
    } 
} 

यहां मुझे कोई संकलन त्रुटि नहीं मिली है। यहां SubSubAlpha कक्षा में निजी कन्स्ट्रक्टर है। क्या वह कंपाइलर super() कॉल करता है, यदि ऐसा है, तो SubAlpha कक्षा में क्या होता है। यहां तक ​​कि निजी कन्स्ट्रक्टर भी है। और यदि इसका उपयोग नहीं किया जाता है तो विरासत का पेड़ शीर्ष तक कैसे जारी रहता है।

+0

(यदि सुपर वर्ग 'कोई आर्ग निर्माता है निजी (और व्युत्पन्न वर्ग:

//: Cartoon.java // Constructor calls during inheritance class Art { Art() { System.out.println("Art constructor"); } } class Drawing extends Art { Drawing() { System.out.println("Drawing constructor"); } } public class Cartoon extends Drawing { Cartoon() { System.out.println("Cartoon constructor"); } public static void main(String[] args) { Cartoon x = new Cartoon(); } } ///:~ 

इस कार्यक्रम के लिए उत्पादन स्वत: कॉल से पता चलता एक ही बाहरी वर्ग में नहीं है; या डिफ़ॉल्ट पहुंच है और व्युत्पन्न कक्षा एक ही पैकेज में नहीं है; या बस गायब है) तो यदि व्युत्पन्न वर्ग के रचनाकारों में एक स्पष्ट 'सुपर() 'या' यह() 'गायब है, तो वे संकलन करने में असफल हो जाएंगे। 'क्लास बेस {निजी बेस() {} } वर्ग व्युत्पन्न आधार {} ') –

+2

क्या आपका मतलब है कि 'वर्ग सबसुबला अल्फाफा' बढ़ाता है? –

उत्तर

4

हाँ में संकलित किया गया है। अगर निजी super या this कन्स्ट्रक्टर कॉल स्पष्ट नहीं है तो निजी कन्स्ट्रक्टर का एक अंतर्निहित super() कॉल है। इस संबंध में, यह अन्य रचनाकारों से अलग नहीं है। स्वाभाविक रूप से, इसके लिए संकलन करने के लिए, सुपरक्लास के पास कक्षा से दिखाई देने वाला कोई तर्क नहीं है।

हालांकि, यदि कोई निर्माता private है, तो यह को उप-वर्ग से ... या कक्षा के अलावा किसी भी अन्य कोड से नहीं कहा जा सकता है।

-1

हां, आप superclass से फ़ंक्शन और विशेषता का उपयोग करने के लिए सुपर() का उपयोग कर सकते हैं। अपनी सामान्य जावा

+0

यह सवाल नहीं था। – dty

8

हैं निजी निर्माता JVM आवेषण सुपर निर्माता करने के लिए कॉल करता है के साथ एक ही?

हाँ

सुपर निर्माता हमेशा बुलाया जाएगा। (आप एक ही समय में सुपर क्लास को तुरंत चालू किए बिना कक्षा को तुरंत चालू नहीं कर सकते हैं।)

यदि आप इसे स्पष्ट रूप से स्वयं नहीं करते हैं, तो आपके लिए एक निहित कॉल डाला जाएगा, भले ही निर्माता निजी या सार्वजनिक है।


चुनने की: यह वास्तव में JVM कि यह सम्मिलित नहीं है, लेकिन जावा कम्पाइलर:

public class Test { 
    private Test() { 
    } 
} 

private Test(); 
    Code: 
    Stack=1, Locals=1, Args_size=1 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 
4

कारण आपको संकलन-समय त्रुटि नहीं मिल रही है यह है कि आपकी कक्षा पदानुक्रम वह नहीं है जो आपको लगता है। मुझे लगता है कि आप इस का मतलब:

class SubSubAlpha extends Alpha { 

इस होना करने के लिए:

class SubSubAlpha extends SubAlpha { 

... जिस पर आप वास्तव में एक संकलन समय त्रुटि प्राप्त होगी इशारा करते हैं।

(दूसरे शब्दों में, हाँ, वहां हमेशा सुपर-कन्स्ट्रक्टर को कॉल करता है।)

+0

हाँ ... अपने अधिकार को क्षमा करें ... – satheesh

+0

मुझे समझा .... – satheesh

1

यह Java Programmer's SourceBook से एक अच्छा उदाहरण है। चूंकि कन्स्ट्रक्टर कॉल करते समय प्रिंट करते हैं, तो आप तुरंत कॉल के अनुक्रम को देखेंगे। यह जावा में सोच से है।

कला निर्माता
आकर्षित निर्माता
कार्टून निर्माता