"आइए एक नए विषय पर चलते हैं। अब, मैं स्थैतिक चर और विधियों पर चर्चा करना चाहता हूँ।"
"एली, मैंने पहले से ही स्थैतिक चर और विधियों के बारे में सीखा है। लेकिन मैं और विवरण सीखना चाहता हूं।"
"जब हम एक वर्ग में चर घोषित करते हैं, तो हम परिभाषित करते हैं कि क्या ये चर सिर्फ एक बार बनाए जाएंगे, या यदि वर्ग के प्रत्येक उदाहरण (ऑब्जेक्ट) की अपनी प्रति होगी। डिफ़ॉल्ट रूप से, प्रत्येक वस्तु के लिए एक चर की एक नई प्रति बनाई जाती है। यह ऐसा दिखता है:"
class Cat // Class
{
String name; // Variable
Cat(String name) // Constructor
{
this.name = name; // Variable initialization
}
}
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Oscar
Missy
"एक ही वर्ग (बिल्ली) में घोषित होने के बावजूद, चर cat1.name
और cat2.name
अलग-अलग मान होते हैं क्योंकि वे विभिन्न वस्तुओं का संदर्भ देते हैं।"
"यह समझ आता है।"
"हालांकि, कक्षा के प्रत्येक उदाहरण के लिए एक स्थिर चर की केवल एक प्रति मौजूद है, और इसे कक्षा के नाम का उपयोग करके एक्सेस किया जाना चाहिए।"
class Cat // Сlass
{
String name; // Instance (non-static) variable
static int catCount; // Static variable
Cat(String name)
{
this.name = name;
Cat.catCount++; // Increment the static variable by 1
}
}
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");
System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");
System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
0
1
Oscar
Missy
2
"ठीक है, यह भी समझ में आता है।"
"जावा विधियों को दो श्रेणियों में विभाजित किया गया है। इंस्टेंस विधियों को किसी ऑब्जेक्ट पर कॉल किया जाता है और उस ऑब्जेक्ट के डेटा तक पहुंच होती है। स्टेटिक विधियों में वह एक्सेस नहीं है, क्योंकि उनके पास ऑब्जेक्ट रेफरेंस नहीं है। हालांकि, वे संदर्भ दे सकते हैं। वर्ग के स्थिर चर और अन्य स्थिर तरीके।
स्थैतिक विधियाँ गैर-स्थैतिक विधियों या गैर-स्थैतिक चरों को संबोधित नहीं कर सकती हैं!"
"वह क्यों है, ऐली?"
"प्रत्येक उदाहरण चर एक वस्तु में समाहित है। इसे केवल तभी पहुँचा जा सकता है जब आपके पास उस वस्तु का संदर्भ हो। स्थिर विधि के लिए ऐसा कोई संदर्भ उपलब्ध नहीं है।"
"क्या उदाहरण विधियों का ऐसा संदर्भ है?"
"हां, यह अप्रत्यक्ष रूप से इंस्टेंस विधियों के लिए पारित किया गया है। ऑब्जेक्ट का एक संदर्भ जिस पर एक इंस्टेंस विधि कहा जाता है, अप्रत्यक्ष रूप से इंस्टेंस विधि को पास किया जाता है। इस संदर्भ को संग्रहीत करने वाले चर को यह कहा जाता है । यह विधि को हमेशा ऑब्जेक्ट तक पहुंचने की अनुमति देता है। डेटा या एक ही वस्तु पर एक और गैर-स्थैतिक विधि को कॉल करें।
ऑब्जेक्ट रेफरेंस के बजाय, नल को स्टैटिक मेथड्स में पास किया जाता है। इसलिए वे गैर-स्थैतिक चर और विधियों को संबोधित नहीं कर सकते हैं। उनके पास इन चरों और विधियों से जुड़ी किसी वस्तु का संदर्भ नहीं है।"
"ठीक है, ऐली, मैं समझता हूँ।"
"इस प्रकार गैर-स्थैतिक तरीके काम करते हैं:
कोड कैसा दिखता है
|
वास्तव में क्या होता है
|
जब आप <ऑब्जेक्ट> डॉट <विधि का नाम> का उपयोग करके किसी विधि को कॉल करते हैं, तो आप वास्तव में एक क्लास विधि को कॉल कर रहे हैं और उसी ऑब्जेक्ट को पहले तर्क के रूप में पास कर रहे हैं। विधि के अंदर, वस्तु को 'यह' कहा जाता है । विधि में सभी कार्य इस वस्तु और इसके डेटा पर किए जाते हैं।" |
"यहां बताया गया है कि स्थिर तरीके कैसे काम करते हैं:
कोड कैसा दिखता है
|
वास्तव में क्या होता है
|
जब आप किसी स्टैटिक मेथड को कॉल करते हैं, तो उसे कोई ऑब्जेक्ट पास नहीं किया जाता है। दूसरे शब्दों में, 'यह' शून्य के बराबर है । यही कारण है कि एक स्थैतिक विधि गैर-स्थैतिक चर और विधियों तक नहीं पहुंच सकती है (क्योंकि इसमें गैर-स्थैतिक तरीकों को पारित करने के लिए कुछ भी नहीं है)। |
"एक चर या विधि स्थिर है यदि उसके सामने कीवर्ड स्थिर है।"
"ऐसे तरीकों की आवश्यकता क्यों है यदि वे इतने गंभीर रूप से सीमित हैं?"
"ठीक है, ऐसे तरीकों के अपने फायदे हैं।"
"सबसे पहले, हमें स्थैतिक विधियों और चरों का उपयोग करने के लिए एक वस्तु संदर्भ पारित करने की आवश्यकता नहीं है। "
"दूसरा, कभी-कभी एक वेरिएबल की एक और केवल एक प्रति होना आवश्यक होता है। उदाहरण के लिए, System.out (सिस्टम क्लास का स्टैटिक आउट वेरिएबल)।"
"तीसरा, कभी-कभी आपको ऑब्जेक्ट बनाने में सक्षम होने से पहले एक विधि को कॉल करने की आवश्यकता होती है।"
"एली, क्या आप मुझे इसका एक उदाहरण दे सकते हैं?"
"आपको क्यों लगता है कि मुख्य () विधि स्थिर है? यह स्थिर है इसलिए प्रोग्रामर किसी ऑब्जेक्ट को बनाए जाने से पहले मेमोरी में क्लास लोड करने के तुरंत बाद इसे कॉल कर सकता है।"
GO TO FULL VERSION