Java में कंस्ट्रक्टर
Box.java में क्लास Box लिखें जिसमें int फ़ील्ड size हो और कंस्ट्रक्टर Box(int n) जो size = n; सेट करे। Hall.java में Box b = new Box(4); से एक box बनाएँ, फिर b.size प्रिंट करें। दोनों फ़ाइलें कंपाइल करें और java Hall चलाएँ। स्क्रीन एक लाइन दिखाए: 4। जो संख्या आप new को देते हैं वह कंस्ट्रक्टर तक पहुँचती है, और कंस्ट्रक्टर उसे ऑब्जेक्ट पर जमा करता है इससे पहले कि main आगे बढ़े। निर्माण के समय फ़ील्ड सेट करना — कंस्ट्रक्टर के अंदर — इसी पेज का पाठ है।
वह मेथड जो new बनाते समय चलती है
कंस्ट्रक्टर का नाम क्लास जैसा ही होता है। इसमें void रिटर्न टाइप नहीं होता और कोई अन्य रिटर्न टाइप भी नहीं। जब main लिखता है new Box(4), Java ऑब्जेक्ट बनाता है और उसी कंस्ट्रक्टर को 4 को n मानकर चलाता है। कंस्ट्रक्टर खत्म होने के बाद चर तैयार ऑब्जेक्ट रखता है। इस पेज का पूरा काम यही है: new में मान दें, कंस्ट्रक्टर को फ़ील्ड पर जमा करने दें, फिर फ़ील्ड प्रिंट करें ताकि जमा सही दिखे।
पहले Box.java बनाएँ। public class लाइन public class Box है। यहाँ पुराना Cup या Chip क्लास नाम न छोड़ें। ब्रेसेस के अंदर int size; घोषित करें। फिर कंस्ट्रक्टर लिखें: Box(int n) { size = n; }। इस पेज पर पैरामीटर नाम size से अलग रखें ताकि असाइनमेंट बिना this शब्द के साफ़ रहे। Box.java में main नहीं है। कंपाइल से पहले सेव करें।
सिर्फ़ फ़ील्ड लाइन ऑब्जेक्ट में 4 नहीं डालती। कंस्ट्रक्टर बॉडी वह काम तब करती है जब new उसे बुलाता है। अगर आप कंस्ट्रक्टर छोड़कर सिर्फ़ फ़ील्ड घोषित करें तो बाद का new Box(4) मेल नहीं खाएगा, और javac कॉल पर शिकायत करेगा। Box.java में दोनों टुकड़े रखें: फ़ील्ड और वह कंस्ट्रक्टर जो उसमें लिखता है।
public class Box {
int size;
Box(int n) {
size = n;
}
}
Hall new Box में 4 भेजता है
उसी फ़ोल्डर में Hall.java बनाएँ। इसकी public class लाइन public class Hall है। main के अंदर लिखें Box b = new Box(4); फिर System.out.println(b.size);। आर्गुमेंट 4 कंस्ट्रक्टर पैरामीटर n में जाता है। इस पेज पर अलग b.size = 4; लाइन की ज़रूरत नहीं — कंस्ट्रक्टर पहले ही मान जमा कर चुका है। प्रिंट लाइन इसलिए है कि आप अंदाज़े के बिना कंस्ट्रक्टर के काम पर भरोसा कर सकें।
Hall को वही क्लास रखें जिसमें main है। इस पाठ के लिए main को Box के अंदर न डालें। दो-फ़ाइल आकार पहले के ऑब्जेक्ट और फ़ील्ड पेजों जैसा है: एक फ़ाइल टाइप परिभाषित करती है, दूसरी बनाती और इस्तेमाल करती है। अगर फ़ाइल का नाम बदलें पर पुरानी public class Shelf लाइन रह जाए, तो नाम फिर मेल खाने तक javac मना करेगा।
public class Hall {
public static void main(String[] args) {
Box b = new Box(4);
System.out.println(b.size);
}
}
जिस फ़ोल्डर में दोनों फ़ाइलें हैं वहाँ से javac Box.java Hall.java चलाएँ। दोनों पूरा होने पर आप पहले Box.java और फिर Hall.java कंपाइल कर सकते हैं। जब कोष्ठक, ब्रेसेस और सेमीकोलन मिलते हैं तो javac अपनी कोई लाइन नहीं लिखता। फिर java Hall चलाएँ — java Hall.java नहीं, और java Box भी नहीं। रन कमांड से .java अंत हटाएँ। वही क्लास शुरू करें जिसमें main है। वही कमांड Windows और macOS पर चलते हैं।
प्रोग्राम एक लाइन प्रिंट कर रुकना चाहिए: 4। आपसे टाइप नहीं माँगना चाहिए। अगर टर्मिनल कीबोर्ड इनपुट का इंतज़ार करे तो किसी पुराने अभ्यास की nextLine कॉल अभी किसी फ़ाइल में है। वह कॉल हटाएँ और Hall में new Box(4) के साथ प्रिंट रखें, Box में कंस्ट्रक्टर के साथ। इंतज़ार करता कर्सर कंस्ट्रक्टर की समस्या नहीं; गलत जगह बैठा पुराना इनपुट कोड है।
रन को एक बार चलाकर देखें। Java Hall.main से शुरू होता है। एक्सप्रेशन new Box(4) एक Box बनाता है और Box(int n) को n बराबर 4 से बुलाता है। बॉडी size = n लिखती है, इसलिए उस ऑब्जेक्ट का size 4 हो जाता है। फिर main b.size प्रिंट करता है और स्क्रीन 4 दिखाती है। और कुछ नहीं छपना चाहिए। अगर ok या 3 या Cup का बचा हिस्सा दिखे तो आप इस पेज का Hall प्रोग्राम नहीं चला रहे।
अगर आप बिना आर्गुमेंट के new Box() लिखें जबकि अकेला कंस्ट्रक्टर int चाहता है, तो javac मना करता है। कॉल को कंस्ट्रक्टर की पैरामीटर सूची से मिलाएँ। अगर कंस्ट्रक्टर नाम से पहले void जोड़ें तो वह साधारण मेथड बन जाता है, कंस्ट्रक्टर नहीं, और new Box(4) उस बॉडी को इस पेज के अपेक्षित तरीके से नहीं चलाएगा। हेडर Box(int n) जैसा होना चाहिए, void Box(int n) नहीं, और static int Box(int n) भी नहीं।
new के बाद असाइन करने से तुलना
फ़ील्ड पेज पर आप new Cup() के बाद c.fill = 3; लिखते थे। वह अभी भी काम करता है। यह पेज जमा को कंस्ट्रक्टर के अंदर ले जाता है ताकि मान ऑब्जेक्ट बनते समय सेट हो। बचा हुआ Cup डेमो जिसमें c.fill = 3; हो अलग पाठ है। इस पेज के लिए Box और Hall तथा new Box(4) रखें। अगर Hall में अभी भी c.fill = 3; है और इस फ़ोल्डर में Cup क्लास नहीं, वह लाइन हटाएँ। कंपाइलर आपके लिए Cup नहीं गढ़ेगा।
सिर्फ़ b को System.out.println(b); से प्रिंट करने पर साफ़ 4 नहीं दिखता। जमा संख्या देखने के लिए b.size प्रिंट करें। अकेला ऑब्जेक्ट रेफ़रेंस फ़ील्ड मान नहीं है। यह पैटर्न आप फ़ील्ड पेज पर सीख चुके; कंस्ट्रक्टर का काम जाँचते समय यहाँ भी वही रखें।
अन्य प्रोग्रामों में आप अभी भी new के बाद फ़ील्ड असाइन कर सकते हैं। यह पाठ सिर्फ़ कंस्ट्रक्टर मार्ग चुनता है ताकि पहला उपयोगी मान निर्माण के समय आए। इस पेज पर एक ही Hall डेमो में दोनों शैलियाँ न मिलाएँ। एक साफ़ मार्ग काफ़ी है: new को आर्गुमेंट, कंस्ट्रक्टर में जमा, फ़ील्ड प्रिंट।
दो box, दो size
हर new Box(...) अलग ऑब्जेक्ट के लिए कंस्ट्रक्टर फिर चलाता है। आप Box a = new Box(2); और Box b = new Box(9); लिख सकते हैं, फिर दोनों size फ़ील्ड प्रिंट करें। पहली कॉल एक ऑब्जेक्ट पर 2 जमा करती है। दूसरी कॉल दूसरे ऑब्जेक्ट पर 9 जमा करती है। दोनों ऑब्जेक्ट एक ही size स्लॉट साझा नहीं करते।
public class Hall {
public static void main(String[] args) {
Box a = new Box(2);
Box b = new Box(9);
System.out.println(a.size);
System.out.println(b.size);
}
}
फिर कंपाइल और चलाएँ: javac Box.java Hall.java, फिर java Hall। स्क्रीन एक लाइन पर 2 और अगली पर 9 दिखाए। हर कंस्ट्रक्टर कॉल ने अपना आर्गुमेंट अपने ऑब्जेक्ट पर जमा किया। Box b = a; लिखना दूसरा ऑब्जेक्ट नहीं बनाता — दो size चाहिए तो दो new Box(...) कॉल करें। रेफ़रेंस कॉपी करना दो बार कंस्ट्रक्टर बुलाने के बराबर नहीं।
अगर दोनों लाइनें एक ही संख्या दिखाएँ तो जाँचें कि हर new अलग आर्गुमेंट देता है और आप उसी क्रम में a.size और b.size प्रिंट करते हैं। अगर javac दूसरी new पर रुक जाए तो गायब कोष्ठक या पुरानी फ़ाइल से गलत क्लास नाम देखें। पहली लाइन कॉपी करके आर्गुमेंट बदलना भूल जाना दूसरी कॉल में आम छोटी गलती है।
this के लिए क्या बचता है
यह पेज अलग नामों के साथ size = n; इस्तेमाल करता है। बाद का पेज — this — दिखाता है कि नाम टकराएँ तो ऑब्जेक्ट की अपनी फ़ील्ड कैसे बोलें। यहाँ साफ़ पैरामीटर नाम n पर रहें। इस पेज पर this.size न गढ़ें जब तक पहले से न जानते हों; पाठ का लक्ष्य new से कंस्ट्रक्टर कॉल है। शब्द this अगला विषय है, आज n को size में जमा करने की शर्त नहीं।
अगर Hall.java कंपाइल करते समय javac को Box न मिले तो जाँचें कि Box.java उसी फ़ोल्डर में है और क्लास लाइन public class Box है। अगर स्क्रीन 0 दिखाए तो कंस्ट्रक्टर में असाइनमेंट गायब हो सकता है, या main अभी भी बिना-आर्गुमेंट आकार इस्तेमाल करता हो जो size कभी सेट नहीं करता — Box(int n) { size = n; } और new Box(4) रखें। स्क्रीन पर शून्य आमतौर पर मतलब फ़ील्ड डिफ़ॉल्ट पर रही क्योंकि जमा चला ही नहीं।
जब फ़ोल्डर में फ़ील्ड पेज के Cup.java या Shelf.java अभी हों, उन्हें छोड़ दें या सिर्फ़ तभी हटाएँ जब वे आपकी कंपाइल कमांड उलझाएँ। पुराना Shelf जो अभी भी c.fill असाइन करता हो कंपाइल करके इस पेज की स्क्रीन की उम्मीद न करें। इस पाठ की Box और Hall जोड़ी कंपाइल करने के बाद java Hall चलाएँ।
this से पहले
आप int size; घोषित कर सकते हैं, Box(int n) { size = n; } लिख सकते हैं, और Hall से Box b = new Box(4); बना सकते हैं। दोनों फ़ाइलें कंपाइल करें और java Hall चलाएँ। स्क्रीन 4 दिखाती है। कंस्ट्रक्टर तब चलता है जब new ऑब्जेक्ट बनाता है। आपने निर्माण के समय संख्या दी, कंस्ट्रक्टर ने फ़ील्ड पर जमा किया, और प्रिंट ने जमा साबित किया। अगला पेज this है, जहाँ आप मेथड और कंस्ट्रक्टर के अंदर ऑब्जेक्ट की अपनी फ़ील्ड नामने का दूसरा तरीका सीखते हैं।
कंस्ट्रक्टर हेडर बिना void रखें। new पर आर्गुमेंट रखें। प्रिंट b.size पर रखें। आगे बढ़ने से पहले ये तीन आदतें इस पेज का चेकपॉइंट हैं।
🧠 अपने ज्ञान की परीक्षा करें
अपने ज्ञान की परीक्षा करें
इस इंटरैक्टिव क्विज़ के साथ अपनी चुनौती लें और देखें कि आप विषय को कितनी अच्छी तरह समझते हैं
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी