Konstanter

"Amigo, visste du at i Java kan ikke alle variabler endres?"

"Hvordan er det, Kim? Faktisk, selve ordet "variabel" snakker om endring."

"Det er ingen tvil om det. Som mange andre programmeringsspråk har Java konstanter , det vil si variabler hvis verdier ikke kan endres . Og selve ordet "konstant" snakker om konstanthet."

"Og hva er de for?"

"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 seg for å gjøre så er nødvendig."

"Du mener som et navn, farge på en bil eller navn på en ukedag?"

"Du har den rette ideen. Alt som ikke bør endres."

"Og hvordan ser disse konstantene ut i Java?"

"Java har et spesielt nøkkelord for dem: 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;

"Hva skjer hvis du lager en konstant og deretter prøver å tildele den en annen verdi?"

"Det er det riktige spørsmålet å stille! Og det riktige svaret er dette: Hvis du prøver å tilordne en annen verdi til en finalvariabel, vil programmet ganske enkelt ikke kompilere."

"Hva om du erklærer en finalvariabel, men ikke tildeler en verdi til den?"

"Det er ingen vits i å gjøre dette, så det er heller ikke tillatt i Java. En finalvariabel må initialiseres når den er deklarert, det vil si at du må tilordne en verdi til den. 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 det senere.

"Når det er sagt, er ikke alt som er finalen konstant. 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 erklært som finalikke kan arves."

"Øh... Overstyrt? Nedarvet? Hvilket språk snakker du nå?"

"Språket til objektorientert programmering. Du kommer til det veldig snart. Inntil da, bare nyt den vakre terminologien."

"Ok. Så, finalkan settes foran variabler, klasser og metoder, og dette nøkkelordet gjør dem uforanderlige på en eller annen måte?"

"Ja. Videre finalkan modifikatoren legges til før alle variabler: lokale variabler, metodeparametere, klassefelt og statiske klassevariabler.

"Her er det viktige å huske: finalfør et variabelnavn er bare beskyttelse mot eventuelle endringer i den variabelen . Hvis en variabel lagrer en referanse til et objekt, kan objektet fortsatt endres."

— Jeg forstår ikke helt.

"Du vil forstå veldig snart. 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 lager en array.

Dette er ikke tillatt: variabelen dataer deklarert som final.

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

"Skjønner det. Det er vanskelig."

Globale konstanter

"Hva tror du globale konstanter er?"

"Jeg antar at globale konstanter sannsynligvis er som globale variabler, bare konstanter?"

"Akkurat. Hvis du trenger å deklarere globale konstanter i programmet ditt, lag statiske klassevariabler , og lag 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 å 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 skyggelegging

"Som jeg sa før, kan du ikke lage flere lokale variabler med de samme navnene i en enkelt metode. I forskjellige metoder kan du."

"Jeg vet det!"

"Men det du sannsynligvis ikke vet er at variabler i en klasse og lokale variabler i en metode godt 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, 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ærte vi en lokal variabel kalt sum. Inntil slutten av metoden skygger (eller maskerer ) suminstansvariabelen."

"Hmm... jeg vil på en måte si at dette er forventet oppførsel."

"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. Dette gjør vi ved å skrive nøkkelordet før thisnavnet :

this.name

"Her er et eksempel hvor 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.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

Variablene countog sumer tilgjengelige overalt med eller uten nøkkelordet this. På linjer der den sumlokale variabelen skygger for sumforekomstvariabelen, sumkan forekomstvariabelen bare nås ved å bruke thisnøkkelordet.

"Det er klart, jeg må øve på dette."

"Du klarer deg."

"Hva om en statisk klassevariabel er skyggelagt i stedet for bare en (ikke-statisk) forekomstvariabel? Du får ikke tilgang til den gjennom this?"

"Helt riktig. Dette nøkkelordet vil ikke fungere. Du må referere til det gjennom klassenavnet:

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

"Vær oppmerksom: du kan få tilgang til countog sumstatiske variabler overalt med eller uten å bruke klassenavnet Solutionsom et prefiks. På de linjene der den sumlokale variabelen skygger for suminstansvariabelen, sumer tilgang til klassevariabelen bare mulig når den brukes Solutionsom et prefiks.

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 - jeg snakker om inne i en forloop ." Vanligvis forhar en løkke en countervariabel i parentes. Og hva blir synligheten til denne variabelen? Tross alt er det ikke i løkkens kropp. Er det hele metoden? Eller ikke?"

"Jeg har allerede hørt noe om dette. Slik jeg forstår det, er en variabel deklarert i overskriften til en forløkke kun synlig i løkkens hoveddel og i løkkens overskriftfor ."

"Godt gjort, Amigo. Men ta en titt på et eksempel for å forsterke dette materialet:

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 sier at jeg i koden min kunne skrive flere løkker etter hverandre med en tellervariabel med samme navn, og det vil ikke være noen problemer?"

"Det ville ikke være noen problemer. Her, se:

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