1. Konstanter

Mange andre programmeringssprog har konstanter , det vil sige variabler, hvis værdier ikke kan ændres . 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, i princippet kan en programmør gøre enhver variabel til en konstant, hvis han eller hun beslutter, at det er nødvendigt.

Så hvordan erklærer du en uforanderlig variabel (konstant) i Java? Der er et særligt søgeord for dette: final. Oprettelse af en uforanderlig variabel ser det samme ud som at oprette en almindelig variabel. Den eneste forskel er, at før variablens type skal du skrive ordet final, sådan her:

final Type name = value;

Hvis du prøver at tildele en anden værdi til en finalvariabel, vil dit program simpelthen ikke kompilere.

En finalvariabel skal initialiseres (der skal tildeles en værdi), når den erklæres. Der er en undtagelse fra denne regel: du kan flytte initialisering af en statisk klassevariabel ind i en konstruktør. Men du lærer om dette på niveau 10 .

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, der er erklæret som, finalkan ikke tilsidesættes, og en klasse, der er erklæret som, finalkan ikke nedarves.

Modifikatoren finalkan tilføjes før alle variabler: lokale variabler, metodeparametre, klassefelter og statiske klassevariabler.

Bemærk, at finalfør et variabelnavn kun er beskyttelse mod eventuelle ændringer af den variabel . Hvis en variabel gemmer en reference til et objekt, kan objektet stadig ændres.

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.

Globale konstanter

Hvis du beslutter dig for at erklære globale konstanter i dit program, skal du oprette statiske klassevariabler og lave dem publicog final. Der er en speciel stil for navnene på sådanne variabler: de er skrevet med store bogstaver, med et understregningstegn, der bruges til at adskille 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;
}


2. Variabel skyggelægning

Som vi sagde før, kan du ikke oprette flere lokale variabler med samme navn i samme metode. I forskellige metoder kan du.

Men her er, hvad du sandsynligvis ikke ved: instansvariabler og lokale metodevariabler 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
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.

Okay, siger du, det kan forventes på en eller anden måde. Men det er ikke slutningen på historien. Det viser sig, at hvis en instansvariabel overskygges 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 thisfør dets navn:

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.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 count og sum er tilgængelige overalt med eller uden nøgleordet this. På linjer, hvor den sum lokale variabel skygger for suminstansvariablen, sum kan instansvariablen kun tilgås ved hjælp af thisnøgleordet.

Hvis en statisk klassevariabel i stedet for en forekomstvariabel skygges, skal du have adgang til den via klassenavnet i stedet for nøgleordet this:

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

Du kan få adgang til de statiske variable count og sum overalt med eller uden at bruge klassenavnet Solutionsom præfiks. På de linjer, hvor den sumlokale variabel skygger for suminstansvariablen, sum er adgang til instansvariablen kun mulig, når den bruges Solutionsom et præfiks.



3. Variabler inde i en forløkke

Og endnu et lille, men interessant faktum.

Der er også et sted, hvor en variabel erklæres på en speciel måde - inde i en forloop .

Du husker måske, at en forloop typisk har en tællervariabel i parentes. Og hvad bliver synligheden af ​​denne variabel? Det er jo ikke i løkkens krop. Er det hele metoden? Eller ikke?

Det korrekte svar er: en variabel , der er erklæret i en forløkkes overskrift , er kun synlig i løkkens brødtekst og i løkkens overskriftfor .

Eksempel:

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 kan altid skrive sløjfer efter hinanden i din kode og bruge tællervariabler med samme navn - det vil ikke skabe nogen problemer.

Eksempel:

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