खोज…


परिचय

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

टिप्पणियों

जावा भाषा विनिर्देश निर्माण शब्दार्थ की सटीक प्रकृति के बारे में लंबाई में बात करता है। वे JLS .88.8 में पाए जा सकते हैं

डिफ़ॉल्ट निर्माता

कंस्ट्रक्टरों के लिए "डिफ़ॉल्ट" यह है कि उनके पास कोई तर्क नहीं है। यदि आप किसी निर्माता को निर्दिष्ट नहीं करते हैं, तो कंपाइलर आपके लिए एक डिफ़ॉल्ट निर्माणकर्ता उत्पन्न करेगा।
इसका मतलब यह है कि निम्नलिखित दो स्निपेट शब्दार्थ के बराबर हैं:

public class TestClass {
    private String test;
}
public class TestClass {
    private String test;
    public TestClass() {

    }
}

डिफ़ॉल्ट कंस्ट्रक्टर की दृश्यता कक्षा की दृश्यता के समान है। इस प्रकार एक वर्ग परिभाषित पैकेज-निजी तौर पर एक पैकेज-निजी डिफ़ॉल्ट निर्माता होता है

हालाँकि, यदि आपके पास गैर-डिफ़ॉल्ट कंस्ट्रक्टर है, तो कंपाइलर आपके लिए डिफ़ॉल्ट कंस्ट्रक्टर नहीं बनाएगा। तो ये समतुल्य नहीं हैं:

public class TestClass {
    private String test;
    public TestClass(String arg) {
    }
}
public class TestClass {
    private String test;
    public TestClass() {
    }
    public TestClass(String arg) {
    }
}

खबरदार कि उत्पन्न कंस्ट्रक्टर कोई गैर-मानक प्रारंभ नहीं करता है। इसका मतलब है कि आपकी कक्षा के सभी क्षेत्रों में उनका डिफ़ॉल्ट मूल्य होगा, जब तक कि उनके पास एक इनिशलाइज़र न हो।

public class TestClass {

    private String testData;

    public TestClass() {
        testData = "Test"
    }
}

कंस्ट्रक्टरों को इस तरह कहा जाता है:

TestClass testClass = new TestClass();

तर्क के साथ निर्माता

किसी भी प्रकार के तर्कों के साथ रचनाकार बनाए जा सकते हैं।

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }
}

इस तरह कहा जाता है:

TestClass testClass = new TestClass("Test Data");

एक वर्ग में अलग-अलग हस्ताक्षर वाले कई निर्माता हो सकते हैं। कंस्ट्रक्टर को कॉल करने के लिए (इंस्टेंटिंग करते समय) उसी क्लास के एक अलग कंस्ट्रक्टर को कॉल करें) this()

public class TestClass {

    private String testData;

    public TestClass(String testData) {
        this.testData = testData;
    }

    public TestClass() {
        this("Test"); // testData defaults to "Test"
    }
}

इस तरह कहा जाता है:

TestClass testClass1 = new TestClass("Test Data");
TestClass testClass2 = new TestClass();

मूल निर्माता को बुलाओ

कहते हैं कि आपके पास एक पैरेंट क्लास और एक चाइल्ड क्लास है। चाइल्ड इंस्टेंस का निर्माण करने के लिए हमेशा कुछ पेरेंट कंस्ट्रक्टर की आवश्यकता होती है, जो कि चाइल्ड कंस्ट्रक्टर के बहुत ही बढ़िया तरीके से चलाया जाए। हम अपने पहले चाइल्ड कंस्ट्रक्टर स्टेटमेंट के रूप में उपयुक्त तर्कों के साथ super(...) को स्पष्ट रूप से कॉल करके अपने इच्छित पेरेंट कंस्ट्रक्टर का चयन कर सकते हैं। ऐसा करने से चाइल्ड क्लासेस के कंस्ट्रक्टर में समान कोड को फिर से लिखने के बजाय पेरेंट क्लासेस के कंस्ट्रक्टर को पुनः उपयोग करने से हमारा समय बचता है।

बिना super(...) विधि:

(संक्षेप में, नो-आर्ग्स वर्जन super() अदृश्य रूप से कहा जाता है)

class Parent {
    private String name;
    private int age;
    
    public Parent() {} // necessary because we call super() without arguments
    
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

// This does not even compile, because name and age are private,
// making them invisible even to the child class.
class Child extends Parent {
    public Child() {
        // compiler implicitly calls super() here
        name = "John";
        age = 42;
    }
}

साथ super() विधि:

class Parent {
    private String name;
    private int age;
    public Parent(String tName, int tAge) {
        name = tName;
        age = tAge;
    }
}

class Child extends Parent {
    public Child() {
        super("John", 42);   // explicit super-call
    }
}

नोट: किसी अन्य कंस्ट्रक्टर (चाइनिंग) या सुपर कंस्ट्रक्टर को कॉल करता है, कंस्ट्रक्टर के अंदर पहला स्टेटमेंट होना चाहिए

यदि आप super(...) कंस्ट्रक्टर को स्पष्ट रूप से कहते हैं, तो एक मेलिंग पैरेंट कंस्ट्रक्टर मौजूद होना चाहिए (यह सीधा है, है न?)।

यदि आप किसी super(...) कंस्ट्रक्टर को स्पष्ट रूप से कॉल नहीं करते हैं, तो आपके पैरेंट क्लास के पास एक नो-आर्ग्स कंस्ट्रक्टर होना चाहिए - और यह या तो स्पष्ट रूप से लिखा जा सकता है या कंपाइलर द्वारा डिफ़ॉल्ट के रूप में बनाया जा सकता है यदि पैरेंट क्लास प्रदान नहीं करता है कोई भी निर्माता।

class Parent{
    public Parent(String tName, int tAge) {}
}

class Child extends Parent{
    public Child(){}
}

क्लास पैरेंट के पास कोई डिफ़ॉल्ट कंस्ट्रक्टर नहीं है, इसलिए, कंपाइलर बाल कंस्ट्रक्टर में super नहीं जोड़ सकता है। यह कोड संकलित नहीं करेगा। आपको दोनों पक्षों को फिट करने के लिए कंस्ट्रक्टर्स को बदलना होगा, या अपनी खुद की super कॉल लिखनी होगी, जैसे:

class Child extends Parent{
    public Child(){
          super("",0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow