मैं जावा super() कंस्ट्रक्टर को समझने की कोशिश कर रहा हूं। आइए निम्नलिखित वर्ग में एक नज़र डालें:

class Point {
    private int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public Point() {
        this(0, 0);
    }
}

यह वर्ग संकलित करेगा। अगर हम एक नया Point ऑब्जेक्ट बनाते हैं Point a = new Point(); बिना पैरामीटर वाले कंस्ट्रक्टर को कॉल किया जाएगा: Point()

अगर मैं गलत हूं तो मुझे सुधारें, this(0,0) करने से पहले, Class कंस्ट्रक्टर को कॉल किया जाएगा और उसके बाद ही Point(0,0) को कॉल किया जाएगा। अगर यह सच है, तो क्या यह कहना सही है कि super() डिफ़ॉल्ट रूप से कॉल किया जा रहा है?

अब एक ही कोड को एक छोटे से बदलाव के साथ देखते हैं:

class Point {

        private int x, y;

        public Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public Point() {
            super();   // this is the change.
            this(0, 0);
        }
    }

अब, कोड संकलित नहीं होगा क्योंकि this(0,0) कंस्ट्रक्टर की पहली पंक्ति में नहीं है। यहीं मैं भ्रमित हो जाता हूं। कोड संकलित क्यों नहीं होगा? क्या super() को वैसे भी नहीं बुलाया जा रहा है? (ऊपर वर्णित क्लास कंस्ट्रक्टर)।

2
DifferentPulses 24 जुलाई 2017, 22:30

5 जवाब

सबसे बढ़िया उत्तर

आप this() या super() पर कॉल कर सकते हैं लेकिन दोनों एक ही कंस्ट्रक्टर से नहीं। जब आप this() को कॉल करते हैं, तो super() को अन्य कंस्ट्रक्टर (जिसे आप this() से कॉल करते हैं) से स्वचालित रूप से कॉल किया जाता है।

4
Code-Apprentice 24 जुलाई 2017, 22:45

this(0, 0); कॉल करेगा, उसी क्लास का कंस्ट्रक्टर और super() Point क्लास के सुपर/पैरेंट क्लास को कॉल करेगा।

अब, कोड संकलित नहीं होगा क्योंकि यह (0,0) कंस्ट्रक्टर की पहली पंक्ति में नहीं है। यहीं मैं भ्रमित हो जाता हूं। कोड संकलित क्यों नहीं होगा? क्या सुपर() को वैसे भी नहीं कहा जा रहा है?

super() कंस्ट्रक्टर की पहली लाइन होनी चाहिए और साथ ही this() कंस्ट्रक्टर की पहली लाइन होनी चाहिए। तो दोनों पहली पंक्ति में नहीं हो सकते (संभव नहीं), इसका मतलब है कि, हम दोनों को एक कंस्ट्रक्टर में नहीं जोड़ सकते।

आपके कोड के बारे में एक स्पष्टीकरण के रूप में:

this(0, 0); उस कंस्ट्रक्टर को कॉल करेगा जो दो पैरामीटर लेता है (Point क्लास में) और वह दो पैरामीटर कंस्ट्रक्टर super() को परोक्ष रूप से कॉल करेगा (क्योंकि आपने इसे स्पष्ट रूप से कॉल नहीं किया था)।

5
Blasanka 24 जुलाई 2017, 22:37

अपने पहले कंस्ट्रक्टर में सुपर () डालें, इसे काम करना चाहिए।

class Point {

        private int x, y;

        public Point(int x, int y) {
            super();   // this is the change.
            this.x = x;
            this.y = y;
        }

        public Point() {
            
            this(0, 0);
        }
    }
4
Zhang Bruce 24 जुलाई 2017, 22:40

this(...) को कॉल करके आपको उस कंस्ट्रक्टर में सुपर कंस्ट्रक्टर (यदि मौजूद है) को कॉल करने के लिए मजबूर किया जाता है जिसे आप वहां कॉल कर रहे हैं।

this(...) या super(...) को कॉल करना हमेशा पहला तरीका है जिसे आप कंस्ट्रक्टर में कॉल कर रहे हैं।

संपादित करें

class Point {
    private int x, y;

    public Point(int x, int y) {
        super(...); //would work here
        this.x = x;
        this.y = y;
    }

    public Point() {
        this(0, 0); //but this(...) must be first in a constructor if you want to call another constructor
    }
}
1
Cedric 24 जुलाई 2017, 22:44

एक कंस्ट्रक्टर super() मेथड कॉल का उपयोग करके सुपर क्लास के कंस्ट्रक्टर को कॉल कर सकता है। केवल बाधा यह है कि यह पहला कथन होना चाहिए।

public Animal() { 
    super();
    this.name = "Default Name"; 
}

क्या यह कोड संकलित होगा?

public Animal() {
    this.name = "Default Name"; 
    super();
}

उत्तर नहीं है। super() को हमेशा कंस्ट्रक्टर की पहली लाइन पर बुलाया जाना चाहिए।

1
Pritam Banerjee 24 जुलाई 2017, 22:47