2011-05-30 4 views
8

मैंने आंतरिक कक्षा ट्यूटोरियल के माध्यम से पढ़ा है और एक बात समझ में नहीं आता है। यह कहा जा रहा है कि भीतर वर्ग बाहरी कक्षा में छिपा संदर्भ रखती है, इसलिए मैं इस सादे वर्ग के माध्यम से कई सवाल के साथ आने:स्थानीय आंतरिक वर्ग

public class OuterClass { 

public void doSomething() { 
    JButton button = new JButton(); 
    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) {     
     } 
    }); 
    } 
} 

तो हम एक स्थानीय भीतरी वर्ग जो विधि doSomething() अंदर रहता है और मैं कुछ सवाल हैं शामिल।

  1. क्या यह स्थानीय आंतरिक कक्षा स्थानीय के बाद से ऑउटर क्लास का संदर्भ रखती है?

  2. क्या यह स्थानीय आंतरिक वर्ग doSomething() विधि के बाद स्मृति रहता है?

  3. क्या कोई ऐसी स्थिति है जिसमें OuterClass जीसी के लिए योग्य है लेकिन स्थानीय आंतरिक कक्षा को अभी भी अन्य कक्षाओं द्वारा संदर्भित किया जा सकता है? क्या हुआ होगा?

+4

आपने कभी अपने वोट नहीं दिए और न ही आपके पिछले प्रश्नों का उत्तर स्वीकार कर लिया। कृपया उस पर सुधार करें। – asgs

+0

अच्छा सवाल ... कम से कम मेरे लिए। –

+2

मुझे इस सवाल को ऊपर उठाने जैसा लगता है लेकिन फिर आपकी प्रोफ़ाइल को देखा और आपने कभी जवाब नहीं दिया है या इससे भी बदतर कभी भी किसी को वोट नहीं दिया है, इसलिए माफ करना, आप मेरी अपवित्र चूक गए हैं। –

उत्तर

8
  1. हाँ, भीतरी वर्ग OuterClass उदाहरण के लिए एक संदर्भ है।

    आप विधि में OuterClass.this तक पहुंच कर सत्यापित कर सकते हैं।

  2. हां, विधि समाप्त होने के बाद आंतरिक कक्षा का उदाहरण मौजूद रहेगा।

    विधि छोड़ने से वस्तु के जीवनकाल को प्रभावित नहीं होता है। जैसे ही हर दूसरी वस्तु, जीसी के लिए पात्र बन जाएगी, इसके बाद इसमें कोई और संदर्भ नहीं होगा। चूंकि JButton इसका संदर्भ रखेगा, यह स्मृति में रहेगा।

  3. OuterClass उदाहरण जीसी के लिए योग्य नहीं हो सकता है जब तक कि आंतरिक वर्ग का उदाहरण पहुंच योग्य न हो।

    इसका कारण # 1 है: आंतरिक वर्ग के उदाहरण में बाहरी वर्ग के उदाहरण का संदर्भ है, जिसका अर्थ है कि बाहरी वर्ग जीसी के लिए योग्य नहीं हो सकता है जब तक कि आंतरिक कक्षा एक ही समय में योग्य नहीं है (यानी दोनों अब पहुंच योग्य नहीं हैं)।

+0

यह वास्तव में पूरी तरह से सच नहीं है। चूंकि इस मामले में भीतरी कक्षा वास्तव में अपने संलग्न 'बाहरी क्लास' उदाहरण का संदर्भ नहीं देती है, इसके लिए कोई संदर्भ संकलित नहीं किया गया है। इसलिए, प्रश्न 3 में, जवाब यह है कि 'बाहरी क्लास' उदाहरण * जीसीएड हो सकता है आंतरिक वर्ग संदर्भित रहता है। यह निश्चित रूप से, इस मामले के लिए विशेष है, लेकिन फिर भी। – Dolda2000