2012-09-22 10 views
22

में निजी कन्स्ट्रक्टर का दायरा यह प्रश्न की तुलना में पहेली से अधिक है। मैं निम्नलिखित कोड है:नेस्टेड कक्षा

public class PrivateBaseConstructor { 
    public static class BaseClass { 
     private BaseClass() { 
     } 

    } 

    public static class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 
} 

यहाँ super(); 1 * पर के लिए कॉल घटना की अनुमति दी है, हालांकि आधार वर्ग निर्माता private है। हम एक ही पैकेज में अलग वर्ग के रूप में कक्षाएं लिखते हैं:

BClass.java 
public class BClass { 
    private BClass() { 

    } 
} 

DClass.java 
public class DClass extends BClass { 
    public DClass() { 
     super(); // 2* 
    } 

संकलक ठीक ही आधार वर्ग निर्माता के बाद से 2 * पर त्रुटि देता दिखाई नहीं देता है।

संकलक मेरे पहले परिदृश्य में त्रुटि क्यों नहीं फेंकता है जब दोनों वर्गों को एक वर्ग के भीतर स्थैतिक घोषित किया जाता है?

उत्तर

25

यदि किसी सदस्य या निर्माता निजी घोषित किया जाता है, तो पहुँच यदि अनुमति दी है और केवल यह शीर्ष स्तर वर्ग के शरीर के भीतर होती है, तो (§7.6) जो सदस्य या कन्स्ट्रक्टर की घोषणा को संलग्न करता है।

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.1

+1

+1 सटीक संदर्भ के लिए! – Anshu

1

क्योंकि कक्षा के अंदर घोषित कुछ भी आंतरिक कक्षाओं सहित अपने निजी सदस्यों तक पहुंच सकता है। हालांकि, अगर आप अपनी कक्षा में PMD चलाते हैं, तो आप पाएंगे कि आप कन्स्ट्रक्टर की दृश्यता को गैर-निजी में बदलते हैं।

4

क्योंकि नेस्टेड कक्षाएं एक-दूसरे के सदस्यों को देख सकती हैं। स्थिर घोषणाओं के साथ इसका कोई लेना-देना नहीं है। अपने कोड का निम्नलिखित उदाहरण केवल घोंसला वाले आंतरिक वर्गों (स्थिर नहीं) के साथ देखें।

public class PrivateBaseConstructor { 
    public class BaseClass { 
     private BaseClass() {} 
    } 

    public class DerivedClass extends BaseClass { 
     public DerivedClass() { 
      super(); // 1* 
     } 
    } 

    public static void main(String[] args) 
    { 
     new PrivateBaseConstructor(). new DerivedClass(); 
    } 
} 

यहाँ नेस्टेड कक्षाओं के बारे में और अधिक पढ़ें: http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

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