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 Pieller 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: . finalAtt 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 , finalså 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 finalvariabel, kommer ditt program helt enkelt inte att kompilera."

"Vad händer om du deklarerar en finalvariabel 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 finalvariabel 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 finalför mer än att bara deklarera konstanter. finalkan också tillämpas på metoder och till och med klasser. Metoder som deklareras som finalkan inte åsidosättas, och en klass förklaras som finalinte 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å, finalkan sättas före variabler, klasser och metoder, och detta nyckelord gör dem oföränderliga i någon mening?"

"Ja. Dessutom finalkan 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: finalinnan 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:

final int[] data = {1, 2, 3, 4, 5, 6};

data = {6, 7, 8, 9};

data[0] = 0;
data[1] = 0;
data[2] = 0;
Vi skapar en array.

Detta är inte tillåtet: variabeln datadeklareras 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 publicoch 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
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

"I addmetoden deklarerade vi en lokal variabel som heter . sumFram 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 thisnamn :

this.name

"Här är ett exempel där namnkonflikten har lösts:

Koda Variabel sikt
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

Variablerna countoch sumär tillgängliga överallt med eller utan thisnyckelordet. På rader där den sumlokala variabeln skuggar suminstansvariabeln sumkan instansvariabeln endast nås med thisnyckelordet.

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

"Var uppmärksam: du kan komma åt de statiska variablerna countoch sumöverallt med eller utan att använda klassnamnet Solutionsom ett prefix. På de rader där den sumlokala variabeln skuggar suminstansvariabeln sumär åtkomst till klassvariabeln endast möjlig när den används Solutionsom prefix.

Variabler inuti en forslinga

"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 forloop ." Vanligtvis forhar en loop en countervariabel 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 forloop 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
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

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