Teória 8: Inicializácia objektov, konštruktory¶
Proces vytvárania objektu¶
Priame vytvorenie objektu sa realizuje vždy pomocou operátora new. Ak aj máme nejakú továrenskú metódu, ktorá nám vracia nový objekt, vnútri továrenskej metódy je niekde ukryté vytvorenie objektu pomocou new. Vytváranie objektu sa skladá z dvoch častí:
- Alokácia pamäti pre objekt
- Inicializácia objektu
Alokáciu pamäti má na starosti JVM a nemusíme sa o to starať. Inicializácia je však niečo, čo vieme ovplyvniť.
Inicializácia objektu¶
Cieľom inicilizácie objektu je nastaviť všetky jeho atribúty na správne hodnoty. Inicializácia sa vykoná vždy pri vytváraní nového objektu pomocou operátora new. Inicializáciu môžeme previesť rôznymi spôsobmi.
Priama inicializácia atribútov¶
Inicializačný blok¶
public class Rat {
private int health;
private double damage;
// inštančný inicializátor
{
health = 100;
damage = 0.5;
}
public int getHealth() {
return health;
}
public double getDamage() {
return damage;
}
}
// použitie
Rat potkan = new Rat();
assert potkan.getHealth() == 100 : "Mlady potkan ma mat zdravie 100";
assert potkan.getDamage() > 0 : "Potkan má nenulový damage";
Konštruktor¶
Ako posledný krok inicializácie sa zavolá konštruktor triedy. Konštruktor je špeciálna metóda, ktorá nemá návratový typ a má rovnaký názov ako jeho trieda.
public class Rat {
private int health;
private double damage;
// konštruktor
public Rat() {
health = 100;
damage = 0.5;
}
public int getHealth() {
return health;
}
public double getDamage() {
return damage;
}
}
// použitie
Rat potkan = new Rat();
assert potkan.getHealth() == 100 : "Mlady potkan ma mat zdravie 100";
assert potkan.getDamage() > 0 : "Potkan má nenulový damage";
Konštruktor sa zavolá vždy. Konštruktorov môžeme mať viac, vyberie a zavolá sa ten, ktorý sa najlepšie hodí argumentom, ktoré boli uvedené pri volaní operátora new.
V triede nemusíme mať napísaný žiaden konštruktor. Ak v kóde triedy nie je žiaden konštruktor, Java automaticky vytvorí konštruktor bez parametrov.
Pravidlá inicializácie¶
Ak nejaký z atribútov triedy neinicializujeme, Java ho inicializuje automaticky na defaultnú hodnotu 0, false alebo null, podľa toho o aký typ atribútu ide. Inicializácia atribútu v kóde teda nie je povinná a nemusíme ju tam mať uvedenú.
Čo sa stane, ak máme v triede viacero druhov inicializácie? Pri vytváraní objektu sa postupne vykonajú všetky dostupné inicializácie v tomto poradí:
- Ako prvá sa vykoná priama inicializácia atribútov
- Následne sa vykonajú všetky inicializačné bloky, v poradí, v akom sú v kóde triedy napísané
- Zavolá sa konštruktor a vykoná sa jeho kód. O tom, ktorý konštruktor sa zavolá rozhodujú argumenty, ktoré volajúci zadal pri volaní operátora
new
Konštruktory¶
public class Rat {
private int health;
private double damage;
// defaultný konštruktor
public Rat() {
health = 100;
damage = 0.5;
}
// kopírovací konštruktor
public Rat(Rat other) {
health = other.health;
damage = other.damage;
}
// parametrizovaný konštruktor
public Rat(double damage) {
health = 100;
this.damage = damage;
}
public int getHealth() {
return health;
}
public double getDamage() {
return damage;
}
}
// použitie
Rat potkan1 = new Rat();
Rat potkan2 = new Rat(2);
Rat potkan3 = new Rat(potkan2);
Modifikátory prístupu¶
Statická inicializácia¶
Podobne ako môže mať trieda statické metódy, tak môže mať aj statické atribúty triedy. Používajú sa väčšinou pre definovanie konštánt, napr. trieda
Integer má statický atribút Integer.MAX_VALUE
Statické atribúty vieme inicializovať podobne ako aj klasické. Je tu však veľký rozdiel, a to ten, že statické atribúty sa inicializujú iba jeden krát a to pri prvom použití triedy. Statické atribúty vieme inicializovať dvoma spôsobmi.
Priama inicializícia statických atribútov¶
Podobne ako klasické atribúty, aj statické atribúty vieme inicializovať pri ich delkarácii.
Statický inicializačný blok¶
Zhrnutie teórie¶
- Proces vytvárania objektu
- Nový objekt vytváram pomocou operátora
new - Alokácia pamäti
- Inicializácia objektu
- Nový objekt vytváram pomocou operátora
- Inicializácia objektu, v nasledovnom poradí
- Priama inicializácia atribútov (pri ich deklarácii)
- Inicializačný blok (môžem ich mať viac) - inštančný inicializátor
- Konštruktor, volá sa vždy. (Ak trieda konštruktor nemá, vytvorí sa automaticky)
- Ak atribút nie je inicializovaný, inicializuje sa automaticky na
0,nullalebofalse
- Konštruktor
- Konštruktor je špeciálna metóda, ktorá nemá návratový typ a má rovnaký názov ako jeho trieda
- Defaultný konštruktor (nulárny konštruktor) - nemá žiadne argumenty
- Kopírovací konštruktor - má jeden argument, typu svojej triedy
- Parametrizovaný konštrutor - má jeden alebo viac argumentov
- Ak v kóde triedy nemáme napísaný žiaden konštruktor, Java automaticky vygeneruje defaultný konštruktor
- Konštruktor má modifikátor prístupu. Ak je
private, vytvorenie objektu musí prebehnúť vnútri továrenskej metódy
- Statická inicializácia triedy, v nasledovnom poradí
- Priama inicializácia statických atribútov
- Statický inicializačný blok (môžem ich mať viac) - statický inicializátor
- Statická inicializácia inicializuje statické atribúty, jeden krát, pri prvom použití triedy.
Poznámky do zošita
V zošite je potrebné mať napísané aspoň tieto poznámky:
VYTVÁRANIE OBJEKTU
Objekt vytváram pomocou operátora new, ktorý vykoná:
1. Alokáciu pamäte
2. Inicializáciu objektu
Inicializácia objektu sa vykoná v tomto poradí:
1. Priama inicializácia atribútov
2. Inicializačný blok - inštančný inicializátor
3. Konštruktor, podľa toho aké argumenty má new
Ak nie je atribút inicializovaný, Java ho inicializuje automaticky na 0, null alebo false
Konštruktor je špeciálna metóda, ktorá nemá návratový typ a má rovnaký názov ako jeho trieda
Defaultný konštruktor (nulárny konštruktor) - bez argumentov
Kopírovací konštruktor - má jeden argument, typu svojej triedy
Parametrizovaný konštrutor - má jeden alebo viac argumentov
Ak v kóde triedy nemáme napísaný žiaden konštruktor, vytvorí sa automaticky defaultný konštruktor
Konštruktor má modifikátor prístupu. Ak je private, musíme mať továrenskú metódu
Statická inicializácia triedy - inicializuje statické atribúty, v tomto poradí:
1. Priama inicializácia statických atribútov
2. Statický inicializačný blok
Statická inicializácia sa vykoná jeden krát, pri prvom použití triedy.
Skúšanie a kontrola vedomostí
Na ďalšej hodine budeme kontrolovať nasledovné veci:
- Zapísané poznámky z hodiny vo vašom zošite
Okruhy otázok na test:
- Proces vytvárania objektu
- Aké druhy inicializácie objektu poznáme
- Poradie, v akom sa inicializácia vykonáva
- Čo je konštruktor
- Druhy konštruktorov
- Statický inicializátor, aké druhy poznáme
- Kedy sa vykoná inštančný inicializátor a kedy statický