Java में ओवरलोडिंग
एक क्लास में दो मेथड रखें जो दोनों नाम paint इस्तेमाल करें। एक हेडर static void paint(String word) है। दूसरा static void paint(int n) है। बॉडी छोटी हैं: पहली word प्रिंट करती है, दूसरी n। main से paint("ok"); फिर paint(3); कॉल करें। स्क्रीन दो लाइनें दिखानी चाहिए: पहले ok, फिर 3। Java दूसरी paint को टकराव नहीं मानती। पैरामीटर सूचियाँ अलग होने से दोनों हेडर अलग मेथड माने जाते हैं। अलग सूचियों वाला यही साझा नाम इस पेज का पाठ है।
एक नाम, अलग सूचियाँ
अब तक हर नया विचार नया मेथड नाम लेता था: ring, greet, twice। यहाँ नाम जानबूझकर paint रहता है। जो बदलता है वह कोष्ठक के बीच है। एक सूची में String है। दूसरी में int। कंपाइलर दोनों रखता है क्योंकि सूचियाँ एक जैसी नहीं हैं।
Sign.java नाम की छोटी प्रोग्राम फ़ाइल बनाएँ। पहली लाइन का public class फ़ाइल नाम से मेल खाना चाहिए: public class Sign। इस फ़ाइल में पुराना Box या Tip क्लास नाम न छोड़ें; कंपाइलर क्लास नाम और फ़ाइल नाम का मेल चाहता है।
main के बाहर, फिर भी क्लास के ब्रेसेस के अंदर, दोनों paint हेडर लिखें। इस पेज पर void रखें: हर बॉडी प्रिंट करती है, और return से main को कुछ लौटाने की ज़रूरत नहीं। पहली बॉडी System.out.println(word); इस्तेमाल करती है। दूसरी System.out.println(n);। कंपाइल से पहले फ़ाइल सेव करें। पहला पूरा प्रोग्राम अगले बॉक्स में है।
दो paint मेथड वाली Sign.java
यह वह संस्करण है जिसे आप पहले कंपाइल करते हैं। main में दो कॉल हैं। क्लास में एक नाम साझा करने वाली दो paint मेथड हैं।
public class Sign {
public static void main(String[] args) {
paint("ok");
paint(3);
}
static void paint(String word) {
System.out.println(word);
}
static void paint(int n) {
System.out.println(n);
}
}
जिस फ़ोल्डर में Sign.java है वहाँ से javac Sign.java चलाएँ। जब कोष्ठक, ब्रेसेस और सेमीकोलन मेल खाते हैं तो javac अपनी कोई लाइन नहीं लिखता। फिर java Sign चलाएँ — java Sign.java नहीं। दूसरी कमांड से .java अंत हटाएँ। ये दोनों कमांड Windows और macOS पर काम करती हैं। प्रोग्राम दो लाइनें प्रिंट करके रुकना चाहिए: ok फिर 3। आपको टाइप करने के लिए नहीं पूछना चाहिए। अगर टर्मिनल कीबोर्ड इनपुट का इंतज़ार करे तो पुराने अभ्यास की nextLine कॉल अभी फ़ाइल में है। उसे हटाएँ और ऊपर की दो paint कॉल व दो paint मेथड रखें।
रन को एक बार क्रम से देखें। Java main से शुरू होती है। पहली कॉल paint("ok") है। आर्ग्युमेंट String है, इसलिए Java वह बॉडी चलाती है जो String word लेती है और ok प्रिंट करती है। दूसरी कॉल paint(3) है। आर्ग्युमेंट int है, इसलिए Java वह बॉडी चलाती है जो int n लेती है और 3 प्रिंट करती है। नाम paint दोनों बार एक है। कोष्ठक के अंदर की सूची बॉडी चुनती है।
अगर दोनों लाइनें ok दिखाएँ तो शायद आपने केवल String मेथड रखी और हर कॉल पर एक तय शब्द प्रिंट किया। अगर दोनों 3 दिखाएँ तो शायद केवल int मेथड रखी। दोनों हेडर रखें। अगर javac कहे कि paint पहले से परिभाषित है, जाँचें कि दोनों हेडर की सूची एक जैसी तो नहीं — जैसे paint(String word) की दो कॉपी। ओवरलोडिंग को सूची में असली फ़र्क चाहिए, केवल अलग पैरामीटर नाम वाली वही हेडर की दूसरी कॉपी नहीं।
दो शब्दों वाली दूसरी सूची
पैरामीटर की संख्या भी बदल सकती है। तीसरा ओवरलोड जोड़ें जो दो String मान ले और उन्हें एक स्पेस के साथ एक लाइन पर प्रिंट करे। पहली दो paint मेथड अपनी जगह छोड़ें। नई शक्ल को main से पहले की कॉल के बाद कॉल करें, या सीखते समय केवल इसी शक्ल पर केंद्रित नया main शुरू करें।
public class Sign {
public static void main(String[] args) {
paint("hi", "sam");
}
static void paint(String a, String b) {
System.out.println(a + " " + b);
}
}
सेव के बाद फिर कंपाइल और रन करें: javac Sign.java, फिर java Sign। स्क्रीन एक लाइन दिखाए: hi sam। कॉल में दो आर्ग्युमेंट हैं। मेथड में दो पैरामीटर हैं। इतना मेल Java के लिए इस बॉडी को चुनने के लिए काफ़ी है। अगर अभी भी उसी क्लास में पहले वाले paint(String word) और paint(int n) हों तो रख सकते हैं। दो String वाली कॉल एक-आर्ग्युमेंट वाली String मेथड नहीं चुनती, क्योंकि संख्या अलग है।
अभ्यास के लिए तीनों ओवरलोड एक फ़ाइल में रखने पर main हर शक्ल को अपनी लाइन पर कॉल कर सकता है। एक String वाली कॉल अभी भी paint(String word) पर जाती है। एक int वाली अभी भी paint(int n) पर। दो String वाली paint(String a, String b) पर। साझा नाम इन फ़र्क़ों को मिटाता नहीं।
String सूची के पास खाली सूची
खाली कोष्ठक वाली मेथड भी अलग सूची है। आप पैरामीटर रहित paint() को paint(String word) के पास रख सकते हैं। खाली कॉल paint(); खाली-सूची बॉडी चलाती है। कॉल paint("go"); String बॉडी चलाती है।
public class Sign {
public static void main(String[] args) {
paint();
paint("go");
}
static void paint() {
System.out.println("ready");
}
static void paint(String word) {
System.out.println(word);
}
}
javac Sign.java और java Sign के बाद स्क्रीन पहली लाइन पर ready और दूसरी पर go दिखानी चाहिए। पहली कॉल के कोष्ठक में कुछ नहीं, इसलिए वह paint() से मेल खाती है। दूसरी एक String भेजती है, इसलिए paint(String word) से मेल खाती है। एक को paintReady नाम देना भी कंपाइल होगा, पर वह अलग कौशल है। यह पेज नाम paint रखता है और फ़र्क सूचियों पर छोड़ता है।
कौन सी कॉल कौन सा हेडर चलाती है
कॉल को हेडर के पास पढ़ें। कॉल की आर्ग्युमेंट सूची हेडर की पैरामीटर सूची से मेल खानी चाहिए। इस शुरुआती रूप में प्रकार और संख्या दोनों मायने रखते हैं।
📊 call beside matching paint
| main में कॉल | चलने वाला हेडर | स्क्रीन लाइन |
|---|---|---|
paint("ok"); |
paint(String word) |
ok |
paint(3); |
paint(int n) |
3 |
paint("hi", "sam"); |
paint(String a, String b) |
hi sam |
paint(); |
paint() |
ready |
आम गलती यह है कि दोनों मेथड paint(String word) लिखें और दूसरी को ओवरलोड मान लें। केवल पैरामीटर नाम बदलकर paint(String label) करना कंपाइलर के लिए नई सूची नहीं बनाता। यहाँ प्रकार और संख्या मायने रखते हैं। दूसरी गलती paint(true) कॉल करना है जब आपने कभी boolean पैरामीटर सूची नहीं लिखी। तब javac मिलती हुई paint नहीं ढूँढता। मनचाहा प्रकार लेने वाला हेडर जोड़ें, या कॉल को उस प्रकार पर बदलें जिसे आप पहले से सपोर्ट करते हैं।
main में System.out.println("paint"); लिखना शब्द paint प्रिंट करता है। कोई मेथड कॉल नहीं होती। जब String वाला ओवरलोड चाहिए तो paint("ok"); रखें। पुरानी Box फ़ाइल का बचा twice अगर Sign.java में रह जाए और main अभी भी twice(7) प्रिंट करे तो स्क्रीन भ्रमित हो सकती है। main को उन paint कॉल तक साफ़ करें जिन्हें आप जाँच रहे हैं, और उस रन के लिए ज़रूरी paint ओवरलोड ही रखें।
paint मेथड को main के ब्रेसेस के अंदर न घुसाएँ। मेथड क्लास के अंदर, main के पास बैठती हैं। दो ओवरलोड उसी क्लास बॉडी में दो भाई मेथड हैं।
scope से पहले
आप एक ही क्लास में एक मेथड नाम और कई पैरामीटर सूचियाँ रख सकते हैं। Java कॉल की आर्ग्युमेंट सूची से बॉडी चुनती है। स्क्रीन मिलती बॉडी की लाइन दिखाती है। एक जैसी सूची वाले दो हेडर ओवरलोड नहीं हैं। अगला पेज scope है; वहाँ आप देखेंगे कौन से नाम मेथड के अंदर दिखते हैं और कौन से बाहर रहते हैं।
🧠 अपने ज्ञान की परीक्षा करें
अपने ज्ञान की परीक्षा करें
इस इंटरैक्टिव क्विज़ के साथ अपनी चुनौती लें और देखें कि आप विषय को कितनी अच्छी तरह समझते हैं
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी