Konstanter
"Amigo, visste du at i Java kan ikke alle variabler endres?"
"Hvordan er det, Kim? Faktisk, selve ordet "variabel" snakker om endring."
"Det er ingen tvil om det. Som mange andre programmeringsspråk har Java konstanter , det vil si variabler hvis verdier ikke kan endres . Og selve ordet "konstant" snakker om konstanthet."
"Og hva er de for?"
"Vanligvis brukes de til en slags grunnleggende ting som antall Pi
eller antall dager i månedene av året. Når det er sagt, i prinsippet kan en programmerer gjøre enhver variabel til en konstant, hvis han eller hun bestemmer seg for å gjøre så er nødvendig."
"Du mener som et navn, farge på en bil eller navn på en ukedag?"
"Du har den rette ideen. Alt som ikke bør endres."
"Og hvordan ser disse konstantene ut i Java?"
"Java har et spesielt nøkkelord for dem: final
. Å lage en uforanderlig variabel ser ut på samme måte som å lage en vanlig. Den eneste forskjellen er at før variabelens type må du skrive ordet final
, slik:
final Type name = value;
"Hva skjer hvis du lager en konstant og deretter prøver å tildele den en annen verdi?"
"Det er det riktige spørsmålet å stille! Og det riktige svaret er dette: Hvis du prøver å tilordne en annen verdi til en final
variabel, vil programmet ganske enkelt ikke kompilere."
"Hva om du erklærer en final
variabel, men ikke tildeler en verdi til den?"
"Det er ingen vits i å gjøre dette, så det er heller ikke tillatt i Java. En final
variabel må initialiseres når den er deklarert, det vil si at du må tilordne en verdi til den. Det er ett unntak fra denne regelen: du kan flytte initialisering av en statisk klassevariabel inn i en konstruktør. Men du vil lære om det senere.
"Når det er sagt, er ikke alt som er final
en konstant. For å redusere antall nøkkelord bruker Java-utviklere ordet final
til mer enn bare å deklarere konstanter. final
kan også gjelde for metoder og til og med klasser. Metoder som er erklært som final
kan ikke overstyres, og en klasse erklært som final
ikke kan arves."
"Øh... Overstyrt? Nedarvet? Hvilket språk snakker du nå?"
"Språket til objektorientert programmering. Du kommer til det veldig snart. Inntil da, bare nyt den vakre terminologien."
"Ok. Så, final
kan settes foran variabler, klasser og metoder, og dette nøkkelordet gjør dem uforanderlige på en eller annen måte?"
"Ja. Videre final
kan modifikatoren legges til før alle variabler: lokale variabler, metodeparametere, klassefelt og statiske klassevariabler.
"Her er det viktige å huske: final
før et variabelnavn er bare beskyttelse mot eventuelle endringer i den variabelen . Hvis en variabel lagrer en referanse til et objekt, kan objektet fortsatt endres."
— Jeg forstår ikke helt.
"Du vil forstå veldig snart. Her er et eksempel:
|
Vi lager en array. Dette er ikke tillatt: variabelen data er deklarert som final . Men du kan gjøre dette. Og også dette. |
"Skjønner det. Det er vanskelig."
Globale konstanter
"Hva tror du globale konstanter er?"
"Jeg antar at globale konstanter sannsynligvis er som globale variabler, bare konstanter?"
"Akkurat. Hvis du trenger å deklarere globale konstanter i programmet ditt, lag statiske klassevariabler , og lag dem public
og final
. Det er en spesiell stil for navnene på slike variabler: de er skrevet med store bokstaver, med et understrekingstegn som brukes til å 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 skyggelegging
"Som jeg sa før, kan du ikke lage flere lokale variabler med de samme navnene i en enkelt metode. I forskjellige metoder kan du."
"Jeg vet det!"
"Men det du sannsynligvis ikke vet er at variabler i en klasse og lokale variabler i en metode godt kan ha samme navn.
Eksempel:
Kode | Variabel synlighet |
---|---|
|
|
"I add
metoden erklærte vi en lokal variabel kalt sum
. Inntil slutten av metoden skygger (eller maskerer ) sum
instansvariabelen."
"Hmm... jeg vil på en måte si at dette er forventet oppførsel."
"Men det er ikke slutten på historien. Det viser seg at hvis en forekomstvariabel er skyggelagt av en lokal variabel, er det fortsatt en måte å referere til forekomstvariabelen i metoden. Dette gjør vi ved å skrive nøkkelordet før this
navnet :
this.name
"Her er et eksempel hvor navnekonflikten er løst:
Kode | Variabel synlighet |
---|---|
|
|
Variablene count
og sum
er tilgjengelige overalt med eller uten nøkkelordet this
. På linjer der den sum
lokale variabelen skygger for sum
forekomstvariabelen, sum
kan forekomstvariabelen bare nås ved å bruke this
nøkkelordet.
"Det er klart, jeg må øve på dette."
"Du klarer deg."
"Hva om en statisk klassevariabel er skyggelagt i stedet for bare en (ikke-statisk) forekomstvariabel? Du får ikke tilgang til den gjennom this
?"
"Helt riktig. Dette nøkkelordet vil ikke fungere. Du må referere til det gjennom klassenavnet:
ClassName.name
Eksempel:
Kode | Variabel synlighet |
---|---|
|
|
"Vær oppmerksom: du kan få tilgang til count
og sum
statiske variabler overalt med eller uten å bruke klassenavnet Solution
som et prefiks. På de linjene der den sum
lokale variabelen skygger for sum
instansvariabelen, sum
er tilgang til klassevariabelen bare mulig når den brukes Solution
som et prefiks.
Variabler inne i en for
loop
"Og enda et lite, men interessant faktum. Det er også et sted hvor en variabel er deklarert på en spesiell måte - jeg snakker om inne i en for
loop ." Vanligvis for
har en løkke en counter
variabel i parentes. Og hva blir synligheten til denne variabelen? Tross alt er det ikke i løkkens kropp. Er det hele metoden? Eller ikke?"
"Jeg har allerede hørt noe om dette. Slik jeg forstår det, er en variabel deklarert i overskriften til en for
løkke kun synlig i løkkens hoveddel og i løkkens overskriftfor
."
"Godt gjort, Amigo. Men ta en titt på et eksempel for å forsterke dette materialet:
Kode | Variabel synlighet |
---|---|
|
|
"Så du sier at jeg i koden min kunne skrive flere løkker etter hverandre med en tellervariabel med samme navn, og det vil ikke være noen problemer?"
"Det ville ikke være noen problemer. Her, se:
Kode | Variabel synlighet |
---|---|
|
|
GO TO FULL VERSION