vytvaranie tried java

41
 2.1. Vytvoř ení vlastní t ř ídy Strana 1 z 41 2. Vytvář íme vlastní tř ídu Obsah 2.1 Vytvoř ení vlastní tř ídy ........................................................................................................... 2  2.2 Zdrojový kód t ř ídy................................................................................................... ............... 3  Základní vlastnosti zabudovaného editoru................................................................................................... 5  Soubor se zdrojovým kódem.......................................................................................................................... 6  Tř i druhy komentářů........................................................................................................................................ 6  2.3 Definice tř ídy .......................................................................................................................... 7  2.4 Úprava konstruktoru.............................................................................................................. 9  2.5 Konstruktor s parametry..................................................................................................... 12  Konstruktor this............................................................................................................................................. 12  2.6 Syntaktické definice ............................................................................................................ 13  2.7 Dokumentační komentář e ................................................................................................... 15  Pomocné značky............................................................................................................................................ 16  2.8 Definice atributů................................................................................................................... 17  Možné důsledky zveř ejnění atribut ů ............................................................................................................ 19  2.9 Definujeme vlastní metodu ................................................................................................. 20  2.10 Kvalifikace a klí čové slovo this ................................................................... ..................... 22  2.11 Metody vracející hodnotu.................................................................................................. 23  Použití metod vracejících hodnotu .............................................................................................................. 23  2.12 Zapouzdř ení........................................................................................................................ 2 4  2.13 Lokální proměnné.............................................................................................................. 25  2.14 Atributy t ř ídy (statické atributy) ........................................................................................ 26  2.15 Metody tř ídy (statické metody) ......................................................................................... 27  Kvalifikace atribut ů a metod tř ídy................................................................................................................ 28  2.16 Konstanty a literály............................................................................................................ 30  2.17 Př edání parametru objektového ty pu............................................................................... 31  2.18 Dokumentace ..................................................................................................................... 33  2.19 Shrnutí – co jsme se v kapitole naučili ............................................................................ 38  V minulé kapitole jsme spíše teoretizovali a ukazovali si, jak co funguje. V této kapitole za čneme opravdu programovat a napíšeme své první ř ádky. Nezačneme však od nuly, ale budeme rozši ř ovat  projekt, s nímž jsme se seznámili v minulé kapitole. Př edem se omlouvám, že tato kapitola bude asi trochu delší, protože se v ní budeme postupn ě seznamovat se zápisem všech konstrukcí, které jsme si v minulé kapitole vysvětlili. Budeme se v ní  proto v ěnovat prakticky pouze kódu, tj. tomu, jak to či ono zapsat. Od př íští kapitoly bych chtěl již obě části výkladu vyvážit. Vždy si budeme chvíli vyprávět o tř ídách, objektech a jejich vlastnos- tech, a pak si ukážeme, jak to, co jsme se právě naučili, zapsat do programu. Pro práci s touto kapitolou si z adresy http://vyuka.pecinovsky.cz/ stáhněte projekt 02_Tvary  a soubor rozbalte do své složky s projekty. Rozbalte jej př itom i s podsložkami, takže vznikne slož- J02 Vytvář íme vlastní tř ídu.doc, verze 1.10.005, uloženo: stř eda 14.května.2003 15:54 Strana 1 z 41 

Upload: davidnovak

Post on 07-Oct-2015

11 views

Category:

Documents


0 download

DESCRIPTION

Vytvaranie tried v jazyku Java

TRANSCRIPT

  • 2.1. Vytvoen vlastn tdy Strana 1 z 41

    2. Vytvme vlastn tdu

    Obsah 2.1 Vytvoen vlastn tdy ........................................................................................................... 2 2.2 Zdrojov kd tdy.................................................................................................................. 3

    Zkladn vlastnosti zabudovanho editoru ................................................................................................... 5 Soubor se zdrojovm kdem.......................................................................................................................... 6 Ti druhy koment........................................................................................................................................ 6

    2.3 Definice tdy .......................................................................................................................... 7 2.4 prava konstruktoru.............................................................................................................. 9 2.5 Konstruktor s parametry ..................................................................................................... 12

    Konstruktor this............................................................................................................................................. 12 2.6 Syntaktick definice ............................................................................................................ 13 2.7 Dokumentan komente ................................................................................................... 15

    Pomocn znaky............................................................................................................................................ 16 2.8 Definice atribut................................................................................................................... 17

    Mon dsledky zveejnn atribut ............................................................................................................ 19 2.9 Definujeme vlastn metodu ................................................................................................. 20 2.10 Kvalifikace a klov slovo this ........................................................................................ 22 2.11 Metody vracejc hodnotu.................................................................................................. 23

    Pouit metod vracejcch hodnotu .............................................................................................................. 23 2.12 Zapouzden........................................................................................................................ 24 2.13 Lokln promnn .............................................................................................................. 25 2.14 Atributy tdy (statick atributy)........................................................................................ 26 2.15 Metody tdy (statick metody) ......................................................................................... 27

    Kvalifikace atribut a metod tdy ................................................................................................................ 28 2.16 Konstanty a literly............................................................................................................ 30 2.17 Pedn parametru objektovho typu............................................................................... 31 2.18 Dokumentace ..................................................................................................................... 33 2.19 Shrnut co jsme se v kapitole nauili ............................................................................ 38

    V minul kapitole jsme spe teoretizovali a ukazovali si, jak co funguje. V tto kapitole zaneme opravdu programovat a napeme sv prvn dky. Nezaneme vak od nuly, ale budeme roziovat projekt, s nm jsme se seznmili v minul kapitole.

    Pedem se omlouvm, e tato kapitola bude asi trochu del, protoe se v n budeme postupn seznamovat se zpisem vech konstrukc, kter jsme si v minul kapitole vysvtlili. Budeme se v n proto vnovat prakticky pouze kdu, tj. tomu, jak to i ono zapsat. Od pt kapitoly bych chtl ji ob sti vkladu vyvit. Vdy si budeme chvli vyprvt o tdch, objektech a jejich vlastnos-tech, a pak si ukeme, jak to, co jsme se prv nauili, zapsat do programu.

    Pro prci s touto kapitolou si z adresy http://vyuka.pecinovsky.cz/ sthnte projekt 02_Tvary a soubor rozbalte do sv sloky s projekty. Rozbalte jej pitom i s podslokami, take vznikne slo-

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 1 z 41

    Rudolf PECINOVSK

    1.10Aktualizovny adresa pro staen soubor.1.9Upraveny nkter formtovac drobnosti.1.8Opraveny 3 chyby po upozornn tenem webu.1.7Upravena kapitola o statickch atributech pidn vklad jejich inicializace.1.6Od verze 1.6 je zavedena automatick inkrementace verze a tento koment na potku souboru.

  • 2.1. Vytvoen vlastn tdy Strana 2 z 41

    ka 02_tvary-0, v n bude vedle td, s nimi jsme se setkali v minul kapitole, tak tda Smrk, o kter budu hovoit v kapitole tto.

    2.1 Vytvoen vlastn tdy

    kali jsme si, e zkladem veho jsou objekty a ty e jsou instancemi svch td. Abychom mohli mt objekt, musme mt nejprve tdu, jej instanc objekt bude.

    Pot jsme se dozvdli, e objekty vytvome tak, e prostednictvm opertoru new zavolme konstruktor, co je speciln metoda matesk tdy vytvench objekt. Tato metoda nem na sta-rosti prakticky nic jinho, ne objekt sprvn vytvoit.

    Zstaneme jet chvli v minulm projektu a podvme se, jak bychom mohli vytvoit novou tdu a jak bychom v n nadefinovali konstruktor, jen by vytvoil ten sprvn objekt.

    1. Stiskneme vlevo tlatko Nov tda.

    Obrzek 2.1: Vytvoen nov tdy.

    2. V nsledn otevenm dialogovm okn zadejte nzev tdy, kter mus odpovdat pravidlm pro identifiktory (zadejte nap.Smrk).

    Obrzek 2.2: Zadn nzvu vytven tdy.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 2 z 41

  • 2.2. Zdrojov kd tdy Strana 3 z 41

    3. Ovte, e budete opravdu vytvet obyejnou tdu a sv zadn potvrte. BlueJ pak pid prv vytvoenou tdu do diagramu td.

    Obrzek 2.3: Pidn nov tdy do diagramu td.

    Obdlnk s novou tdou je prozatm vyrafovn, ale my ji vme, e rafovn znamen jen to, e tda jet nen peloena. Stiskneme proto tlatko Peloit a meme hned zkusit vytvoit instanci nov definovan tdy.

    Konvence pi tvorb identifiktor: V programech psanch v jazyku Java se ustlily jist konvence. Jednou z nich je zvyk definovat vechny identifiktory td s velkm potenm psmenem a identifiktory instanc a metod s malm potenm psmenem. Sestv-li identifiktor z nkolika slov, pouv se tzv. velbloud notace, pi n je kad poten psmeno dalho slova v identifiktoru velk a ostatn psme-na jsou mal nap. DlouhNzevTdy nebo dlouhNzevMetody().

    2.2 Zdrojov kd tdy

    Instance se vytvo, ale nebude nic umt. V mstn nabdce je sice poloka String toString(), ale tato me-toda slou spe pro nsledn ladn jejm jedinm kolem je vrtit textov etzec obsahujc do-staten informace pro identifikaci instance. Vybaven tdy potebnmi schopnostmi je na ns. Abychom tak mohli uinit, musme otevt jej zdrojov kd, tj. soubor, kam jsme my nebo nkdo jin zapsali program. Meme toho doshnout dvma zpsoby:

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 3 z 41

  • 2.2. Zdrojov kd tdy Strana 4 z 41

    ) )

    poklepeme na tdu (pesnji na jej ikonu, tj. na pslun obdlnk v diagramu td),

    v mstn nabdce tdy zadme pkaz Otevt v editoru.

    Vyberte si postup, kter je vm sympatitj a otevete editor se zdrojovm kdem tdy, kter pro ns vygeneroval BlueJ v okamiku, kdy jsme jej podali o vytvoen nov tdy. Je to tm przd-n definice tdy, do kter budeme vpisovat n program. Jinmi slovy: BlueJ za ns napsal to, co bychom stejn museli (nebo alespo mli) napsat a pidal i njak komente, kter maj pomoci vsledn program zpehlednit a uspodat.

    Obrzek 2.4: Okno zabudovanho editoru

    Poznmka: Vechny souasn programtorsk editory pouvaj barevn zvraznn syntaxe, kter vraz-nm zpsobem zvyuje pehlednost a srozumitelnost programu. Protoe webov podoba tohoto uebnho textu umouje vyuit barev, budu se snait pout toto barevn zvraznn i v ukz-kch program uvedench v textu.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 4 z 41

  • 2.2. Zdrojov kd tdy Strana 5 z 41

    Zkladn vlastnosti zabudovanho editoru

    Autoi editoru dodvanho s prostedm BlueJ se snaili vytvoit program maximln jednoduch, aby ci zvldli jeho ovldn co nejrychleji, avak na druhou stranu dostaten komfortn, aby jim tvorbu jejich program co nejvce usnadnil.

    Mezi zkladn komfortn doplky, kter v souasn dob pat ji k tm povinn vbav vech programtorskch editor, pat monost automatickho odsazovn, barevnho zvraznn syntaxe, vytven zlonch kopi, zobrazovn sel dk a schopnost dohledn a oznaen pro-v zvorky k zvorce, u kter je textov kurzor. Navc nm zabudovan editor umouje nastavit velikost pouitho psma (jinou pouijeme pi vlastn tvorb a jinou pak pi jej prezentaci ped skupinou poslucha).

    Vechny tyto vlastnosti meme nastavit i naopak potlait v dialogovm okn, je vyvolme pkazem Pedvolby Nastaven.

    Obrzek 2.5: Nastaven pedvoleb pro editor a peklada.

    Kdy u jsme toto dialogov okno oteveli, povme si i o ostatnch monostech, kter jdou na kart Rzn nastavit. Prvnm z nich je povolen novinek z JDK 1.4. Verze 1.4 toti zavedla nov klov slovo assert. Jeho pouit je vak implicitn zakzno pro ppad, e by je nkdo ve svch starch programech ji pouil jako identifiktor. Kdo vak v, e slovo assert ve svch programech nikdy nepouil, me je povolit. Protoe my vytvme programy zcela nov, rdi jeho pouit povolme, abychom pozdji mohli vyut jeho pjemnch vlastnost.

    Druhou monost je nastaven adresy s dokumentac standardn knihovny. Po instalaci je zde nastavena internetov adresa tto dokumentace na strnkch firmy Sun. Pokud jste spolu s JDK in-stalovali i jeho dokumentaci, doporuuji vm pepsat tuto adresu na lokln adresu ve vaem pota-

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 5 z 41

  • 2.2. Zdrojov kd tdy Strana 6 z 41

    i. Na obrzku 2.5 si vimnte, e se zde nastavuje absolutn cesta k souboru index.html ve sloce api, je je podlokou sloky, do n jste dokumentaci instalovali.

    Pokud jste se zalekli rozmru dokumentace a neinstalovali jste ji, zrute zakrtnut polka Po-ut toto URL pi generovn projektov dokumentace. Jedinou vhodou, o n se zruenm tohoto zakrtnut pipravte, je to, e do vai dokumentace nebudou vloeny odkazy na dokumentaci souvisejcch st standardn knihovny. A si budeme povdat o dokumentaci, jet se k tomu vrtm.

    Soubor se zdrojovm kdem

    Vrame se ale k editoru, jeho okno je na obrzku 2.4 a podvejme se na kd prv vytvoen tdy Smrk. Prozradm vm, e tento kd je uloen v souboru, kter se jmenuje stejn jako v nm de-finovan tda a kter m pponu .java. To je dleit! Kdybyste toti pozdji chtli pejmeno-vat tdu, muste myslet na to, e spolu se tdou se mus pejmenovat i soubor, v nm je jej zdro-jov kd. (Navc se mus pejmenovat vechny konstruktory, kter se tak jmenuj stejn jako t-da.)

    Poznmka: V souboru s pponou .java je opravdu ve, co potebujete. Budete-li chtt nkdy sv programy nkam penst, sta penst pouze soubory .java. Ve ostatn potebn pro sprvn vvoj pro-gramu si ji BlueJ (a vtina ostatnch vvojovch prosted) doke znovu vytvoit .

    Ti druhy koment

    Na potku vygenerovanho zdrojovho kdu najdeme koment. Jeho podoba odpovd podob komente, kter znte z Baltkovch program: obecn koment zan dvojic znak /* a kon inverzn dvojic */ tyto dvojice slou jako komentov zvorky. Ve, co mezi nimi peklada na-jde, ignoruje. Zapamatujte si, e koment m stejn vznam jako mezera (jinmi slovy: kde sm bt mezera, tam sm bt koment vjimkou je pouze vnitek textovch etzc).

    Vedle ve popsanch obecnch koment, jejich dlka nen nijak omezena, existuj jet jednodkov komente (ty tak znte z Baltka), kter zanaj dvojic znak // a kon spolu s koncem dku.

    Programovac jazyk Java zavd navc jet dokumentan koment, kter vypad skoro stejn jako obecn koment a li se pouze tm, e zan trojic znak /**. Do tchto koment se zapisuje dokumentace k vytvenmu programu. asem se k nim jet vrtme.

    Pokraovac dky obecnch a dokumentanch koment bv dobrm zvykem zanat hvzdikami. Ty sice nejsou povinn, ale zvyuj pehlednost programu. Proto je tam ada progra-mtorskch editor (mezi nimi i BlueJ) automaticky vkld. Zkuste klepnout do kterhokoliv dku uprosted dokumentanho komente a stisknout Enter editor vlo nov dek a zahj jej tm, e pod hvzdiku souasnho dku vlo tak hvzdiku a znakov kurzor pesune a za ni. Kdybyste do programu nkam vloili obecn koment, zjistite, e se chov stejn.

    Vhodn komente dok vrazn zvit itelnost programu. Naute se sv programy dosta-ten komentovat, abyste pak pi pozdjch pravch nemuseli pracn analyzovat, jak jste to ten-krt mysleli. V prbhu serilu se k tto problematice vrtm jet podrobnji.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 6 z 41

  • 2.3. Definice tdy Strana 7 z 41

    kol: Doplte dokumentan koment na zatku souboru o popis elu dan tdy, nzev autora a popis verze. Mj soubor by pak zanal nsledovn:

    /** * Trida Smrk slouzi k vyuce zakladu prace se zdrojovym kodem. * Je soucasti projektu Tvary, jenz je startovacim projektem * kurzu objektove orientovaneho programovani. * * @author Rudolf Pecinovsky * @version 1.06, 2.1.2003 */

    2.3 Definice tdy

    Projdeme si nyn vlastn definici tdy, ukeme si, z jakch se skld st a povme si, co jednotli-v sti znamenaj:

    public klov slovo, kter k, e tda je veejn a kdokoliv (tedy i BlueJ) ji me pout.

    class klov slovo oznamujc, e definujeme novou tdu.

    Smrk nzev definovan tdy. Mus vyhovovat pravidlm pro tvorbu identifiktor (viz sekce Pravidla pro tvorbu identifiktor v kapitole 1. Tdy a objekty) a podle konvence by ml zanat velkm psmenem.

    { } ve, co je uzaveno v nsledujcch sloench zvorkch, oznaujeme jako tlo tdy. Ve, co je ped tlem tdy, oznaujeme jako hlavika tdy.

    //Smrk nepovinn zvren koment, kter sem ve svch programech vkldm proto, abych rychle poznal, kterou tdu jsem prv definoval, a to i tehdy, uvidm-li pouze jej konec. Koment mi navc pomh urit, e prv tato uzavrac zvorka je koncem tla tdy.

    S vjimkou dvou pesn specifikovanch pkaz (budeme o nich mluvit pozdji) mus bt v jazyku Java ve ostatn, tj. atributy i metody, definovno v tle tdy.

    Definice tdy ve vygenerovanm programu zan sri koment, kter nm napovdaj po-ad, v nm je vhodn do programu zaazovat definice jednotlivch st tdy. Toto poad sice nen povinn, ale pokud si na n zvyknete a budete je dodrovat, budete se ve svch programech mnohem rychleji orientovat.

    Abyste si ovili, e to opravdu sta, podejte BlueJ o vytvoen nov tdy, kterou nazvete nap. PrzdnTda (klidn si na n vyzkouejte, e Java diakritiku zvld). Pak otevete jej zdrojov kd a ve, co nemus bt v definici, smate. Vsledkem bude definice:

    public class PrzdnTda { }

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 7 z 41

  • 2.3. Definice tdy Strana 8 z 41

    Abyste si vyzkoueli, e Jav je pln jedno, kde kon dky, upravte definici do toho nejstrunj-ho tvaru:

    public class PrzdnTda{}

    Abychom mohli n kd vyzkouet, musme jej nejprve peloit. Stisknte proto na horn lit edi-toru tlatko Peloit. Jak nm BlueJ oznm v dolnm informanm okn, tak nejprve upraven sou-bor ulo, pak se na chvli zamysl a za chvli nm v tomto poli oznm, e Tda byla spn peloena dn syntaktick chyby.

    Obrzek 2.6: Okno editoru se zprvou o spnm pekladu tdy PrzdnTda.

    Pekladem tdy zmiz i rafovn ikony tdy v diagramu td. Meme tedy zkusit vytvoit jej in-stanci. Mon vs pekvap, e v mstn nabdce tdy najdete jej konstruktor, i kdy jste dn ne-definovali. Je to proto, e tda njak konstruktor mt mus. Autoi jazyka ns ale nechtli nutit pst przdn, nic nedlajc konstruktory. Definovali proto jazyk tak, e v ppad, kdy vbec dn konstruktor nenadefinujeme, tak se ns pekladai zel a msto toho, aby ns nutil nco doplovat, nadefinuje przdn bezparametrick konstruktor msto ns sm.

    Zkuste tedy vytvoit instanci a ovte, e ve funguje.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 8 z 41

  • 2.4. prava konstruktoru Strana 9 z 41

    Obrzek 2.7: Instance a mstn nabdka przdn tdy

    Samozejm, e s takto vytvoenou instanc nememe skoro nic dlat. Otevete proto jej mstn nabdku, nechte ji odstranit a tot pak provete i s celou tdou. Protoe odstrann tdy je pece jenom operace, kter m na cel projekt zsadnj dopad, tak se vs BlueJ pro jistotu nejprve ze-pt, jestli to s tm odstrannm tdy myslte vn. Jakmile svj mysl potvrdte, odstran nejenom zdrojov soubor tdy, ale i vechny zmnky o tom, e tda byla nkdy soust projektu.

    Obrzek 2.8: Potvrzovac dotaz ped smaznm tdy

    2.4 prava konstruktoru

    Vrame se zpt k na td Smrk. Jak naznauj komente, prvn skutenou definic v automaticky vygenerovanm zdrojovm textu tdy Smrk je definice konstruktoru. Vimnte si, e tato definice opt zan klovm slovem public oznamujcm, e konstruktor je veejn pstupn.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 9 z 41

  • 2.4. prava konstruktoru Strana 10 z 41

    Konstruktor poznme podle toho, e se jmenuje stejn jako tda, jej instanci vytv. Za n-zvem by ml nsledovat seznam parametr, ale protoe tento konstruktor dn parametry nem, budou zvorky przdn.

    Modifiktory (v naem ppad klov slovo public), nzev tdy a seznam parametr v z-vorkch tvo hlaviku konstruktoru. V hlavice je uvedeno ve, co ostatn tdy o danm kon-struktoru vd. Co nen uvedeno v hlavice, to okoln svt o konstruktoru nev.

    Za hlavikou je ve sloench zvorkch tlo konstruktoru. Je sloeno z posloupnosti pkaz popisujcch, co bude konstruktor dlat. Kad pkaz mus bt ukonen stednkem. Pitom je zcela jedno, vejde-li se cel pkaz na jeden dek, nebo bude-li rozprosten na nkolika dcch.

    Jak jsem ji ekl, zvykl jsem si pro zven pehlednosti svch program vkldat za uzavrac zvorky tl td a metod koment, kter znovu obsahuje hlaviku. Zle na vs, jestli tento zvyk pevezmete nebo ne.

    Pokusme se nyn definovat tlo konstruktoru tak, aby nm konstruktor nakreslil mal smrek. Pamatujete-li si, jak vypadaly parametrick konstruktory v mstnch nabdkch td, asi jist odvod-te, e by definice konstruktoru mohla vypadat nap. nsledovn:

    public Smrk() { new Trojuhelnik( 10, 0, 30, 30 ); new Trojuhelnik( 5, 10, 40, 40 ); new Trojuhelnik( 0, 20, 50, 50 ); }//public Smrk()

    Poznmka k formtu: Vimnte si, e pkazy uvnit tla konstruktoru jsou oproti hlavice odsazeny. Obdobn jsou odsazeny vechny definice uvnit tla tdy. Obecn se dodruje zsada, e vechny pkazy uvnit bloku pkaz ve sloench zvorkch se oproti okolnm pkazm odsazuj o zadan po-et mezer (BlueJ m peddefinovan 4 mezery, ale lze to zmnit vtinou se pouvaj 2 a 4 mezery). O stejn poet mezer se pak odsazuj i pokraovac dky pkaz, kter se nevejdou na jeden dek (pesnji kter rozdlte do nkolika dk).

    Dosaen takovhoto vzhledu nen natst pracn. Sta ped zadnm prvnho odsazen-ho dku stisknout tabultor a dal dky se ji automaticky odsad podle toho prvnho.

    Zrove si vimnte, e otevrac a zavrac sloen zvorka jsou pod sebou na rovni hlaviky. Pro ty, kte si zvykli na odsazovn, kter se pouv v Baltkovi, to bude zmna. Bal-tk toti zavedl jin odsazovn, ne na jak je zvykl zbytek svta. Protoe na toto odsazovn je v Baltkovi vzn zrychlen vbr blok, pouil jsem je i ve sv uebnici. Te vs budu nao-pak nabdat, abyste peli na uspodn, kter je v programtorskm svt mnohem bnj. Programtoi se odliuj v tom, zda dvaj otevrac zvorku na samostatn dek i na konec pedchozho dku. V umstn zavrac zvorky se vak vtinou shodnou.

    Vhodou otevrac zvorky na konci dku jsou krat programy, vhodou zvorky na samostatnm dku je snaz kontrola provn zvorek. Protoe druh dvod povauji pro zatenky za dleitj, budu v tomto kurzu umsovat otevrac a zavrac sloen zvorky na samostatn dky.

    Abychom mohli n kd vyzkouet, musme jej opt peloit. Jak vypad spn peklad jsme ji vidli. Podvejme se nyn na to, jak se bude BlueJ chovat v ppad, kdy budeme mt ve zdrojovm textu njakou chybu.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 10 z 41

  • 2.4. prava konstruktoru Strana 11 z 41

    Odstrate stednk ze zvrenho pkazu v tle konstruktoru a spuste peklad. BlueJ v program opt nejprve ulo a pak jej zane pekldat. Kdy naraz na chybu, zobraz v dolnm in-formanm poli chybovou zprvu. Tato zprva sice bude anglicky, ale klepnutm na otaznk na pra-vm okraji informanho pole otevete dialogov okno, kter vm chybov hlen pelo a mon i esky vysvtl viz obr.2.9.

    Obrzek 2.9: Vysvtlen nalezen chyby s nvodem k nprav

    Tato vysvtlen sice nejsou k dispozici pro vechny chyby, nicmn nejastj chyby takto vysvt-leny jsou.

    Zkuste se nyn vrtit do prosted BlueJ, vytvote instanci tdy Smrk a pesvdete se, e se na pltno poadovan smrek opravdu nakreslil.

    kol 1: Pepnte se do projektu, jen jste sthli na potku tto kapitoly a definujte tdu Smrk2, v n si budete zkouet vlastn verze definic, kter pak budete moci porovnat s definicemi ve td Smrk.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 11 z 41

  • 2.5. Konstruktor s parametry Strana 12 z 41

    kol 2: Definujte tdy Snehulak, jej instance nakresl na pltno blankytnho snhulka, Domek, jej in-stance nakresl domek s oknkem a dvemi, a Panak, jej instance nakresl postaviku sestavenou z obdlnk, trojhelnk a elips.

    2.5 Konstruktor s parametry

    Stromek jsme sice nakreslili, ale vytvome-li druh, nebudeme jej moci od prvnho odliit, protoe se budou pekrvat. Vytvome proto konstruktor s parametry, kter nm umon specifikovat, kam se m stromek nakreslit. Vzpomeneme si, e parametry se p do kulatch zvorek za nzev kon-struktoru a e ped kadm parametrem mus bt nejprve uveden jeho typ. Je-li parametr vce, od-dluj se rkou.

    Konstruktor umoujc nakreslit stromek na zadan souadnice by mohl vypadat nsledovn:

    public Smrk( int x, int y ) { new Trojuhelnik( x+10, y, 30, 30 ); new Trojuhelnik( x+5, y+10, 40, 40 ); new Trojuhelnik( x, y+20, 50, 50 ); }//public Smrk( int x, int y )

    Pidejte do zdrojovho textu ve uveden kd a tdu pelote. Vrate se pak do prosted BlueJ a vytvote na rznch mstech pltna nkolik instanci tdy Smrk. Pesvdete se, e se stromky na-kreslily opravdu tak, jak byl vam zmrem.

    Poznmka: Jakmile napete (nebo smaete) prvn psmeno ve zdrojovm kdu, pota ihned odstran ze zsobnku vechny odkazy na instance tdy, jej kd prv upravujete. Zrove ozna tuto t-du v diagramu td jako nepeloenou, tj. opt ji vyrafuje.

    kol 1: Zkuste nyn definovat pro svoji tdu Smrk2 konstruktor, ktermu budete moci zadat nejenom po-ten pozici kreslenho smrku, ale tak jeho rozmr. Protoe je to loha t, budete si moci v pt podkapitole prohldnout jej een.

    kol 2: Definujte obdobn parametrick konstruktory i pro svoje tdy Snehulak, Domek a Panak.

    Konstruktor this

    Tdy Obdelnik, Elipsa a Trojuhelnik, kter jsme doposud pouvali, mly kad po tech kon-struktorech, je se vzjemn liily potem zadvanch parametr. Protoe vechny konstruktory maj velice podobnou funkci, budou i jejich definice velice podobn.

    Programtoi jsou ale lid ln (proto se tak dali na programovn) a neradi p nco dvakrt. Java natst nabz zpsob, jak se opakovanmu psan tla konstruktoru vyhnout je jm pouit

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 12 z 41

  • 2.6. Syntaktick definice Strana 13 z 41

    klovho slova this nsledovanho seznamem parametr. Takto pouit klov slovo this zastupu-je jin konstruktor te tdy kter to je, to si peklada odvod z potu a typu zadanch paramet-r.

    POZOR! Takovto voln jinho konstruktoru mus bt pln prvnm pkazem tla kon-struktoru. Ped nm sm bt ji pouze koment.

    Podvejme se, jak bychom mohli tuto monost vyut pi definici naeho smrku. Ped chvilkou jste mli za kol definovat konstruktor, ktermu bychom zadali nejen poten pozici smrku, ale tak jeho velikost. Definice takovhoto konstruktoru by mohla bt nap. nsledujc:

    public Smrk( int x, int y, int sirka, int vyska ) { new Trojuhelnik( x+sirka/5, y, 3*sirka/5, 3*vyska/7 ); new Trojuhelnik( x+sirka/10, y+vyska/7, 4*sirka/5, 4*vyska/7 ); new Trojuhelnik( x, y+2*vyska/7, sirka, 5*vyska/7 ); }//public Smrk( int x, int y, int sirka, int vyska )

    Kdy u budeme mt definovan takovto univerzln konstruktor, meme definice zbylch dvou konstruktor siln zjednoduit a definovat je ve tvaru:

    public Smrk() { this( 0, 0, 50, 70 ); }//public Smrk() public Smrk( int x, int y ) { this( x, y, 50, 70 ) }//public Smrk( int x, int y )

    Pi definici bezparametrickho konstruktoru bychom mohli jt jet dl a definovat jej ve tvaru:

    public Smrk() { this( 0, 0 ); }//public Smrk()

    Tm bychom zavolali konstruktor, ktermu se zadvaj pouze souadnice a ten by zavolal konstruk-tor, jemu se zadvaj vechny tyi parametry.

    kol: Vyzkouejte definici jednoduch konstruktor volajcch obecnj konstruktor prostednictvm klovho slova this i ve svch tdch Snehulak, Domek a Panak.

    2.6 Syntaktick definice

    Poznmka: Tato kapitola trochu odbouje od vlastnho vkladu. Chtl bych vs v n seznmit se zpsobem

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 13 z 41

  • 2.6. Syntaktick definice Strana 14 z 41

    zpisu syntaktickch definic, pomoc nich lze jednoznan popsat, jak m vysvtlovan kon-strukce vypadat. Mon bude nkterm z vs pipadat tk. Pokud se vm bude zdt, e je p-li abstraktn, klidn ji peskote a vrate se k n pozdji, a si budete chtt ujasnit, jak si mte njakou syntaktickou definici peloit.

    Pi popisu syntaxe programovch konstrukc (syntaxe = souhrn pravidel, jak konstrukci zapsat) ne-bv slovn popis optimlnm zpsobem vyjden, protoe se pi nm asto ztrcej cenn informa-ce v zplav okolnch slov. V programtorskm svt se proto pouvaj jin druhy popisu. Jednm z nich jsou syntaktick definice. Ty budu pouvat i j.

    V syntaktickch definicch je teba rozliit, co se z nich m do programu opsat, co pouze zastupuje njak objekt a co je pouze pomocn vyjadovac prostedek pro popis struktury dan konstrukce. V syntaktickch definicch, kter budu v tomto kurzu pouvat, uvedu vdy na prvnm dku erven nzev popisovan konstrukce a na dalch, odsazench dcch pak popu vlastn de-finici. V n budu pouvat nsledujc prvky:

    mode Modrou barvu budu pouvat pro ty sti konstrukce, kter se maj do vslednho progra-mu opsat (nap. pro sloen zvorky ohraniujc tlo konstruktoru i tdy nebo pro rku oddlujc jednotliv parametry v seznamu).

    nzev ern a pro vy odlien jet kurzivou budu pst nzvy prvk, kter se v definici vysky-tuj. Msto nich pak do programu napete pslun prvek.

    [ ] erven hranat zvorky budou uzavrat tu st konstrukce, kter se v n me, ale tak nemus vyskytovat.

    erven vpustka bude nsledovat za prvkem, kter se me v konstrukci vyskytovat opa-kovan.

    { } erven sloen zvorky budou uzavrat skupinu prvk, s nimi budu chtt v definici pra-covat jako s celkem nap. za n budu chtt vloit vpustku naznaujc, e cel skupina se me opakovat.

    | erven svisltko bude mt funkci nebo, kter k, e ve vsledn konstrukci se me ob-jevit bu prvek vlevo od nj anebo prvek vpravo od nj. Ne vak oba zrove (to bychom museli zapsat jinak).

    Definici konstruktoru bychom podle tchto pravidel zapsali nsledovn:

    Konstruktor: [ modifiktor ] nzev_tdy ( [ definice_parametru [ , definice_parametru ] ] ) { [ pkaz ] }

    Definice_parametru: typ nzev

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 14 z 41

  • 2.7. Dokumentan komente Strana 15 z 41

    Definici interpretujeme tak, e na potku se me, ale nemus vyskytovat modifiktor (zatm zn-me pouze modifiktor public, ale je jich vc). Modifiktor dokonce me bt i vc.

    Za modifiktorem nsleduje nzev tdy, jej instance konstruktor vytv a za nm pak otev-rac kulat zvorka uvozujc seznam ppadnch parametr. Za n me, ale nemus bt uvedena definice pouitho parametru. Za definic prvnho parametru mohou bt i definice dalch paramet-r, ale kad z nich ji mus bt od pedchoz definice oddlena rkou.

    Za seznamem parametr napeme zavrac kulatou zvorku a za n otevrac sloenou zvor-ku uvozujc tlo konstruktoru. V tle konstruktoru nemus bt nic, ale me tam bt i nkolik p-kaz. Tlo ukon uzavrac sloen zvorka.

    V definici konstruktoru se vyskytuje prvek definice_parametru. Ten vytvome tak, e uve-deme typ parametru a za nm jeho nzev.

    Abychom si ukzali pouit ervench sloench zvorek a svisltka, rozebereme si jet defi-nici identifiktoru:

    Identifiktor: { psmeno | _ | $ } [ psmeno | _ | $ | slice ]

    Tato definice je vak neikovn a uvedl jsem ji pouze proto, abych v n mohl pout i sloen z-vorky. V praxi bychom identifiktor definovali asi nsledovn:

    Identifiktor: zobecnn_psmeno [ zobecnn_psmeno | slice ]

    Zobecnn_psmeno: psmeno | _ | $

    Tato definice k, e identifiktor mus zanat zobecnnm psmenem, za nm me nsledovat li-bovoln poet zobecnnch psmen a slic

    2.7 Dokumentan komente

    Kad nov metoda by mla bt doplnna o dokumentan koment, kter umstme tsn ped jej hlaviku a ve kterm popeme, co metoda dl, jak poaduje parametry a co ppadn vrac. Mli bychom tak uinit i v ppad prv definovanho konstruktoru. V automaticky generovanm zdro-jovm souboru je u bezparametrickho konstruktoru koment ji pipraven. Nechm na vs, zda jej zkoprujete nebo zda vytvote nov.

    Definujete-li konstruktor s parametry, ope se dokumentan koment do horn poloviny dia-logovho okna. Aby k tomu vak opravdu dolo, nesm bt v celm souboru v dnm komenti ani identifiktoru jedin psmeno s diakritikou. Jakmile se tam njak objev, pestanou se doku-mentan komente v dialogovch oknech pro zadn parametr opisovat. Zrove se pestanou uvdt i nzvy zadvanch parametr. Proto do doby, ne tuto chybu autoi oprav, nepouvejte v komentch diakritiku.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 15 z 41

  • 2.7. Dokumentan komente Strana 16 z 41

    Poznmka: Najt zapomenutou rku i hek bv v delch programech opravdu tk. Proto je obas vhodn pout njak nstroj, kter vechna diakritick znamnka z textu odstran (bohuel je odstran i z textovch etzc, ale to ji je da za pohodl). J k tomuto elu pouvm textov editor PSPad, kter se s vmi bav esky, um zvraznit syntaxi javovskch program, m adu nejrznjch vymoenost (napklad je schopen do souboru bez diakritiky znovu vrtit hky a rky nad psmeny) a mete si jej zdarma sthnout na adrese http://pspad.zde.cz.

    Dokumentan komente vak neslou pouze k tomu, aby se jejich obsah vypsal do njakch dia-logovch oken. Ony slou opravdu k vytvoen dokumentace. O tom se mete pesvdit nap. tak, e rozbalte seznam na pravm okraji panelu s tlatky a msto dosavadn poloky Implementace (zdrojov kd) vyberete poloku Dokumentace (popis rozhran) (viz obr. 2.14). BlueJ pak zavol program, kter je soust JDK a kter z vaich dokumentanch koment vyrob HTML soubor efektn dokumentujc vai tdu.

    Tato autodokumentan schopnost Javy je jednou z jejch velice pjemnch vlastnost. Proza-tm se j vak nebudeme podrobnji zabvat a vrtme se k n na konci tto kapitoly a pak pokad, kdy se naume dal rysy, o nich se meme z dokumentace nco dozvdt. Prozatm se spoko-jme s tm, e dokumentan komente metod se opisuj do dialogovch oken pro zadvn jejich parametr.

    Pomocn znaky

    Jak jste si mohli v dialogovch oknech volanch metod vimnout, v dokumentanch komentch se pouv nkolik specilnch znaek. Prozatm jsme se setkali se znakou @param uvozujc po-pis parametru a se znakou @return uvozujc popis nvratov hodnoty. (asem se naume dal.)

    V dialogovm okn vm mon tyto znaky pek, ale pesto bych vm radil, abyste je pou-vali. A se na konci tto kapitoly k dokumentaci vrtme, uku vm, jak se v n pouvn tchto znaek projev.

    Podvejme se nyn na monou podobu definice t uvedench konstruktor:

    /** * Konstruktor pro objekty tridy Smrk, kter umon nastavit * souradnice a rozmery vytvareneho obrazce. * Souradnicemi objektu se pritom rozumi souradnice * leveho horniho rohu opsaneho ctverce. * * @param x x-ova souradnice, x>=0, x=0 ma levy okraj platna * @param y y-ova souradnice, y>=0, y=0 ma horni okraj platna * @param sirka sirka obdelniku, sirka > 0 * @param vyska vyska obdelniku, vyska > 0 */ public Smrk( int x, int y, int sirka, int vyska ) { new Trojuhelnik( x+sirka/5, y, 3*sirka/5, 3*vyska/7 ); new Trojuhelnik( x+sirka/10, y+vyska/7, 4*sirka/5, 4*vyska/7 ); new Trojuhelnik( x, y+2*vyska/7, sirka, 5*vyska/7 ); }// public Smrk( int x, int y, int sirka, int vyska ) /** * Konstruktor pro objekty tridy Smrk, kter um nastavit

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 16 z 41

  • 2.8. Definice atribut Strana 17 z 41

    * pocatecni pozici objektu. Velikost je implicitn. * Souradnicemi objektu se pritom rozumi souradnice * leveho horniho rohu opsaneho ctverce. * * @param x x-ova souradnice, x>=0, x=0 ma levy okraj platna * @param y y-ova souradnice, y>=0, y=0 ma horni okraj platna */ public Smrk( int x, int y ) { this( x, y, 50, 70 ); }// public Smrk( int x, int y ) /** * Bezparametricky konstruktor pro objekty tridy Smrk. * Nakresli objekt standardni velikosti se souradnicemi [0;0]. */ public Smrk() { this( 0, 0, 50, 70 ); }//public Smrk()

    2.8 Definice atribut

    Kdybychom zstali u dosavadn podoby definice konstruktor, tak bychom toho s naimi smrky moc dlat nemohli. Jednotliv trojhelnky se sice nakresl, ale pak ji s nimi nic dalho dlat ne-meme (vynechvm prohlen instanc). Abychom tyto pomocn trojhelnky mohli jet nkdy o nco podat (nap. o to, aby se pesunuly), musme si nkde zapamatovat odkaz na n. Potebu-jeme proto definovat atributy instanc, do nich budeme potebn informace ukldat.

    Atributy definujeme skoro stejn jako parametry. Neuvdj se vak v dn hlavice, ale v tle tdy vn tl jejch metod. Aby se nm kd lpe etl, umsuj se definice atribut v tle tdy vtinou ped definice metod tak, jak to napovd koment ve zdrojovm souboru.

    I v definici atributu musme uvst nejprve typ atributu a pak jeho identifiktor (nzev). Oproti definici parametru mme navc jet dv monosti:

    )

    )

    ped typ atributu meme vloit modifiktory, kter ble specifikuj nkter vlastnosti defi-novanho atributu,

    dokeme-li urit poten hodnotu atributu (tj. nepotebujeme-li k jejmu zjitn njak pa-rametry zadvan a pi voln konstruktoru), meme za nzev atributu pidat rovntko a za nm poten hodnotu zadat.

    Celou definici atributu ukonme stednkem. Syntaktickou definici definice atributu bychom mohli zapsat nsledovn:

    Definice atributu: [ modifiktor ] typ nzev [ = poten_hodnota ] ;

    Prozatm jsem se setkvali pouze s modifiktorem public, kter oznamoval, e pslunou tdu i metodu mohou pouvat vichni. Atributy jsou vak povaovny za soukromou vc kad tdy, ve

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 17 z 41

  • 2.8. Definice atribut Strana 18 z 41

    kter nem nikdo ciz mt anci se hrabat. Kter atributy je tda ochotna zveejnit, k tm poskytne pslun pstupov metody. Ostatn jsou jej soukromou zleitost.

    Ve, co chceme deklarovat jako soukromou vc tdy, oznaujeme modifiktorem private. Dohodnme se, e vechny atributy budeme oznaovat vdy jako private. Jedinou vjimkou mohou bt konstanty, protoe ty nem stejn nikdo anci nijak zmnit.

    Vynechm-li kvli spoe msta dokumentan komente (v programu je vak nevynechvej-te), mohla by definice tdy Smrk s potebnmi atributy a temi ve popsanmi konstruktory vy-padat nap. takto:

    public class Smrk { //== ATRIBUTY INSTANCI ========================================================= private Trojuhelnik horni; private Trojuhelnik stredni; private Trojuhelnik dolni; //== KONSTRUKTORY ============================================================== public Smrk( int x, int y, int sirka, int vyska ) { horni = new Trojuhelnik( x+sirka/5, y, 3*sirka/5, 3*vyska/7 ); stredni=new Trojuhelnik( x+sirka/10, y+vyska/7, 4*sirka/5, 4*vyska/7 ); dolni = new Trojuhelnik( x, y+2*vyska/7, sirka, 5*vyska/7 ); }//public Smrk( int x, int y, int sirka, int vyska ) public Smrk( int x, int y ) { this( x, y, 50, 70 ); }//public Smrk( int x, int y ) public Smrk() { this( 0, 0, 50, 70 ); }//public Smrk() }//public class Smrk

    Nyn tdu pelote a nechte zkonstruovat jednu jej instanci. Kdy v mstn nabdce tto instance zadte pkaz Prohlet, oteve se znm prohlec okno a v nm se opravu objev ony ti atributy, kter jsme ve td definovali. Jak vidte, dokonce se o nich dozvme, e jsou soukrom (private) a e jsou instancemi typu Trojuhelnik.

    Protoe jsou tyto atributy instancemi objektovho typu, neuke se nm dn hodnota, jak jsme tomu byli zvykl u celch sel, ale prohle nm pouze oznm, e obsahem atributu je odkaz na objekt. My se vak meme na tento objekt podvat zblzka. Jakmile toti klepnete na nkter z objektovch atribut, obivne vpravo tlatko Prohlet (viz obr. 2.10) a po stisknut tohoto tlat-ka se oteve okno prohlee, kter nm umon do trob danho atributu nahldnout.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 18 z 41

  • 2.8. Definice atribut Strana 19 z 41

    Obrzek 2.10: Prohlen instance s atributy objektovch typ.

    kol 1: Otevete prohlec okna pro vechny trojhelnky, z nich je stromek sestaven, a ovte, e hodno-ty jejich atribut odpovdaj tomu, co jsme zadvali v konstruktoru.

    kol 2: Definujte atributy i pro svoje tdy Snehulak, Domek a Panak a upravte pslun i konstruktory. Nechte pak vytvoit instance tchto tdy a prohldnte si jejich atributy.

    Mon dsledky zveejnn atribut

    Jak jsem ekl, vechny atributy by mly bt deklarovny jako soukrom. Ukame si, co by se mohlo stt, kdyby tomu tak nebylo. Zmte nap. deklaraci hornho trojhelnka a oznate jej jako veejn. Tdu znovu pelote, vytvote jej instanci a podvejte se na ni prohleem. Klepnte nyn na horn trojhelnk. Vpravo se rozsvt nejenom tlatko Prohlet, ale tak tlatko Zskat odkaz (viz obr. 2.11).

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 19 z 41

  • 2.9. Definujeme vlastn metodu Strana 20 z 41

    Obrzek 2.11: Prohle um pedat odkaz na veejn atribut objektovho typu

    Stisknte toto tlatko a v zsobnku odkaz se objev nov odkaz nazvan horni. Nyn otevete mstn nabdku tohoto odkazu a zadejte nap. pkaz posunVpravo(). Vrchn st stromku, na jej in-stanci odkaz vede, se poslun pesune poadovanm smrem. Mete ji samozejm zadat jakko-liv jin pkaz (nap. sma) a ona poslechne.

    Pedpokldm, e mon dsledky zveejnn atribut jsou z tohoto pkladu jasn. Protoe je atribut veejn, me k nmu pistupovat kdokoliv. Je pln jedno, zda nevhodnou manipulac s atributem pokod vai instanci zmrn nebo omylem dsledkem bude pokozen instance.

    2.9 Definujeme vlastn metodu

    Vm, e nzev tto sti zcela nesed, protoe jsme ji vlastn metodu definovali (konstruktor je tak peci tak metoda, i kdy zvltn), ale vm, e pochopte, co jsem jm chtl ci. Zkusme si defi-novat vlastn metodu instance.

    Dohodnme se, e pro n stromek nebudeme definovat dn pstupov metody k jednotlivm trojhelnkm, protoe pro to nemme dn dvod. Nen pro nkomu umoovat zskat odkaz na nkter z trojhelnk, ani tento trojhelnk zmnit.

    Prvn metodu, kterou bychom mli pro n stromek definovat, je metoda kresli(), protoe ji vtina ostatnch metod bude potebovat. Jej definice bude jednoduch: nem dn parametry ani nic nevrac, take bude mt jednoduchou hlaviku, a dky jednoduchosti na instance i jednoduch tlo:

    /** * Nakresli stromek na platno. */ public void kresli() {

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 20 z 41

  • 2.9. Definujeme vlastn metodu Strana 21 z 41

    horni.kresli(); stredni.kresli(); dolni.kresli(); }//public void kresli()

    V tle metody si vimnte, jak se v programu zapisuje pkaz k zasln zprvy njak instanci: nap-e se nzev promnn, v n je uloen odkaz na tuto instanci, za nzev se nape teka, za teku n-zev metody realizujc reakci na danou zprvu a za nzev pak kulat zvorky se seznamem hodnot pedvanch parametr (volme-li bezparametrickou metodu, budou zvorky przdn). Cel pkaz ukonme stednkem.

    kol: Definujte k tto metod doplkovou metodu Smaz().

    Konstruktory s parametry jsme ji zvldli, take jist zvldneme i bn metody s parametry. Ukame si nap. definici metody posunVpravo(int).

    Cel smrk bychom mohli posunout tak, e bychom postupn posunuli jednotliv trojhelnky. Vyvolte-li vak posun trojhelnk od hornho ke spodnmu, zjistte, e stromek vypad po men-m posunut divn. Je to proto, e trojhelnk se pi posunu nejprve smae a pak se nakresl v nov pozici. Pi tomto mazn (nakresl se barvou pltna) pak me zniit obrzek hornho trojhelnku. Prohodme-li ale poad voln jednotlivch posun, bude ve v podku.

    /** * Posune stromek o zadany pocet bodu vpravo, * pri zapornem parametru vlevo. * * @param n pocet bodu, o ktere se smrcek posune */ public void posunVpravo( int n ) { dolni.posunVpravo( n ); stredni.posunVpravo( n ); horni.posunVpravo( n ); //Pri vodorovnem posunu nemuze odmazani horniho patra // poskodit dolni patro => neni treba nic znovu kreslit }//public void posunVpravo( int n )

    Dovolil bych si vs upozornit na zmnku o parametru, kter se objevuje v dokumentanm koment-i. Znovu pipomnm: zvyknte si dsledn zadvat dokumentan komente i se vemi vyhlao-vanmi parametry.

    kol 1: Doplte definici metody posunDolu(int). Myslete vak na to, e po nkterch posunech bude teba nco znovu nakreslit.

    kol 2: Doplte obdobn definice i pro svoje tdy Snehulak, Domek a Panak.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 21 z 41

  • 2.10. Kvalifikace a klov slovo this Strana 22 z 41

    2.10 Kvalifikace a klov slovo this

    Nzev promnn nsledovan tekou je oznaovn jako kvalifikace metody, protoe ble uruje (kvalifikuje), o metodu se jedn, tj. kter instance je ta metoda (kter instanci poslme zprvu). Technicky vzato, volanou metodu musme mimo jin kvalifikovat i proto, e potebujeme, a y moh-la pracovat s atributy metodami dan instance, a kdybychom metodu nekvalifikovali, nebylo by jas-n, s mi atributy m pracovat.

    Nyn hned trochu vyvrtm to, co jsem prv ekl. Peklada toti v, e volat nekvalifikova-nou metodu instance je nesmysl, take pokud tak uinm, tj. pokud v programu zavolm nekvalifi-kovanou metodu instance, pokus se ji kvalifikovat tou instanc, jej metodu prv pekld. Poda--li se mu to, je spokojen. Nepoda-li se mu to, tj. nen-li tato metoda pro danou instanci definov-na, ohls chybu pekladu.

    Ukame si to na pkladu. V minul kapitole jsme definovali metodu posunVpravo(int). Aby byla souprava metod symetrick, zkusme doplnit i metodu posunVlevo(int). Vzhledem k tomu, e posun vlevo je zporn zadan posun vpravo, me bt een velice jednoduch:

    /** * Posune stromek o zadany pocet bodu vlevo, * pri zapornem parametru vpravo. * * @param bodu pocet bodu, o ktere se smrcek posune */ public void posunVlevo( int bodu ) { //Pro posun vlevo musime zadat zapornou hodnotu posunVpravo( -bodu ); }//public void posunVlevo( int bodu )

    Pkaz v tle metody bychom mohli pevyprvt: zavolej metodu posunVpravo(int) t instance, kterou j mm posunout vlevo.

    Situaci, kdy si peklada kvalifikaci domysl, oznaujeme jako implicitn kvalifikace, na rozdl od explicitn kvalifikace, pi n programtor kvalifikuje metodu (nebo jinou st programu) sm.

    ada programtor nerada vid pouvn nekvalifikovanch (pesnji implicitn kvalifikova-nch) atribut a metod a dv pednost dsledn explicitn kvalifikaci. K t slou klov slovo this, kter vdy zastupuje tu instanci, v jej metod toto klov slovo pouijeme. S pouitm kl-ovho slova this bychom pedchoz metodu zapsali:

    public void posunVlevo( int bodu ) { //Pro posun vlevo musime zadat zapornou hodnotu this.posunVpravo( -bodu ); }//public void posunVlevo( int bodu )

    Klov slovo this nm umouje kvalifikovat nejenom metody, ale i atributy. Pi definici metod s parametrem se nap. asto stane, e nm jako nejvhodnj nzev parametru pipad nzev atributu, jeho hodnotu tento parametr nastavuje. V definici metody je pak ale teba rozhodnout, o kter z obou objekt se v tom kterm ppad jedn.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 22 z 41

  • 2.11. Metody vracejc hodnotu Strana 23 z 41

    Peklada se rozhoduje podle hesla Bli koile ne kabt. Pi vbru objektu, kter dan identifiktor oznauje, d pednost parametru ped atributem, protoe parametr byl definovn pr-v tady v hlavice metody, kdeto atribut je definovn kdesi zcela mimo metodu.

    Budeme-li chtt peklada pesvdit, e v tomto ppad mme na mysli atribut, musme atri-but kvalifikovat klovm slovem this. Kdybychom v na td mli nap. atribut x, mohli bychom jeho nastavovac metodu definovat nsledovn:

    public void setX( int x ) { this.x = x; }//public void setX( int x )

    2.11 Metody vracejc hodnotu

    Tdy obrazc, s nimi jsme doposud pracovali, nabzely pro svoje atributy pstupov metody, kte-r umoovaly zjistit i nastavit jejich hodnotu. Podvejme se, jak bychom takov metody realizo-vali v na td Smrk.

    Jist budete souhlasit s tm, e by nebylo moudr nabdnout pstup k jednotlivm trojheln-km tvocm smrek. To by nm jej pak nkdo mohl pkn rozhodit. Mli bychom mu vak umo-nit zjistit aktuln polohu a velikost jednotlivch instanc, tj. jednotlivch smrk. K tomu potebu-jeme definovat metodu, kter bude vracet hodnotu. Takov metoda se od metod, kter jsme defino-vali doposud, li ve dvou vcech:

    ) )

    v hlavice m msto typu void uveden typ hodnoty, kterou vrac,

    ped ukonen innosti mus vrtit poadovanou hodnotu k tomu slou pkaz return, za kter napeme vraz, jeho hodnotu bude metoda vracet.

    Ukame si nap. jak bychom definovali metody, kter nm vrt aktuln pozici obrazce vykresle-nho danou instanc.

    /** * Vraci y-ovou souradnici celeho smrku. * * @return y-ova souradnice smrku */ public int getY() { //y-ova souradnice horniho trojuhelniku //je zaroven y-ovou souradnici celeho smrku return horni.getY(); }//public int getY()

    Pouit metod vracejcch hodnotu

    Metody vracejc hodnotu meme zavolat kdekoliv, kde budeme vracenou hodnotu potebovat. Kdy budete chtt nap. spotat plochu zabranou instanc, na n odkazuje promnn obrazec, spotete ji podle vzorce:

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 23 z 41

  • 2.12. Zapouzden Strana 24 z 41

    int plocha = obrazec.getSirka() * obrazec.getVyska();

    Kdy pota naraz na takovto vraz, zavol nejprve metodu obrazec.getSirka(), zapamatuje si vrcenou hodnotu, pak zavol metodu obrazec.getVyska(), opt si zapamatuje vrcenou hodnotu a ob zapamatovan hodnoty spolu vynsob. Vsledek pak ulo jako poten hodnotu prv defi-novan promnn plocha.

    Monosti dosadit za neznmou hodnotu voln metody, kter danou hodnotu zjist a vrt, meme vyut i pi vpotu vky celho smrku pslun metoda by mohla vypadat nap. nsle-dovn:

    /** * Vrati vysku celeho obrazce. * * @return vyska smrku */ public int getVyska() { //Vysku spoctu jako rozdil y-vych souradnic //spicky a spodni hrany smrku return dolni.getY()+dolni.getVyska() - horni.getY(); }//public int getVyska()

    2.12 Zapouzden

    Takto jsme vlastn definovali pstupov metody k atributm, kter vbec neuchovvme. To je ale relativn ast. Tvrci program se obas rozhodnou, e nkter atributy nestoj za to, aby si je in-stance pamatovaly, protoe je mon je vdy v ppad poteby dostaten rychle zjistit.

    Zvenku tdy, tj. pi voln jejch pstupovch metod, nemme anci zjistit, jestli tda uvnit pracuje se skutenmi a nebo s vypotanmi atributy. A to je dobe. Jednou ze zkladnch a velice cennch vlastnost objektov orientovanch program je schopnost tzv. zapouzden. Lidov by-chom mohli zapouzden charakterizovat heslem:

    Nikdo nesm mt anci zjistit nic o tom, jak to dlm, e umm to, co umm.

    Takto osamocen vyslovena vypad mon tato zsada neurvale, ale vte, e je to nejvce cenn vlastnost celho OOP. m jsou programy sloitj, tm je dleitj, abychom ani omylem ne-mohli ovlivnit chod nkter jin sti.

    V tto souvislosti se seznmme se dvma novmi termny:

    )

    )

    Rozhran tdy budeme chpat jako mnoinu informac, kter o sob tda zveejn. Mezi rozhran pat nap. ve, co tda ozna modifiktorem public.

    Implementace je zpsob, jak je tda naprogramovna.

    Do rozhran bychom mli zaadit pouze to, co ostatn sti programu o dan td opravdu mus v-dt. Kdy jsme napklad chtli, aby ostatn programy mohly nai tdu podat o vytvoen instan-ce, museli jsme zveejnit jej konstruktor. Budeme-li chtt, aby ostatn programy mohly zjistit, kde je prv dan smrk nakreslen, musme zveejnit metody, pomoc nich mohou tuto informaci zskat.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 24 z 41

  • 2.13. Lokln promnn Strana 25 z 41

    Ve, co sice k implementaci poadovanch funkc potebuji, ale o em se domnvm, e ostatn vdt nemus, oznam jako private. Nechci-li, aby ostatn sti programu mohly pohybovat jednotlivmi stmi smrku bez mho vdom, nesmm je k nim pustit oznam proto pslun atributy jako private.

    Poznmka: Mezi public a private existuj jet mezistupn, ale o tch si povme a si s objektovm pro-gramovnm trochu vce potykte.

    Do rozhran se nkdy potaj i informace, kter z hlaviek nevytete, ale kter by mly bt uvedeny v dokumentaci. Sem pat informace o dalch podmnkch, kter je teba dodret (nap. e zadva-n souadnice vytvenho tvaru mus bt vt ne 0, e instance metody Platno je jedinek apod.) o monch vedlejch efektech funkc (nap. co se stane, kdy obrazec vycestuje z pltna) a ada dalch dleitch sdlen. Tento souhrn informac bv oznaovn jako kontrakt.

    2.13 Lokln promnn

    Kdy jsme ji definovali metody, kter vracej hodnoty fiktivnch atribut, zkusme definovat meto-dy, kter hodnoty tchto atribut nastavuj. Definujme nap. metodu setRozmer(int,int).

    Protoe je n smrk sestaven z nkolika trojhelnk rznch velikost, nen pepoet jejich novch velikost prv jednoduch. Budeme pi nm navc potebovat pout nkter sla nkoli-krt. Bylo by proto vhodn definovat njak lokln promnn (Baltkovy koky), kam si bude-me ukldat mezivsledky.

    Lokln promnn se definuj naprosto stejn jako atributy. Jedinm rozdlem je, e se definu-j uvnit metod a e mimo jejich metodu o nich nikdo nev. Bude-li proto jin metoda definovat stejn pojmenovan lokln promnn, budou mon stejn pojmenovan, ale budou to naprosto ji-n promnn.

    Poznmka: Je to obdobn, jako kdy budete mt doma more pojmenovan Ferda (programtorsky: budete mt lokln promnnou Ferda typu More) a v kamard na druhm konci msta bude mt stej-n pojmenovan more. Ob jsou to morata, ob maj stejn jmno, ale nikdo nepedpokld, e nakrmte-li vaeho Ferdu, pestane mt kamardv Ferda hlad. Stejn pohlejte i na lokln promnn metod.

    Lokln promnn maj jet dv dleit vlastnosti:

    )

    )

    Ped jejich prvnm pouitm jim muste piadit njakou poten hodnotu. Neuinte-li tak, ohls peklada chybu, protoe odmt vytvoit program, kter by pracoval s njakm sme-tm, je by se zrovna nachzelo v pamti na mst, kter by pro danou promnnou vyhradil.

    Jakmile metodu opustte, promnn se zru a pi ptm sputn metody se znovu vytvo. Nen proto mon uchovvat v loklnch promnnch cokoliv, co si potebujeme pamatovat mezi jednotlivmi volnmi dan metody. K tomu muste pout atributy.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 25 z 41

  • 2.14. Atributy tdy (statick atributy) Strana 26 z 41

    Take nyn u vechno vme a meme zat programovat:

    /** * Nastavi novy rozmer stromku na platne. * * @param s nova sirka smrku * @param v nova vyska smrku */ public void setRozmer( int s, int v ) { //Zmenou velikosti celeho smrku se meni i pozice //jeho jednotlivych casti - je treba nastavit obe //Pri nastavovani muzeme vyjit z definice kontruktoru //Pripravime si casto pocitane vyrazy int s5 = s/5; int v7 = v/7; int x = getX(); int y = getY(); //Spocteme a nastavime novou pozici jednotlivych casti horni.setPozice ( x + s5, y ); stredni.setPozice( x + s/10, y + v7 ); dolni.setPozice ( x, y + v7*2 ); //Spocteme a nastavime definitivni podobu casti horni.setRozmer ( 3 * s5, 3 * v7 ); stredni.setRozmer( 4 * s5, 4 * v7 ); dolni.setRozmer ( s, 5 * v7 ); //Pri odmazavani dolnich dilu se muze umazat kus hornich horni.kresli(); stredni.kresli(); }//public void setRozmer( int s, int w )

    kol 1: Definujte pro tdu Smrk2 jet metodu setPozice(int,int).

    kol 2: Definujte ob metody i pro svoje tdy Snehulak, Domek a Panak.

    2.14 Atributy tdy (statick atributy)

    Kdy jsme si v minul kapitole hrli s geometrickmi obrazci, ukazovali jsme si, e kad z nich poskytuje metody, kter mohou pohnout se zadanm obrazcem o pedem zadan poet bod. Tento poet byl uloen v atributu tdy nazvanm krok.

    Terminologick poznmka: Chceme-li ve zdrojovm kdu definovat njak atribut jako atribut tdy, pidme mezi jeho modifiktory modifiktor static. To ve. Vzhledem k tomuto klovmu slovu v deklaraci b-vaj atributy tdy asto oznaovny jako statick atributy a atributy instanc jako nestatick atributy. Protoe se tento termn oproti termnu atributy tdy lpe sklouje, budu jej v dalm textu asto pouvat.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 26 z 41

  • 2.15. Metody tdy (statick metody) Strana 27 z 41

    Na rozdl od atribut instanc, kter meme inicializovat bu pmo v deklaraci nebo pozdji v konstruktoru, pro inicializaci atribut tdy prozatm dn konstruktor neznme (existuje, ale do zatenickch kurz peci jenom nepat). Zbv nm tedy prozatm pouze inicializace v deklaraci.

    Natst to vak nen dn velk omezen, protoe inicializovat meme i volnm njak metody, kter potebnou hodnotu nejprve spot. U statickch atribut si proto meme pomoci metodou, je bude potebnou hodnotu vracet.

    V naich souasnch pkladech prozatm takovto zpsob inicializace nepotebujeme, proto-e vystame s inicializac pomoc pevnch hodnot. A ji budeme potebovat, tak vm to jet pi-pomenu.

    kol 1: Doplte tdu Smrk o atribut krok, kter bude obsahovat poet bod, o kter se obraz smrku posu-ne po zavoln bezparametrickch verz posunovch metod, a nadefinujme si hned metodu posun-Vlevo().

    //== ATRIBUTY TRIDY ============================================================ private static krok = 50; //== OSTATNI METODY INSTANCI =================================================== /** * Posune obrazek smrku o krok bodu vlevo. */ public void posunVlevo() { //Pro posun vlevo musime zadat zapornou hodnotu posunVpravo( -krok ); }//public void posunVlevo()

    kol 2: Doplte tdu Smrk2 o metody posunVpravo(), posunNahoru() a posunDolu().

    kol 3: Doplte statick atribut a bezparametrick posunov metody i do svch td Snehulak, Domek a Panak.

    2.15 Metody tdy (statick metody)

    Stejn jako atributy tdy existuj i metody tdy. Jejich vhodou je, e je meme zavolat jet ped tm, ne vznikne jej prvn instance. Slou proto asto k pprav prosted, ve kterm nsledn in-stance vznikne, ppadn k definici metod, kter nejsou na dnou instanci vzny (takto je nap. definovna vtina matematickch funkc). Jako metody tdy se (samozejm) definuj tak pstu-pov metody atribut tdy (i ty meme nap. st a nastavovat jet ped tm, ne vznikne prvn in-stance dan tdy).

    Poznmka: Ped chvilkou jsme si vysvtlovali, e atributy tdy meme inicializovat i prostednictvm vo-

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 27 z 41

  • 2.15. Metody tdy (statick metody) Strana 28 z 41

    ln metod. Protoe se tyto atributy inicializuj jet ped tm, ne se tda poprv pouije, mu-sme k jejich inicializaci pout statickch metod, protoe jedin ty meme volat jet ped tm, ne vznikne jakkoli v instance.

    kol 1: V na td Smrk i ve vaich tdch Snehulak, Domek a Panak ji je definovn statick atribut krok. Definujme pro nj pstupovou metodu getKrok():

    /** * Vraci velikost kroku, o kterou se posune obrazek smrku * pri volani bezparametrickych posunovych metod. * * @return velikost kroku v bodech */ public static int getKrok() { return krok; }//public static int getKrok()

    kol 2: Doplte stejnojmennou metodu do svch td Snehulak, Domek a Panak.

    Upozornn: Jak jsem ekl, metody tdy nezvisej na dn instanci a meme je volat jet ped tm, ne prvn instance vznikne. Je proto logick, e v metodch tdy nememe pouvat atributy a metody instanc, pesnji eeno atributy a metody instanc kvalifikovan implicitn nebo ex-plicitn klovm slovem this. Peklada toti nem dnou informaci o tom, kter instance by se v danm okamiku mohla za this skrvat.

    Nic nm vak nebrn vytvoit uvnit metody novou instanci a volat pak jej metody, pro-toe ty ji meme kvalifikovat konkrtn, existujc instanc. Nkdy si to ukeme.

    Kvalifikace atribut a metod tdy

    I metody tdy je poteba kvalifikovat, protoe i u nich peklada potebuje vdt, metodu pekl-d, aby se pak mohl obrtit na sprvn atributy. Meme je sice kvalifikovat instanc, ale jak jsme si ped chvl ekli, metody tdy je mono volat jet ped vznikem prvn instance (nap. k tomu, abych nastavil velikost kroku pi voln bezparametrickch posunovch metod dnou instanci ne-potebuji). Pro jejich kvalifikaci nememe pout ani klov slovo this, protoe i to je uren k zskn odkazu na instanci.

    Jak si jist domyslte, onou instanc, jej atributy a metody definovan td slou, je vlastn cel tda. Asi vs proto nijak nepekvap, kdy vm prozradm, e metody tdy je mon kvalifi-kovat nzvem tdy. Odtud by pak ji mlo bt ve jasn.

    Pokud byste tedy nap. chtli ve svm programu zskat pltno, abyste je mohli o nco podat, zadte pkaz:

    Platno platno = Platno.getPlatno();

    Tento pkaz definuje novou promnnou (mon atribut, mon lokln promnnou to bychom poznali a podle okolnho programu), kter je odkazem na instanci tdy Platno a jmenuje se plat-

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 28 z 41

  • 2.15. Metody tdy (statick metody) Strana 29 z 41

    no. V jej deklaraci ji ihned piazujeme poten hodnotu, kterou zskme tak, e zavolme meto-du getPlatno(), kter je (jak ji vme) metodou tdy Platno a vrac odkaz na jej jedinou instanci.

    Ukame si, jak bychom mohli takovouto promnnou pout v programu. Pedpokldejme, e mme ve td definovanou metodu setBarva(String) (tu byste urit pro smrk i snhulka defi-novat dokzali prost nastavte pro vechny trojhelnky, resp. elipsy zadanou barvu). Definujme metodu schovejVPozad(), kter pebarv danou instanci na barvu pozad pouitho pltna. Defini-ce by mohla vypadat nsledovn:

    /** * Prebarvi obrazek smrku barvou pozadi platna. */ public void schovejVPozadi() { //Metodu tridy kvalifikujeme tridou Platno platno = Platno.getPlatno(); //Metodu instance kvalifikujeme instanci String pozadi = platno.getBarvaPozadi(); horni.setBarva( pozadi ); stredni.setBarva( pozadi ); dolni.setBarva( pozadi ); }//public void schovejVPozadi()

    Nzvem tdy meme kvalifikovat nejenom metody tdy, ale i jej atributy. Ukame si to na p-kladu metody setKrok(int), jej parametr bude mt stejn nzev jako nastavovan atribut tdy:

    /** * Nastavi novou velikost kroku, o kterou se posune obrazek * smrku pri volani bezparametrickych posunovych metod. * * @param krok nastavovana velikost kroku v bodech */ public static void setKrok( int krok ) { //Atribut krok kvalifikujeme nzvem tridy Smrk.krok = krok; }//public static void setKrok( int krok )

    Poznmka: Peklada nen dn hlupk. Objev-li v kdu nekvalifikovan odkaz na atribut nebo metodu tdy, nebude se je samozejm pokouet hloup kvalifikovat klovm slovem this, jak to dlal u atribut a metod instanc, ale rozumn se je pokus kvalifikovat nzvem tdy, v jejm tle se dan kd nachz.

    Kdybychom tedy v pedchoz metod pouili parametr k a piazovac pkaz ml tvar: krok = k;

    peklada by identifiktor krok iniciativn kvalifikoval jako Smrk.krok, co je to, co jsme chtli.

    kol: Doplte stejnojmennou metodu do svch td Snehulak, Domek a Panak.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 29 z 41

  • 2.16. Konstanty a literly Strana 30 z 41

    2.16 Konstanty a literly

    V programech asto pouvme nejrznj magick hodnoty, kter se v prbhu programu ne-mn. Budeme-li chtt nap. pracovat s potem dn v tdnu, budeme neustle pouvat slo 7. Pro-blm nastane, kdy se pi nkter z pozdjch prav rozhodneme, e msto potu dn v celm td-nu bude pro n program vhodnj pouvat pouze poet pracovnch dn, tj. 5 (alespo prozatm to tak je). Takov prava pak znamen prolzt cel program a vechny sedmiky nahradit ptkami.

    Ji samotn tato pedstava je dostaten nepjemn. Non mrou se ale stane, pokud je pro-gram opravdu rozshl a navc je v nm ada rznch sedmiek nkter sedmiky budou nap. znamenat, e v ervenci zanaj przdniny a dal sedmiky budou oznamovat, e pracujeme od 7 hodin rno.

    Rozumn programtoi proto takovto magick hodnoty zsadn nepouvaj a dvaj pednost pojmenovanm konstantm. Ty se v Jav definuj stejn jako promnn, pouze se mezi jejich modi-fiktory uvede klov slovo final.

    Konstantm meme piadit hodnotu pouze jednou a ji nikdy ji nememe zmnit:

    ) )

    statickm konstantm piadme jejich hodnotu hned v deklaraci,

    nestatickm konstantm, kter nemaj svoji hodnotu piazenou v deklaraci, musme piadit hodnotu v konstruktoru.

    Terminologick poznmka: Tyto magick hodnoty se oznauj jako literly. Literl je konstanta zapsan svoji hodnotou nap. 7 (celoseln literl), "Ahoj" (etzcov literl) apod. Naproti tomu konstanty, o nich jsme prv hovoili, se oznauj jako pojmenovan konstanty, protoe ve sv definici dostanou jmno, kterm se na n v programu odvolvme.

    Budu-li v dalm textu hovoit o konstantch, bud tm vdy myslet pojmenovan konstan-ty. Pokud bych chtl hovoit o literlech, vdy to vslovn uvedu.

    Poznmka o dobrch mravech: Z selnch literl se doporuuje pouvat pouze hodnoty 0 a 1. Ostatn hodnoty je lepe defi-novat jako pojmenovan konstanty. Dokonce i nuly a jedniky se maj pouvat pouze v situa-cch, kdy tyto hodnoty neoznauji nic, co by se mohlo v nkter z ptch verz programu zm-nit nap. v souasn dob mm jen jedno kolo (auto, penenku, manelku, ), ale doku si pedstavit situaci, kdy se tato jednika zmn.

    Obdobn etzcov literly je vhodn pouvat pouze v situacch, kdy se dan etzec po-uije pouze jednou (nap. v chybovm hlen). Chcete-li vak program lokalizovat do vce ja-zyk, je vhodn i jednou pouit textov etzce pojmenovat a definovat vechny na jednom mst, kde je lze snadno nahradit jejich peklady.

    Rozime poet konstruktor smrku o konstruktor, kter umon zadat i jeho barvu. Definujme pi-tom konstantu BARVA_0, v n bude uchovna implicitn barva smrku, kterou pouijeme ve chvli, kdy nebude jeho barva zadna. Potek programu s pslunou konstantou a konstruktory by mohl vypadat nsledovn (dokumentan komente a dve definovan metody a atributy pro sporu msta opt vynechvm):

    public class Smrk

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 30 z 41

  • 2.17. Pedn parametru objektovho typu Strana 31 z 41

    { //== VEREJNE KONSTANTY ========================================================= public static final String BARVA_0 = "zelena"; // ... preskoceno ... //== KONSTRUKTORY ============================================================== public Smrk( int x, int y, int s, int v, String b ) { horni = new Trojuhelnik( x+s/5, y, 3*s/5, 3*v/7, b ); stredni=new Trojuhelnik( x+s/10, y+v/7, 4*s/5, 4*v/7, b ); dolni = new Trojuhelnik( x, y+2*v/7, s, 5*v/7, b ); }//public Smrk( int x, int y, int sirka, int vyska, String Barva ) public Smrk( int x, int y, int sirka, int vyska ) { this( x, y, 50, 70, BARVA_0 ); }//public Smrk( int x, int y, int sirka, int vyska ) // ... preskoceno ... }// public class Smrk

    Jak jste si jist vimli, definoval jsem konstantu jako veejnou. Kdy jsme se bavili o zapouzden, kal jsem, e atributy maj bt soukrom a e veejn mohou bt pouze konstanty, kter nikdo ne-me zmnit. Nyn ten ppad nastal. Protoe se domnvm, e konstantu BARVA_0 me okol za jistch okolnost vyut, definoval jsem ji jako veejnou.

    Poznmka: Jako nemnn lze povaovat seln, logick a etzcov konstanty. U konstant objektovch ty-p to vak nemus platit. Kdybychom nap. oznaili atribut horni za konstantu, znamenalo by to, e se nemn hodnota atributu, tj. e odkazuje stle na stejnou instanci. Nijak tm ale neo-vlivnme to, co se dje s danou instanc (jestli s n nap. nkdo nehbe). Zvr: Nedeklarujte atributy objektovch typ (s vjimkou konstant typu String) jako veejn alespo do doby, ne se naute zabezpeit, aby s nimi nikdo nemohl dlat nepravosti.

    kol: Doplte do tdy Smrk2 konstantu BARVA_0 spolu s metodami getBarva() a setBarva(String).

    2.17 Pedn parametru objektovho typu

    Poznmka: Tato podkapitola by teoreticky patila jet do prvn kapitoly, kde jsme si ukazovali, co ve nm prosted BlueJ nabz. Tehdy mne vak jet nenapadl pklad, jak vm monost pedn para-metru objektovho typu ukzat. Pitom stailo nap. ukzat, jak bychom jednomu geometrick-mu tvaru piadili barvu jinho geometrickho tvaru. Omlouvm se a ji to napravuji.

    Zkusme n smrk pebarvit a pak mu opt vrtit implicitn barvu, kter je uchovvna v konstant BARVA_0 (pesnji eeno v etzci, na nj tato konstanta odkazuje). Provdjte se mnou:

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 31 z 41

  • 2.17. Pedn parametru objektovho typu Strana 32 z 41

    1. Zite novou instanci tdy Smrk.

    2. Zavolnm metody setBarva( "cerna" ) smrk pebarvte.

    3. Otevete pro instanci smrku okno prohlee (nap. zadejte v mstn nabdce odkazu na instan-ci pkaz Prohlet).

    4. Klepnte v okn prohlee na dek s konstantou a stisknte pot tlatko Zskat odkaz (viz obr. 2.12). V zsobnku odkaz se objev odkaz na nai etzcovou konstantu.

    Obrzek 2.12: Zskn odkazu na konstantu objektovho typu

    5. Zavolejte znovu metodu setBarva(String), klepnte do vstupnho pole pro zadn parametru a pak v zsobnku odkaz klepnte na odkaz na konstantu BARVA_0 odkaz na instanci se penese do vstupnho pole (viz obr. 2.13).

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 32 z 41

  • 2.18. Dokumentace Strana 33 z 41

    Obrzek 2.13: Pedej odkaz jako parametr

    6. Potvrte sv zadn stiskem OK a pesvdete se, e se stromek opt vybarvil implicitn bar-vou.

    2.18 Dokumentace

    Konme kapitolu o zkladech kdovn definic td, jejich atribut a metod. Na potku kapitoly jsem vm slbil, e se na konci jet jednou vrtm k otzce dokumentace. Ukeme si, jak pro-stedky nm Java nabz k tomu, abychom s relativn minimln nmahou mohli vytvet pomrn efektn a profesionln vyhlejc dokumentaci svch vtvor.

    Ji jsme si ekli, e rozbalte-li v okn editoru seznam na pravm okraji panelu s tlatky a vyberete-li msto dosavadn poloky Implementace (zdrojov kd) poloku Dokumentace (popis rozhran) (viz obr. 2.14), objev se v okn editoru msto kdu jeho dokumentace (viz obr. 2.15).

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 33 z 41

  • 2.18. Dokumentace Strana 34 z 41

    Obrzek 2.14: Pepnut editoru na zobrazen dokumentace

    Pi prvnm pokusu to bude sice chvilku trvat, protoe BlueJ mus nejprve zavolat program javadoc, kter je soust JDK a kter z vaich dokumentanch koment vyrob HTML soubor efektn dokumentujc vai tdu. Pi ptm pepnut bude ji ve okamit (samozejm nezmnte-li mezi tm kd tdy).

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 34 z 41

  • 2.18. Dokumentace Strana 35 z 41

    Obrzek 2.15: Vytvoen dokumentace tdy

    Projdte si postupn celou dokumentaci a podvejte se, jak se jednotliv informace zadvan do do-kumentanch koment promtnou do vsledn dokumentace tdy. Ta je rozdlena do nkolika sekc:

    )

    )

    )

    Nejprve je tda pedstavena. Informace, kter lze vyst z tto sti, ocente po peten dal-ch dvou kapitol. Prozatm si zapamatujeme, e zde nalezneme jmno tdy.

    Do nsledujc sti se zkopruj informace z dokumentanho komente ped hlavikou t-dy. Pitom informace zadan za znakami @version a @author dostanou sv vlastn nadpisy.

    Ve tet sti je uveden seznam atribut. Tato st v na dokumentaci chyb, protoe jsme vechny atributy prohlsili za soukrom, take je program do dokumentace nezahrnul, protoe do nich nikomu nic nen. (Kdybychom vak chtli vytvet dokumentaci pro intern potebu,

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 35 z 41

  • 2.18. Dokumentace Strana 36 z 41

    mohli bychom program podat, aby do dokumentace zahrnul ve, vetn soukromch atribu-t a metod.)

    Budete-li se chtt podvat, jak by tato st vypadala, zkuste u njakho atributu smazat modifiktor private a nechte vytvoit dokumentaci znovu.

    )

    )

    )

    )

    )

    )

    tvrt st obsahuje pehled definovanch konstruktor. Vimnte si, e do tabulky je opsna hlavika (modifiktor public se vynechv) a z dokumentanho komente je do tabulky pevzata vdy prvn vta (pesnji st textu k prvn tece). Potejte s tm proto ve svch ptch komentch a pokuste se shrnout vechny dleit informace v prvn vt.

    Ptou st tvo tabulka definovanch metod seazench abecedn. V levm sloupci je vdy uveden typ nvratov hodnoty a ppadn modifiktory (public se opt vynechv), v prav sti je stejn jako u konstruktor opsn zbytek hlaviky a prvn vta dokumentace.

    Za tabulkou definovanch metod nsleduje tabulka se seznamem metod, kter tda zddila od svch pedk. K tto sti se jet vrtme, a si budeme povdat o ddinosti.

    Sedm st se podrobn vnuje jednotlivm nesoukromm atributm. Protoe v na td ta-kov nejsou, bude v dokumentaci opt vynechna. (Odstrante-li ped vytvoenm dokumen-tace u atribut modifiktor private, atributy se zde objev. Protoe jsme k nim ale dn do-kumentan komente nenapsali, najdete zde pouze jejich modifiktory, typ a nzev.

    Osm st se podrobn vnuje konstruktorm. U kadho konstruktoru je zde opsna cel hlavika a cel dokumentan koment. M-li konstruktor parametry a byl-li k nim vytvoen patin koment za znakou @param, objev se v sekci nadepsan Parameters:.

    Posledn devt st se podrobn vnuje definovanm metodm. Stejn jako u konstruktoru je zde u kad metody opsna jej hlavika nsledovan kompletnm dokumentanm koment-em.

    ) U funkc s parametry zde naleznete speciln sekci nadepsanou Parameters: do n jsou opsny komente zapsan za znakou @param,

    ) u funkc vracejcch njakou hodnotu sekci nadepsanou Returns:, do n se ope ko-ment zadan za znakou @return.

    Jednotliv sti dokumentace jsou spolu provzan hypertextovmi odkazy. Klepnete-li v tabulce atribut, konstruktor nebo metod na nzev vybranho objektu, pesunete se automaticky do sekce, kde si mete pest jeho podrobnou dokumentaci.

    To vak stle jet nen vechno. BlueJ je schopen za vs vytvoit dokumentaci nejenom k jednotlivm tdm, ale i k celmu projektu. Vytvo ji navc tak, abyste ji mohli samostatn prohl-et v njakm webovm prohlei, ani byste museli pt otevrat BlueJ. Postup je jednoduch.

    Vrate se do aplikanho okna projektu a zadejte pkaz Nstroje Dokumentace projektu:

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 36 z 41

  • 2.18. Dokumentace Strana 37 z 41

    Obrzek 2.16: Pkaz k vytvoen dokumentace projektu

    Tmto pkazem dte BlueJ, aby vytvoil dokumentaci ke vem tdm zahrnutm v projektu. BlueJ vytvo sadu html strnek, kter umst v podsloce doc a oteve hlavn strnku tto sady ulo-enou v souboru index.html. Tato strnka je rozdlena na dv sti: v lev najdete seznam definova-nch td a v prav se objev dokumentace t tdy, na kterou v levm sti klepnete. Zrove vm v horn sti nabz nkolik dalch uitench odkaz, z nich prozatm vyuijete pouze Index (ne-budu jej popisovat, vyzkouejte si jej).

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 37 z 41

  • 2.19. Shrnut co jsme se v kapitole nauili Strana 38 z 41

    Obrzek 2.17: Dokumentace celho projektu

    Ulote-li si tuto strnku mezi sv oblben webov strnky, budete ji moci otevt kdykoliv si vzpomenete nezvisle na tom, mte-li zrovna oteven BlueJ i nikoliv.

    2.19 Shrnut co jsme se v kapitole nauili )

    )

    ) ) )

    )

    )

    Nov tda se vytvo klepnutm na tlatko Nov tda a zadnm nzvu tdy v nsledn oteve-nm dialogovm okn.

    Velbloud notac oznaujeme zpsob zpisu, pi nm se nkolikaslovn nzev pe bez me-zer jako jedno slovo piem kad slovo nzvu zan velkm psmenem a ostatn psmena jsou mal nap. StrPrtstSkrzKrk.

    Nzvy td peme velbloud notac s prvnm psmenem velkm.

    Nzvy atribut, promnnch a metod peme velbloud notac s prvnm psmenem malm.

    Zdrojov kd tdy je uloen v souboru, kter m stejn nzev jako tda (mus se dodret i velikost psmen) m pponu .java.

    Jazyk Java pouv dva druhy koment: obecn, kter je ohranien komentovmi zvor-kami /* a */, a dkov, kter zan znaky // a kon spolu koncem dku.

    Koment meme napsat kdekoliv, kde meme napsat mezeru.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 38 z 41

  • 2.19. Shrnut co jsme se v kapitole nauili Strana 39 z 41

    )

    )

    ) )

    )

    ) )

    ) )

    )

    )

    ) ) )

    )

    )

    )

    )

    Obecn koment zanajc znaky /** je chpna jako dokumentan. Zapisuj se do nj in-formace uiten pro budouc uivatele dan tdy, metody, konstanty

    Dokumentan komente musme napsat tsn ped dokumentovanou konstrukci (tdu, atri-but, metodu).

    Dokumentan komente mohou vedle prostho textu obsahovat i HTML znaky (tagy).

    Java zavd nkolik specilnch znaek zanajcch znakem @, kter slou k lepmu po-pisu nkterch rys dokumentovanch konstrukc, nap. parametr i nvratovch hodnot do-kumentovanch metod.

    Novou tdu vytvome stiskem tlatka Nov tda a vyplnnm nsledn otevenho dialogov-ho okna.

    Tdu odstranme zadnm pkazu Odstranit v mstn nabdce tdy.

    Definice tdy sestv z hlaviky a tla. Hlavika obsahuje modifiktory ble specifikujc vlastnosti tdy (prozatm znme jen modifiktor public), klov slovo class a nzev tdy. Tlo nsleduje za hlavikou, je uzaveno ve sloench zvorkch a obsahuje definice vech atribut a metod dan tdy.

    Po kad prav se mus tda ped svm prvnm sputnm peloit.

    Objev-li peklada pi pekladu njakou chybu, oznm nm to ve spodnm, informanm poli okna editoru.

    Nen-li nm vznam chyby zejm, meme podat o npovdu stiskem tlatka s otaznkem na pravm kraji informanho pole.

    Definice konstruktoru sestv z hlaviky a tla. Hlavika obsahuje modifiktory nsledovan nzvem konstruktoru, kter je shodn s nzvem tdy, a seznamem parametr uzaven v ku-latch zvorkch.

    M-li bt konstruktor viditeln zvenku tdy, ozname jej modifiktorem public.

    Nem-li konstruktor dn parametry, budou zvorky za jeho nzvem przdn.

    Parametr deklarujeme tak, e uvedeme jeho typ (u objektovch parametr uvedeme tdu, na jej instanci odkazuj) nsledovan jeho nzvem (identifiktorem), prostednictvm nj se k nmu budeme v tle konstruktoru obracet.

    Je-li pro ns vhodn zavolat v konstruktoru jin konstruktor te tdy, zavolme jej tak, e napeme klov slovo this nsledovan seznamem parametr.

    Voln konstruktoru this mus bt pln prvnm pkazem tl konstruktoru ped nm smj bt ji pouze mezery a komente.

    Pro pesn zpis pravidel, podle nich se vytv (zapisuje) vysvtlovan konstrukce, pou-vme syntaktick definice.

    Atributy definujeme v tle tdy, avak mimo tla jejich metod.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 39 z 41

  • 2.19. Shrnut co jsme se v kapitole nauili Strana 40 z 41

    )

    ) )

    )

    ) )

    )

    )

    )

    ) )

    )

    ) )

    )

    )

    )

    Definice atribut sestv se seznamu modifiktor nsledovanho typem definovanho atribu-tu a jeho identifiktorem (nzvem) a ppadnm piazenm poten hodnoty.

    Atributy s vjimkou konstant, kter nen mon zmnit, oznaujeme modifiktorem private.

    U td rozeznvme jejich rozhran, tj. to, co o sob tda zveejn a na co se mohou jej uiva-tel spolehnout, a implementaci, tj. to, jak tda zad, e um to, co vyhlsila v rozhran. Im-plementan detaily bychom mli ped okolm skrvat, aby nebylo mono funknost tdy a jejch instanc ohrozit.

    Definice metody sestv z hlaviky a tla. Hlavika obsahuje modifiktory nsledovan ty-pem nvratov hodnoty, nzvem metody a seznamem parametr uzavenm v kulatch z-vorkch.

    Metody, kter nic nevrac, maj jako typ nvratov hodnoty uveden typ void.

    Pouit metody a atributy musme vdy kvalifikovat, tj. napsat ped n nzev odkazu na in-stanci (u atribut a metod tdy meme pout nzev tdy), o jej metodu nebo atribut se jedn.

    Kvalifikaci meme vynechat pouze v ppad, kdy se na danou metodu i atribut obracme v metod instance (tdy), na jej metodu i atribut se obracme.

    Chceme-li zdraznit, e se obracme na atribut i metodu t instance, jej metodu prv defi-nujeme, kvalifikujeme ji klovm slovem this.

    V ppad poteby meme uvnit metody definovat lokln promnn. Definice mus obsa-hovat typ promnn (u objektovch typ tdu instance, na n bude promnn odkazovat), identifiktor (nzev) a ppadn i piazen poten hodnoty.

    Lokln promnnou nelze pout, dokud se j nepiad njak hodnota.

    Po ukonen metody jsou vechny jej lokln promnn ztraceny. Potebuje-li si metoda nco pamatovat mezi svmi sputnmi, mus si to uloit do njakho atributu.

    Atributy a metody tdy definujeme tak, e mezi jejich modifiktory uvedeme klov slovo static.

    Atributy a metody tdy bvaj asto oznaovny jako statick.

    M-li bt hodnota atributu nemnn (konstantn), uvedeme mezi jeho modifiktory klov slovo final.

    Statickm konstantm je teba piadit jejich hodnotu ji v deklaraci, nestatickm konstantm je mono piadit poten hodnotu v konstruktoru.

    Jako veejn mohou bt deklarovny pouze konstanty selnch typ. logick konstanty a konstanty typu String.

    Metody mohou mt i parametry objektovch typ. Pi zadvn takovchto parametr v pro-sted BlueJ meme vyut monosti zadat takovto parametr klepnutm na pslun odkaz v zsobnku odkaz.

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 40 z 41

  • 2.19. Shrnut co jsme se v kapitole nauili Strana 41 z 41

    J02 Vytvme vlastn tdu.doc, verze 1.10.005, uloeno: steda 14.kvtna.2003 15:54 Strana 41 z 41

    )

    ) )

    V okn editoru meme zadat, zda m editor zobrazit implementaci dan tdy (zdrojov kd) nebo jej rozhran (dokumentaci).

    Dokumentace je generovna automaticky z dokumentanch koment.

    Zadnm pkazu Nstroje Dokumentace projektu v okn projektu podme o vygenerovn do-kumentace vech td v projektu. Tyto dokumentaci si pak meme prohlet HTML prohle-em nezvisle na sputn BlueJ.

    Autor pracuje jako EDU expert ve firm Amaio Technologies, Inc.

    Vytvme vlastn tduObsahVytvoen vlastn tdyZdrojov kd tdyZkladn vlastnosti zabudovanho editoruSoubor se zdrojovm kdemTi druhy koment

    Definice tdyprava konstruktoruKonstruktor s parametryKonstruktor this

    Syntaktick definiceDokumentan komentePomocn znaky

    Definice atributMon dsledky zveejnn atri

    Definujeme vlastn metoduKvalifikace a klov slovo thMetody vracejc hodnotuPouit metod vracejcch hodn

    ZapouzdenLokln promnnAtributy tdy \(statick atriMetody tdy \(statick metodyKvalifikace atribut a metod t

    Konstanty a literlyPedn parametru objektovho DokumentaceShrnut co jsme se v kapitol