1. Konstanter

Många andra programmeringsspråk har konstanter , det vill säga variabler vars värden inte kan ändras . Vanligtvis används de för någon form av grundläggande sak som antalet Pieller antalet dagar i årets månader. Som sagt, i princip kan en programmerare göra vilken variabel som helst till en konstant, om han eller hon beslutar att det är nödvändigt.

Så hur deklarerar man en oföränderlig variabel (konstant) i Java? Det finns ett speciellt nyckelord för detta: final. Att skapa en oföränderlig variabel ser ut på samma sätt som att skapa en vanlig. Den enda skillnaden är att innan variabelns typ måste du skriva ordet , finalså här:

final Type name = value;

Om du försöker tilldela ett annat värde till en finalvariabel, kommer ditt program helt enkelt inte att kompilera.

En finalvariabel måste initieras (ett värde måste tilldelas den) när den deklareras. Det finns ett undantag från denna regel: du kan flytta initiering av en statisk klassvariabel till en konstruktor. Men du kommer att lära dig om detta på nivå 10 .

För att minska antalet nyckelord använder Java-utvecklare ordet finalför mer än att bara deklarera konstanter. finalkan även gälla metoder och till och med klasser. Metoder som deklareras som finalkan inte åsidosättas, och en klass som deklareras som finalkan inte ärvas.

Modifieraren finalkan läggas till före alla variabler: lokala variabler, metodparametrar, klassfält och statiska klassvariabler.

Observera att finalinnan ett variabelnamn bara är skydd mot alla ändringar av den variabeln . Om en variabel lagrar en referens till ett objekt kan objektet fortfarande ändras.

Exempel:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
Vi skapar en array.

Detta är inte tillåtet: variabeln datadeklareras som final.

Men du kan göra det här.
Och även detta.

Globala konstanter

Om du bestämmer dig för att deklarera globala konstanter i ditt program måste du skapa statiska klassvariabler och göra dem publicoch final. Det finns en speciell stil för namnen på sådana variabler: de är skrivna med stora bokstäver, med ett understreck som används för att separera ord.

Exempel:

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 skuggning

Som vi sa tidigare kan du inte skapa flera lokala variabler med samma namn i samma metod. I olika metoder kan du.

Men här är vad du förmodligen inte vet: instansvariabler och lokala metodvariabler kan ha samma namn.

Exempel:

Koda Variabel sikt
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 deklarerade vi en lokal variabel med namnet sum. Fram till slutet av metoden skuggar (eller maskerar ) instansvariabeln sum.

Okej, säger du, det är förväntat i någon mening. Men det är inte slutet på historien. Det visar sig att om en instansvariabel skuggas av en lokal variabel så finns det fortfarande ett sätt att referera till instansvariabeln inom metoden. Vi gör detta genom att skriva thisnyckelordet före dess namn:

this.name

Här är ett exempel där namnkonflikten har lösts:

Koda Variabel sikt
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

Variablerna count och sum är tillgängliga överallt med eller utan thisnyckelordet. På rader där den sum lokala variabeln skuggar suminstansvariabeln sum kan instansvariabeln endast nås med thisnyckelordet.

Om en statisk klassvariabel snarare än en instansvariabel är skuggad, måste du komma åt den genom klassnamnet snarare än nyckelordet this:

ClassName.name

Exempel:

Koda Variabel sikt
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 komma åt de statiska variablerna count och sum överallt med eller utan att använda klassnamnet Solutionsom prefix. På de rader där den sumlokala variabeln skuggar suminstansvariabeln sum är åtkomst till instansvariabeln endast möjlig när den används Solutionsom ett prefix.



3. Variabler inuti en forslinga

Och ytterligare ett litet men intressant faktum.

Det finns också en plats där en variabel deklareras på ett speciellt sätt — inuti en forloop .

Du kanske minns att en forslinga vanligtvis har en räknarvariabel inom parentes. Och vad blir synligheten för denna variabel? Det är trots allt inte i slingans kropp. Är det hela metoden? Eller inte?

Det korrekta svaret är: en variabel som deklareras i en forloops rubrik är endast synlig i loopens brödtext och i loopens rubrikfor .

Exempel:

Koda Variabel sikt
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 skriva loopar efter varandra i din kod och använda räknarvariabler med samma namn - det kommer inte att skapa några problem.

Exempel:

Koda Variabel sikt
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