1. Konstanter

Mange andre programmeringsspråk har konstanter , det vil si variabler hvis verdier ikke kan endres . Vanligvis brukes de til en slags grunnleggende ting som antall Pieller antall dager i månedene av året. Når det er sagt, i prinsippet kan en programmerer gjøre enhver variabel til en konstant, hvis han eller hun bestemmer at det er nødvendig.

Så hvordan erklærer du en uforanderlig variabel (konstant) i Java? Det er et spesielt nøkkelord for dette: final. Å lage en uforanderlig variabel ser ut på samme måte som å lage en vanlig. Den eneste forskjellen er at før variabelens type må du skrive ordet final, slik:

final Type name = value;

Hvis du prøver å tilordne en annen verdi til en finalvariabel, vil programmet ganske enkelt ikke kompilere.

En finalvariabel må initialiseres (en verdi må tildeles den) når den er deklarert. Det er ett unntak fra denne regelen: du kan flytte initialisering av en statisk klassevariabel inn i en konstruktør. Men du vil lære om dette på nivå 10 .

For å redusere antall nøkkelord bruker Java-utviklere ordet finaltil mer enn bare å deklarere konstanter. finalkan også gjelde for metoder og til og med klasser. Metoder som er erklært som finalkan ikke overstyres, og en klasse som er erklært som finalkan ikke arves.

Modifikatoren finalkan legges til før alle variabler: lokale variabler, metodeparametere, klassefelt og statiske klassevariabler.

Merk at finalfør et variabelnavn bare er beskyttelse mot eventuelle endringer i den variabelen . Hvis en variabel lagrer en referanse til et objekt, kan objektet fortsatt endres.

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 lager en array.

Dette er ikke tillatt: variabelen dataer deklarert som final.

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

Globale konstanter

Hvis du bestemmer deg for å deklarere globale konstanter i programmet ditt, må du lage statiske klassevariabler og lage dem publicog final. Det er en spesiell stil for navnene på slike variabler: de er skrevet med store bokstaver, med et understrekingstegn som brukes til å skille 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 skyggelegging

Som vi sa før, kan du ikke lage flere lokale variabler med samme navn i samme metode. I forskjellige metoder kan du.

Men her er det du sannsynligvis ikke vet: forekomstvariabler og lokale metodevariabler kan ha samme navn.

Eksempel:

Kode Variabel synlighet
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ærte vi en lokal variabel kalt sum. Inntil slutten av metoden skygger (eller maskerer ) sumforekomstvariabelen.

Ok, sier du, det er på en måte å forvente. Men det er ikke slutten på historien. Det viser seg at hvis en forekomstvariabel er skyggelagt av en lokal variabel, er det fortsatt en måte å referere til forekomstvariabelen i metoden. Vi gjør dette ved å skrive nøkkelordet thisfør navnet:

this.name

Her er et eksempel der navnekonflikten er løst:

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

Variablene count og sum er tilgjengelige overalt med eller uten nøkkelordet this. På linjer der den sum lokale variabelen skygger for sumforekomstvariabelen, sum kan forekomstvariabelen bare nås ved å bruke thisnøkkelordet.

Hvis en statisk klassevariabel i stedet for en forekomstvariabel er skyggelagt, må du få tilgang til den gjennom klassenavnet i stedet for nøkkelordet this:

ClassName.name

Eksempel:

Kode Variabel synlighet
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å tilgang til count og sum statiske variabler overalt med eller uten å bruke klassenavnet Solutionsom et prefiks. På de linjene der den sumlokale variabelen skygger for sumforekomstvariabelen, sum er tilgang til forekomstvariabelen bare mulig når den brukes Solutionsom et prefiks.



3. Variabler inne i en forloop

Og enda et lite, men interessant faktum.

Det er også et sted hvor en variabel er deklarert på en spesiell måte - inne i en forloop .

Du husker kanskje at en forsløyfe vanligvis har en tellervariabel i parentes. Og hva blir synligheten til denne variabelen? Tross alt er det ikke i løkkens kropp. Er det hele metoden? Eller ikke?

Det riktige svaret er: en variabel deklarert i overskriften til en forløkke er bare synlig i løkkens hoveddel og i løkkens overskriftfor .

Eksempel:

Kode Variabel synlighet
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 alltid skrive løkker etter hverandre i koden din og bruke tellervariabler med samme navn - det vil ikke skape noen problemer.

Eksempel:

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