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 Pi
of 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 final
variabele, dan wil je programma gewoon niet compileren."
"Wat als u een final
variabele declareert maar er geen waarde aan toekent?"
"Dit heeft geen zin, dus het is ook niet toegestaan in Java. Een final
variabele 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, final
is een constante. Om het aantal trefwoorden te verminderen, gebruiken Java-ontwikkelaars het woord final
voor meer dan alleen het declareren van constanten. final
Het kan ook worden toegepast op methoden en zelfs op klassen. Methoden die zijn gedeclareerd als final
kunnen niet worden overschreven, en een klasse verklaard als final
niet 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, final
kan vóór variabelen, klassen en methoden worden geplaatst, en dit sleutelwoord maakt ze in zekere zin onveranderlijk?"
"Ja. Bovendien final
kan de modifier vóór variabelen worden toegevoegd: lokale variabelen, methodeparameters, klassevelden en statische klassevariabelen.
"Dit is het belangrijkste om te onthouden: final
voordat 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:
|
We maken een array. Dit is niet toegestaan: de data variabele 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 public
en 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 |
---|---|
|
|
"In de add
methode hebben we een lokale variabele met de naam gedeclareerd sum
. Tot het einde van de methode schaduwt (of maskeert ) deze de sum
instantievariabele."
"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 this
schrijven :
this.name
"Hier is een voorbeeld waarbij het naamconflict met succes is opgelost:
Code | Variabele zichtbaarheid |
---|---|
|
|
De variabelen count
en sum
zijn overal beschikbaar met of zonder het this
trefwoord. Op regels waar de sum
lokale variabele de sum
instantievariabele in de schaduw stelt, sum
is de instantievariabele alleen toegankelijk met behulp van het this
trefwoord.
"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 |
---|---|
|
|
"Let op: je hebt overal toegang tot de count
en sum
statische variabelen, met of zonder de klassenaam Solution
als voorvoegsel te gebruiken. In die regels waar de sum
lokale variabele de sum
instantievariabele in de schaduw stelt, sum
is toegang tot de klassevariabele alleen mogelijk wanneer deze Solution
als voorvoegsel wordt gebruikt.
Variabelen binnen een for
lus
"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 for
lus ." Meestal for
heeft een lus een counter
variabele 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 for
lus alleen zichtbaar in de body van de lus en in de kop van de for
lus ."
"Goed gedaan, Amigo. Maar toch, kijk eens naar een voorbeeld om dit materiaal te versterken:
Code | Variabele zichtbaarheid |
---|---|
|
|
"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 |
---|---|
|
|
GO TO FULL VERSION