17 Metódy
17 Metódy 17.1 Metóda je podprogram V algoritmizácii sa snažíme každú úlohu rozložiť na čiastkové podúlohy, ktoré keď vyriešime v správnom poradí, tak vlastne vyriešime celú úlohu. Programovacie jazyky na riešenie spomínaných podúloh ponúkajú podprogramy. Podprogram je relatívne samostatná programová jednotka (podobná hlavnému programu), ktorá rieši určitý čiastkový problém. Podprogramy využívame hlavne vtedy, keď potrebujeme tú istú činnosť vykonať na rôznym miestach programu. Použitím podprogramov sprehľadníme celý program, čo môže pomôcť pri neskoršej úprave celého programu, prípadne pri vyhľadávaní chýb. V jazyku Java sú podprogramy realizované metódami. Na rozdiel od jazyka C++ (používa názov funkcia; ak je súčasťou triedy, tak tiež metóda) musí byť metóda v jazyku Java vždy súčasťou triedy. V našich programoch sme sa doteraz stretli s niektorými matematickými metódami ako Math.sqrt(), Math.round(), Math.random() alebo replace(), toUpperCase() v prípade reťazcov. Všetky uvedené metódy sa nachádzajú v štandardných triedach (Math resp. String) a my ich len využívame pre svoje vlastné účely (hovoríme tomu, že ich voláme). V Jave však máme možnosť vytvárať svoje vlastné metódy. Úlohou metódy je vykonať nejakú činnosť a my pri definícii metódy vlastne určujeme, čo bude metóda vykonávať. Metóda pritom môže alebo nemusí prebrať nejaké hodnoty (hovoríme, že má parametre) a môže alebo nemusí vrátiť nejakú hodnotu metóde, ktorá ju zavolala. Príklady: − static double podielCisel(int a, int b) - metóda preberá dve celočíselné hodnoty a vráti reálnu hodnotu − static void podciarkni(char znak) - metóda preberá znakovú hodnotu a nevráti nič (void) − static int vypocet() – metóda nič nepreberá ale vráti celočíselnú hodnotu − static void ukonci() – metóda nič nepreberá a nič nevráti Kľúčové slovo static určuje, že ide statické metódy tried a tým pádom je možné tieto metódy využívať bez nutnosti vytvárať inštancie danej triedy. Táto komplikovaná veta bude bližšie vysvetlená pri objektovo – orientovanom programovaní. Zatiaľ teda budeme využívať slovo static bez bližšieho vysvetlenia pri deklarácii každej metódy.
RNDr. Miloš Vojtek
63
17 Metódy
17.2 Deklarácia metódy Deklarácia metódy obsahuje hlavičku metódy a telo. V hlavičke je uvedené rezervované slovo static, návratový typ metódy, meno metódy a v zátvorke sú deklarácie formálnych parametrov.
Všeobecný tvar deklarácie metódy static navratovyTyp menoMetody(formalneParametre)
hlavička
{ prikaz1; telo metódy
prikaz2; ... return hodnota; } navratovyTyp - int, float, double atď. alebo void (ak metóda nič nevráti)
menoMetody – identifikátor metódy, ktorý volí sám programátor, podobne ako pri premenných formalneParametre – hodnoty, ktoré sú posielané metóde z metódy, ktorá ju volá; tu sa uvádzajú deklarácie premenných - cez ne sú tieto hodnoty posielané return – príkaz, ktorým sa vráti hodnota; ak je uvedený samostatne, tak ukončí beh metódy hodnota – hodnota, ktorú metóda vráti metóde, ktorá ju zavolala (nepoužíva sa pri metódach bez návratovej hodnoty, t.j. metódach typu void) Príklad: static int sucetCisel(int a, int b) { int c=0; c=a+b; return c; } V tele metódy main() by mohla byť metóda sucetCisel() volaná nasledovne: ... int vysledok = sucetCisel(10,30); ... Metóda main() zavolá metódu suceCisel() a odovzdá jej hodnoty 10 a 30. Metóda sucetCisel() preberie obe hodnoty, uloží ich do premenných a a b, vykoná súčet oboch hodnôt a výslednú hodnotu vráti cez return metóde main(). RNDr. Miloš Vojtek
64
17 Metódy
17.3 Kde deklarovať metódy V Jave platí, že metódu musíme deklarovať vždy mimo inej metódy, t.j. nemôže byť súčasťou žiadnej metódy! Z pohľadu metódy main() je jedno, či nami vytváraná metóda je deklarovaná pred metódou main() alebo za ňou. Java nepoužíva prototypy a preto kompilácia prebehne bez problémov. V našich programoch budeme deklarácie metód umiestňovať buď za metódu main() v spoločnej triede alebo si vytvoríme samostatnú triedu (v tom istom balíku) a do nej umiestnime deklarácie metód. Druhy spôsob budeme používať častejšie, lebo nás približuje k samotným základom objektovo – orientovaného programovania.
17.4 Preťažovanie metód V Jave môžu mať dve a viac metód, v rámci jednej triedy, rovnaký názov – hovoríme o preťažovaní metód. Musia sa však líšiť v deklarácii parametrov – rozdiel musí byť buď v počte parametrov, alebo v ich type. Nestačí ak sa dve metódy líšia iba v type návratovej hodnoty. Nasledujúce deklarácie ukazujú správne použitie preťaženia: static int vypocet(int a, int b) static int vypocet(double a, int b) static int vypocet(int a) Nasledujúce deklarácie ukazujú nesprávne použitie preťaženia: static int vypocet(int a, int b) static double vypocet(int a, int b) Preťažovanie je v Jave veľmi často využívané a stretneme sa s ním najmä v objektovo orientovanom programovaní, keď budeme preťažovať tzv. konštruktory.
17.5 Aplikácia SucetCisel Vytvoríme aplikáciu SucetCisel. Program spočíta dve celé čísla, zadané z klávesnice. Na súčet čísel sa použije metóda sucetCisel(), ktorá bude zavolaná z metódy main(). Metódu sucetCisel() budeme deklarovať za metódou main() v tej istej triede.
17.6 Aplikácia SkalarnySucin Vytvoríme aplikáciu SkalarnySucin. Program vypočíta skalárny súčin dvoch vektorov v rovine. Na výpočet skalárneho súčinu bude vytvorená metóda skalarnySucin() so štyrmi formálnymi parametrami. Metódu skalarnySucin() deklarujeme v samostatnej triede s názvom Metody. Novú triedu pridáme do našej aplikácie nasledovne: RNDr. Miloš Vojtek
65
17 Metódy 1. v ľavej časti obrazovky, v záložke Projects, vyvoláme na názve balíka skalarnysucin kontextové menu:
2. zvolíme ponuku New a následne Java Class
RNDr. Miloš Vojtek
66
17 Metódy 3. v zobrazenom okne, do políčka Class Name, zapíšeme meno triedy Metody a klikneme na Finish.
4. v takto vytvorenej triede potom deklarujeme metódu skalarnySucin(). Metódu skalarnySucin() potom musíme volať z metódy main() aj s uvedením názvu triedy, napr.: double vysledok = Metody.skalarnySucin(5,2,1,6);
17.7 Aplikácia MetodaZaokruhlit Vytvoríme aplikáciu MetodaZaokruhlit. Program si vyžiada zadanie dvoch čísel. Prvé, ktoré budeme zaokrúhľovať a druhé, ktoré bude určovať počet desatinných miest. Obe čísla budú odovzdané metóde, ktorá vráti už zaokrúhlené číslo. Metódu na zaokrúhlenie vytvoríme v samostatnej triede.
17.8 Aplikácia DlhsiRetazec Vytvoríme aplikáciu DlhsiRetazec. Program si vyžiada zadanie dvoch reťazcov. Oba odovzdá metóde, ktorá potom vráti dlhší reťazec, ten bude následne z metódy main() vypísaný.
17.9 Cvičenie 1. Vytvorte aplikáciu s názvom AritmetickeVypocty. Program si vyžiada zadanie dvoch celých čísel. Potom vypíše ich súčet, ak stlačíme s, rozdiel, ak r, súčin, ak stlačíme n a podiel ak stlačíme p. Program musí po spustení a zadaní čísel ponúknuť jednoduché menu, aby používateľ vedel čo má robiť. Program tiež nesmie povoliť delenie, ak druhé zadané číslo je rovné nule. Na každú aritmetickú operáciu vytvorte metódu. Všetky metódy dajte do samostatnej triedy. RNDr. Miloš Vojtek
67
17 Metódy 2. Vytvorte aplikáciu s názvom PriemerCisel. Program si vyžiada 6 celých čísel. Tie potom odovzdá metóde, ktorá vypočíta a vráti aritmetický priemer. Aritmetický priemer bude následne vypísaný z metódy main(). 3. Vytvorte aplikáciu s názvom VyskytZnakuVRetazci. Program si vyžiada zadanie reťazca a znaku. Potom zistí koľkokrát sa daný znak v reťazci vyskytuje. Na zistenie početnosti výskytu vytvorte metódu. 4. Vytvorte aplikáciu NajvacsiSpolocnyDelitel. Úlohou programu bude nájsť najväčší spoločný deliteľ dvoch kladných celých čísel. Na nájdenie najväčšieho spoločného deliteľa použite vlastnú metódu. Poznámka: použite Euklidov algoritmus postupného odčítavania čísel – vždy menšieho od väčšieho - až kým nebudú obe čísla rovnaké. Toto číslo je potom najväčší spoločný deliteľ.
17.10 Otázky 1. Vysvetlite čo je to podprogram? 2. Na čo slúžia metódy? 3. Aké metódy môžeme v Jave deklarovať z hľadiska parametrov a návratových hodnôt? 4. Uveďte deklaráciu metódy. 5. Čo sú to formálne parametre? 6. Kde všade je možné deklarovať metódy? 7. Ako zavoláme metódu, ktorá je uložená v inej triede? 8. Čo je to preťažovanie metód?
RNDr. Miloš Vojtek
68