Java में स्कोप
एक पैरामीटर वाली मेथड mark लिखें: static void mark(int n)। ब्रेसेस के अंदर उस पैरामीटर को System.out.println(n); से प्रिंट करें। main से mark(4); कॉल करें। स्क्रीन एक लाइन दिखाए: 4। नाम n केवल mark के अंदर है। अगर आप main से n प्रिंट करने की कोशिश करें तो javac मना कर देता है। यही सीमा — मेथड कौन से नाम देख सकती है — इस पेज का पाठ है।
मेथड के अंदर रहने वाले नाम
ओवरलोडिंग पेज पर कई paint मेथड एक नाम साझा करती थीं लेकिन पैरामीटर सूचियाँ अलग थीं। यहाँ फोकस छोटा है: एक मेथड, एक पैरामीटर नाम, और वह नाम कहाँ दिख सकता है। पैरामीटर वह नाम है जो उसे घोषित करने वाली मेथड का है। उस मेथड के ब्रेसेस के बाहर नाम खत्म हो जाता है।
Gate.java नाम की छोटी प्रोग्राम फ़ाइल बनाएँ। पहली लाइन का public class फ़ाइल नाम से मेल खाना चाहिए: public class Gate। इस फ़ाइल में पुराना Sign या Box क्लास नाम न छोड़ें; कंपाइलर क्लास नाम और फ़ाइल नाम का मेल चाहता है।
main के बाहर, फिर भी क्लास के ब्रेसेस के अंदर, static void mark(int n) लिखें। बॉडी में एक प्रिंट है: System.out.println(n);। इस पेज पर void रखें। आप रिटर्न वैल्यू नहीं, दृश्यता देख रहे हैं। कंपाइल से पहले फ़ाइल सेव करें। पहला पूरा प्रोग्राम अगले बॉक्स में है।
mark वाली Gate.java
यह वह संस्करण है जिसे आप पहले कंपाइल करते हैं। main कॉल रखता है। mark वह प्रिंट रखता है जो n इस्तेमाल करता है।
public class Gate {
public static void main(String[] args) {
mark(4);
}
static void mark(int n) {
System.out.println(n);
}
}
जिस फ़ोल्डर में Gate.java है वहाँ से javac Gate.java चलाएँ। जब कोष्ठक, ब्रेसेस और सेमीकोलन मेल खाते हैं तो javac अपनी कोई लाइन नहीं लिखता। फिर java Gate चलाएँ — java Gate.java नहीं। दूसरी कमांड से .java अंत हटाएँ। ये दोनों कमांड Windows और macOS पर काम करती हैं। प्रोग्राम एक लाइन प्रिंट करके रुकना चाहिए: 4। आपको टाइप करने के लिए नहीं पूछना चाहिए। अगर टर्मिनल कीबोर्ड इनपुट का इंतज़ार करे तो पुराने अभ्यास की nextLine कॉल अभी फ़ाइल में है। उसे हटाएँ और ऊपर की mark(4); व mark मेथड रखें।
रन को एक बार क्रम से देखें। Java main से शुरू होती है। कॉल mark(4) संख्या 4 को पैरामीटर n में भेजती है। mark के अंदर println(n) लिखता है 4। जब mark खत्म होती है तो नाम n भी खत्म होता है। main के पास कभी नाम n नहीं था। संख्या 4 कॉल से मान के रूप में गुज़री। नाम n main में नहीं गया।
अगर कॉल के बाद main में System.out.println(n); जोड़ें तो javac कहता है कि प्रतीक n नहीं मिला। वही त्रुटि पाठ है: n कभी main में घोषित नहीं हुआ। उस लाइन को main से हटाकर ठीक करें, या अगर वहाँ लोकल चाहिए तो दूसरा नाम घोषित करें। उम्मीद न करें कि mark का पैरामीटर खुद main में दिखाई देगा।
पैरामीटर के पास एक लोकल नाम
mark के अंदर आप ऐसा नया नाम भी घोषित कर सकते हैं जो पैरामीटर नहीं है। वह लोकल नाम केवल mark के ब्रेसेस के बीच रहता है। बॉडी बदलकर एक लेबल रखें और लेबल व n एक लाइन पर प्रिंट करें, या डेमो के लिए दूसरी छोटी मेथड रखें — इस पेज पर अगला बॉक्स उसके बजाय main से नाम पास करना दिखाता है, जो शुरुआती का आम रास्ता है।
शुरुआती की आम उम्मीद यह है कि main में घोषित नाम क्लास की हर मेथड में अपने आप दिखे। इस रूप में ऐसा नहीं है। अगर main में int room = 4; है और mark बिना लिए room प्रिंट करे तो javac mark के अंदर room नहीं ढूँढता। ठीक तरीका मान पास करना है: mark अभी भी mark(int n) हो और कॉल mark(room);।
main का लोकल mark को दें
main के अंदर int room = 4; घोषित करें। mark(room); कॉल करें। mark के अंदर n प्रिंट करते रहें। स्क्रीन अभी भी 4 दिखाती है। main में लोकल नाम room है। mark में पैरामीटर नाम n है। अलग जगहों पर अलग नाम हैं। यात्रा करने वाला मान 4 है।
public class Gate {
public static void main(String[] args) {
int room = 4;
mark(room);
}
static void mark(int n) {
System.out.println(n);
}
}
फिर कंपाइल और रन करें: javac Gate.java, फिर java Gate। अभी भी एक लाइन दिखती है: 4। अगर room को 9 करें और मेथड बॉडी न छुएँ तो स्क्रीन 9 दिखाती है। मेथड अभी भी n में आया मान प्रिंट करती है। main में System.out.println(room); जोड़ें तो room भी प्रिंट हो सकता है — वह नाम वहीं का है। main अभी भी n प्रिंट नहीं कर सकता।
अगर mark अपना लोकल घोषित करे — जैसे ब्रेसेस के अंदर int tag = 1; — तो वह tag main के लिए अदृश्य है। main में System.out.println(tag); आज़माना उसी कारण से फेल होता है जिस कारण main से n प्रिंट करना। mark के ब्रेसेस अंदर घोषित नामों के लिए दीवार हैं।
दीवार क्या बचाती है
अलगाव को सादे शब्दों में पढ़ें। main में घोषित नाम main में रहते हैं जब तक आप उनके मान कॉल में न भेजें। mark में घोषित नाम — पैरामीटर और लोकल — mark में रहते हैं। कॉल मान ले जाती है, नाम खुद नहीं। पिछले पेज की ओवरलोडिंग अलग कौशल है: एक साझा मेथड नाम वाली कई मेथड। स्कोप इस बारे में है कि वेरिएबल या पैरामीटर नाम सोर्स में कहाँ दिख सकता है।
कई paint मेथड वाला बचा Sign डेमो उसी फ़ाइल में रह सकता है और अगर main अभी भी paint("ok") कॉल करे तो स्क्रीन भ्रमित हो सकती है। main को उस mark कॉल तक साफ़ करें जिसे आप जाँच रहे हैं। mark को main के ब्रेसेस के अंदर न घुसाएँ। मेथड क्लास के अंदर, main के पास बैठती हैं।
main में System.out.println("n"); लिखना उद्धरण में अक्षर n प्रिंट करता है। पैरामीटर नहीं प्रिंट करता। कॉल से आए मान के लिए println(n) को mark के अंदर रखें। हेडर अभी भी mark(int n) कहे तो खाली कोष्ठक वाला mark(); फेल होता है — कॉल को एक int भेजना चाहिए, चाहे लिटरल 4 हो या लोकल room।
recursion से पहले
आप mark(int n) लिख सकते हैं, उसी मेथड में n प्रिंट कर सकते हैं, और n को main से बाहर रख सकते हैं। आप main में room घोषित कर mark को room दे सकते हैं। स्क्रीन वह मान दिखाती है जो कॉल से गुज़रा। नाम ब्रेसेस से खुद नहीं रिसते। अगला पेज recursion है; वहाँ मेथड खुद को छोटे आर्ग्युमेंट से तब तक कॉल करती है जब तक रोक की शर्त श्रृंखला खत्म न कर दे।
🧠 अपने ज्ञान की परीक्षा करें
अपने ज्ञान की परीक्षा करें
इस इंटरैक्टिव क्विज़ के साथ अपनी चुनौती लें और देखें कि आप विषय को कितनी अच्छी तरह समझते हैं
📝 निर्देश
- हर प्रश्न को ध्यान से पढ़ें
- हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
- आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
- आपकी प्रगति शीर्ष पर दिखाई जाएगी