Kapitola 1. Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výrazy, příkazy Obsah Příkazy a řídicí struktury v Jávě .....................................................................................1 Příkazy v Jávě ....................................................................................................1 Přiřazení v Jávě ..................................................................................................2 Přiřazení primitivní hodnoty..................................................................................2 Přiřazení odkazu na objekt ....................................................................................2 Volání metody....................................................................................................3 Návrat z metody .................................................................................................3 Řízení toku programu v těle metody .......................................................................3 Cyklus s podmínkou na začátku .............................................................................4 Doporučení k psaní cyklů/větvení...........................................................................4 Příklad použití "while" cyklu.................................................................................5 Cyklus s podmínkou na konci................................................................................5 Příklad použití "do-while" cyklu ............................................................................5 Cyklus "for" .......................................................................................................6 Příklad použití "for" cyklu ....................................................................................6 Doporučení k psaní for cyklů (1)..........................................................................7 Doporučení k psaní for cyklů (2)..........................................................................7 Vícecestné větvení "switch - case - default"..............................................................7 Vnořené větvení..................................................................................................8 Vnořené větvení (2) .............................................................................................8 Řetězené "if - else if - else" ...................................................................................9 Příkazy "break"...................................................................................................9 Příkaz "continue" ..............................................................................................10 "break" a "continue" s návěštím ...........................................................................10 Doporučení k příkazům break a continue ...............................................................10 Příkazy a řídicí struktury v Jávě • Příkazy v Jávě • Řídicí příkazy (větvení, cykly) Příkazy v Jávě i Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výra- V Jávě máme následující příkazy: • Přiřazovací příkaz = a jeho modifikace (kombinované operátory jako je += apod.) • Řízení toku programu (větvení, cykly) • Volání metody • Návrat z metody - příkaz return Příkaz je ukončen středníkem ; • v Pascalu středník příkazy odděluje, v Jávě (C/C++) ukončuje Přiřazení v Jávě Operátor přiřazení: • Operátor přiřazení = (assignment) • na levé straně musí být proměnná • na pravé straně výraz přiřaditelný (assignable) do této proměnné • Rozlišujeme přiřazení primitivních hodnot a odkazů na objekty Přiřazení primitivní hodnoty Na pravé straně výraz vracející hodnotu primitivního typu číslo, logická hodnotu, znak (ale ne např. řetězec) Na levé straně proměnná téhož typu jako přiřazovaná hodnota nebo typu širšího např. int lze přiřadit do long Při zužujícím přiřazení se také provede konverze, ale může dojít ke ztrátě informace např. int -> short Přiřazením primitivní hodnoty se hodnota zduplikuje ("opíše") do proměnné na levé straně. Přiřazení odkazu na objekt Konstrukci = lze použít i pro přiřazení do objektové proměnné: Živočich zl = new Zivocich(); Co to udělalo? 2 zy, příkazy 1. vytvořilo nový objekt typu Živočich ( new Živočich () ) 2. přiřadilo jej do proměnné zl typu Živočich Nyní můžeme odkaz na tentýž vytvořený objekt znovu přiřadit - do z 2: Živočich z2 = zl; Proměnné z 1 a z2 ukazují nyní na stejný objekt typu živočich!!! Proměnné objektového typu obsahují odkazy (reference) na objekty, ne objekty samotné!!! Volání metody Metoda objektu je vlastně procedura/funkce, která realizuje svou činnost primárně s proměnnými objektu. Volání metody určitého objektu realizujeme: identifikaceObjektu.názevMetody(skutečné parametry) • identifikaceObjektu, jehož metodu voláme • . (tečka) • názevMetody, jíž nad daným objektem voláme • v závorách uvedeme skutečné parametry volání (záv. může být prázdná, nejsou-li parametry) Návrat z metody Návrat z metody se děje: 1. Buďto automaticky posledním příkazem v těle metody 2. nebo explicitně příkazem return návratováhodnota. způsobí ukončení provádění těla metody a návrat, přičemž může být specifikována návratová hodnota typ skutečné návratové hodnoty musí korespondovat s deklarovaným typem návratové hodnoty Řízení toku programu v těle metody Příkaz (neúplného) větvení if if (logický výraz) přikaž 3 Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výra- platí-li logický výraz (má hodnoty true), provede se příkaz Příkaz úplného větvení if - else if (logický výraz) přikazl else přikaz2 platí-li logický výraz (máhodnoty true), provede se přikazl neplatí-li, provede sepřikaz2 Větev else se nemusí uvádět Cyklus s podmínkou na začátku Tělo cyklu se provádí tak dlouho, dokud platí podmínka obdoba while v Pascalu v těle cyklu je jeden jednoduchý příkaz ... while (podminka) přikaž; ... nebo příkaz složený while (podminka) { přikazl; přikaz2; přikaz3; } Tělo cyklu se nemusí provést ani jednou - pokud už hned na začátku podmínka neplatí Doporučení k psaní cyklů/větvení Větvení, cykly: doporučuji vždy psát se složeným pnkazem v těle (tj. se složenými závorkami)!!! jinak hrozí, že se v těle větvení/cyklu z neopatrnosti při editaci objeví něco jiného, než chceme, např.: while (i < a.length) System.out.println(a[i]); i++; Provede v cyklu jen ten výpis, inkrementaci ne a program se zacyklí. 4 zy, příkazy Pišme proto vždy takto: while (i < a.length) { System.out.println(a[i]); i++; } Příklad použití "while" cyklu Dokud nejsou přečteny všechny vstupní argumenty: int i = 0; while (i < args.length) { "přečti argument args[i]" i++; } Dalším příkladem je použití while pro realizaci celočíselného dělení se zbytkem: Příklad: Celočíselné dělení se zbytkem [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/DeleniOdcitanimjava] Cyklus s podmínkou na konci Tělo se provádí dokud platí podmínka (vždy aspoň jednou) obdoba repeat v Pascalu (podmínka je ovšem interpretována opačně) Relativně málo používaný - je méně přehledný než while Syntaxe: do { přikazl; přikaz2; přikaz3; } while (podmínka); Příklad použití "do-while" cyklu Dokud není z klávesnice načtena požadovaná hodnota: String vstup = ""; float cislo; boolean načteno; // vytvoř reader ze standardního vstupu BufferedReader in = new BufferReader(new InputStream(System.in)); // dokud neni zadáno čislo, čti 5 Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výra- do { vstup = in.readLine(); try { cislo = Float.parseFloat(vstup) ; načteno = true; } catch (NumberFormatException nfe) { načteno = false; } } while(!načteno); System.out.println("Načteno cislo "+cislo); Přiklad: Načítej, dokud není zadáno číslo [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/DokudNeniZadano.java] Cyklus "for" obecnější než for v Pascalu, podobně jako v C/C++ De-facto jde o rozšíření while, lze jím snadno nahradit Syntaxe: for(počáteční op.; vstupní podm.; přikaž po každém průch.) přikaž; anebo (obvyklejší, bezpečnější) for (počáteční op.; vstupní podm.; přikaž po každém průch.) { přikazl; přikaz2; přikaz3; Příklad použití "for" cyklu Provedení určité sekvence určitý počet krát for (int i = 0; i < 10; i++) { System.out.println(i ) ; } Vypíše na obrazovku deset řádků s čísly postupně 0 až 9 1. Příklad: Pět pozdravů [http://www.fi.murii.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizerii/PetPozdravu.java] 6 zy, příkazy 2. Příklad: Výpis prvků pole objektů "for" cyklem [http://wwwíi.mumxz/~tomp/java/ucebmce/javasrc/tomp/ucebnice/rizeni/PolozkyForCyklem.java] Doporučení k psaní for cyklů (1) Používejte asymetrické intervaly (ostrá a neostrá nerovnost): podmínka daná počátečním přiřazením i = 0 a inkrementací i++ je neostrou nerovností, zatímco opakovací podmínka i < 10 je ostrou nerovností-> i už nesmí hodnoty 10 dosáhnout! Vytvarujte se složitých příkazů v hlavičce (kulatých závorkách) for cyklu - • je lepší to napsat podle situace před cyklus nebo až do jeho těla Doporučení k psaní for cyklů (2) Někteří autoři nedoporučují psát deklaraci řídicí proměnné přímo do závorek cyklu for (int i = 0; ... ale rozepsat takto: int i; for (i = 0; ... potom je proměnná i přístupná ("viditelná") i mimo cyklus - za cyklem, což se však ne vždy hodí. Vícecestné větvení "switch - case - default" Obdoba pascalského select - case - else Větvení do více možností na základě ordinální hodnoty Syntaxe: switch(výraz) { case hodnotal: prikazla; prikazlb; prikazlc; break; case hodnota2: prikaz2a; prikaz2b; 7 Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výra- break; default: prikazDa; prikazDb; } Je-li výraz roven některé z hodnot, provede se sekvence uvedená za příslušným case. Sekvenci obvykle ukončujeme příkazem break, který předá řízení ("skočí") na první příkaz za ukončo-vací závorkou příkazu switch. Příklad: Vícecestné větvení [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeniAíricecestneVetvenijava] Vnořené větvení Větvení if - else můžeme samozřejmě vnořovat do sebe: if(podmínka vnější) { if(podmínka vnitřní 1) { } else { } } else { if(podmínka vnitřní 2) { } else { } } Vnořené větvení (2) Je možné "šetřit" a neuvádět složené závorky, v takovém případě se else vztahuje vždy k nejbližšímu neuzavřenému if, např. znovu předchozí příklad: if(podmínka vnější) if(podmínka vnitřnil) else // vztahuje se k nejbližšímu if // s if (podmínka vnitřní 1) else // vztahuje se k prvnímu if, // protože je v tuto chvíli // nejbližší neuzavřené if (podmínka vnitřní 2) zy, příkazy else // vztahuje se k if (podmínka vnitřní 2) Tak jako u cyklů - tento způsob zápisu nelze v žádném případě doporučit!!! Příklad: Vnořené větvení [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeniA^noreneVetveni.java] Řetězené "if - else if - else" Někdy rozvíjíme pouze druhou (negativní) větev: if (podminkal) { } else if (podminka2) { } else if (podminka3) { } else { } Neplatí-li podminkal, testuje se podmínka2, neplatí-li, pak podmínka3... neplatí-li žádná, provede se příkaz za posledním - samostatným - else. Opět je dobré všude psát složené závorky!!! Příklad: Řetězené if [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeniAíricecestneVetveniIf.java] Příkazy "break" Realizuje "násilné" ukončení průchodu cyklem nebo větvením switch Syntaxe použití break v cyklu: for (int i = 0; i < a.length; i++) { if(a[i] == 0) { break; // skoci se za konec cyklu } } if (a[i] == 0) { System.out.println("Našli jsme 0 na pozici "+i); } else { System.out.println("0 v poli neni"); } 9 Přednáška 4 - objektový návrh aplikace, dědičnost. Specifické javové věci - operátory, výra- použitíu switch jsme již viděli,, Vícecestné větvení "switch - case -default"" Příkaz "continue" Používá se v těle cyklu. Způsobí přeskočení zbylé části průchodu tělem cyklu for (int i = 0; i < a.length; i++) { if (a[i] == 5) continue; System.out.println (i) ; } Výše uvedený příklad vypíše čísla 1, 2, 3, 4, 6, 7, 8, 9, nevypíše hodnotu 5. Příklad: Řízení průchodu cyklem pomocí "break" a "continue" [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/BreakContinue.java] "break" a "continue" s návěštím Umožní ještě jemnější řízení průchodu vnořenými cykly: • pomocí návěští můžeme naznačit, který cyklus má být příkazem break přerušen nebo tělo kterého cyklu má být přeskočeno příkazem continue. Příklad: Návěští [http://www.fi.muni.cz/~tomp/java/ucebnice/javasrc/tomp/ucebnice/rizeni/Navesti.java] Doporučení k příkazům break a continue Poznámka Raději NEPOUŽÍVAT, ale jsou menším zlem než by bylo goto (kdyby v Jávě existovalo...), protože nepředávají řízení dále než za konec struktury (cyklu, větvení). Poznámka Toto však již neplatí pro break a continue na návěští! Poznámka Poměrně často se používá break při sekvenčním vyhledávání prvku. 10