-
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