1. Constanten

Veel andere programmeertalen hebben constanten , dat wil zeggen variabelen waarvan de waarden niet kunnen worden gewijzigd . Meestal worden ze gebruikt voor iets fundamenteels, zoals het aantal Piof het aantal dagen in de maanden van het jaar. Dat gezegd hebbende, kan een programmeur in principe elke variabele tot een constante maken, als hij of zij besluit dat dit nodig is.

Dus hoe declareer je een onveranderlijke variabele (constante) in Java? Hier is een speciaal trefwoord voor: final. Het maken van een onveranderlijke variabele ziet er hetzelfde uit als het maken van een gewone variabele. Het enige verschil is dat u vóór het type van de variabele het woord moet schrijven final, zoals dit:

final Type name = value;

Als je probeert een andere waarde toe te kennen aan een finalvariabele, dan wil je programma gewoon niet compileren.

Een finalvariabele moet worden geïnitialiseerd (er moet een waarde aan worden toegekend) wanneer deze wordt gedeclareerd. Er is één uitzondering op deze regel: u kunt de initialisatie van een statische klassevariabele verplaatsen naar een constructor. Maar daarover leer je in Level 10 .

Om het aantal trefwoorden te verminderen, gebruiken Java-ontwikkelaars het woord finalvoor meer dan alleen het declareren van constanten. finalkan ook van toepassing zijn op methoden en zelfs klassen. Methoden die zijn gedeclareerd als finalniet kunnen worden overschreven, en een klasse die is gedeclareerd als finalniet kunnen worden geërfd.

De finalmodifier kan vóór variabelen worden toegevoegd: lokale variabelen, methodeparameters, klassevelden en statische klassevariabelen.

Merk op dat finalvóór een variabelenaam alleen bescherming is tegen eventuele wijzigingen aan die variabele . Als een variabele een verwijzing naar een object opslaat, kan het object nog steeds worden gewijzigd.

Voorbeeld:

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

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

data[0] = 0;
data[1] = 0;
data[2] = 0;
We maken een array.

Dit is niet toegestaan: de datavariabele wordt gedeclareerd als final.

Maar je kunt dit doen.
En ook dit.

Wereldwijde constanten

Als u besluit om globale constanten in uw programma te declareren, dan moet u statische klassevariabelen maken en deze publicen maken final. Er is een speciale stijl voor de namen van dergelijke variabelen: ze worden allemaal in hoofdletters geschreven, met een onderstrepingsteken dat wordt gebruikt om woorden te scheiden.

Voorbeelden:

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. Variabele schaduwwerking

Zoals we al eerder zeiden, kunt u met dezelfde methode niet meerdere lokale variabelen met dezelfde naam maken. Op verschillende manieren kan dat.

Maar dit is wat u waarschijnlijk niet weet: instantievariabelen en lokale methodevariabelen kunnen dezelfde naam hebben.

Voorbeeld:

Code Variabele zichtbaarheid
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

In de addmethode hebben we een lokale variabele met de naam sum. Tot het einde van de methode schaduwt (of maskeert ) het de suminstantievariabele.

Oké, zeg je, dat is in zekere zin te verwachten. Maar dat is niet het einde van het verhaal. Het blijkt dat als een instantievariabele wordt overschaduwd door een lokale variabele, er nog steeds een manier is om naar de instantievariabele te verwijzen binnen de methode. Dit doen we door het thistrefwoord voor de naam te schrijven:

this.name

Hier is een voorbeeld waarbij het naamconflict met succes is opgelost:

Code Variabele zichtbaarheid
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

De variabelen count en sum zijn overal beschikbaar met of zonder het thistrefwoord. Op regels waar de sum lokale variabele de suminstantievariabele in de schaduw stelt, sum is de instantievariabele alleen toegankelijk met behulp van het thistrefwoord.

Als een statische klassevariabele in plaats van een instantievariabele wordt geschaduwd, moet u deze openen via de klassenaam in plaats van het thistrefwoord:

ClassName.name

Voorbeeld:

Code Variabele zichtbaarheid
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

U hebt overal toegang tot de count en sum statische variabelen, met of zonder de klassenaam Solutionals voorvoegsel te gebruiken. In die regels waar de lokale variabele de instantievariabele sumoverschaduwt ,  is toegang tot de instantievariabele alleen mogelijk wanneer deze als voorvoegsel wordt gebruikt.sumsumSolution



3. Variabelen binnen een forlus

En nog een klein maar interessant feit.

Er is ook een plaats waar een variabele op een speciale manier wordt gedeclareerd — binnen een forlus .

U herinnert zich misschien dat een forlus doorgaans een tellervariabele tussen haakjes heeft. En wat is de zichtbaarheid van deze variabele? Het zit tenslotte niet in de body van de lus. Is het de hele methode? Of niet?

Het juiste antwoord is: een variabele gedeclareerd in de header van een forloop is alleen zichtbaar in de body van de loop en in de header van de forloop .

Voorbeeld:

Code Variabele zichtbaarheid
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

U kunt dus altijd loops achter elkaar in uw code schrijven en tellervariabelen met dezelfde naam gebruiken - dat levert geen problemen op.

Voorbeeld:

Code Variabele zichtbaarheid
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