2012-07-27 13 views
5

संभव डुप्लिकेट:
Why cant we have static method in an inner class?क्यों एक गैर स्थैतिक आंतरिक वर्ग में स्थिर सदस्य (फ़ील्ड और विधियां) नहीं हो सकती हैं?

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

यदि किसी आंतरिक वर्ग में स्थिर सदस्य होने का अर्थ नहीं है, तो क्यों आंतरिक वर्ग स्थिर सदस्यों के पास एक वर्ग विरासत में स्थिर सदस्यों का उत्तराधिकारी हो सकता है?

मैंने यह post भी पढ़ा। जैसा कि उल्लेख किया गया है:

आंतरिक कक्षाएं उन स्थिर सदस्यों का उत्तराधिकारी हो सकती हैं जो संकलित समय स्थिरांक नहीं हैं, भले ही वे उन्हें घोषित न करें। नेस्टेड कक्षाएं आंतरिक कक्षाएं जावा प्रोग्रामिंग भाषा के सामान्य नियमों के साथ के अनुसार स्थिर सदस्यों को स्वतंत्र रूप से घोषित नहीं कर सकती हैं।

क्या यह एक सम्मेलन है?

public class OuterClass { 

    private int outerClassField; 

    public void doSomethingOuterClass() { 
     outerClassField = 1; 
    } 

    public static void doSomethingStaticOuterClass() { 
     // outerClassField = 2; // Error: Because static method cannot access an specific object's field 
    } 

    public class InnerClass extends ClassWithStaticField { 

     // Error: Why a non-static inner class cannot have static fields ? 
     // public static int innerClassStaticField = 1; 

     public void doSomethingInnerClass() { 
      outerClassField = 3; 
      staticField = 1; 
     } 

     // Error: Why a non-static inner class cannot have static methods ? 
     // public static void doSomethingStaticInnerClass() { 
     // outerClassField = 4; 
     // } 
    } 

    public static void main(final String[] args) { 
     // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static 
     // members? 
     OuterClass.InnerClass.staticField = 1; 
     OuterClass.InnerClass.staticMethod(); 
    } 
} 

class ClassWithStaticField { 
    public static int staticField; 

    public static void staticMethod() { 
    }; 
} 
+0

यह भी देखें: http://stackoverflow.com/questions/2482327/why-can-we-have-static-final-members-but-cant-have-static-method-in-an-inner-cla – Autar

उत्तर

6
तकनीकी तौर पर वहाँ

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

मुझे लगता है कि यह एक भाषा डिजाइन निर्णय था, अधिकतर क्योंकि गैर स्थैतिक आंतरिक कक्षाओं में स्थिरता भ्रमित और पहुंचने के लिए सहज नहीं है (बाहरी.इनर.स्टैटमेम्बर)।

-1

एक गैर स्थिर भीतरी वर्ग के भीतर एक स्थिर विधि प्रदान करने का कोई मतलब नहीं है:

यहाँ मेरी कोड है। आप बाहरी वर्ग के अंदर एक गैर स्थैतिक विधि का उपयोग कर सकते हैं?

+0

"कोई बिंदु" उत्तर नहीं है और विधियों के अलावा सदस्य डेटा के मुद्दे को भी संबोधित नहीं करता है। – RichieHH

7

1. एक Non-static inner class का एक object अपने Outer Class (यानी enclosing वर्ग) के एक instance/object साथ जुड़ा हुआ है।

2. एकNon-static inner class की पूरे शरीर एक स्थिर गुंजाइश भीतर नहीं है, और इसलिए आप वहाँ में स्थिर सदस्य नहीं हो सकते।

3.Instance variables और non-static inner class में methodsसंलग्नित क्लास का एक उदाहरण के सापेक्ष हैं, तो एक वस्तु से संबंधित जा रहा है, स्थिर उन्हें के लिए सच नहीं होगा (यानी आंतरिक वर्ग),

4. हम एक Instance की गैर स्थिरinner class, हम एकआवश्यकता बनाते हैं 66। आंतरिकnon-static class में अंतर्निहित संदर्भouter enclosing class है।

उदाहरण के लिए:

Outer o = new Outer(); 
Outer.Inner i = o.new Inner(); 
संबंधित मुद्दे

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