1. स्थिरांक

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

तो आप जावा में एक अपरिवर्तनीय चर (स्थिर) कैसे घोषित करते हैं? इसके लिए एक विशेष कीवर्ड है: final. एक अपरिवर्तनीय चर बनाना सामान्य बनाने जैसा ही दिखता है। finalअंतर केवल इतना है कि चर के प्रकार से पहले आपको इस तरह शब्द लिखना होगा :

final Type name = value;

यदि आप एक finalचर के लिए एक अलग मान निर्दिष्ट करने का प्रयास करते हैं, तो आपका प्रोग्राम संकलित नहीं होगा।

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

खोजशब्दों की संख्या को कम करने के लिए, जावा डेवलपर्स शब्द का उपयोग finalकेवल स्थिरांक घोषित करने से अधिक के लिए करते हैं। finalविधियों और यहां तक ​​कि कक्षाओं पर भी लागू हो सकता है। घोषित विधियों को finalओवरराइड नहीं किया जा सकता है, और घोषित वर्ग को 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;
}


2. चर छायांकन

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

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

उदाहरण:

कोड परिवर्तनशील दृश्यता
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
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.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



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

और एक और छोटा लेकिन दिलचस्प तथ्य।

वहाँ भी एक जगह है जहाँ एक चर को एक विशेष तरीके से घोषित किया जाता है - forलूप के अंदर ।

आपको याद होगा कि एक forलूप में आमतौर पर कोष्ठक में एक काउंटर वैरिएबल होता है। और इस वेरिएबल की विजिबिलिटी क्या होगी? आखिरकार, यह लूप के शरीर में नहीं है। क्या यह पूरी विधि है? या नहीं?

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