Konstanter

"Amigo, vidste du, at i Java ikke alle variabler kan ændres?"

"Hvordan er det, Kim? Selve ordet 'variabel' taler faktisk om forandring."

"Det er der ingen tvivl om. Som mange andre programmeringssprog har Java konstanter , det vil sige variabler, hvis værdier ikke kan ændres . Og selve ordet 'konstant' taler om konstanthed."

"Og hvad er de til?"

"Normalt bruges de til en slags grundlæggende ting såsom antallet Pieller antallet af dage i årets måneder. Når det er sagt, kan en programmør i princippet gøre enhver variabel til en konstant, hvis han eller hun beslutter, at så er det nødvendigt."

"Du mener som et navn, farve på en bil eller navn på en dag i ugen?"

"Du har den rigtige idé. Alt, hvad der ikke bør ændres."

"Og hvordan ser disse konstanter ud i Java?"

"Java har et særligt nøgleord til dem: final. At skabe en uforanderlig variabel ser ud på samme måde som at skabe en almindelig. Den eneste forskel er, at før variablens type skal du skrive ordet final, sådan her:

final Type name = value;

"Hvad sker der, hvis du opretter en konstant og derefter prøver at tildele den en anden værdi?"

"Det er det rigtige spørgsmål at stille! Og det rigtige svar er dette: Hvis du prøver at tildele en anden værdi til en finalvariabel, så vil dit program simpelthen ikke kompilere."

"Hvad hvis du erklærer en finalvariabel, men ikke tildeler en værdi til den?"

"Det nytter ikke at gøre dette, så det er heller ikke tilladt i Java. En finalvariabel skal initialiseres, når den er deklareret, det vil sige, du skal tildele den en værdi. Der er en undtagelse fra denne regel: du kan flytte initialisering af en statisk klassevariabel ind i en konstruktør, men det lærer du ud af senere.

"Når det er sagt, er ikke alt, hvad der er finalen konstant. For at reducere antallet af søgeord, bruger Java-udviklere ordet finaltil mere end blot at erklære konstanter. finalkan også gælde for metoder og endda klasser. Metoder erklæret som finalkan ikke tilsidesættes, og en klasse erklæret som finalikke kan arves."

"Øh... Tilsidesat? Nedarvet? Hvilket sprog taler du nu?"

"Sproget i objektorienteret programmering. Du vil komme til det meget snart. Indtil da kan du bare nyde den smukke terminologi."

"Okay. Så finalkan det sættes før variabler, klasser og metoder, og dette nøgleord gør dem uforanderlige på en eller anden måde?"

"Ja. Desuden finalkan modifikatoren tilføjes før alle variabler: lokale variabler, metodeparametre, klassefelter og statiske klassevariabler.

"Her er det vigtige at huske: finalfør et variabelnavn er kun beskyttelse mod enhver ændring af den variabel . Hvis en variabel gemmer en reference til et objekt, så kan objektet stadig ændres."

"Jeg forstår det ikke helt."

"Du vil snart forstå. Her er et eksempel:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
Vi skaber et array.

Dette er ikke tilladt: variablen dataerklæres som final.

Men du kan gøre dette.
Og også dette.

"Forstår det. Det er vanskeligt."

Globale konstanter

"Hvad tror du globale konstanter er?"

"Jeg gætter på, at globale konstanter sandsynligvis er som globale variabler, kun konstanter?"

"Nøjagtigt. Hvis du har brug for at erklære globale konstanter i dit program, skal du oprette statiske klassevariable , og lave dem publicog final. Der er en speciel stil for navnene på sådanne variable: de er skrevet med store bogstaver, med et understregningstegn, der bruges til at separate ord.

Eksempler:

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

Variabel skygge

"Som jeg sagde før, kan du ikke oprette flere lokale variabler med de samme navne i en enkelt metode. I forskellige metoder kan du."

"Jeg ved det!"

"Men hvad du sandsynligvis ikke ved er, at variabler i en klasse og lokale variabler i en metode godt kan have samme navn.

Eksempel:

Kode Variabel synlighed
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

"I addmetoden erklærede vi en lokal variabel ved navn sum. Indtil slutningen af ​​metoden skygger (eller maskerer ) suminstansvariablen."

"Hmm... jeg vil sige, at dette i en vis forstand er den forventede adfærd."

"Men det er ikke slutningen på historien. Det viser sig, at hvis en instansvariabel skygges af en lokal variabel, er der stadig en måde at henvise til instansvariablen i metoden. Det gør vi ved at skrive nøgleordet før dets thisnavn :

this.name

"Her er et eksempel, hvor navnekonflikten er løst:

Kode Variabel synlighed
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

Variablerne countog sumer tilgængelige overalt med eller uden nøgleordet this. På linjer, hvor den sumlokale variabel skygger for suminstansvariablen, sumkan instansvariablen kun tilgås ved hjælp af thisnøgleordet.

"Det er klart, jeg bliver nødt til at øve mig på det her."

"Du klarer dig."

"Hvad hvis en statisk klassevariabel er skygget i stedet for blot en (ikke-statisk) instansvariabel? Du kan ikke få adgang til den via this?"

"Det har du ret. Dette nøgleord virker ikke. Du skal henvise til det gennem klassenavnet:

ClassName.name

Eksempel:

Kode Variabel synlighed
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

"Vær opmærksom: du kan få adgang til de statiske variabler countog sumoveralt med eller uden brug af klassenavnet Solutionsom præfiks. På de linjer, hvor den sumlokale variabel skygger for suminstansvariablen, sumer adgang til klassevariablen kun mulig, når den bruges Solutionsom præfiks.

Variabler inde i en forløkke

"Og endnu et lille, men interessant faktum. Der er også et sted, hvor en variabel deklareres på en særlig måde - jeg taler om inde i en forløkke ." Typisk forhar en loop en countervariabel i parentes. Og hvad bliver synligheden af ​​denne variabel? Det er jo ikke i løkkens krop. Er det hele metoden? Eller ikke?"

"Jeg har allerede hørt noget om dette. Som jeg forstår det, er en variabel , der er erklæret i overskriften på en forløkke , kun synlig i løkkens brødtekst og i løkkens overskriftfor ."

"Godt gået, Amigo. Men kig alligevel på et eksempel for at forstærke dette materiale:

Kode Variabel synlighed
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

"Så du siger, at jeg i min kode kunne skrive flere loops efter hinanden med en tællervariabel med samme navn, og der vil ikke være nogen problemer?"

"Der ville ikke være nogen problemer. Se her:

Kode Variabel synlighed
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