2013-04-07 15 views
33

मैं कोड के इस ब्लॉक में भाग गया, और यह एक पंक्ति है जिसे मैं अर्थ समझने से नहीं छोड़ता या यह क्या कर रहा है।"यह()" विधि का क्या अर्थ है?

public Digraph(In in) { 
    this(in.readInt()); 
    int E = in.readInt(); 
    for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
    } 
} 

मैं समझता हूँ कि क्या या this.variable रहे हैं, लेकिन क्या this() है?

+0

@Avi मैं सिर्फ इस परिचित लग रहा था सोच रहा था। –

उत्तर

48

यह निर्माता से अधिक भार है। विस्तारित कक्षा को आरंभ करने के लिए यह कन्स्ट्रक्टर की पहली पंक्ति में super() पर कॉल करने के समान ही है। आपको अपने कन्स्ट्रक्टर की पहली पंक्ति में this() (या this() का कोई अन्य ओवरलोडिंग) कॉल करना चाहिए और इस प्रकार कन्स्ट्रक्टर कोड डुप्लिकेशंस से बचें। Constructor overloading in Java - best practice

+0

धन्यवाद एक टन ... अच्छी जानकारी वास्तव में – Gattsu

10

इस तरह के एक समारोह के रूप में इस() का उपयोग करके, अनिवार्य रूप से कक्षा के निर्माता को बुलाता है। यह आपको एक कन्स्ट्रक्टर में सभी सामान्य प्रारंभिकताओं की अनुमति देता है और दूसरों में विशेषज्ञता प्राप्त करता है। तो उदाहरण के लिए कोड के इस टुकड़े में, this(in.readInt()) पर कॉल डिग्राफ कन्स्ट्रक्टर को कॉल कर रहा है जिसमें एक int तर्क है।

3

एक int पैरामीटर के साथ कक्षा डिग्राफ का एक अन्य निर्माता।

Digraph(int param) { /* */ } 
8

यह कोड स्निपेट एक निर्माता है।

this को इस कॉल में एक ही कक्षा

public App(int input) { 
} 

public App(String input) { 
    this(Integer.parseInt(input)); 
} 

का एक और निर्माता ऊपर के उदाहरण में कॉल करने पर हम एक निर्माता है कि एक int और एक कि एक String लेता है लेता है। String लेता है जो कन्स्ट्रक्टर String को int में परिवर्तित करता है और फिर int कन्स्ट्रक्टर में प्रतिनिधि करता है।

ध्यान दें कि किसी अन्य निर्माता या सुपरक्लस कन्स्ट्रक्टर (super()) पर कॉल कन्स्ट्रक्टर में पहली पंक्ति होनी चाहिए।

शायद कन्स्ट्रक्टर अधिभार के अधिक विस्तृत स्पष्टीकरण के लिए this पर एक नज़र डालें।

public class Diagraph { 

    public Diagraph(int n) { 
     // Constructor code 
    } 


    public Digraph(In in) { 
     this(in.readInt()); // Calls the constructor above. 
     int E = in.readInt(); 
     for (int i = 0; i < E; i++) { 
     int v = in.readInt(); 
     int w = in.readInt(); 
     addEdge(v, w); 
     } 
    } 
} 

आप इस कोड को बता सकते हैं एक निर्माता और नहीं एक वापसी प्रकार की कमी से एक विधि है:

3

कॉलिंग this अनिवार्य रूप से वर्ग निर्माता कहता है:

आप भी इस पद पर एक नज़र हो सकता है। उदाहरण के लिए, आप, कुछ का विस्तार कर रहे हैं add(JComponent) के साथ तुलना में, तुम कर सकते हो: this.add(JComponent).

2

निर्माता ओवरलोडिंग:

पूर्व:

public class Test{ 

    Test(){ 
     this(10); // calling constructor with one parameter 
     System.out.println("This is Default Constructor"); 
    } 

    Test(int number1){ 
     this(10,20); // calling constructor with two parameter 
     System.out.println("This is Parametrized Constructor with one argument "+number1); 
    } 

    Test(int number1,int number2){ 
     System.out.println("This is Parametrized Constructor with two argument"+number1+" , "+number2); 
    } 


    public static void main(String args[]){ 
     Test t = new Test(); 
     // first default constructor,then constructor with 1 parameter , then constructor with 2 parameters will be called 
    } 

} 
2

this(); निर्माता जो एक और फोन करने के लिए इस्तेमाल किया जाता है एक कक्षा में कन्स्ट्रक्टर, उदाहरण के लिए: -

class A{ 
    public A(int,int) 
    { this(1.3,2.7);-->this will call default constructor 
    //code 
    } 
public A() 
    { 
    //code 
    } 
public A(float,float) 
    { this();-->this will call default type constructor 
    //code 
    } 
} 

नोट: मैंने डिफॉल्ट कन्स्ट्रक्टर में this() कन्स्ट्रक्टर का उपयोग नहीं किया क्योंकि इससे डेडलॉक स्थिति हो जाएगी।

आशा यह आप में मदद मिलेगी :)

4

यह लगभग एक ही

public class Test { 
    public Test(int i) { /*construct*/ } 

    public Test(int i, String s){ this(i); /*construct*/ } 

} 
+0

आपकी टिप्पणियां आपके समापन ब्रैकेट को गड़बड़ कर रही हैं –

+0

@Alex ऐसा इसलिए है क्योंकि मैंने उन्हें स्पष्टता के लिए ओपी से कॉपी किया था। – Antimony

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