2011-06-05 14 views
5

संभावित डुप्लिकेट:
Cannot refer to a non-final variable inside an inner class defined in a different method
Why inner classes require “final” outer instance variables [Java] ?जावा इनर क्लासेस

class MyOuter {  

    private String x = "Outer"; 
    void doStuff(){ 
      final String z = "local variable"; 
      class MyInner { 
       public void seeOuter(){ 
         System.out.println("Outer x is" + x); 
         System.out.println("Local variable z is" + z); // does 
         // not compile if final keyword from String z is removed 
       } 
      } 
    } 
} 

उपरोक्त कोड ठीक काम करता है। मैं जानना चाहता हूं कि अगर मैं स्ट्रिंग जेड से अंतिम कीवर्ड हटा देता हूं तो संकलक एक त्रुटि क्यों देता है। अंतिम कीवर्ड बनाने में क्या अंतर है?

उत्तर

3

आपकी कक्षा myInner वास्तव में विधि स्कोप वेरिएबल जेड को "देख" नहीं सकती है जिसका आप संदर्भ दे रहे हैं। कंपाइलर सिर्फ आंतरिक वर्ग को अपनी निजी प्रतिलिपि जेड देता है। इस प्रकार यदि आप बाद में ज़ेड को बदलना चाहते थे, तो आपका प्रोग्राम रहस्यमय तरीके से "तोड़" सकता था, क्योंकि कोड इसे "जैसा दिखता है" यह वही चर है।

इस प्रकार, संकलक आपको उस कोड को तब तक नहीं लिखने देगा जब तक आप वादा नहीं करते कि ज़ेड इसे बाद में नहीं बदल सकता है।

0

1) z कि वर्तमान थ्रेडढेर पर रहता है String लिए एक संदर्भ है। अब, मान लीजिए कि आपकी आंतरिक कक्षा में आप (B) धागा शुरू करते हैं और आप बी से z तक पहुंचना चाहते हैं लेकिन बी को ए के ढेर तक पहुंच नहीं है। इस पहुंच को अनुमति देने के लिए, जावा इस संदर्भ की एक प्रति बनाता है। लेकिन यह सुनिश्चित करने के लिए कि दोनों धागे अपना मूल्य नहीं बदलेंगे, जिससे यह प्रणाली असंगत स्थिति में रखेगी, आपको इसे अंतिम घोषित करना होगा।

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