Állandók
"Amigo, tudtad, hogy Java-ban nem lehet minden változót megváltoztatni?"
"Hogy van ez, Kim? Valóban, maga a "változó" szó a változásról beszél.
"Ehhez nincs kétség. Sok más programozási nyelvhez hasonlóan a Java-nak is vannak konstansai , vagyis olyan változói, amelyek értékeit nem lehet megváltoztatni . És maga a "konstans" szó is állandóságról beszél."
– És mire valók?
"Általában valamilyen alapvető dologra használják őket, mint például a Pi
napok száma vagy száma az év hónapjaiban. Elvileg a programozó bármilyen változót konstanssá tehet, ha úgy dönt, hogy ezt teszi. tehát szükséges."
– Úgy érted, mint egy név, egy autó színe vagy a hét egy napjának neve?
"Jó ötleted van. Bármit, amin nem szabad változtatni."
– És hogyan néznek ki ezek a konstansok a Java nyelven?
final
"A Java egy speciális kulcsszóval rendelkezik final
:
final Type name = value;
"Mi történik, ha létrehoz egy állandót, majd megpróbálja hozzárendelni egy másik értéket?"
"Ez a helyes kérdés, amit fel kell tenni! A helyes válasz pedig a következő: ha más értéket próbálsz hozzárendelni egy változóhoz final
, akkor a programod egyszerűen nem fog lefordítani."
"Mi van, ha deklarálsz egy final
változót, de nem adsz hozzá értéket?"
"Nincs értelme ezt csinálni, ezért Java-ban sem megengedett. A final
változót deklaráláskor inicializálni kell, vagyis értéket kell hozzá rendelni. Ez alól a szabály alól van egy kivétel: mozgathatod az inicializálást statikus osztályváltozót egy konstruktorba, de erről később megtudhatja.
"Egyébként nem minden, ami van final
, konstans. A kulcsszavak számának csökkentése érdekében a Java fejlesztők final
nem csak konstansok deklarálására használják ezt a szót. final
Metódusokra és akár osztályokra is vonatkozhatnak. A metódusok, amelyek deklaráltan final
nem bírálhatók felül, és egy osztály final
nem örökölhetőnek nyilvánították ."
"Ööö... Felülbírálva? Öröklött? Milyen nyelven beszélsz most?"
"Az objektum-orientált programozás nyelve. Hamarosan rá fog jönni. Addig csak élvezze a gyönyörű terminológiát."
"Rendben. Szóval final
lehet tenni a változók, osztályok és metódusok elé, és ez a kulcsszó bizonyos értelemben megváltoztathatatlanná teszi őket?"
"Igen. Ezenkívül a final
módosító bármely változó elé hozzáadható: helyi változók, metódusparaméterek, osztálymezők és statikus osztályváltozók.
"Itt van a fontos dolog, amit meg kell jegyezni: final
mielőtt a változónév csak védelmet jelent a változó bármilyen változása ellen . Ha egy változó egy objektumra való hivatkozást tárol, akkor az objektum továbbra is megváltoztatható."
– Nem egészen értem.
"Hamarosan meg fogod érteni. Íme egy példa:
|
Készítünk egy tömböt. Ez nem megengedett: a data változót final . De ezt megteheti. És ezt is. |
"Értem. Ez trükkös."
Globális állandók
– Mit gondol, mik a globális állandók?
"Azt hiszem, a globális konstansok valószínűleg olyanok, mint a globális változók, csak konstansok?"
"Pontosan. Ha globális konstansokat kell deklarálnia a programban, hozzon létre statikus osztályváltozókat , és tegye őket public
és final
. Az ilyen változók nevének egy speciális stílusa van: csupa nagybetűvel írják őket, aláhúzásjellel. külön szavakat.
Példák:
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;
}
Változó árnyékolás
"Ahogy korábban mondtam, nem hozhat létre több helyi változót ugyanazzal a névvel egyetlen metódusban. Különböző metódusokban igen."
"Tudom!"
"De valószínűleg nem tudod, hogy az osztály változóinak és a metódusban lévő helyi változóknak ugyanaz a neve.
Példa:
Kód | Változó láthatóság |
---|---|
|
|
"A metódusban add
deklaráltunk egy helyi változót, melynek neve sum
. A metódus végéig árnyékolja (vagy maszkolja ) a sum
példányváltozót."
– Hmm... azt mondanám, hogy bizonyos értelemben ez az elvárt viselkedés.
this
"De ezzel még nincs vége a történetnek. Kiderült, hogy ha egy példányváltozót egy lokális változó árnyékol, továbbra is van mód a példányváltozóra hivatkozni a metóduson belül. Ezt úgy tesszük, hogy a kulcsszót a neve elé írjuk :
this.name
"Íme egy példa, ahol a névütközés sikeresen feloldásra került:
Kód | Változó láthatóság |
---|---|
|
|
A count
és sum
változók mindenhol elérhetők kulcsszóval vagy anélkül this
. Azokon a sorokon, ahol a sum
helyi változó árnyékolja a sum
példányváltozót, a példányváltozó csak a kulcsszó sum
használatával érhető el .this
– Nyilvánvaló, hogy ezt gyakorolnom kell.
– Majd elintézel.
"Mi van akkor, ha egy statikus osztályváltozó árnyékolva van, nem csak egy (nem statikus) példányváltozó? Nem érheti el a következőn keresztül this
?"
"Igazad van. Ez a kulcsszó nem fog működni. Az osztálynéven keresztül kell hivatkoznod rá:
ClassName.name
Példa:
Kód | Változó láthatóság |
---|---|
|
|
count
"Figyelem: a és a statikus változókat mindenhol elérheti sum
az osztálynév Solution
előtagként való használatával vagy anélkül. Azokban a sorokban, ahol a sum
lokális változó beárnyékolja a sum
példányváltozót, az osztályváltozóhoz sum
csak Solution
előtagként való hozzáférés esetén van lehetőség.
Változók a for
cikluson belül
for
"És még egy apró, de érdekes tény. Van egy olyan hely is, ahol egy változót különleges módon deklarálnak – a cikluson belülről beszélek ." Általában egy for
ciklusban van egy counter
változó zárójelben. És mi lesz ennek a változónak a láthatósága? Végül is nem a hurok testében van. Ez az egész módszer? Vagy nem?"
for
"Már hallottam valamit erről. Ha jól értem, a ciklus fejlécében deklarált változó csak a ciklus törzsében és a ciklus fejlécébenfor
látható ."
"Jól van, Amigo. De azért nézz egy példát ennek az anyagnak a megerősítésére:
Kód | Változó láthatóság |
---|---|
|
|
"Tehát azt mondod, hogy a kódomban több ciklust is írhatnék egymás után egy azonos nevű számlálóváltozóval, és nem lesz probléma?"
"Nem lenne probléma. Nézze:
Kód | Változó láthatóság |
---|---|
|
|
GO TO FULL VERSION