इंस्टेंस वेरिएबल्स (Instance Variables)
एक वेरिएबल जो क्लास के अंदर और सभी मेथड्स और ब्लॉक्स के बाहर घोषित किया जाता है, इंस्टेंस वेरिएबल होता है। इंस्टेंस वेरिएबल का सामान्य स्कोप क्लास के पूरे भाग में होता है सिवाय स्टेटिक मेथड्स के। इंस्टेंस वेरिएबल का लाइफटाइम तब तक होता है जब तक ऑब्जेक्ट मेमोरी में रहता है।
- घोषणा स्थान: क्लास बॉडी में, मेथड्स/ब्लॉक्स के बाहर
- स्कोप: पूरी क्लास (सभी इंस्टेंस मेथड्स, कंस्ट्रक्टर्स, इंस्टेंस इनिशियलाइजर ब्लॉक्स)
- लाइफटाइम: ऑब्जेक्ट निर्माण से ऑब्जेक्ट डिस्ट्रक्शन (GC) तक
- डिफ़ॉल्ट मान: टाइप के अनुसार (0, null, false, आदि)
- एक्सेस:
obj.variableNameया सीधे इंस्टेंस कॉन्टेक्स्ट में
क्लास वेरिएबल्स / स्टेटिक वेरिएबल्स (Class/Static Variables)
एक वेरिएबल जो क्लास के अंदर, सभी ब्लॉक्स के बाहर घोषित किया जाता है और static मार्क किया जाता है, क्लास वेरिएबल के रूप में जाना जाता है। क्लास वेरिएबल का सामान्य स्कोप पूरी क्लास में होता है और क्लास वेरिएबल का लाइफटाइम प्रोग्राम के अंत तक या जब तक क्लास मेमोरी में लोड रहती है, तब तक होता है।
- घोषणा स्थान: क्लास बॉडी में,
staticकीवर्ड के साथ - स्कोप: पूरी क्लास (स्टेटिक और इंस्टेंस दोनों कॉन्टेक्स्ट से एक्सेसिबल)
- लाइफटाइम: क्लास लोड होने से JVM शटडाउन/अनलोड होने तक
- डिफ़ॉल्ट मान: टाइप के अनुसार
- एक्सेस:
ClassName.variableNameयाobj.variableName(डिसकरेज्ड) - साझा: क्लास के सभी इंस्टेंसेस द्वारा साझा
लोकल वेरिएबल्स (Local Variables)
वे सभी वेरिएबल्स जो इंस्टेंस और क्लास वेरिएबल्स नहीं हैं, लोकल वेरिएबल्स माने जाते हैं, जिसमें मेथड में पैरामीटर्स भी शामिल हैं। लोकल वेरिएबल का स्कोप उस ब्लॉक के भीतर होता है जिसमें यह घोषित किया गया है और लोकल वेरिएबल का लाइफटाइम तब तक होता है जब तक कंट्रोल उस ब्लॉक को नहीं छोड़ देता जिसमें यह घोषित किया गया है।
- घोषणा स्थान: मेथड, कंस्ट्रक्टर, ब्लॉक, या पैरामीटर लिस्ट के अंदर
- स्कोप: घोषणा से लेकर ब्लॉक के अंत तक ({ } के भीतर)
- लाइफटाइम: ब्लॉक एंट्री से ब्लॉक एग्जिट तक
- डिफ़ॉल्ट मान: कोई नहीं - उपयोग से पहले स्पष्ट रूप से इनिशियलाइज़ करना आवश्यक
- एक्सेस: केवल घोषित ब्लॉक के भीतर
- थ्रेड-सेफ: प्रत्येक थ्रेड का अपना कॉपी (स्टैक पर)
तुलना तालिका
| विशेषता | इंस्टेंस वेरिएबल | क्लास/स्टेटिक वेरिएबल | लोकल वेरिएबल |
|---|---|---|---|
| कीवर्ड | कोई नहीं | static | कोई नहीं |
| स्थान | क्लास बॉडी, मेथड्स के बाहर | क्लास बॉडी, मेथड्स के बाहर | मेथड/ब्लॉक/पैरामीटर के अंदर |
| स्कोप | पूरी क्लास (नॉन-स्टेटिक कॉन्टेक्स्ट) | पूरी क्लास (सभी कॉन्टेक्स्ट) | घोषित ब्लॉक तक सीमित |
| लाइफटाइम | ऑब्जेक्ट के जीवन तक | क्लास लोडेड रहने तक | ब्लॉक निष्पादन तक |
| मेमोरी | हीप (ऑब्जेक्ट का हिस्सा) | मेटास्पेस/हीप (क्लास डेटा) | स्टैक (थ्रेड-लोकल) |
| डिफ़ॉल्ट मान | हां | हां | नहीं (कंपाइलर एरर) |
| थ्रेड-सेफ्टी | नहीं (सिंक्रोनाइजेशन चाहिए) | नहीं (सिंक्रोनाइजेशन चाहिए) | हां (प्रति-थ्रेड) |
उदाहरण
public class VariableScopeDemo {
// इंस्टेंस वेरिएबल
String instanceVar = "Instance";
// क्लास/स्टेटिक वेरिएबल
static String classVar = "Static";
public void method() {
// लोकल वेरिएबल
String localVar = "Local";
// ब्लॉक स्कोप
if (true) {
String blockVar = "Block"; // केवल इस ब्लॉक में
System.out.println(blockVar); // OK
}
// System.out.println(blockVar); // ERROR - स्कोप से बाहर
// एक्सेस
System.out.println(instanceVar); // OK
System.out.println(classVar); // OK
System.out.println(localVar); // OK
}
public static void staticMethod() {
System.out.println(classVar); // OK
// System.out.println(instanceVar); // ERROR - स्टेटिक कॉन्टेक्स्ट से इंस्टेंस एक्सेस
}
}
पैरामीटर्स (Parameters)
- मेथड पैरामीटर्स लोकल वेरिएबल्स ही होते हैं।
- स्कोप: पूरे मेथड बॉडी में।
- लाइफटाइम: मेथड कॉल से मेथड रिटर्न तक।
- कॉलर द्वारा मान पास किया जाता है (पास-बाय-वैल्यू)।
वेरिएबल शैडोइंग (Variable Shadowing)
public class ShadowDemo {
String name = "Class Level"; // इंस्टेंस वेरिएबल
void method(String name) { // पैरामीटर (लोकल) - शैडोज इंस्टेंस
System.out.println(name); // पैरामीटर प्रिंट होगा
System.out.println(this.name); // इंस्टेंस वेरिएबल एक्सेस
}
void anotherMethod() {
String name = "Local"; // लोकल वेरिएबल - शैडोज इंस्टेंस
System.out.println(name); // लोकल प्रिंट होगा
}
}
निष्कर्ष: स्कोप (दृश्यता) और लाइफटाइम (अस्तित्व अवधि) को समझना सही वेरिएबल प्रबंधन, मेमोरी दक्षता और बग्स से बचने के लिए आवश्यक है। इंस्टेंस=ऑब्जेक्ट लाइफ, स्टेटिक=क्लास लाइफ, लोकल=ब्लॉक लाइफ।