2012-10-23 7 views
17

एक आंतरिक वर्ग विधि के भीतर परिभाषित किया गया है, जब तक कि इन स्थानीय चर को final चिह्नित नहीं किया जाता है। मैंने स्टैक ओवरफ्लो और जावा कोड खेत में अन्य पोस्टों को देखा है, लेकिन उनमें से कोई भी बिल्कुल जवाब देने वाला प्रतीत नहीं होता है सवाल यह है कि चरम चर को कैसे चिह्नित किया जाता है, आंतरिक वर्ग को विधि में स्थानीय चरों तक पहुंचने की अनुमति मिलती है।एक वैरिएबल को अंतिम रूप में चिह्नित करने से आंतरिक कक्षाओं तक पहुंचने की अनुमति मिलती है?

स्थानीय चर और स्थानीय चर जबकि दुर्गम अंतिम स्थानीय चर रहे हैं स्टैक पर जमा हो जाती है और जैसे ही विधि कॉल खत्म के रूप में ढेर अप पॉपअप है:

class MyOuter { 
    private String x = "Outer"; 

    void fly(final int speed) { 
     final int e = 1; 
     class FlyingEquation { 

      public void seeOuter() 
      { 
       System.out.println("Outer x is " + x); 
      } 
      public void display() 
      { 
       System.out.println(e);// line 1 
       System.out.println(speed);// line 2 
      } 
     } 
     FlyingEquation f=new FlyingEquation(); 
     f.seeOuter(); 
     f.display(); 
    }  
    public static void main(String args[]) 
    { 
     MyOuter mo=new MyOuter(); 
     mo.fly(5); 
    } 
} 

स्पष्टीकरण मैं इस पायामेमोरी के डेटा सेक्शन में संग्रहीत हैं, संभावित रूप से JVM को विधि कॉल के अंत के बाद भी उन्हें एक्सेस करने की अनुमति देता है। data section of memory कहां है? मुझे विश्वास है कि सभी स्थानीय चर अंतिम हैं या स्टैक पर संग्रहीत नहीं हैं। जब स्टैक से विधि हटा दी जाती है तो अंतिम चर इसके साथ हटा दिया जाएगा। क्या यह है कि अंतिम चर में मान ढेर में वस्तु के साथ संग्रहीत किया जाता है?

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

+0

यह [एसओ लिंक] (http://stackoverflow.com/a/1299889/1168372) उपयोगी हो सकता है – Sujay

+0

मैं एक जवाब जोड़ लिया है। उम्मीद है कि यह आपको –

उत्तर

11

आंतरिक वर्ग के तत्कालता के दौरान, जब विधि और वर्ग दोनों दायरे में होते हैं, तो आंतरिक कक्षा स्थिरता की एक प्रति बनायेगी जो स्थिरांक हैं, जिसका अर्थ यह है कि विधि आंतरिक रूप से गुंजाइश से बाहर हो सकती है वर्ग केवल चर की एक प्रति का उपयोग कर रहा है। Check out this article

13

final के रूप में एक स्थानीय चर को चिह्नित करने के लिए संकलक बताता है कि इसके मूल्य को आवंटित होने के बाद बदलने की गारंटी नहीं है। यह आंतरिक वर्ग के अंदर एक सिंथेटिक क्षेत्र बनाने के लिए संकलक और प्रति स्थानीय चर के मान को इस सिंथेटिक फ़ील्ड में आंतरिक कक्ष उदाहरण के निर्माण के दौरान सुरक्षित बनाता है। आंतरिक वर्ग कोड के अंदर से स्थानीय चर के सभी पाठ वास्तव में सिंथेटिक क्षेत्र के पढ़ने में संकलित होते हैं।

यह चाल गैर-अंतिम चर के लिए काम नहीं करेगी क्योंकि आंतरिक कक्षा को तुरंत चालू करने के बाद वे बदल सकते हैं, और कृत्रिम क्षेत्र मूल चर के साथ सिंक हो जाएगा।

यह जानना महत्वपूर्ण है कि सभी आंतरिक कक्षाएं कंपाइलर की चाल हैं - रनटाइम के लिए जेवीएम सभी कक्षाएं (शीर्ष-स्तर, घोंसला स्थिर, और भीतरी) का इलाज समान होता है।

2

हां अंतिम स्थानीय चर ढेर पर सहेजे जाते हैं और उस विधि को नष्ट कर दिया जाता है जब विधि को ढेर से हटा दिया जाता है। जैसा कि @ इयान ने सुझाव दिया है, जब संकलक चर के लिए अंतिम कीवर्ड देखता है, तो यह ढेर पर आंतरिक वर्ग ऑब्जेक्ट में मान की एक प्रति बनाता है।

0

इसके पीछे की कहानी यह है कि जावा के रचनाकारों के पास closure का पूरा समर्थन करने के लिए पर्याप्त समय नहीं था।

भाषा समर्थन बंद करने के कई तरीके हैं। उदाहरण के लिए, योजना में, फ़ंक्शन में निशुल्क पैरामीटर ऐसे वातावरण से बंधे होते हैं जो लेक्सिकल स्कोप से मेल खाते हैं जहां फ़ंक्शन परिभाषित किया जाता है।एक ऐसी भाषा में जो एसएमएल जैसे अपरिवर्तनीय डेटा को मजबूर करती है, बंद करने के लिए आवश्यक स्थानीय चर की प्रतिलिपि बनाकर बंद किया जा सकता है।

तो वे एक गरीब व्यक्ति के बंद होने का संस्करण बनाने के लिए आंतरिक वर्ग बनाते हैं जो एमएल की शैली की नकल करता है।

0

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

चेकआउट इस अनुच्छेद: http://www.geeksforgeeks.org/inner-class-java/

0

तो अब विधि के it.The स्थानीय चर ढेर पर रहते हैं के बारे में सोचना और विधि के जीवन भर के लिए ही मौजूद हैं। हम पहले से ही जानते हैं कि स्थानीय चर का दायरा वैरिएबल घोषित करने की विधि तक सीमित है। जब विधि समाप्त होती है, तो स्टैक फ्रेम उड़ा दिया जाता है और चर इतिहास होता है। लेकिन विधि पूर्ण होने के बाद भी, इसके भीतर बनाई गई आंतरिक कक्षा वस्तु ढेर पर जीवित हो सकती है, उदाहरण के लिए, इसका संदर्भ किसी अन्य कोड में पारित किया गया था और फिर एक आवृत्ति चर में संग्रहीत किया गया था। चूंकि स्थानीय चर को जीवित रहने की गारंटी नहीं दी जाती है, जब तक कि स्थानीय आंतरिक वर्ग वस्तु विधि हो, आंतरिक वर्ग वस्तु उनका उपयोग नहीं कर सकती है। जब तक स्थानीय चर अंतिम चिह्नित नहीं होते हैं।

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

स्पष्टीकरण: अब तो मुझे लगा कि सभी स्थानीय चर (अंतिम या नहीं) ढेर में संग्रहीत और दायरे से बाहर जाने के जब विधि निष्पादन खत्म हो गया है पता चला में कुछ शोध के बाद।

लेकिन अंतिम परिवर्तनीय JVM इन्हें स्थिर के रूप में ले जाएं क्योंकि वे के बाद नहीं बदलेंगे। और जब एक आंतरिक वर्ग तक पहुँचने का प्रयास उन्हें उस चर की एक प्रति (नहीं है कि चर यह आत्म) ढेर में बनाने कम्पाइलर और भीतरी वर्ग के भीतर एक सिंथेटिक क्षेत्र बनाते हैं, तो भी जब विधि निष्पादन है इसके ऊपर पहुंच योग्य है क्योंकि आंतरिक वर्ग की अपनी प्रति है। सिंथेटिक फ़ील्ड दायर किया गया है जो वास्तव में स्रोत कोड में मौजूद नहीं है लेकिन संकलक उन फ़ील्ड को आंतरिक वर्गों में उन फ़ील्ड को सुलभ बनाने के लिए बनाते हैं। सरल शब्द छिपा फ़ील्ड में।

तो अंतिम वैरिएबल भी ढेर में संग्रहीत है, लेकिन उस प्रतिलिपि की प्रतिलिपि जो एक आंतरिक वर्ग ढेर में संग्रहीत है।

+0

में मदद करता है क्या कोई मेरा जवाब पढ़ता है :(?? –

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

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