2013-10-19 4 views
5

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

class Outer { 
    public int a = 1; 
    private int b = 2; 
    public void method(final int c){ 
     int d = 3; 
     class Inner{ 
      private void iMethod(int e){ 
       System.out.println("a = " + a); 
       System.out.println("b = " + b); 
       System.out.println("c = " + c); 
       System.out.println("e = " + e); 
      } 
     }   
    } 
    public static void main (String[] args){ 
     Outer outer = new Outer(); 
     Outer.Inner inner = outer.new Inner();// there is an compile error here 
    } 
} 
+0

विधि स्थानीय कक्षाओं का उपयोग केवल उस विधि में किया जा सकता है। –

उत्तर

6

आप नहीं कर सकते। Inner कक्षा method(int) विधि के लिए स्थानीय है।

यदि आप इसे एक्सेस करना चाहते हैं, तो आपको इसे एक बड़े दायरे में घोषित करने की आवश्यकता होगी।

भाग्य के बीमार मोड़ में, आप एक उदाहरण प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। उदाहरण के लिए ले लो

package com.so.examples; 

class Main { 
    public void method(final int c){ 
     class Inner{ 
      public Inner() {} 
      private void iMethod(int e){ 
       System.out.println("inner method"); 
      } 
     }     
    } 

    public static void main (String[] args) throws Exception{ 
     Class clazz = Class.forName("com.so.examples.Main$1Inner"); 
     Constructor<?> constructor = clazz.getConstructor(new Class[]{Main.class}); 
     Object instance = constructor.newInstance(new Main()); 
     System.out.println(instance.getClass()); 
    } 
} 

यह

class com.so.examples.Main$1Inner 

बाहर प्रिंट प्रतिबिंब के बिना, आप अपने सदस्यों में से किसी का उपयोग नहीं कर सकते हैं क्योंकि आप की विधि के प्रकार Inner बाहर एक चर की घोषणा नहीं कर सकते हैं।

8

आंतरिक वर्ग की विधि में आंतरिक कक्षा घोषित होने पर आंतरिक वर्ग के उदाहरण को कैसे प्रारंभ किया जाए?

आप नहीं कर सकते। कक्षा का दायरा विधि के लिए ही सीमित है। यह इसी तरह है कि आप विधि के बाहर स्थानीय चर का उपयोग क्यों नहीं कर सकते हैं।

JLS §6.3 - Scope of a Declaration से:

एक स्थानीय वर्ग घोषणा तुरंत एक ब्लॉक (§14.2) से घिरा के दायरे तुरंत enclosing ब्लॉक के बाकी, अपने ही वर्ग घोषणा भी शामिल है।

+0

धन्यवाद रोहित! मैंने कड़ी मेहनत की लेकिन ऐसा करने का कोई तरीका नहीं मिला। अब मैं समझता हूं कि ऐसा करना संभव नहीं है – bean

+0

@bean बस इसे विधि के बाहर रखें ... 'कक्षा बाहरी {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) {आंतरिक आंतरिक = नया आंतरिक(); } सार्वजनिक शून्य विधि() {} कक्षा आंतरिक {}} ' – Radiodef

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