Obsah tretej lekcie:
- Definovanie tried
- Premenné v definícii triedy
- Metódy v definícii triedy
- Prístup k členom triedy
- Úloha č. 3
Definovanie tried
Triedu definujeme (čiže určíme jej obsah a význam) pred vytváraním objektu. Je to vlastne vzor, podľa ktorého budeme vytvárať objekty. Telo triedy je umiestnené medzi dvomi zloženými zátvorkami:
public class Bicykel {
}
Do definície triedy dávame:
- Premenné (angl. variables a v Jave sa označujú aj ako fields) – pomenované kúsky pamäte, ktoré slúžia na uloženie nejakej informácie alebo dátovej položky.
- Metódy (angl. methods) – funkcie definované v triede, ktoré vykonávajú operácie pre triedu. Metódy väčšinou pracujú s premennými.
public class Bicykel {
// premenna
private int rychlost;
// metoda
public int zistiRychlost() {
return rychlost;
}
// metoda
public void nastavRychlost(int novaRychlost) {
rychlost = novaRychlost;
}
}
Premenné v definícii triedy
Objekt vytvorený z triedy (objekt môžeme nazvať aj ako inštanciu triedy) obsahuje všetky premenné, ktoré sú súčasťou definície danej triedy. Tieto premenné sa rozdeľujú na dva druhy:
Inštančné premenné (angl. instance variables) – každý objekt vytvorený z danej triedy bude mať svoju vlastnú kópiu každej inštančnej premennej, ktoré boli uvedené v definícii vzorovej triedy. Objekt je jedným výskytom (inštanciou) triedy a hodnoty premenných, ktoré sú v ňom uložené sa odlišujú od ostatných hodnôt premenných objektov vytvorených z tej istej triedy. Inštančná premenná je v triede deklarovaná normálnym spôsobom:
private int rychlost;
Statické premenné (angl. static variables) – všetky objekty vytvorené zo vzorovej triedy budú túto premennú a jej hodnotu spoločne zdielať. Na rozdiel od inštančných premenných, kde zmena hodnoty pre jeden objekt nemá vplyv na hodnoty iných objektov, je hodnota statickej premennej dostupná v nezmenenej podobe vo všetkých objektoch vzorovej triedy. Takáto premenná musí byť v triede deklarovaná s kľúčovým slovom static:
private static int maximalnaRychlost;
Keď v triede definujeme nejaké premenné, tak im nemusíme priradiť žiadnu hodnotu (viď príklad hore, vtedy sa im priradí implicitná hodnota) alebo ich inicializujeme sami na nejakú hodnotu:
private static int maximalnaRychlost = 130;
Metódy v definícii triedy
Metódy definované v triede predstavujú vlastnosti, správanie alebo akcie, ktoré môžu byť vykonávané s premennými budúceho objektu. Tak isto ako u premenných, aj metódy sú rozdelené na inštančné
public int zistiRychlost() {
return rychlost;
}
a statické
public static int zistiMaximalnuRychlost() {
return maximalnaRychlost;
}
s tým istým významom. Každá metóda musí mať určený typ návratovej hodnoty a poprípade zoznam parametrov, ktore prijíma na spracovanie.
Prístup k členom triedy
K členom triedy, čiže k premenným alebo metódam, sa pristupuje po vytvorení objektu pomocou operátoru „.“ (bodka). Po vytvorení objektu napr. z triedy Bicykel
Bicykel mojBicykel = new Bicykel();
môžeme pristúpiť k jeho celočíselnej premennej rýchlosť a zmeniť jej hodnotu.
mojBicykel.rychlost = 5;
V zásade by sa nemalo pristupovať priamo k premenným objektu, tak ako je to vidno na vyššie uvedenom zdrojáku, lebo sa tým narúša integrita zapúzdrenia dát. Preto sa tento problém rieši pomocou geterov (od angl. get – získa hodnotu premennej) a seterov (od angl. set – nastaví hodnotu premennej):
// metoda pre ziskanie hodnoty premennej (geter)
public int zistiRychlost() {
return rychlost;
}
// metoda pre nastavenie hodnoty premennej (seter)
public void nastavRychlost(int novaRychlost) {
rychlost = novaRychlost;
}
...
mojBicykel.nastavRychlost(5);
System.out.println(mojBicykel.zistiRychlost());
To, ako sú členy triedy alebo jej objektu prístupné napr. iným triedam, určujú prístupové kľúčové slová.
Kľúčové slovo určujúce prístup | Povolený prístup |
žiadne | z metód hociktorej triedy toho istého balíku* |
public | z metód v hociktorej triede, hocikde |
private | iba z metódy vo vnútri danej triedy (zvonku žiadny prístup) |
protected | z metód v hociktorej triede toho istého balíku* a z hociktorej podtriedy |
* – Tomu, čo sú to balíky a načo slúžia, sa budem venovať neskôr.
Príklad
Trieda Zakaznik
// trieda Zakaznik a jej definicia
public class Zakaznik {
// PREMENNE:
/*
* instancna premenna pre ulozenie hodnoty
* hotovosti zakaznika (klucove slovo
* pristupu - protected)
*/
protected int hotovost;
// METODY:
/*
* - zisti hodnotu premennej "hotovost";
* - navratova hodnota je typu int, lebo vracia
* celocislenu hodnotu premennej "hotovost"
*/
public int zistiHotovost() {
return hotovost;
}
/*
* - nastavi hodnotu premennej "hotovost";
* - navratova hodnota je typu void (prazdna), lebo
* metoda nevracia ziadnu hodnotu;
* - tato metoda prijima ako parameter premennu
* "novaHotovost", ktorou sa nastavi premenna
* "hotovost" na jej hodnotu
*/
public void nastavHotovost(int novaHotovost) {
hotovost = novaHotovost;
}
}
Trieda Banka
// trieda Banka a jej definicia
public class Banka {
// PREMENNE:
/*
* staticka premenna urcujuca maximalnu
* vysku vkladu (klucove slovo pristupu
* - public); tato premenna je inicializovana
* na urcitu hodnotu (v nasom pripade 70000)
*/
public static int maxVyskaVkladu = 70000;
/*
* instancna premenna pre ulozenie hodnoty
* vysky vkladu zakaznika (klucove slovo
* pristupu - private)
*/
private int vkladZakaznika;
// METODY:
/*
* - zisti hodnotu premennej "vkladZakaznika";
* - navratova hodnota je typu int, lebo vracia
* celocislenu hodnotu premennej "vkladZakaznika"
*/
public int zistiVkladZakaznika() {
return vkladZakaznika;
}
/*
* - nastavi hodnotu premennej "vkladZakaznika";
* - navratova hodnota je typu void (prazdna), lebo
* metoda nevracia ziadnu hodnotu;
* - tato metoda prijima ako parameter premennu
* "novyVkladZakaznika", ktorou sa nastavi premenna
* "vkladZakaznika" na jej hodnotu
*/
public void nastavVkladZakaznika(int novyVkladZakaznika) {
vkladZakaznika = novyVkladZakaznika;
}
}
Trieda Test
// trieda Test a jej definicia
public class Test {
// PREMENNE:
// METODY:
/*
* hlavna staticka metoda obsahujuca zdrojovy kod, podla
* ktoreho sa bude program vykonavat
*/
public static void main(String[] args) {
/*
* novy objekt "mojaBanka" vytvoreny na zaklade
* vzoru triedy "Banka"
*/
Banka mojaBanka = new Banka();
/*
* novy objekt "mojZakaznik" vytvoreny na zaklade
* vzoru triedy "Zakaznik"
*/
Zakaznik mojZakaznik = new Zakaznik();
// nastavime vysku hotovosti mojhoZakaznika
mojZakaznik.nastavHotovost(50000);
/*
* novy objekt "mojDruhyZakaznik" vytvoreny na zaklade
* vzoru triedy "Zakaznik"
*/
Zakaznik mojDruhyZakaznik = new Zakaznik();
// nastavime vysku hotovosti druheho zakaznika
mojDruhyZakaznik.nastavHotovost(20000);
// vypis hodnot hotovosti zakaznikov; vsimnite si, ze hodnoty
// instantnych premennych su odlisne
System.out.println("1. Hotovost prveho zakaznika v jeho penazenke: "
+ mojZakaznik.zistiHotovost());
System.out.println("2. Hotovost druheho zakaznika v jeho penazenke: "
+ mojDruhyZakaznik.zistiHotovost());
// nastavenie vkladu zakaznika do banky pomocou toho, ze
// ako parameter metody "nastavVkladZakaznika" (objekt mojaBanka)
// sa prijima hodnota cez metodu zistiHotovost (objekt mojZakaznik)
mojaBanka.nastavVkladZakaznika(mojZakaznik.zistiHotovost());
// vypis vysky vkladu zakaznika v banke
System.out.println("3. Vklad prveho zakaznika v banke: "
+ mojaBanka.zistiVkladZakaznika());
// vypis maximalnej moznej vysky vkladu v banke
System.out.println("4. Maximalna mozna vyska vkladu v prvej banke: "
+ mojaBanka.maxVyskaVkladu);
/*
* novy objekt "mojaDruhaBanka" vytvoreny na zaklade
* vzoru triedy "Banka"
*/
Banka mojaDruhaBanka = new Banka();
// vypis maximalnej moznej vysky vkladu v druhej banke
System.out.println("5. Maximalna mozna vyska vkladu v druhej banke: "
+ mojaDruhaBanka.maxVyskaVkladu);
// urcenie novej hodnoty pre staticku premennu a jej vypis; vsimnite si,
// ze jej hodnota sa zmeni aj v druhej banke
mojaBanka.maxVyskaVkladu = 75000;
System.out.println("6. Maximalna mozna vyska vkladu v prvej banke: "
+ mojaBanka.maxVyskaVkladu);
System.out.println("7. Maximalna mozna vyska vkladu v druhej banke: "
+ mojaDruhaBanka.maxVyskaVkladu);
}
}
Úloha č. 3
Spusťte uvedený príklad a zmeňte ho tak, aby testoval, či výška vkladu zákazníka vyhovuje maximálnej možnej výške vkladu do banky, a spravte pre statickú premennú metódy na získanie a nastavenie jej hodnoty.