2011-10-09 5 views
7

संभव डुप्लिकेट:
Why inner classes require “final” outer instance variables [Java]?
Why are only final variables accessible in anonymous class?विधि स्थानीय आंतरिक कक्षा केवल अंतिम स्थानीय चर का उपयोग कर सकती है। क्यों?

class Outer{ 
    private String x = "instance variable"; 
    void doStuff(){ 
     String z = "local variable"; 
     class Inner{ 
      public void seeOuter(){ 
      System.out.println("Outer x is : "+ x); 
      System.out.println("Local variable z is : " + z); //won't compile 
     } 
     } 
    } 
} 

अंतिम फिक्स के रूप में स्थानीय चर जेड अंकन समस्या:

final String z = "local variable"; //Now inner object can use it. 


क्या कोई यह बता सकता है कि क्या हो रहा है?

मुझे पता है कि अगर मैं एक गैर-अंतिम स्थानीय चर का उपयोग करने की कोशिश कर रहा हूं तो यह संकलित क्यों नहीं हो सकता है।

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

क्या अंतिम स्थानीय चर ढेर के बजाय ढेर पर संग्रहीत होते हैं? किसी को भी व्याख्या कर सकते हैं कृपया क्या हो रहा है:

उत्तर

2

अंतिम फिक्स के रूप में स्थानीय चर जेड समस्या अंकन?

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

क्या स्थानीय-परिवर्तनीय फ़ाइनल बनाने से यह जीवित रहने की अनुमति देता है भले ही विधि पूरी हो जाती है और स्थानीय चर गुंजाइश से बाहर हो जाता है?

अंतिम मतलब यह बदला नहीं जा सकता है। और कुछ नहीं।

क्या अंतिम स्थानीय चर ढेर के बजाय ढेर पर संग्रहीत होते हैं?

सभी चर स्टैक, अंतिम या नहीं पर आवंटित किए जाते हैं।

मुझे पता है कि अगर मैं एक गैर-अंतिम स्थानीय चर का उपयोग करने की कोशिश कर रहा हूं तो यह संकलित क्यों नहीं हो सकता है।

शायद आपको इसके बारे में सोचना चाहिए क्योंकि यह मुझे स्पष्ट नहीं है कि यह बिल्कुल मामला है।

एक नेस्टेड क्लास अंतिम चर "एक्सेस" कर सकता है क्योंकि इन्हें ऑब्जेक्ट के फ़ील्ड के रूप में कॉपी किया जाता है। यह गैर-अंतिम फ़ील्ड का समर्थन नहीं करता है क्योंकि उन्हें विधि या कक्षा द्वारा बदला जा सकता है और यह समर्थित नहीं है क्योंकि वास्तविकता में दो अलग-अलग फ़ील्ड/चर होते हैं।

+0

: लेकिन यहां सवाल यह है कि एक विधि-स्थानीय परिवर्तनीय फाइनल को चिह्नित करने से यह सुलभ हो जाता है? – Anu11

+0

@ Anu11 मैं फिर से अंतिम पैराग्राफ पढ़ूंगा। ;) –

10

वे स्थानीय चर और समारोह के मापदंडों, लेकिन केवल जो कि final घोषित किया गया है का उपयोग करें क्योंकि स्थानीय वर्ग उदाहरण चर का एक अलग प्रतिलिपि बनाए रखना होगा के रूप में यह समारोह बाहर रह सकते हैं कर सकते हैं।तो के रूप में के साथ दो संशोधित चर के भ्रम को एक ही दायरे में समान नाम नहीं है, चर को पर गैर-संशोधित किया जाना चाहिए।

+1

"जैसा कि यह फ़ंक्शन से बाहर हो सकता है", जावा के लिए नया हूं और इस भाग को समझने में असमर्थ हूं, क्या आप ऐसा परिदृश्य बता सकते हैं जहां यह हो सकता है? धन्यवाद – RVP

+2

मान लें कि आंतरिक वर्ग का उदाहरण एक विधि तर्क के रूप में पारित किया गया है और इसे किसी अन्य ऑब्जेक्ट के इंस्टेंस वैरिएबल के रूप में संग्रहीत किया जाता है। हालांकि विधि पद्धति को विधि के पूरा होने पर मृत्यु हो जाती है, लेकिन INNER क्लास ऑब्जेक्ट विधि –

+0

"से बाहर निकलता है क्योंकि स्थानीय क्लास इंस्टेंस को चर की एक अलग प्रति बनाए रखना चाहिए" - स्थानीय क्लास इंस्टेंस बनाए रखें उस दायरे में सभी चरों तक पहुंच? क्या इसका समर्थन करने के लिए प्रलेखन में कुछ भी है, या कोई परीक्षण कार्यक्रम? मेरा मतलब है कि हम कैसे जानते हैं कि स्थानीय आंतरिक कक्षाओं को उन स्थानीय चरों की एक प्रति प्राप्त होती है? – Solace