1 / 20

R óbert Novotný 22. 11. 2006

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?.

kylan-vance
Download Presentation

R óbert Novotný 22. 11. 2006

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Dobré ráno s jazykom Java 8ÚINF/PAZ1c Róbert Novotný 22. 11. 2006 22. 11. 2006

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

More Related