2012-04-26 27 views
14

मुझे local variable को final के रूप में घोषित करने की आवश्यकता क्यों है यदि मेरे Inner class विधि के भीतर परिभाषित करने की आवश्यकता है?आंतरिक वर्ग और स्थानीय चर

उदाहरण:

class MyOuter2 { 

private String x = "Outer2"; 

void doStuff() { 
    final String y = "Hello World"; 

    final class MyInner { 

     String z = y; 

     public void seeOuter() { 
      System.out.println("Outer x is "+x); 
      System.out.println("Local variable is "+y); 
      MyInner mi = new MyInner(); 
      mi.seeOuter(); 
     } 
    } 
} 

}

क्यों स्ट्रिंग y एक अंतिम लगातार होने की जरूरत है? यह कैसे प्रभावित करता है?

+0

देखें कि यह चर्चा http://techtracer.com/2008/04/14/mystery-of-accessibility-in-local-inner-classes/ – kosa

+0

संभावित डुप्लिकेट में मदद करती है [अंदर एक गैर-अंतिम चर का संदर्भ नहीं दे सकता एक आंतरिक वर्ग एक अलग तरीके में परिभाषित] (http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a- differen) –

+0

[जावा में स्थानीय अंतिम चर के बारे में प्रश्न] (http://stackoverflow.com/questions/5947352/question-about-local-final-variable-in-java)। http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class: – Lion

उत्तर

13

उत्तर दो अलग-अलग क्षेत्रों में हैं। तो आंतरिक कक्षा से पहले वैरिएबल बदल सकता है इससे पहले। इसे अंतिम बनाना इसे रोकता है।

+2

इस में जावा 8 बदल गया है – ohcibi

3

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

public void doStuff() 
{ 
    InnerClass cls[] = new InnerClass[100]; 
    for (int i = 0; i < 100; ++i) 
    { 
     cls[i] = new InnerClass() 
     { 
      void doIt() 
      { 
       System.out.println(i); 
      } 
     }; 
    } 
} 

जब doIt() विधि कहा जाता है, क्या प्रिंट किया जाएगा: इस कोड की कल्पना? लूपिंग के दौरान i बदल गया। उस भ्रम को रोकने के लिए, आपको चर को स्थानीय चर में कॉपी करना होगा या चर अंतिम बनाना होगा, लेकिन फिर आप लूप करने में असमर्थ होंगे।

1

आपकी आंतरिक कक्षा अंतिम है और इसलिए आपको अपनी अंतिम इकाई के अंदर से कुछ भी संशोधित करने में सक्षम नहीं होना चाहिए।

15

स्थानीय चर हमेशा ढेर पर रहते हैं, सभी स्थानीय चरों पर पल विधि खत्म हो जाती है।

लेकिन विधि के खत्म होने के बाद भी आपकी आंतरिक कक्षा वस्तुएं ढेर पर हो सकती हैं (एक आवृत्ति चर संदर्भ में कहें), इसलिए उस स्थिति में जब तक वे चले जाते हैं, तब तक यह आपके स्थानीय चरों तक नहीं पहुंच सकता है, जब तक कि आप उन्हें चिह्नित न करें अंतिम

7

ऐसा इसलिए है क्योंकि एक फ़ंक्शन के अंदर आंतरिक वर्ग वास्तव में स्थानीय चर की एक प्रति बनाता है क्योंकि स्थानीय क्लाइंट का उदाहरण अभी भी मौजूद है, जबकि स्थानीय चर को फ़ंक्शन कॉल के बाद नष्ट किया जा सकता है। स्थानीय चर की दो प्रतियां बनाने के लिए हमेशा एक ही मान होता है (उन्हें समान दिखने के लिए), आपको चर को अंतिम के रूप में घोषित करना होगा।

0

जावा मेमोरी मॉडल के अनुसार अंतिम परिवर्तनीय गारंटी के उपयोग के अनुसार अंतिम चर हमेशा प्रारंभ किया जाता है। जब हम प्रारंभिक किए बिना स्थानीय चर का उपयोग करने का प्रयास करते हैं तो हमें त्रुटि मिलती है। अंतिम गारंटी का उपयोग करते हुए आंतरिक वर्ग जो स्थानीय चर का उपयोग किया गया है प्रारंभ किया गया है।

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

  • कोई संबंधित समस्या नहीं^_^