वर्ग नाम के साथ "यह" का उपयोग करना


115

मैं एंड्रॉइड प्रोग्रामिंग कर रहा हूं और इंटेंट्स के बारे में सीख रहा था, जब मैंने एक कंस्ट्रक्टर देखा, जो मेरे सी # प्रशिक्षित दिमाग के लिए, कायरतापूर्ण लग रहा था। कॉल था:

Intent myIntent = new Intent(CurrentActivity.this, NextActivity.class);

मेरे लिए दोनों पैरामीटर नए हैं। क्लास नाम से एक स्थिर ".this" कैसे होता है? यह एक जावा चीज है या एक Android चीज है? मैं यह मान रहा हूं कि यह केवल "यह" कह रहा है, क्योंकि मैं इसके संदर्भ में CurrentActivityहूं, लेकिन मुझे यह नहीं मिलता कि "इस" को क्लास नाम से ही कैसे बुलाया जा सकता है। इसके अलावा। ".Class" ऐसा लगता है कि यह प्रतिबिंब के लिए उपयोग किया जाता है, जिसे मैं C # से परिचित हूं, लेकिन इस बारे में किसी भी जानकारी का स्वागत किया जाएगा।

धन्यवाद।

जवाबों:


138

आमतौर पर, आप केवल उपयोग कर सकते हैं this। लेकिन, कभी this- कभी एक आंतरिक वर्ग का संदर्भ देता है ... इसलिए, उदाहरण के लिए:

Button button = (Button)findViewById(R.id.ticket_details_sell_ticket);
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // it will be wrong to use only "this", because it would
        // reference the just created OnClickListener object
        Intent login = new Intent(ClassName.this, Login.class);
        startActivityForResult(login, LOGIN_REQUEST);
    }
});

17
समझा। तो मैंने आपके उदाहरण में नए इरादे में सिर्फ "यह" कहा था, यह ऑनक्लीक्लिंटर वर्ग के "इस" का जिक्र होगा, लेकिन चूंकि मुझे बाहरी वर्ग को संदर्भित करने की आवश्यकता है, इसलिए मुझे यह संकेत देने का एक तरीका चाहिए।
skaz

7
सही। thisहमेशा अंतरतम वर्ग है।
फाल्मरी

7
और प्रश्न के अन्य भाग का उत्तर देने के लिए: हाँ, यह एक जावा बात है
डेको जू

1
मैं क्यों सोच रहा था MyClass.this और न केवल यह जब एक श्रोता पंजीकरण में! धन्यवाद
luigi7up

3
मजेदार! कौन जानता था कि जावा जावा thisजावास्क्रिप्ट की तरह था this? मुझे लगता है कि आपको प्रथम श्रेणी के कार्यों या लैंबडास नहीं होने के लिए क्या मिलता है :-)
पैट

61

एक बार में एक:

पहले निर्माण को एक योग्य कहा जाता है । वाक्यविन्यास का उद्देश्य उस स्थिति में है जहां आप एक आंतरिक वर्ग (आमतौर पर एक अनाम आंतरिक वर्ग) में हैं और आप thisबाहरी this(अनाम) आंतरिक वर्ग के बजाय बाहरी वर्ग का संदर्भ चाहते हैं । "योग्य यह" केवल एक संदर्भ में उपयोग किया जा सकता है जहां thisअस्पष्ट होगा। JLS का उद्धरण "यह एक संकलन-समय की त्रुटि है अगर अभिव्यक्ति एक वर्ग या इंटरफ़ेस में होती है जो कक्षा टी या टी के ही एक आंतरिक वर्ग नहीं है"।

दूसरी रचना को कहा जाता class literalहै जो क्लास ऑब्जेक्ट को संदर्भित करने का एक तरीका है जो उस प्रकार का प्रतिनिधित्व करता है। इसका उपयोग किसी भी संदर्भ में किया जा सकता है।


यह ध्यान देने योग्य है, अगर यह उत्तर अभी भी स्पष्ट नहीं है, कि यह केवल तभी काम करता है जब कोई संलग्न वर्ग हो और आप बाहरी वर्ग का संदर्भ दे रहे हों। आप बस "NotInTheStackOfEnclosings.this" का उपयोग नहीं कर सकते।
२४:५४

1
@DiegoNunes, के सच qualified thisनहीं है class literal। मैंने उस उत्तर को स्पष्ट करने के लिए अपने उत्तर का विस्तार किया है।
यिशै जूल

14

वाक्यविन्यास "Classname.this" आंतरिक कक्षाओं के लिए है। यदि आप "आउटरक्लास" प्रकार के संलग्न उदाहरण को संदर्भित करना चाहते हैं तो आप इसे "आउटरक्लास" के रूप में करते हैं।

NextActivity.class केवल क्लास ऑब्जेक्ट है जो क्लास "NextActivity" का वर्णन करता है।



8

ClassName.this एक बाहरी वर्ग से एक बाहरी वर्ग के वर्तमान उदाहरण को संदर्भित करने के लिए उपयोग किया जाता है।


और निश्चित रूप से चारों ओर का रास्ता?
कोडीनिक्स

5
<ClassName>.this

एनक्लोजिंग क्लास के वर्तमान उदाहरण को संदर्भित करने के लिए नेस्टेड कक्षाओं में उपयोग किया जाता है, क्योंकि `यह 'कीवर्ड नेस्ट क्लास उदाहरण को संदर्भित करता है।

सार्वजनिक वर्ग Siht { वर्ग NestedSht { शून्य डेमोइस () { सिस्टम ग़लती से println ( " : Siht.this 'का एक उदाहरण है" + Siht इस getClass ()। getName ; ()) } }   
      
         
            this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println(" 
                            
        
    

void demoThis() {
    new java.lang.Object() {
        void demoThis() {
            System.err.println("`this' is an instance of: " + 
                            this.getClass().getName());
            System.err.println("`Siht.this' is an instance of: " +
                            Siht.this.getClass().getName());
        }
    }.demoThis();
    new NestedSiht().demoThis();
}

public static void main(String [] args) {
    new Siht().demoThis();
}

}


0

यह केवल भ्रामक है क्योंकि जब आप " MainActivity.this " का उपयोग करते हैं , तो ऐसा लगता है कि आप कक्षा का उल्लेख कर रहे हैं न कि वस्तु का। वास्तव में जब आप "इस" का उपयोग करते हैं तो आप हमेशा वर्तमान वस्तु का उल्लेख करते हैं, जैसा कि जावा से प्रलेखन राज्यों में होता है:

https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

एक आवृत्ति विधि या एक निर्माता के भीतर, यह वर्तमान objec t का संदर्भ है - वह वस्तु जिसका विधि या निर्माता कहा जा रहा है। आप वर्तमान ऑब्जेक्ट के किसी भी सदस्य को एक इंस्टेंस विधि या एक कंस्ट्रक्टर से इसका उपयोग करके संदर्भित कर सकते हैं।

यह सिर्फ वाक्यात्मक रूप से अजीब है।

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