Константи

„Амиго, знаеше ли, че в Java не всички променливи могат да се променят?“

"Как така, Ким? Наистина, самата дума "променлива" говори за промяна."

„В това няма съмнение. Както много други езици за програмиране, Java има константи , тоест променливи, чиито стойности не могат да бъдат променяни . И самата дума „константа“ говори за постоянство.“

— И за Howво са?

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

„Имате предвид като име, цвят на кола or име на ден от седмицата?“

"Имате правилната идея. Всичко, което не трябва да се променя."

„И How изглеждат тези константи в Java?“

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

final Type name = value;

„Какво се случва, ако създадете константа и след това се опитате да й присвоите различна стойност?“

"Това е правилният въпрос! И правилният отговор е следният: ако се опитате да присвоите различна стойност на променлива final, вашата програма просто няма да се компorра."

„Ами ако декларирате променлива final, но не й присвоите стойност?“

„Няма смисъл да правите това, така че също не е разрешено в Java. Една finalпроменлива трябва да бъде инициализирана, когато е декларирана, тоест трябва да й присвоите стойност. Има едно изключение от това правило: можете да преместите инициализацията на статична класова променлива в конструктор. Но ще научите за това по-късно.

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

„Ъъъ... Заменен? Наследен? Какъв език говорите сега?“

„Езикът на обектно-ориентираното програмиране. Ще стигнете до него много скоро. Дотогава просто се наслаждавайте на красивата терминология.“

"Добре. Значи finalможе да се постави преди променливи, класове и методи и тази ключова дума ги прави неизменни в няHowъв смисъл?"

„Да. Освен това 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;
}

Променливо засенчване

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

"Знам това!"

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

Пример:

Код Променлива видимост
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. До края на метода тя засенчва (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.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са достъпни навсякъде със 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като префикс.

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

„И още един малък, но интересен факт. Има и място, където променливата се декларира по специален начин — говоря за вътре в цикъл for. “ Обикновено forцикълът има counterпроменлива в скоби. И Howва ще бъде видимостта на тази променлива? В крайна сметка не е в тялото на цикъла. Целият метод ли е? Или не?"

„Вече съм чувал нещо за това. Доколкото разбирам, променлива, декларирана в заглавката на цикъл, forсе вижда само в тялото на цикъла и в заглавката на forцикъла .“

„Браво, Амиго. Но все пак вижте един пример, за да подсorте този материал:

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