Konstanter
"Amigo, visste du att i Java kan inte alla variabler ändras?"
"Hur är det, Kim? Själva ordet "variabel" talar faktiskt om förändring."
"Det råder ingen tvekan om det. Precis som många andra programmeringsspråk har Java konstanter , det vill säga variabler vars värden inte kan ändras. Och själva ordet 'konstant' talar om beständighet."
"Och vad är de till för?"
"Vanligtvis används de för någon form av grundläggande sak som antalet Pi
eller antalet dagar under årets månader. Som sagt, i princip kan en programmerare göra vilken variabel som helst till en konstant, om han eller hon bestämmer sig för att göra så är nödvändigt."
"Du menar som ett namn, färg på en bil eller namn på en dag i veckan?"
"Du har rätt idé. Allt som inte bör ändras."
"Och hur ser dessa konstanter ut i Java?"
"Java har ett speciellt nyckelord för dem: . final
Att skapa en oföränderlig variabel ser ut på samma sätt som att skapa en vanlig. Den enda skillnaden är att innan variabelns typ måste du skriva ordet , final
så här:
final Type name = value;
"Vad händer om du skapar en konstant och sedan försöker tilldela den ett annat värde?"
"Det är rätt fråga att ställa! Och det rätta svaret är detta: om du försöker tilldela ett annat värde till en final
variabel, kommer ditt program helt enkelt inte att kompilera."
"Vad händer om du deklarerar en final
variabel men inte tilldelar den ett värde?"
"Det är ingen mening att göra detta, så det är inte heller tillåtet i Java. En final
variabel måste initieras när den deklareras, det vill säga du måste tilldela den ett värde. Det finns ett undantag från denna regel: du kan flytta initiering av en statisk klassvariabel till en konstruktor. Men du kommer att lära dig om det senare.
"Som sagt, inte allt som är final
är en konstant. För att minska antalet nyckelord använder Java-utvecklare ordet final
för mer än att bara deklarera konstanter. final
kan också tillämpas på metoder och till och med klasser. Metoder som deklareras som final
kan inte åsidosättas, och en klass förklaras som final
inte kan ärvas."
"Äh... Åsidosatt? Ärvt? Vilket språk pratar du nu?"
"Språket för objektorienterad programmering. Du kommer till det mycket snart. Tills dess är det bara att njuta av den vackra terminologin."
"Okej. Så, final
kan sättas före variabler, klasser och metoder, och detta nyckelord gör dem oföränderliga i någon mening?"
"Ja. Dessutom final
kan modifieraren läggas till före alla variabler: lokala variabler, metodparametrar, klassfält och statiska klassvariabler.
"Här är det viktiga att komma ihåg: final
innan ett variabelnamn är bara skydd mot alla ändringar av den variabeln . Om en variabel lagrar en referens till ett objekt kan objektet fortfarande ändras."
"Jag förstår inte riktigt."
"Du kommer att förstå snart. Här är ett exempel:
|
Vi skapar en array. Detta är inte tillåtet: variabeln data deklareras som final . Men du kan göra det här. Och även detta. |
"Förstår. Det är knepigt."
Globala konstanter
"Vad tror du globala konstanter är?"
"Jag antar att globala konstanter förmodligen är som globala variabler, bara konstanter?"
"Exakt. Om du behöver deklarera globala konstanter i ditt program, skapa statiska klassvariabler , och gör dem public
och final
. Det finns en speciell stil för namnen på sådana variabler: de skrivs med stora bokstäver, med ett understreck som används för att separata ord.
Exempel:
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 skuggning
"Som jag sa tidigare kan du inte skapa flera lokala variabler med samma namn i en enda metod. I olika metoder kan du."
"Jag vet det!"
"Men vad du förmodligen inte vet är att variabler i en klass och lokala variabler i en metod mycket väl kan ha samma namn.
Exempel:
Koda | Variabel sikt |
---|---|
|
|
"I add
metoden deklarerade vi en lokal variabel som heter . sum
Fram till slutet av metoden skuggar (eller maskerar ) instansvariabeln sum
."
"Hmm... jag skulle säga att i någon mening är detta det förväntade beteendet."
"Men det är inte slutet på historien. Det visar sig att om en instansvariabel skuggas av en lokal variabel så finns det fortfarande ett sätt att hänvisa till instansvariabeln i metoden. Det gör vi genom att skriva nyckelordet före dess this
namn :
this.name
"Här är ett exempel där namnkonflikten har lösts:
Koda | Variabel sikt |
---|---|
|
|
Variablerna count
och sum
är tillgängliga överallt med eller utan this
nyckelordet. På rader där den sum
lokala variabeln skuggar sum
instansvariabeln sum
kan instansvariabeln endast nås med this
nyckelordet.
"Självklart måste jag träna på det här."
"Du klarar dig."
"Vad händer om en statisk klassvariabel är skuggad snarare än bara en (icke-statisk) instansvariabel? Du kan inte komma åt den via ? this
"
"Det har du rätt. Det här nyckelordet fungerar inte. Du måste referera till det genom klassnamnet:
ClassName.name
Exempel:
Koda | Variabel sikt |
---|---|
|
|
"Var uppmärksam: du kan komma åt de statiska variablerna count
och sum
överallt med eller utan att använda klassnamnet Solution
som ett prefix. På de rader där den sum
lokala variabeln skuggar sum
instansvariabeln sum
är åtkomst till klassvariabeln endast möjlig när den används Solution
som prefix.
Variabler inuti en for
slinga
"Och ytterligare ett litet men intressant faktum. Det finns också en plats där en variabel deklareras på ett speciellt sätt - jag pratar om inuti en for
loop ." Vanligtvis for
har en loop en counter
variabel inom parentes. Och vad blir synligheten för denna variabel? Det är trots allt inte i slingans kropp. Är det hela metoden? Eller inte?"
"Jag har redan hört något om det här. Som jag förstår det är en variabel som deklareras i huvudet på en for
loop endast synlig i slingans huvuddel och i slingans huvudfor
."
"Bra gjort, Amigo. Men ta en titt på ett exempel för att förstärka detta material:
Koda | Variabel sikt |
---|---|
|
|
"Så du säger att jag i min kod skulle kunna skriva flera loopar efter varandra med en räknarvariabel med samma namn, och det blir inga problem?"
"Det skulle inte vara några problem. Titta här:
Koda | Variabel sikt |
---|---|
|
|
GO TO FULL VERSION