2015-02-11 3 views
5

enter image description here

मैं डिबग मोड में एक test बुलाया testSendStream चल रहा है और कोड के माध्यम से कदम के रूप में परीक्षण कार्यान्वित द्वारा this कार्यात्मक प्रतिक्रियाशील जावा पुस्तकालय समझने की कोशिश कर रहा हूँ।

उपरोक्त स्नैपशॉट से पता चलता है कि this$0 नामक एक अजीब नामित चर है।

यह नाम कहां से आया है?

इस नाम का क्या अर्थ है?

इस चर का नाम इस नाम का है?

यह नाम देने के पीछे तर्क क्या है?

निश्चित रूप से यह नाम कोड से नहीं आया है, यह इंटेलिजे या जावैक/जावा द्वारा उत्पन्न होता है। पर क्यों ?

यह देखना भी दिलचस्प है कि अगर मैं इस ऑब्जेक्ट को Mystery Object लेबल से चिह्नित करता हूं तो क्या होता है।

enter image description here

उत्तर

8

this$0Inner कक्षा में संदर्भित है जो बताता है कि Outer कक्षा का कौन सा उदाहरण आंतरिक वर्ग का वर्तमान उदाहरण बनाने के लिए उपयोग किया गया था।

यह आवश्यक है क्योंकि जब से नेस्टेड वर्गों (निजी भी शामिल होते हैं) बाहरी वर्गों अगर हम भीतरी कक्षा में methodFromOuterClass() की तरह कुछ JVM पता करने के लिए जो Outer उदाहरण यह आह्वान करने के लिए उपयोग करना चाहिए की जरूरत है लिखने में सक्षम होना चाहता हूँ के सभी सदस्यों के लिए उपयोग किया इस विधि पर (इसलिए संकलक इस कोड को this$0.methodFromOuterClass() में बदलता है)।


लिटिल अधिक जानकारी और उदाहरण:

public class Outer { 
    private int id; 
    public Outer(int id) { this.id = id;} 

    public class Inner{ 
     void printParentID(){ 
      System.out.println(id); 
     } 
    } 
} 

अब यहाँ क्या प्रिंट किया जाएगा और क्यों?

Outer o1 = new Outer(1); 
Outer o2 = new Outer(2); 
Outer.Inner in1 = o1.new Inner(); 
Outer.Inner in2 = o2.new Inner(); 

in1.printParentID(); 
in2.printParentID(); 

हम

1 
2 

देखेंगे लेकिन कैसे in1 जानता था कि यह o2 से o1 और नहीं से id का मूल्य मुद्रित करना चाहिए?
ऐसा इसलिए है क्योंकि आंतरिक वर्ग के प्रत्येक उदाहरण को पता है कि बाहरी वर्ग का कौन सा उदाहरण बनाया गया था। और यह this$0 संदर्भ के कारण है जो बाहरी उदाहरण बनाने के लिए बाहरी उदाहरण के संदर्भ में संग्रहीत करता है।
यह चर संकलक द्वारा सभी गैर स्थिर इनर क्लासों में जोड़ा जाता है और इसके मूल्य जब आप

Outer.Inner in1 = o1.new Inner();//`this$0` will be set to hold `o1` instance. 

आह्वान सेट कर दिया जाता तो कोड

void someMethod(){ 
    System.out.println(id); 
} 

की तरह अनिवार्य रूप से

void someMethod(){ 
    System.out.println(this$0.id);//although we can't access this$0 explicitly 
} 
+0

कूल! आपका बहुत बहुत धन्यवाद ! हर दिन कुछ नया सीखना! – jhegedus

+0

आपका स्वागत है :) – Pshemo

2

गैर स्थिर इनर क्लासों से संबंधित एक सम्मेलन है। आंतरिक कक्षा के बाइटकोड में this$0 नामक पैकेज-स्कोप्ड फ़ील्ड का संदर्भ होगा जो आपको संलग्न कक्षा के इस ऑब्जेक्ट को संदर्भित करने की अनुमति देता है। आपके उदाहरण में नोटिस this$0Mystery Object this जैसा ऊपर वर्णित है वैसा ही है।

+0

के बराबर है सहायक उत्तर के लिए धन्यवाद! – jhegedus

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