200 likes | 295 Views
Dobré ráno s jazykom Java 8 ÚINF/PAZ1c. R óbert Novotný 22. 11. 2006. Hudobné nástroje z minulého dielu. public class HudobnýNástroj { void zahraj(int t ón ) { // tu sa nič nedeje } }. Zamyslime sa: HudobnýNástroj n = new HudobnýNástroj(); Má to význam?.
E N D
Dobré ráno s jazykom Java 8ÚINF/PAZ1c Róbert Novotný 22. 11. 2006 22. 11. 2006
Hudobné nástroje z minulého dielu public class HudobnýNástroj { void zahraj(int tón) { //tu sa nič nedeje } } • Zamyslime sa: HudobnýNástroj n = new HudobnýNástroj(); • Má to význam? 22. 11. 2006
Hudobné nástroje z minulého dielu HudobnýNástroj n = new HudobnýNástroj(); • Má význam dovoliť používateľovi vytvárať inštancie hudobných nástrojov? • náš úplne všeobecný hudobný nástroj, zovšeobecňujúci flauty, rohy... v skutočnosti nemôže existovať. Huh? Dobrý deň. Zabaľte mi jeden nástroj. 22. 11. 2006
Hudobné nástroje jednoducho neexistujú... • Riešenie: abstraktné triedy • abstraktné triedy reprezentujú abstraktné pojmy, či entity • ,,Divím sa, že sa divím, že sa divím..." • z abstraktnej triedy nemožno vytvárať inštancie public abstract class HudobnýNástroj { ... } Cannot instantiate type / Nemôžem vytvoriť inštanciu typu HudobnýNástroj n = new HudobnýNástroj(); 22. 11. 2006
Abstraktné triedy i metódy • Aj metódy môžu byť abstraktné • Abstraktná metóda = ,,ja nerobím nič, ale moji dedičia musia túto metódu prekryť (override)". public abstract class HudobnýNástroj { abstractvoid zahraj(int tón); } žiadne kučeravé zátvorky! • každý hudobný nástroj (flauta, trúba...) musí vedieť zahrať tón len hlavička s bodkočiarkou 22. 11. 2006
Abstraktné triedy i metódy • Pravidlo: ak sa v triede abstraktnú metódu, celá trieda musí byť abstraktná. • Príklad: • biológ: každý vták lieta • informatik: trieda Vták má abstraktnú metódu lietaj(). Trieda (Európska)Lastovička lieta tak, že 15krát za sekundu zamáva krídlami. public class Vták { abstract void lietaj(); } Vták f = new Vták(); f.lietaj(); Čo sa podľa vás má stať, vážení diváci? abstract class Vták! 22. 11. 2006
Načo je to dobré? • abstraktná trieda môže vo svojich metódach robiť mnoho vecí, ale niektoré druhy správania chce nechať na zodpovednosť dedičom • niektoré druhy správania chce vyžadovať od dedičov • používané ako doplnok k rozhraniam (interface-om) – o tom neskôr milujem abstraktné umenie 22. 11. 2006
Chránime životné prostredie a inštančné premenné • Chceme zaviesť psa-cirkusanta class Pes { private int vek; String štekaj() { return "Haf haf"; } } class CirkusovýPes extends Pes { void derivuj() { System.out.println("derivácia funkcie x je 1"); } } • CirkusovýPes zdedí všetky metódy • teda vie štekať • a vie derivovať 22. 11. 2006
Chránime životné prostredie a inštančné premenné class CirkusovýPes extends Pes { void derivuj() { System.out.println("derivácia funkcie x je 1"); } } CirkusovýPes cirkusant = new CirkusovýPes(); cirkusant.štekaj(); • pozrieme sa do CirkusovéhoPsa • má uvedenú metódu štekaj()? • áno – zavoláme ju a šlus • nie – pozrieme sa do predka • má predok (Pes) metódu štekaj()? • áno – zavoláme ju a šlus • ak náhodou nie – pozrieme sa do predka • keďže prapra...predkom je Object, určite raz skončíme. • ak sa metóda nenájde ani v Object-e, tak máme syntaktickú chybu 22. 11. 2006
Chránime životné prostredie a inštančné premenné • pozrieme sa do danej triedy • má uvedenú danú metódu? • áno – zavoláme ju a šlus • nie – pozrieme sa do nadradenej triedy a opakujeme algoritmus • prinajhoršom skončíme v Object-e • typickým príkladom sú metódy equals(), hashCode() a toString(); 22. 11. 2006
Chránime životné prostredie a inštančné premenné • spomnime minule: triedy môžeme prekrývať (override) class Pes { String štekaj() { return "Haf haf"; } } class CirkusovýPes extends Pes { String štekaj() { return "Baf baf baf"; } } Pes dunčo = new Pes(); dunčo.štekaj(); CirkusovýPes cirkusant = new CirkusovýPes(); cirkusant.štekaj(); Pes cirkusant2 = new CirkusovýPes(); cirkusant2.štekaj(); Haf haf Baf baf baf Baf baf baf 22. 11. 2006
Chránime životné prostredie a inštančné premenné • niekedy chceme len rozšíriť správanie z predka • napr. chceme, aby cirkusový pes štekal ako každý iný pes, ale na koniec štekania vložil reklamu na svoj cirkus. zavolá sa metóda uvedená v triede Pes class CirkusovýPes extends Pes { String štekaj() { String stekanie = super.štekaj(); return stekanie + " Príďte do nášho Cirkusu™."; } } super je zvláštna premenná takého typu, aký má predok 22. 11. 2006
Dedíme aj inštančné premenné • každá trieda zdedí okrem metód aj inštančné premenné. class Pes { private String rasa; private int vek; } class CirkusovýPes extends Pes { public String toString() { return "Cirkusant " + rasa; } } The variablePes.vek is not visible! / Premenná Pes.vek nie je viditeľná! Táto premenná by sa mala zdediť. 22. 11. 2006
Dedíme aj inštančné premenné • spomeňme si na privátne premenné • k privátnym premenným môže pristupovať len kód v danej triede • riešenie: chránené (protected) premenné • k protected premenným môže pristupovať • kód v danej triede • kód v zdedených triedach • kód v triedach, ktoré sa nachádzajú v rovnakom balíčku class Pes { protected String rasa; protected int vek; } class CirkusovýPes extends Pes { public String toString() { return "Cirkusant " + rasa; } } 22. 11. 2006
Dedíme aj inštančné premenné • verejné (public) premenné sa tiež zdedia • také premenné by však v triede nemali byť. • kedy private a kedy protected? • privátne inštančné premenné sú určené len a len danej triede. • nepredpokladá sa, že k nim budú mať prístup zdedené triedy • chránené sú určené ,,blízkej rodine" a dedičom • rady starej matere: je lepšie označiť premennú ako private a v prípade potreby ju zmeniť na protected 22. 11. 2006
Dedíme aj inštančné premenné • Príklad: trieda Otec a inštančná premenná Pivo • privátna (private) = len otec môže piť pivo • chránená (protected) = pivo môže vypiť len otec a môže mu ho vypiť synček alebo iný člen rodiny (= balíčka) • verejná (public) = pivo môže vypiť otcovi hocikto 22. 11. 2006
Príklad použitia v projekte JukeBox public abstract class JukeBox { protectedString meno; public void hrajVšetky() { for(CD cd : getCDs()) { cd.zahraj(); }} protected abstract ArrayList<CD> getCDs(); } • Všetcí prípadní potomkovia JukeBox-u budú mať meno • JukeBox vie prehrať CDčka, ktoré v ňom sú • To, odkiaľ sa získa zoznam CDčiek, sa prenechá na potomkov 22. 11. 2006
Príklad použitia v projekte JukeBox public class SúborovýJukeBox extends JukeBox { protected ArrayList<CD> getCDs(){ ArrayList<CD> cds = new ArrayList<CD>(); File súbor = new File("C:/MP3"); for(File podsúbor : súbor.list()) { CD cd = new CD(); cd.setNázov(podsúbor.getName()); cds.add(cd); } return cds; } } vypíše súbory v danom adresári názov súboru 22. 11. 2006
Príklad použitia v projekte JukeBox public class DatabázovýJukeBox extends JukeBox { protected ArrayList<CD> getCDs(){ Databáza db = Databáza.getDatabáza(); ArrayList<CD> cds = db.vykonajDopyt("SELECT * FROM cd ORDER BY 1"); return cds } } nejaká zázračná trieda pracujúca s SQL databázou 22. 11. 2006
Polymorfizmus v akcii! public static void main(String[] args) { JukeBox j = new JukeBox(); j.hrajVšetko(); j = new SúborovýJukeBox(); j.hrajVšetko() j = new DatabázovýJukeBox(); j.hrajVšetko(); } Cannot instantiate type / Nemôžem vytvoriť inštanciu typu 22. 11. 2006