जावा में Class.this और इसके बीच क्या अंतर है


121

उस वर्ग के भीतर एक वर्ग के उदाहरण को संदर्भित करने के दो तरीके हैं। उदाहरण के लिए:

class Person {
  String name;

  public void setName(String name) {
    this.name = name;
  }

  public void setName2(String name) {
    Person.this.name = name;
  }
}

एक का उपयोग this.nameऑब्जेक्ट फ़ील्ड को संदर्भित करने के लिए करता है, लेकिन दूसरा className.thisऑब्जेक्ट फ़ील्ड को संदर्भित करने के लिए उपयोग करता है। इन दोनों संदर्भों में क्या अंतर है?

जवाबों:


165

इस मामले में, वे समान हैं। Class.thisजब आप एक गैर स्थिर नेस्टेड वर्ग है कि जरूरतों को इसकी बाहरी वर्ग के उदाहरण का उल्लेख किया है वाक्य रचना उपयोगी है।

class Person{
    String name;

    public void setName(String name){
        this.name = name;
    }

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }

    }
}

2
यदि आप Person.this.name के बजाय सिर्फ "रिटर्न नेम" कहेंगे तो क्या यह काम नहीं करेगा?
अमित जी

7
@ अमित जी - इस उदाहरण में, हां, यह काम करेगा। हालाँकि, ऐसे समय होते हैं जब आपको यह स्पष्ट करने की आवश्यकता होती है कि कौन सा "यह" आप उपयोग कर रहे हैं (उदाहरण के लिए यदि सदस्य var नाम या विधि नाम में विरोधाभास हैं)। एक प्रासंगिक उदाहरण के लिए माइकल का जवाब देखें।
jtahlborn

1
एक उदाहरण तब होगा जब आपको Person.thisकिसी अन्य वस्तु का संदर्भ देना होगा ।
बोवी

85

यह वाक्यविन्यास केवल तब प्रासंगिक हो जाता है जब आपके पास नेस्टेड कक्षाएं हों:

class Outer{
    String data = "Out!";

    public class Inner{
        String data = "In!";

        public String getOuterData(){
            return Outer.this.data; // will return "Out!"
        }
    }
}

13

आपको केवल आंतरिक कक्षाओं के लिए className.this का उपयोग करने की आवश्यकता है। यदि आप उनका उपयोग नहीं कर रहे हैं, तो इसके बारे में चिंता न करें।


4

Class.thisएक स्थिर नहीं संदर्भ के लिए उपयोगी है OuterClass

नॉनस्टैटिक को इंस्टेंट करने के लिए InnerClass, आपको सबसे पहले इंस्टेंट करना होगा OuterClass। इसलिए एक अमानक InnerClassहमेशा इसके OuterClassऔर सभी क्षेत्रों और तरीकों के OuterClassलिए एक संदर्भ होगा InnerClass

public static void main(String[] args) {

        OuterClass outer_instance = new OuterClass();
        OuterClass.InnerClass inner_instance1 = outer_instance.new InnerClass();
        OuterClass.InnerClass inner_instance2 = outer_instance.new InnerClass();
        ...
}

इस उदाहरण में दोनों Innerclassको एक ही से लिया गया है, Outerclassइसलिए दोनों का संदर्भ समान है Outerclass

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.