V této kapitole si řekneme něco o referenci
this, statických atributech a konstantách.
Referenci this můžeme použít
v konstruktorech a instančních metodách. Odkazuje na instanci, s níž
v daném okamžiku pracujeme. Pomocí this
lze aktuální instanci předat jako parametr při volání metody nebo
konstruktoru.
class Bod {
int x, y;
Bod( Bod b ) {
x = b.x;
y = b.y;
}
Bod vytvorKopii() {
return new Bod( this );
}
}
Metoda vytvorKopii() vytvoří identickou
kopii daného objektu.
Bod p1 = new Bod( 10, 20 );
Bod p2 = p1.vytvorKopii();
V bodě 2 reference this odkazuje na
objekt, od něhož jsme zavolali metodu
nastav. Referenci
this používáme také pro přístup
k atributu, který se jmenuje stejně jako lokální proměnná. Je např.
běžné, že parametry konstruktoru se jmenují stejně jako atributy,
které chceme těmito parametry inicializovat.
class Bod {
int x, y;
Bod( int x, int y ) {
this.x = x;
this.y = y;
}
void nastavX( int x ) {
this.x = x;
}
void nastavY( int y ) {
this.y = y;
}
}
Kromě instančních atributů je možné ve třídě deklarovat
statické (třídní) atributy.
Deklarují se pomocí klíčového slova static
a na rozdíl od instančních atributů existují v paměti vždy pouze
jednou. Jsou nezávislé na instancích dané třídy.
class Auto {
static int maxId;
}
Ke statickým atributům přistupujeme pomocí jména třídy.
Paměť je statickým atributům přidělena bezprostředně po natažení
třídy do paměti. Natažení třídy do paměti se provede těsně před
jejím prvním použitím. Statické atributy jsou stejně jako instanční
atributy automaticky inicializovány nulovými hodnotami.
K inicializaci jinými hodnotami můžeme použít inicializátory.
Statický atribut může sloužit např. pro počítání počtu instancí
dané třídy. (V tomto příkladě předpokládáme, že počet vytvořených
instancí nebude větší než maximální hodnota typu
long).
class Osoba {
static long citac; // na začátku automaticky 0
Osoba() {
// ve třídě Osoba můžeme místo Osoba.citac psát jen citac
citac++; // při každém provedení konstruktoru zvýšíme čítač
}
}
Statické atributy lze inicializovat inicializátorem.
class Osoba {
static int dalsiId = 100;
}
Pro náročnější inicializaci statických atributů lze použít
statický inicializátor, což je blok,
který se provede bezprostředně po nahrání třídy do paměti.
class Osoba {
static int dalsiId;
static { // statický inicializátor
dalsiId = 100;
}
}
Statický inicializátor se hodí např. pokud chceme inicializovat
statické atributy hodnotami ze souboru či databáze.
Deklarace konstant se provádí pomocí klíčového slova
final. Jména konstant píšeme velkými
písmeny. Pokud se jméno konstanty skládá z více slov, oddělujeme
slova podtržítkem.
class Kruznice {
static final double PI = 3.14159;
static final double MAX_POLOMER = 10;
}
Konstanty jsou v Javě proměnné, do nichž lze přiřadit pouze jednou.
Často jsou deklarovány jako statické. Pokud nejsou statické, pak
obvykle mají v každé instanci jinou hodnotu.
class Auto {
final int MAX_RYCHLOST;
Auto() {
MAX_RYCHLOST = (int) (Math.random() * 100 + 30);
}
}
Dvě konstanty z javovského API již známe:
Math.PI (Ludolfovo číslo,
π)
a Math.E (Eulerovo číslo).
Úloha 1
Doplňte tělo konstruktoru.
Úloha 2
Doplňte deklaraci třídy Auto tak,
aby každá instance této třídy měla v atributu
id unikátní hodnotu. Hodnoty začněte
přidělovat od 1.
Úloha 3
Určete, co se vytiskne.
Úloha 4
Doplňte deklaraci statické konstanty MAX
typu int. Její hodnotu nastavte na
maximální hodnotu v typu byte.
Úloha 5
Určete, co se vytiskne.
Úloha 6
Doplňte křížovku.
Otázky a odpovědi
Student:
Mistře, jak mám pojmenovávat třídy, atributy a metody? Mám
upřednostňovat jména delší a popisnější nebo jména kratší? Je
lepší pojmenovat atribut polomer nebo
r?
Java guru:
Jména tříd, atributů i metod vybírej tak, aby byl kód
srozumitelný. Přitom měj na paměti, že kód po tobě bude velmi
pravděpodobně někdo číst. Vhodně zvolené identifikátory mu to
mohou ulehčit. Identifikátory by měly být podle tzv. jmenné
konvence. Jmenná konvence říká,
jak mají vypadat jména tříd, atributů a metod:
Jména tříd začínají velkým písmenem. Pokud se jméno
třídy skládá z více slov, slova oddělujeme tak, že
první písmeno každého slova je velké.
Např. NakladniVuz.
Jména atributů a metod začínají malým písmenem. Pokud
se jméno skládá z více slov, první písmeno druhého
a dalších slov je velké. Např.
maxRychlost či
spoctiSpotrebuPaliva.
Jména konstant píšeme velkými písmeny. Je-li jméno
složeno z více slov, oddělujeme slova podtržítkem.
Např. MAX_RYCHLOST.
Pro lokální proměnné používáme často jednopísmenné
identifikátory. Např. i
a j jsou častými řídícími proměnnými
v cyklu for.