this$0
Inner
कक्षा में संदर्भित है जो बताता है कि 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
}
कूल! आपका बहुत बहुत धन्यवाद ! हर दिन कुछ नया सीखना! – jhegedus
आपका स्वागत है :) – Pshemo