स्थिरांक

"अमीगो, क्या आप जानते हैं कि जावा में सभी चर नहीं बदले जा सकते हैं?"

"वह कैसा है, किम? वास्तव में, 'वैरिएबल' शब्द ही परिवर्तन की बात करता है।"

"इसमें कोई संदेह नहीं है। कई अन्य प्रोग्रामिंग भाषाओं की तरह, जावा में स्थिरांक हैं , अर्थात, वेरिएबल्स जिनके मान नहीं बदले जा सकते हैं । और 'निरंतर' शब्द ही निरंतरता की बात करता है।"

"और वे किस लिए हैं?"

"आमतौर पर, उनका उपयोग किसी प्रकार की मूलभूत चीज़ों के लिए किया जाता है जैसे कि Piवर्ष के महीनों में संख्या या दिनों की संख्या। सिद्धांत रूप में, एक प्रोग्रामर किसी भी चर को स्थिर बना सकता है, यदि वह ऐसा करने का निर्णय लेता है तो आवश्यक है।"

"आपका मतलब नाम, कार का रंग, या सप्ताह के एक दिन का नाम है?"

"आपके पास सही विचार है। कुछ भी जिसे बदला नहीं जाना चाहिए।"

"और ये स्थिरांक जावा में क्या दिखते हैं?"

"जावा के पास उनके लिए एक विशेष कीवर्ड है: finalएक अपरिवर्तनीय चर बनाना एक सामान्य बनाने जैसा दिखता है। केवल अंतर यह है कि चर के प्रकार से पहले आपको शब्द लिखने की आवश्यकता है final, जैसे:

final Type name = value;

"क्या होता है यदि आप एक स्थिरांक बनाते हैं और फिर इसे एक अलग मान निर्दिष्ट करने का प्रयास करते हैं?"

"यह पूछने का सही प्रश्न है! और सही उत्तर यह है: यदि आप एक finalचर के लिए एक अलग मान निर्दिष्ट करने का प्रयास करते हैं, तो आपका प्रोग्राम बस संकलित नहीं होगा।"

"क्या होगा यदि आप एक finalचर घोषित करते हैं लेकिन इसके लिए कोई मान निर्दिष्ट नहीं करते हैं?"

"ऐसा करने का कोई मतलब नहीं है, इसलिए जावा में भी इसकी अनुमति नहीं है। finalजब घोषित किया जाता है तो एक वैरिएबल को इनिशियलाइज़ किया जाना चाहिए, अर्थात, आपको इसके लिए एक मान निर्दिष्ट करना होगा। इस नियम का एक अपवाद है: आप इनिशियलाइज़ेशन को स्थानांतरित कर सकते हैं। एक कंस्ट्रक्टर में एक स्थिर वर्ग चर। लेकिन आप इसके बारे में बाद में जानेंगे।

"उस ने कहा, वह सब कुछ नहीं है जो एक स्थिर है। कीवर्ड की संख्या को कम करने के लिए, जावा डेवलपर्स केवल स्थिरांक घोषित करने से अधिक के लिए finalशब्द का उपयोग करते हैं । विधियों और यहां तक ​​कि कक्षाओं पर भी लागू हो सकते हैं। घोषित विधियों को ओवरराइड नहीं किया जा सकता है, और एक वर्ग के रूप में घोषित किया जा सकता है विरासत में नहीं मिला।"finalfinalfinalfinal

"उह... ओवरराइड? इनहेरिटेड? अब आप कौन सी भाषा बोल रहे हैं?"

"ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की भाषा। आप इसे बहुत जल्द प्राप्त कर लेंगे। तब तक, बस सुंदर शब्दावली का आनंद लें।"

"ठीक है। तो, finalचर, वर्गों और विधियों से पहले रखा जा सकता है, और यह कीवर्ड उन्हें कुछ अर्थों में अपरिवर्तनीय बनाता है?"

"हाँ। इसके अलावा, finalसंशोधक को किसी भी चर से पहले जोड़ा जा सकता है: स्थानीय चर, विधि पैरामीटर, वर्ग फ़ील्ड और स्थिर वर्ग चर।

"यहाँ याद रखने वाली महत्वपूर्ण बात है: finalएक चर नाम से पहले उस चर में किसी भी परिवर्तन के खिलाफ सुरक्षा है । यदि एक चर किसी वस्तु के संदर्भ को संग्रहीत करता है, तो वस्तु को अभी भी बदला जा सकता है।"

"मैं बिल्कुल नहीं समझता।"

"आप वास्तव में जल्द ही समझ जाएंगे। यहाँ एक उदाहरण है:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
हम एक सरणी बनाते हैं।

इसकी अनुमति नहीं है: चर 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;
}

परिवर्तनीय छायांकन

"जैसा कि मैंने पहले कहा, आप एक ही विधि में एक ही नाम के साथ कई स्थानीय चर नहीं बना सकते। विभिन्न तरीकों से, आप कर सकते हैं।"

"मुझे पता है कि!"

"लेकिन जो आप शायद नहीं जानते हैं वह यह है कि एक वर्ग में चर और एक विधि में स्थानीय चर का एक ही नाम हो सकता है।

उदाहरण:

कोड परिवर्तनशील दृश्यता
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     sum = sum + data;
     int sum = data * 2;
     count++;
   }
}

count, sum
count, sum
count, sum
count, sum
count, sum
count, sum, data
count, sum, data
count, sum, data
count, sum, data
count, sum

"विधि में add, हमने नाम का एक स्थानीय चर घोषित किया sum। विधि के अंत तक, यह उदाहरण चर को छाया (या मास्क ) करता है sum।"

"हम्म... मैं कुछ मायनों में कहूंगा कि यह अपेक्षित व्यवहार है।"

"लेकिन यह कहानी का अंत नहीं है। यह पता चला है कि यदि एक स्थानीय चर द्वारा एक आवृत्ति चर छाया हुआ है, तो विधि के भीतर आवृत्ति चर को संदर्भित करने का एक तरीका अभी भी है। हम इसके नाम से पहले कीवर्ड लिखकर ऐसा करते thisहैं :

this.name

"यहां एक उदाहरण दिया गया है जहां नाम विवाद सफलतापूर्वक हल हो गया है:

कोड परिवर्तनशील दृश्यता
public class Solution
{
   public int count = 0;
   public int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     this.sum = this.sum + data;
     count++;
   }
}

this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum
this.count, this.sum, data
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum, data, sum
this.count, this.sum

कीवर्ड के साथ countया उसके बिना चर sumहर जगह उपलब्ध हैं । thisउन पंक्तियों पर जहां sumस्थानीय चर आवृत्ति चर को छाया करता है sum, उदाहरण चर को केवल कीवर्ड का sumउपयोग करके ही एक्सेस किया जा सकता है ।this

"जाहिर है, मुझे इसका अभ्यास करना होगा।"

"आप संभाल लेंगे।"

"क्या होगा यदि एक स्थिर वर्ग चर को केवल एक (गैर-स्थैतिक) उदाहरण चर के बजाय छायांकित किया जाता है? आप इसके माध्यम से इसका उपयोग नहीं कर सकते this?"

"आप सही हैं। यह कीवर्ड काम नहीं करेगा। आपको इसे कक्षा के नाम से संदर्भित करने की आवश्यकता है:

ClassName.name

उदाहरण:

कोड परिवर्तनशील दृश्यता
public class Solution
{
   public static int count = 0;
   public static int sum = 0;

   public void add(int data)
   {
     int sum = data * 2;
     Solution.sum = Solution.sum + data;
     count++;
   }
}

Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum
Solution.count, Solution.sum, data
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum, data, sum
Solution.count, Solution.sum

"ध्यान दें: आप कक्षा के नाम को उपसर्ग के रूप में उपयोग किए बिना या बिना हर जगह स्थैतिक चर का countउपयोग कर सकते हैं। उन पंक्तियों में जहां स्थानीय चर आवृत्ति चर को छाया करता है , वर्ग चर तक पहुंच केवल उपसर्ग के रूप में उपयोग करते समय संभव है।sumSolutionsumsumsumSolution

forएक पाश के अंदर चर

"और एक और छोटा लेकिन दिलचस्प तथ्य। एक ऐसी जगह भी है जहां एक चर को एक विशेष तरीके से घोषित किया जाता है — मैं एक forलूप के अंदर की बात कर रहा हूं ।" आमतौर पर, लूप में कोष्ठक में forएक चर होता है । counterऔर इस वेरिएबल की विजिबिलिटी क्या होगी? आखिरकार, यह लूप के शरीर में नहीं है। क्या यह पूरी विधि है? या नहीं?"

for"मैंने इसके बारे में कुछ सुना है। जैसा कि मैं इसे समझता हूं, लूप के शीर्षलेख में घोषित एक चर केवल लूप के शरीर में और लूप के शीर्षलेखfor में दिखाई देता है ।"

"शाबाश, अमीगो। लेकिन फिर भी, इस सामग्री को सुदृढ़ करने के लिए एक उदाहरण देखें:

कोड परिवर्तनशील दृश्यता
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a

"तो आप कह रहे हैं कि मेरे कोड में मैं एक के बाद एक एक ही नाम के साथ एक काउंटर चर के साथ कई लूप लिख सकता हूं, और कोई समस्या नहीं होगी?"

"कोई समस्या नहीं होगी। यहाँ, देखो:

कोड परिवर्तनशील दृश्यता
public static void main(String[] args)
{
   int a = 0;

   for (int i = 0; i < 10; i++)
   {
     System.out.println(i);
   }

   for (int i = 0; i < 10; i--)
   {
     System.out.println(i);
   }

   System.out.println("end");
}


a
a
a, i
a, i
a, i
a
a
a, i
a, i
a, i
a
a
a