constante

„Amigo, știai că în Java nu toate variabilele pot fi modificate?”

„Cum e, Kim? Într-adevăr, cuvântul „variabil” vorbește despre schimbare.”

„Nu există nicio îndoială în acest sens. La fel ca multe alte limbaje de programare, Java are constante , adică variabile ale căror valori nu pot fi modificate . Și chiar cuvântul „constant” vorbește despre constanță.”

— Și pentru ce sunt?

„De obicei, ele sunt folosite pentru un fel de lucru fundamental, cum ar fi numărul Pisau numărul de zile din lunile anului. Acestea fiind spuse, în principiu, un programator poate face din orice variabilă o constantă, dacă el sau ea decide că făcând deci este necesar.”

„Vrei să spui ca un nume, culoarea unei mașini sau numele unei zile a săptămânii?”

"Ai ideea corectă. Orice lucru care nu ar trebui schimbat."

„Și cum arată aceste constante în Java?”

„Java are un cuvânt cheie special pentru ei: final. Crearea unei variabile imuabile arată la fel cu crearea uneia obișnuite. Singura diferență este că înainte de tipul variabilei trebuie să scrieți cuvântul final, astfel:

final Type name = value;

„Ce se întâmplă dacă creați o constantă și apoi încercați să-i atribuiți o valoare diferită?”

„Aceasta este întrebarea corectă de pus! Și răspunsul corect este acesta: dacă încercați să atribuiți o valoare diferită unei finalvariabile, atunci programul dumneavoastră pur și simplu nu se va compila.”

„Ce se întâmplă dacă declari o finalvariabilă, dar nu îi atribui o valoare?”

„Nu are rost să faci asta, deci nu este permis nici în Java. O finalvariabilă trebuie inițializată atunci când este declarată, adică trebuie să îi alocați o valoare. Există o excepție de la această regulă: puteți muta inițializarea o variabilă de clasă statică într-un constructor. Dar veți afla despre asta mai târziu.

„Aceasta fiind spuse, nu tot ceea ce este finaleste o constantă. Pentru a reduce numărul de cuvinte cheie, dezvoltatorii Java folosesc cuvântul finalpentru mai mult decât doar declararea constantelor. finalSe poate aplica și metodelor și chiar claselor. Metodele declarate ca finalnu pot fi suprascrise și o clasă declarat ca finalnu poate fi mostenit.”

"Uh... Overscris? Moștenit? Ce limbă vorbești acum?"

"Limbajul programării orientate pe obiecte. Veți ajunge la el foarte curând. Până atunci, bucurați-vă de terminologia frumoasă."

"Bine. Deci, finalpoate fi pus înaintea variabilelor, claselor și metodelor, iar acest cuvânt cheie le face imuabile într-un anumit sens?"

„Da. În plus, finalmodificatorul poate fi adăugat înaintea oricăror variabile: variabile locale, parametri de metodă, câmpuri de clasă și variabile statice de clasă.

„Iată lucrul important de reținut: finalînainte ca numele unei variabile este doar protecție împotriva oricăror modificări aduse acelei variabile . Dacă o variabilă stochează o referință la un obiect, atunci obiectul poate fi schimbat în continuare.”

— Nu prea înțeleg.

„Veți înțelege foarte curând. Iată un exemplu:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
Creăm o matrice.

Acest lucru nu este permis: variabila dataeste declarată ca final.

Dar poți face asta.
Si tot asta.

— Am înțeles. E complicat.

Constante globale

„Ce crezi că sunt constantele globale?”

„Bănuiesc că constantele globale sunt probabil ca variabilele globale, doar constante?”

„Exact. Dacă trebuie să declarați constante globale în programul dvs., creați variabile statice de clasă și faceți-le publicși final. Există un stil special pentru numele unor astfel de variabile: acestea sunt scrise cu majuscule, cu un caracter de subliniere folosit pentru cuvinte separate.

Exemple:

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;
}

Umbrire variabilă

„Așa cum am spus înainte, nu puteți crea mai multe variabile locale cu aceleași nume într-o singură metodă. În diferite metode, puteți.”

"Știu că!"

„Dar ceea ce probabil nu știți este că variabilele dintr-o clasă și variabilele locale dintr-o metodă pot avea același nume.

Exemplu:

Cod Vizibilitate variabila
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

„În addmetodă, am declarat o variabilă locală numită sum. Până la sfârșitul metodei, umbră (sau maschează ) sumvariabila de instanță.”

„Hmm... aș spune într-un fel că acesta este comportamentul așteptat”.

„Dar acesta nu este sfârșitul poveștii. Se dovedește că, dacă o variabilă de instanță este umbrită de o variabilă locală, există totuși o modalitate de a face referire la variabila de instanță în cadrul metodei. Facem acest lucru scriind cuvântul cheie înaintea numelui său this. :

this.name

„Iată un exemplu în care conflictul de nume este rezolvat cu succes:

Cod Vizibilitate variabila
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

Variabilele countși sumsunt disponibile peste tot cu sau fără thiscuvântul cheie. Pe liniile în care sumvariabila locală umbră variabila suminstanță, sumvariabila instanță poate fi accesată numai folosind thiscuvântul cheie.

— Evident, va trebui să exersez asta.

— Te vei descurca.

„Ce se întâmplă dacă o variabilă de clasă statică este umbrită mai degrabă decât doar o variabilă de instanță (nestatică)? Nu o puteți accesa prin intermediul this?”

„Ai dreptate. Acest cuvânt cheie nu va funcționa. Trebuie să te referi la el prin numele clasei:

ClassName.name

Exemplu:

Cod Vizibilitate variabila
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

„Atenție: puteți accesa variabilele countși sumvariabilele statice oriunde cu sau fără utilizarea numelui clasei Solutionca prefix. În acele linii în care sumvariabila locală umbrește sumvariabila instanță, accesul la sumvariabila clasă este posibil numai atunci când este utilizat Solutionca prefix.

Variabile în interiorul unei forbucle

„Și încă un fapt mic, dar interesant. Există, de asemenea, un loc în care o variabilă este declarată într-un mod special – vorbesc despre în interiorul unei forbucle .” De obicei, o forbuclă are o countervariabilă între paranteze. Și care va fi vizibilitatea acestei variabile? La urma urmei, nu se află în corpul buclei. Este întreaga metodă? Sau nu?"

"Am auzit deja ceva despre asta. După cum am înțeles , o variabilă declarată în antetul unei forbucle este vizibilă numai în corpul buclei și în antetul bucleifor ."

„Bravo, Amigo. Dar totuși, aruncă o privire la un exemplu pentru a consolida acest material:

Cod Vizibilitate variabila
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

„Deci spui că în codul meu aș putea scrie mai multe bucle una după alta cu o variabilă contor cu același nume și nu vor fi probleme?”

„Nu ar fi probleme. Uite, uite:

Cod Vizibilitate variabila
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