मैं जावा 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()
को वैसे भी नहीं बुलाया जा रहा है? (ऊपर वर्णित क्लास कंस्ट्रक्टर)।
5 जवाब
आप this()
या super()
पर कॉल कर सकते हैं लेकिन दोनों एक ही कंस्ट्रक्टर से नहीं। जब आप this()
को कॉल करते हैं, तो super()
को अन्य कंस्ट्रक्टर (जिसे आप this()
से कॉल करते हैं) से स्वचालित रूप से कॉल किया जाता है।
this(0, 0);
कॉल करेगा, उसी क्लास का कंस्ट्रक्टर और super()
Point
क्लास के सुपर/पैरेंट क्लास को कॉल करेगा।
अब, कोड संकलित नहीं होगा क्योंकि यह (0,0) कंस्ट्रक्टर की पहली पंक्ति में नहीं है। यहीं मैं भ्रमित हो जाता हूं। कोड संकलित क्यों नहीं होगा? क्या सुपर() को वैसे भी नहीं कहा जा रहा है?
super()
कंस्ट्रक्टर की पहली लाइन होनी चाहिए और साथ ही this()
कंस्ट्रक्टर की पहली लाइन होनी चाहिए। तो दोनों पहली पंक्ति में नहीं हो सकते (संभव नहीं), इसका मतलब है कि, हम दोनों को एक कंस्ट्रक्टर में नहीं जोड़ सकते।
आपके कोड के बारे में एक स्पष्टीकरण के रूप में:
this(0, 0);
उस कंस्ट्रक्टर को कॉल करेगा जो दो पैरामीटर लेता है (Point
क्लास में) और वह दो पैरामीटर कंस्ट्रक्टर super()
को परोक्ष रूप से कॉल करेगा (क्योंकि आपने इसे स्पष्ट रूप से कॉल नहीं किया था)।
अपने पहले कंस्ट्रक्टर में सुपर () डालें, इसे काम करना चाहिए।
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);
}
}
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
}
}
एक कंस्ट्रक्टर super()
मेथड कॉल का उपयोग करके सुपर क्लास के कंस्ट्रक्टर को कॉल कर सकता है। केवल बाधा यह है कि यह पहला कथन होना चाहिए।
public Animal() {
super();
this.name = "Default Name";
}
क्या यह कोड संकलित होगा?
public Animal() {
this.name = "Default Name";
super();
}
उत्तर नहीं है। super()
को हमेशा कंस्ट्रक्टर की पहली लाइन पर बुलाया जाना चाहिए।
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।