1. Stałe

Wiele języków programowania posiada stałezmienne, których wartości nie można zmienić . Zwykle są to pewne podstawowe rzeczy, takie jak liczba Pilub liczba dni w miesiącach. Chociaż w zasadzie programista może uczynić dowolną zmienną stałą, jeśli uzna, że ​​jest to konieczne.

Jak więc zadeklarować niezmienną zmienną (stałą) w Javie? Jest do tego specjalne słowo kluczowe - final. Tworzenie niezmiennej zmiennej wygląda tak samo, jak tworzenie zwykłej, tylko trzeba napisać słowo przed typem zmiennej final:

final тип Nazwa = oznaczający;

Jeśli spróbujesz nadać final-zmiennej inną wartość, twój program po prostu się nie skompiluje.

final- zmienna musi być zainicjowana podczas deklarowania (przypisywania jej wartości). Ta reguła ma jeden wyjątek: możesz przenieść inicjalizację zmiennej klasy do konstruktora. Ale o tym dowiesz się na poziomie 10 .

Aby zmniejszyć liczbę słów kluczowych, programiści Javy używają tego słowa finalnie tylko do deklarowania stałych. finalmożna również określić przed metodą, a nawet klasą. Metody zadeklarowane jako finalnie mogą zostać przesłonięte, a klasa zadeklarowana jako finalnie może być dziedziczona.

Modyfikator finalmożna dodać przed dowolnymi zmiennymi: lokalnymi, parametrami, polami klas i zmiennymi statycznymi.

Należy pamiętać, że final- jest to tylko zabezpieczenie przed zmianą zmiennej . Jeśli zmienna zawiera odniesienie do obiektu, obiekt nadal można zmienić.

Przykład:

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

data = new int[]{6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Tworzymy tablicę.

Nie jest to możliwe: zmienna datajest zadeklarowana jako final.

Czy to dozwolone.
I tak jest to możliwe.

Stałe globalne

Jeśli zdecydujesz się zadeklarować stałe globalne w swoim programie, aby to zrobić, musisz utworzyć statyczne zmienne klasy , a także uczynić je publici final. Istnieje specjalny styl pisania nazw takich zmiennych: są one pisane wielkimi literami, a znak podkreślenia działa jak separator słów.

Przykłady:

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. Przesłanianie zmiennych

Jak powiedzieliśmy wcześniej, nie można utworzyć kilku zmiennych lokalnych o tej samej nazwie w jednej metodzie. W różnych metodach - jest to możliwe.

Ale oto, czego prawdopodobnie nie wiesz: zmienne klasy i zmienne metody lokalnej mogą mieć tę samą nazwę.

Przykład:

Kod Dostępność zmiennych
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

W metodzie addzadeklarowaliśmy zmienną lokalną sumi do końca metody nakłada się ona (lub mówią, że zaciemnia ) na zmienną klasową sum.

No ok, mówisz, nawet w pewnym sensie oczekiwane zachowanie. Ale to nie wszystko. Okazuje się, że jeśli zmienna klasy jest przesłonięta przez zmienną lokalną, nadal istnieje sposób, aby metoda odwoływała się do zmiennej klasy. Aby to zrobić, musisz napisać słowo kluczowe przed jej imieniem this:

this.Nazwa

Oto przykład pomyślnego rozwiązania konfliktu nazw:

Kod Dostępność zmiennych
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

Zmienne wszędzie count i są dostępne zarówno ze sum słowem kluczowym this, jak i bez niego . W wierszach, w których zmienna lokalna sum przesłania zmienną klasową sum, dostęp do zmiennej klasowej sum można uzyskać tylko za pomocą this.

Jeśli cieniowana jest nie tylko zmienna klasy, ale zmienna klasy statycznej, musisz uzyskać do niej dostęp nie przez this, ale przez nazwę klasy:

ClassName.Nazwa

Przykład:

Kod Dostępność zmiennych
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

Zmienne są wszędzie statyczne count i są dostępne z sum prefiksem nazwy klasy Solutionlub bez niego . W wierszach, w których zmienna lokalna sumprzesłania zmienną klasową sum, dostęp do zmiennej klasowej sum można uzyskać tylko za pomocą przedrostka Solution.



3. Zmienne wewnątrz pętlifor

I jeszcze jeden mały, ale interesujący fakt.

Jest jeszcze jedno miejsce, w którym zmienna jest deklarowana w specjalny sposób - jest to pętlafor .

Jak pamiętasz, zazwyczaj pętla forma zmienną licznika zadeklarowaną w nawiasach. A jaka będzie widoczność tej zmiennej? Nie ma go w ciele pętli, więc to cała metoda? A może nadal nie jest?

Prawidłowa odpowiedź brzmi: zmienna zadeklarowana w nagłówku pętlifor jest widoczna tylko w ciele pętli iw nagłówku pętlifor .

Przykład:

Kod Dostępność zmiennych
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

Dlatego zawsze możesz napisać sekwencyjnie kilka pętli w swoim kodzie ze zmienną licznika o tej samej nazwie - nie będzie problemów.

Przykład:

Kod Dostępność zmiennych
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