Constanten

"Amigo, wist je dat in Java niet alle variabelen veranderd kunnen worden?"

'Hoezo, Kim? Inderdaad, het woord 'variabel' spreekt van verandering.'

"Daar bestaat geen twijfel over. Net als veel andere programmeertalen heeft Java constanten , dat wil zeggen variabelen waarvan de waarden niet kunnen worden veranderd . En het woord 'constant' spreekt van constantheid."

"En waar dienen ze voor?"

"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 doen zo is nodig."

'Je bedoelt zoals een naam, kleur van een auto of naam van een dag van de week?'

'Je hebt het juiste idee. Alles wat niet veranderd mag worden.'

"En hoe zien deze constanten eruit op Java?"

"Java heeft een speciaal trefwoord voor hen: final. Het maken van een onveranderlijke variabele ziet er hetzelfde uit als het maken van een gewone variabele. Het enige verschil is dat je vóór het type van de variabele het woord final, als volgt moet schrijven:

final Type name = value;

"Wat gebeurt er als je een constante maakt en er vervolgens een andere waarde aan probeert toe te wijzen?"

"Dat is de juiste vraag om te stellen! En het juiste antwoord is dit: als je probeert een andere waarde toe te kennen aan een finalvariabele, dan wil je programma gewoon niet compileren."

"Wat als u een finalvariabele declareert maar er geen waarde aan toekent?"

"Dit heeft geen zin, dus het is ook niet toegestaan ​​in Java. Een finalvariabele moet worden geïnitialiseerd wanneer deze wordt gedeclareerd, dat wil zeggen, u moet er een waarde aan toekennen. Er is één uitzondering op deze regel: u kunt de initialisatie van een statische klassevariabele in een constructor, maar daar leer je later meer over.

"Dat gezegd hebbende, niet alles wat is, finalis een constante. Om het aantal trefwoorden te verminderen, gebruiken Java-ontwikkelaars het woord finalvoor meer dan alleen het declareren van constanten. finalHet kan ook worden toegepast op methoden en zelfs op klassen. Methoden die zijn gedeclareerd als finalkunnen niet worden overschreven, en een klasse verklaard als finalniet kan worden geërfd."

"Uh... Overschreven? Geërfd? Welke taal spreek je nu?"

"De taal van objectgeoriënteerd programmeren. Je komt er heel snel aan toe. Tot die tijd, geniet gewoon van de mooie terminologie."

"Oké. Dus, finalkan vóór variabelen, klassen en methoden worden geplaatst, en dit sleutelwoord maakt ze in zekere zin onveranderlijk?"

"Ja. Bovendien finalkan de modifier vóór variabelen worden toegevoegd: lokale variabelen, methodeparameters, klassevelden en statische klassevariabelen.

"Dit is het belangrijkste om te onthouden: finalvoordat een variabelenaam alleen bescherming biedt tegen eventuele wijzigingen aan die variabele . Als een variabele een verwijzing naar een object opslaat, kan het object nog steeds worden gewijzigd."

"Ik begrijp het niet helemaal."

"Je zult het heel snel begrijpen. Hier is een 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.

"Begrepen. Dat is lastig."

Wereldwijde constanten

"Wat denk je dat globale constanten zijn?"

"Ik denk dat globale constanten waarschijnlijk globale variabelen zijn, alleen maar constanten?"

"Precies. Als je globale constanten in je programma moet declareren, maak dan statische klassevariabelen aan en maak ze publicen 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 afzonderlijke woorden.

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;
}

Variabele schaduwwerking

"Zoals ik al eerder zei, kun je met één methode niet meerdere lokale variabelen met dezelfde naam maken. Met verschillende methoden kan dat wel."

"Dat weet ik!"

"Maar wat je waarschijnlijk niet weet, is dat variabelen in een klasse en lokale variabelen in een methode wel eens dezelfde naam kunnen 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, sum
count, sum
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 gedeclareerd sum. Tot het einde van de methode schaduwt (of maskeert ) deze de suminstantievariabele."

"Hmm... ik zou zeggen dat dit in zekere zin het verwachte gedrag is."

"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 binnen de methode te verwijzen. We doen dit door het trefwoord voor de naam te thisschrijven :

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

De variabelen counten sumzijn overal beschikbaar met of zonder het thistrefwoord. Op regels waar de sumlokale variabele de suminstantievariabele in de schaduw stelt, sumis de instantievariabele alleen toegankelijk met behulp van het thistrefwoord.

"Het is duidelijk dat ik dit moet oefenen."

"Het gaat je lukken."

"Wat als een statische klassevariabele wordt geschaduwd in plaats van alleen een (niet-statische) instantievariabele? U hebt er geen toegang toe via this?"

"Je hebt gelijk. Het trefwoord this werkt niet. Je moet ernaar verwijzen via de klassenaam:

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

"Let op: je hebt overal toegang tot de counten sumstatische variabelen, met of zonder de klassenaam Solutionals voorvoegsel te gebruiken. In die regels waar de sumlokale variabele de suminstantievariabele in de schaduw stelt, sumis toegang tot de klassevariabele alleen mogelijk wanneer deze Solutionals voorvoegsel wordt gebruikt.

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 - ik heb het over in een forlus ." Meestal forheeft een lus een countervariabele tussen haakjes. 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?"

"Ik heb hier al iets over gehoord. Zoals ik het begrijp, is een variabele die is gedeclareerd in de kop van een forlus alleen zichtbaar in de body van de lus en in de kop van de forlus ."

"Goed gedaan, Amigo. Maar toch, kijk eens naar een voorbeeld om dit materiaal te versterken:

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

"Dus je zegt dat ik in mijn code verschillende loops achter elkaar zou kunnen schrijven met een tellervariabele met dezelfde naam, en dat er geen problemen zullen zijn?"

"Er zouden geen problemen zijn. Hier, kijk:

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