1. Константи

Много други езици за програмиране имат константи , тоест променливи, чиито стойности не могат да бъдат променяни . Обикновено те се използват за няHowво фундаментално нещо като броя Pior броя на дните в месеците от годината. Въпреки това, по принцип програмистът може да направи всяка променлива константа, ако той or тя реши, че това е необходимо.

И така, How да декларирате неизменна променлива (константа) в Java? Има специална ключова дума за това: final. Създаването на неизменна променлива изглежда по същия начин като създаването на обикновена. Единствената разлика е, че преди типа на променливата трябва да напишете думата final, така:

final Type name = value;

Ако се опитате да присвоите различна стойност на finalпроменлива, вашата програма просто няма да се компorра.

Променливата finalтрябва да бъде инициализирана (трябва да й бъде присвоена стойност), когато се декларира. Има едно изключение от това правило: можете да преместите инициализацията на променлива на статичен клас в конструктор. Но ще научите за това в ниво 10 .

За да намалят броя на ключовите думи, Java разработчиците използват думата finalза повече от просто деклариране на константи. finalможе също да се прилага към методи и дори класове. Методи, декларирани като, finalне могат да бъдат заменени, а клас, деклариран като, finalне може да бъде наследен.

Модификаторът finalможе да се добави преди всяHowви променливи: локални променливи, параметри на метода, полета на клас и статични променливи на клас.

Обърнете внимание, че finalпреди името на променлива е просто защита срещу всяHowви промени в тази променлива . Ако променлива съхранява препратка към обект, тогава обектът все още може да бъде променен.

Пример:

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. Променливо засенчване

Както казахме преди, не можете да създадете няколко локални променливи с едно и също име в един и същи метод. С различни методи можете.

Но ето Howво вероятно не знаете: променливите на екземпляра и променливите на локалния метод могат да имат едно и също име.

Пример:

Код Променлива видимост
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. До края на метода той засенчва (or маскира ) 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 са достъпни навсякъде със or без 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 и sum навсякъде със or без да използвате името на класа Solutionкато префикс. В тези редове, където sumлокалната променлива засенчва sumпроменливата на екземпляра, достъпът до sum променливата на екземпляра е възможен само когато се използва Solutionкато префикс.



3. Променливи в forцикъл

И още един малък, но интересен факт.

Има и място, където променливата се декларира по специален начин — вътре в forцикъл .

Може би си спомняте, че forцикълът обикновено има променлива брояч в скоби. И Howва ще бъде видимостта на тази променлива? В крайна сметка не е в тялото на цикъла. Целият метод ли е? Или не?

Правилният отговор е: променлива, декларирана в заглавката на цикъл, 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

Така че винаги можете да пишете цикли един след друг в codeа си и да използвате променливи на брояча с едно и също име — това няма да създаде проблеми.

Пример:

Код Променлива видимост
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