स्थिरांक
"अमीगो, क्या आप जानते हैं कि जावा में सभी चर नहीं बदले जा सकते हैं?"
"वह कैसा है, किम? वास्तव में, 'वैरिएबल' शब्द ही परिवर्तन की बात करता है।"
"इसमें कोई संदेह नहीं है। कई अन्य प्रोग्रामिंग भाषाओं की तरह, जावा में स्थिरांक हैं , अर्थात, वेरिएबल्स जिनके मान नहीं बदले जा सकते हैं । और 'निरंतर' शब्द ही निरंतरता की बात करता है।"
"और वे किस लिए हैं?"
"आमतौर पर, उनका उपयोग किसी प्रकार की मूलभूत चीज़ों के लिए किया जाता है जैसे कि Pi
वर्ष के महीनों में संख्या या दिनों की संख्या। सिद्धांत रूप में, एक प्रोग्रामर किसी भी चर को स्थिर बना सकता है, यदि वह ऐसा करने का निर्णय लेता है तो आवश्यक है।"
"आपका मतलब नाम, कार का रंग, या सप्ताह के एक दिन का नाम है?"
"आपके पास सही विचार है। कुछ भी जिसे बदला नहीं जाना चाहिए।"
"और ये स्थिरांक जावा में क्या दिखते हैं?"
"जावा के पास उनके लिए एक विशेष कीवर्ड है: final
एक अपरिवर्तनीय चर बनाना एक सामान्य बनाने जैसा दिखता है। केवल अंतर यह है कि चर के प्रकार से पहले आपको शब्द लिखने की आवश्यकता है final
, जैसे:
final Type name = value;
"क्या होता है यदि आप एक स्थिरांक बनाते हैं और फिर इसे एक अलग मान निर्दिष्ट करने का प्रयास करते हैं?"
"यह पूछने का सही प्रश्न है! और सही उत्तर यह है: यदि आप एक final
चर के लिए एक अलग मान निर्दिष्ट करने का प्रयास करते हैं, तो आपका प्रोग्राम बस संकलित नहीं होगा।"
"क्या होगा यदि आप एक final
चर घोषित करते हैं लेकिन इसके लिए कोई मान निर्दिष्ट नहीं करते हैं?"
"ऐसा करने का कोई मतलब नहीं है, इसलिए जावा में भी इसकी अनुमति नहीं है। final
जब घोषित किया जाता है तो एक वैरिएबल को इनिशियलाइज़ किया जाना चाहिए, अर्थात, आपको इसके लिए एक मान निर्दिष्ट करना होगा। इस नियम का एक अपवाद है: आप इनिशियलाइज़ेशन को स्थानांतरित कर सकते हैं। एक कंस्ट्रक्टर में एक स्थिर वर्ग चर। लेकिन आप इसके बारे में बाद में जानेंगे।
"उस ने कहा, वह सब कुछ नहीं है जो एक स्थिर है। कीवर्ड की संख्या को कम करने के लिए, जावा डेवलपर्स केवल स्थिरांक घोषित करने से अधिक के लिए final
शब्द का उपयोग करते हैं । विधियों और यहां तक कि कक्षाओं पर भी लागू हो सकते हैं। घोषित विधियों को ओवरराइड नहीं किया जा सकता है, और एक वर्ग के रूप में घोषित किया जा सकता है विरासत में नहीं मिला।"final
final
final
final
"उह... ओवरराइड? इनहेरिटेड? अब आप कौन सी भाषा बोल रहे हैं?"
"ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की भाषा। आप इसे बहुत जल्द प्राप्त कर लेंगे। तब तक, बस सुंदर शब्दावली का आनंद लें।"
"ठीक है। तो, final
चर, वर्गों और विधियों से पहले रखा जा सकता है, और यह कीवर्ड उन्हें कुछ अर्थों में अपरिवर्तनीय बनाता है?"
"हाँ। इसके अलावा, final
संशोधक को किसी भी चर से पहले जोड़ा जा सकता है: स्थानीय चर, विधि पैरामीटर, वर्ग फ़ील्ड और स्थिर वर्ग चर।
"यहाँ याद रखने वाली महत्वपूर्ण बात है: final
एक चर नाम से पहले उस चर में किसी भी परिवर्तन के खिलाफ सुरक्षा है । यदि एक चर किसी वस्तु के संदर्भ को संग्रहीत करता है, तो वस्तु को अभी भी बदला जा सकता है।"
"मैं बिल्कुल नहीं समझता।"
"आप वास्तव में जल्द ही समझ जाएंगे। यहाँ एक उदाहरण है:
|
हम एक सरणी बनाते हैं। इसकी अनुमति नहीं है: चर data के रूप में घोषित किया गया है final । लेकिन आप ऐसा कर सकते हैं। और यह भी। |
"समझ गया। यह मुश्किल है।"
वैश्विक स्थिरांक
"आपको क्या लगता है कि वैश्विक स्थिरांक क्या हैं?"
"मुझे लगता है कि वैश्विक स्थिरांक शायद वैश्विक चर की तरह हैं, केवल स्थिरांक?"
"बिल्कुल सही। यदि आपको अपने कार्यक्रम में वैश्विक स्थिरांक घोषित करने की आवश्यकता है, तो स्थैतिक वर्ग चर बनाएँ , और उन्हें बनाएँ public
और final
। ऐसे चर के नामों के लिए एक विशेष शैली है: वे सभी बड़े अक्षरों में लिखे गए हैं, जिसमें एक अंडरस्कोर वर्ण का उपयोग किया गया है। अलग शब्द।
उदाहरण:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
परिवर्तनीय छायांकन
"जैसा कि मैंने पहले कहा, आप एक ही विधि में एक ही नाम के साथ कई स्थानीय चर नहीं बना सकते। विभिन्न तरीकों से, आप कर सकते हैं।"
"मुझे पता है कि!"
"लेकिन जो आप शायद नहीं जानते हैं वह यह है कि एक वर्ग में चर और एक विधि में स्थानीय चर का एक ही नाम हो सकता है।
उदाहरण:
कोड | परिवर्तनशील दृश्यता |
---|---|
|
|
"विधि में add
, हमने नाम का एक स्थानीय चर घोषित किया sum
। विधि के अंत तक, यह उदाहरण चर को छाया (या मास्क ) करता है sum
।"
"हम्म... मैं कुछ मायनों में कहूंगा कि यह अपेक्षित व्यवहार है।"
"लेकिन यह कहानी का अंत नहीं है। यह पता चला है कि यदि एक स्थानीय चर द्वारा एक आवृत्ति चर छाया हुआ है, तो विधि के भीतर आवृत्ति चर को संदर्भित करने का एक तरीका अभी भी है। हम इसके नाम से पहले कीवर्ड लिखकर ऐसा करते this
हैं :
this.name
"यहां एक उदाहरण दिया गया है जहां नाम विवाद सफलतापूर्वक हल हो गया है:
कोड | परिवर्तनशील दृश्यता |
---|---|
|
|
कीवर्ड के साथ count
या उसके बिना चर sum
हर जगह उपलब्ध हैं । this
उन पंक्तियों पर जहां sum
स्थानीय चर आवृत्ति चर को छाया करता है sum
, उदाहरण चर को केवल कीवर्ड का sum
उपयोग करके ही एक्सेस किया जा सकता है ।this
"जाहिर है, मुझे इसका अभ्यास करना होगा।"
"आप संभाल लेंगे।"
"क्या होगा यदि एक स्थिर वर्ग चर को केवल एक (गैर-स्थैतिक) उदाहरण चर के बजाय छायांकित किया जाता है? आप इसके माध्यम से इसका उपयोग नहीं कर सकते this
?"
"आप सही हैं। यह कीवर्ड काम नहीं करेगा। आपको इसे कक्षा के नाम से संदर्भित करने की आवश्यकता है:
ClassName.name
उदाहरण:
कोड | परिवर्तनशील दृश्यता |
---|---|
|
|
"ध्यान दें: आप कक्षा के नाम को उपसर्ग के रूप में उपयोग किए बिना या बिना हर जगह स्थैतिक चर का count
उपयोग कर सकते हैं। उन पंक्तियों में जहां स्थानीय चर आवृत्ति चर को छाया करता है , वर्ग चर तक पहुंच केवल उपसर्ग के रूप में उपयोग करते समय संभव है।sum
Solution
sum
sum
sum
Solution
for
एक पाश के अंदर चर
"और एक और छोटा लेकिन दिलचस्प तथ्य। एक ऐसी जगह भी है जहां एक चर को एक विशेष तरीके से घोषित किया जाता है — मैं एक for
लूप के अंदर की बात कर रहा हूं ।" आमतौर पर, लूप में कोष्ठक में for
एक चर होता है । counter
और इस वेरिएबल की विजिबिलिटी क्या होगी? आखिरकार, यह लूप के शरीर में नहीं है। क्या यह पूरी विधि है? या नहीं?"
for
"मैंने इसके बारे में कुछ सुना है। जैसा कि मैं इसे समझता हूं, लूप के शीर्षलेख में घोषित एक चर केवल लूप के शरीर में और लूप के शीर्षलेखfor
में दिखाई देता है ।"
"शाबाश, अमीगो। लेकिन फिर भी, इस सामग्री को सुदृढ़ करने के लिए एक उदाहरण देखें:
कोड | परिवर्तनशील दृश्यता |
---|---|
|
|
"तो आप कह रहे हैं कि मेरे कोड में मैं एक के बाद एक एक ही नाम के साथ एक काउंटर चर के साथ कई लूप लिख सकता हूं, और कोई समस्या नहीं होगी?"
"कोई समस्या नहीं होगी। यहाँ, देखो:
कोड | परिवर्तनशील दृश्यता |
---|---|
|
|