Konstanter
"Amigo, vidste du, at i Java ikke alle variabler kan ændres?"
"Hvordan er det, Kim? Selve ordet 'variabel' taler faktisk om forandring."
"Det er der ingen tvivl om. Som mange andre programmeringssprog har Java konstanter , det vil sige variabler, hvis værdier ikke kan ændres . Og selve ordet 'konstant' taler om konstanthed."
"Og hvad er de til?"
"Normalt bruges de til en slags grundlæggende ting såsom antallet Pi
eller antallet af dage i årets måneder. Når det er sagt, kan en programmør i princippet gøre enhver variabel til en konstant, hvis han eller hun beslutter, at så er det nødvendigt."
"Du mener som et navn, farve på en bil eller navn på en dag i ugen?"
"Du har den rigtige idé. Alt, hvad der ikke bør ændres."
"Og hvordan ser disse konstanter ud i Java?"
"Java har et særligt nøgleord til dem: final
. At skabe en uforanderlig variabel ser ud på samme måde som at skabe en almindelig. Den eneste forskel er, at før variablens type skal du skrive ordet final
, sådan her:
final Type name = value;
"Hvad sker der, hvis du opretter en konstant og derefter prøver at tildele den en anden værdi?"
"Det er det rigtige spørgsmål at stille! Og det rigtige svar er dette: Hvis du prøver at tildele en anden værdi til en final
variabel, så vil dit program simpelthen ikke kompilere."
"Hvad hvis du erklærer en final
variabel, men ikke tildeler en værdi til den?"
"Det nytter ikke at gøre dette, så det er heller ikke tilladt i Java. En final
variabel skal initialiseres, når den er deklareret, det vil sige, du skal tildele den en værdi. Der er en undtagelse fra denne regel: du kan flytte initialisering af en statisk klassevariabel ind i en konstruktør, men det lærer du ud af senere.
"Når det er sagt, er ikke alt, hvad der er final
en konstant. For at reducere antallet af søgeord, bruger Java-udviklere ordet final
til mere end blot at erklære konstanter. final
kan også gælde for metoder og endda klasser. Metoder erklæret som final
kan ikke tilsidesættes, og en klasse erklæret som final
ikke kan arves."
"Øh... Tilsidesat? Nedarvet? Hvilket sprog taler du nu?"
"Sproget i objektorienteret programmering. Du vil komme til det meget snart. Indtil da kan du bare nyde den smukke terminologi."
"Okay. Så final
kan det sættes før variabler, klasser og metoder, og dette nøgleord gør dem uforanderlige på en eller anden måde?"
"Ja. Desuden final
kan modifikatoren tilføjes før alle variabler: lokale variabler, metodeparametre, klassefelter og statiske klassevariabler.
"Her er det vigtige at huske: final
før et variabelnavn er kun beskyttelse mod enhver ændring af den variabel . Hvis en variabel gemmer en reference til et objekt, så kan objektet stadig ændres."
"Jeg forstår det ikke helt."
"Du vil snart forstå. Her er et eksempel:
|
Vi skaber et array. Dette er ikke tilladt: variablen data erklæres som final . Men du kan gøre dette. Og også dette. |
"Forstår det. Det er vanskeligt."
Globale konstanter
"Hvad tror du globale konstanter er?"
"Jeg gætter på, at globale konstanter sandsynligvis er som globale variabler, kun konstanter?"
"Nøjagtigt. Hvis du har brug for at erklære globale konstanter i dit program, skal du oprette statiske klassevariable , og lave dem public
og final
. Der er en speciel stil for navnene på sådanne variable: de er skrevet med store bogstaver, med et understregningstegn, der bruges til at 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 skygge
"Som jeg sagde før, kan du ikke oprette flere lokale variabler med de samme navne i en enkelt metode. I forskellige metoder kan du."
"Jeg ved det!"
"Men hvad du sandsynligvis ikke ved er, at variabler i en klasse og lokale variabler i en metode godt kan have samme navn.
Eksempel:
Kode | Variabel synlighed |
---|---|
|
|
"I add
metoden erklærede vi en lokal variabel ved navn sum
. Indtil slutningen af metoden skygger (eller maskerer ) sum
instansvariablen."
"Hmm... jeg vil sige, at dette i en vis forstand er den forventede adfærd."
"Men det er ikke slutningen på historien. Det viser sig, at hvis en instansvariabel skygges af en lokal variabel, er der stadig en måde at henvise til instansvariablen i metoden. Det gør vi ved at skrive nøgleordet før dets this
navn :
this.name
"Her er et eksempel, hvor navnekonflikten er løst:
Kode | Variabel synlighed |
---|---|
|
|
Variablerne count
og sum
er tilgængelige overalt med eller uden nøgleordet this
. På linjer, hvor den sum
lokale variabel skygger for sum
instansvariablen, sum
kan instansvariablen kun tilgås ved hjælp af this
nøgleordet.
"Det er klart, jeg bliver nødt til at øve mig på det her."
"Du klarer dig."
"Hvad hvis en statisk klassevariabel er skygget i stedet for blot en (ikke-statisk) instansvariabel? Du kan ikke få adgang til den via this
?"
"Det har du ret. Dette nøgleord virker ikke. Du skal henvise til det gennem klassenavnet:
ClassName.name
Eksempel:
Kode | Variabel synlighed |
---|---|
|
|
"Vær opmærksom: du kan få adgang til de statiske variabler count
og sum
overalt med eller uden brug af klassenavnet Solution
som præfiks. På de linjer, hvor den sum
lokale variabel skygger for sum
instansvariablen, sum
er adgang til klassevariablen kun mulig, når den bruges Solution
som præfiks.
Variabler inde i en for
løkke
"Og endnu et lille, men interessant faktum. Der er også et sted, hvor en variabel deklareres på en særlig måde - jeg taler om inde i en for
løkke ." Typisk for
har en loop en counter
variabel i parentes. Og hvad bliver synligheden af denne variabel? Det er jo ikke i løkkens krop. Er det hele metoden? Eller ikke?"
"Jeg har allerede hørt noget om dette. Som jeg forstår det, er en variabel , der er erklæret i overskriften på en for
løkke , kun synlig i løkkens brødtekst og i løkkens overskriftfor
."
"Godt gået, Amigo. Men kig alligevel på et eksempel for at forstærke dette materiale:
Kode | Variabel synlighed |
---|---|
|
|
"Så du siger, at jeg i min kode kunne skrive flere loops efter hinanden med en tællervariabel med samme navn, og der vil ikke være nogen problemer?"
"Der ville ikke være nogen problemer. Se her:
Kode | Variabel synlighed |
---|---|
|
|
GO TO FULL VERSION