1. Állandók

Sok más programozási nyelvnek vannak konstansai , vagyis olyan változók, amelyek értékei nem változtathatók meg . Általában valamilyen alapvető dologra használják őket, mint például a Pinapok száma vagy száma az év hónapjaiban. Ez azt jelenti, hogy elvileg a programozó bármely változót konstanssá tehet, ha úgy dönt, hogy ez szükséges.

Tehát hogyan deklarálunk egy megváltoztathatatlan változót (konstanst) a Java-ban? Van erre egy speciális kulcsszó: final. Egy megváltoztathatatlan változó létrehozása ugyanúgy néz ki, mint egy közönséges változó létrehozása. Az egyetlen különbség az, hogy a változó típusa előtt meg kell írni a szót final, így:

final Type name = value;

Ha megpróbál más értéket rendelni egy változóhoz final, akkor a program egyszerűen nem fog lefordítani.

A finalváltozót deklaráláskor inicializálni kell (értéket kell hozzá rendelni). Ez alól egy kivétel van: a statikus osztályváltozó inicializálását áthelyezheti egy konstruktorba. De erről a 10. szinten fogsz tanulni .

A kulcsszavak számának csökkentése érdekében a Java fejlesztők ezt a szót finalnem csupán konstansok deklarálására használják. finalmetódusokra, sőt osztályokra is vonatkozhat. A mintának deklarált metódusok finalnem bírálhatók felül, és a mintának deklarált osztály finalnem örökölhető.

A finalmódosító bármely változó elé kerülhet: lokális változók, metódusparaméterek, osztálymezők és statikus osztályváltozók.

Ne feledje , hogy finala változó előtti név csak védelem a változó bármilyen változása ellen . Ha egy változó hivatkozást tárol egy objektumra, akkor az objektum továbbra is módosítható.

Példa:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
Készítünk egy tömböt.

Ez nem megengedett: a dataváltozót final.

De ezt megteheti.
És ezt is.

Globális állandók

Ha úgy dönt, hogy globális konstansokat deklarál a programban, akkor statikus osztályváltozókat kell létrehoznia , és azokat publicés final. Az ilyen változók nevének sajátos stílusa van: csupa nagybetűvel írják, a szavak elválasztására szolgáló aláhúzásjellel.

Példák:

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. Változó árnyékolás

Mint korábban említettük, nem hozható létre több, azonos nevű helyi változó ugyanazzal a módszerrel. Különböző módszerekkel megteheti.

De itt van, amit valószínűleg nem tud: a példányváltozóknak és a helyi metódusváltozóknak lehet ugyanaz a neve.

Példa:

Kód Változó láthatóság
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

A addmetódusban egy helyi változót deklaráltunk sum. A metódus végéig árnyékolja (vagy maszkolja ) a sumpéldányváltozót.

Oké, azt mondod, ez bizonyos értelemben várható. De ezzel még nincs vége a történetnek. Kiderült, hogy ha egy példányváltozót egy lokális változó árnyékol be, akkor is van mód a metóduson belül a példányváltozóra hivatkozni. Ehhez a thiskulcsszót a neve elé írjuk:

this.name

Íme egy példa, ahol a névütközés sikeresen feloldásra került:

Kód Változó láthatóság
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

A count és sum változók mindenhol elérhetők kulcsszóval vagy anélkül this. Azokon a sorokon, ahol a sum helyi változó árnyékolja a sumpéldányváltozót, a példányváltozó csak a kulcsszó sum használatával érhető el .this

Ha a példányváltozó helyett egy statikus osztályváltozó van árnyékolva, akkor azt az osztálynéven keresztül kell elérnie, nem pedig a thiskulcsszón keresztül:

ClassName.name

Példa:

Kód Változó láthatóság
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 A és statikus változókat mindenhol elérheti sum az osztálynév Solutionelőtagként való használatával vagy anélkül. Azokban a sorokban, ahol a sumlokális változó árnyékolja a sumpéldányváltozót, a példányváltozóhoz csak előtagként sum lehet hozzáférni.Solution



3. Változók forcikluson belül

És még egy apró, de érdekes tény.

Van egy olyan hely is, ahol egy változót speciális módon deklarálnak – egy forcikluson belül .

Emlékezhet arra, hogy a forciklusok általában zárójelben tartalmaznak egy számlálóváltozót. És mi lesz ennek a változónak a láthatósága? Végül is nem a hurok testében van. Ez az egész módszer? Vagy nem?

forA helyes válasz: a ciklus fejlécében deklarált változó csak a ciklus törzsében és a ciklus fejlécébenfor látható .

Példa:

Kód Változó láthatóság
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

Tehát mindig írhat ciklusokat egymás után a kódba, és használhat azonos nevű számlálóváltozókat – ez nem okoz problémát.

Példa:

Kód Változó láthatóság
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