Windows je registrovaná obchodní známka firmy Microsoft v USA a v ostatních zemích.



Podobné dokumenty
Objekty strana 11. Abstrakce je základní objektovou vlastností. Skutečnost, kterou chceme do programu promítnout,

Výčtový typ strana 67

Algoritmizace a programování

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

8 Třídy, objekty, metody, předávání argumentů metod

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

3. Třídy. Základní pojmy objektového programování. Třídy

Teoretické minimum z PJV

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Seminář Java II p.1/43

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

20. Projekt Domácí mediotéka

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

typová konverze typová inference

Úvod do programovacích jazyků (Java)

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Programování v Javě I. Únor 2009

15. Projekt Kalkulačka

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Programování v Javě I. Leden 2008

Základy objektové orientace I. Únor 2010

O autorovi O odborném korektorovi Úvod 17 Vývoj jazyka Java Java SE 8 Struktura této knihy Předchozí zkušenosti s programováním nejsou potřebné

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Dědičnost a polymorfismus

Datové typy strana 29

Úvod do programování - Java. Cvičení č.4

11. Dědičnost. Dědičnost strana 103

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Generické programování

PŘETĚŽOVÁNÍ OPERÁTORŮ

17. Projekt Trojúhelníky

Z. Kotala, P. Toman: Java ( Obsah )

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Projekt Obrázek strana 135

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

10 Balíčky, grafické znázornění tříd, základy zapozdření

Programování v C++ 3, 3. cvičení

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Programovací jazyk Pascal

Zápis programu v jazyce C#

Objektově orientované programování

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Proměnné a datové typy

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

KTE / ZPE Informační technologie

Algoritmizace a programování

6 Příkazy řízení toku

Algoritmizace a programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Téma 03 - Rozhodování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Programování proti rozhraní

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Úvod do programovacích jazyků (Java)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

PB161 Programování v jazyce C++ Přednáška 9

Programovací jazyk Java

Regulární výrazy. Vzory

IRAE 07/08 Přednáška č. 1

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Programování v C++ 1, 1. cvičení

Java a XML. 10/26/09 1/7 Java a XML

9. Polymorfismus a rozhraní

Maturitní otázky z předmětu PROGRAMOVÁNÍ

NPRG031 Programování II --- 2/2 Z, Zk

1. ÚVOD ZÁKLADY JAZYKA...

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Paměť počítače. alg2 1

Seminář Java IV p.1/38

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

6. Příkazy a řídící struktury v Javě

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Principy objektově orientovaného programování

7. Datové typy v Javě

První kapitola úvod do problematiky

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský

Vytváření a použití knihoven tříd

Abstraktní třída a rozhraní

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Programování v C++ 1, 6. cvičení

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

Ukazka knihy z internetoveho knihkupectvi

19. Projekt Adventura

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Algoritmizace a programování

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Transkript:

Sun, Sun Microsystems, Java a všechny obchodní známky a loga obsahující Sun nebo Java jsou ochrannými známkami nebo registrovanými ochrannými známkami firmy Sun Microsystems, Inc. v USA a v ostatních zemích. Windows je registrovaná obchodní známka firmy Microsoft v USA a v ostatních zemích. V knize použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Ing. Jarmila Pavlíčková, Ing. Luboš Pavlíček Praha 2005 ISBN 80-245-0963-6

Obsah strana 3 Obsah 1. Úvod... 9 2. Objekty... 11 2.1. Objekty a abstrakce... 11 2.2. Třída a instance... 12 2.3. Volání metod (posílání zpráv)... 14 2.4. Zapouzdření... 14 2.5. Ukrývání implementace... 14 2.6. Vytváření tříd v Javě... 15 2.6.1. Identifikátory... 15 2.6.2. Datové atributy instance... 16 2.6.3. Metody instance... 17 2.6.4. Modifikátory přístupu k datovým atributům a metodám... 20 2.6.5. Konstruktor... 20 2.7. Vytváření instancí a volání metod v Javě... 22 2.7.1. Volání metod v rámci jedné instance (this)... 23 2.8. Modifikátor final... 24 2.9. Rušení objektů... 24 2.10. Balíčky (package)... 25 2.11. Komentáře... 26 3. Datové typy... 29 3.1. Primitivní datové typy... 29 3.1.1. Deklarace a inicializace proměnné primitivního typu... 29 3.1.2. Konstanty...30 3.1.3. Pojmenované konstanty... 30 3.1.4. Přetypování... 31 3.1.5. Přetečení... 31 3.2. Výrazy a operátory... 31 3.2.1. Operátor přiřazení (=), přiřazovací příkaz... 31 3.2.2. Aritmetické operátory... 32 3.2.3. Relační operátory... 33 3.2.4. Logické operátory... 34 3.2.5. Bitové operátory... 34 3.2.6. Podmíněný výraz... 34 3.2.7. Kulaté závorky... 34 3.3. Referenční datové typy... 35 3.3.1. Rozdíl mezi primitivními a referenčními datovými typy... 35 3.3.2. Konstanta null... 35 3.3.3. Přetypování referenčních typů... 35 3.3.4. Operátor přiřazení (přiřazovací příkaz)... 36 3.3.5. Relační operátory == a!=... 36 3.3.6. Relační operátor instanceof... 37 3.3.7. Volání metod... 37 3.4. Obalové třídy pro primitivní typy... 37

Obsah strana 4 4. Základní konstrukce metod... 41 4.1. Sekvence... 41 4.1.1. Rozsah platnosti lokálních proměnných... 41 4.2. Selekce... 42 4.2.1. Příkaz if... 42 4.2.2. Příkaz switch... 43 4.3. Iterace (cykly)... 45 4.3.1. Příkaz while... 45 4.3.2. Příkaz do-while... 46 4.3.3. Příkaz for...46 4.3.4. Příkazy break a continue... 47 4.4. Prázdný příkaz... 48 5. Řetězce (třída String)... 49 5.1. Porovnávání řetězců... 49 5.2. Další operace s řetězci... 50 5.3. Speciální (escape) znaky v řetězcích... 51 5.4. Formátování řetězců... 51 5.5. Regulární výrazy... 53 5.6. Třídy StringBuffer a StringBuilder... 55 6. Třída Object... 57 6.1. Metoda tostring()... 57 6.2. Metoda equals()... 57 6.3. Metoda hashcode()... 58 6.4. Metoda getclass()... 58 6.5. Metoda clone()... 58 6.6. Metoda finalize()... 58 6.7. Metody notify(), notifyall(), wait()... 59 7. Statické prvky třídy... 61 7.1. Statické datové atributy (statické proměnné, proměnné třídy)... 61 7.2. Statická metoda (metoda třídy)... 62 7.3. Statické datové atributy a metody ve třídách Math a System... 62 7.3.1. Třída Math... 62 7.3.2. Třída System... 63 7.4. Standardní spouštění aplikace metoda main... 64 7.5. Počítání vytvořených instancí... 65 8. Výčtový typ... 67 8.1. Pojmenované konstanty... 67 8.2. Výčtový typ (enum)... 68 8.3. Metody výčtového typu... 69 8.4. Rozšíření příkazu switch... 69 8.5. Výčtový typ uvnitř třídy... 69 8.6. Výčtový typ a datové struktury... 70 8.7. Rozšiřování výčtového typu... 70

Obsah strana 5 9. Polymorfismus a rozhraní... 73 9.1. Přetěžování metod a polymorfismus... 73 9.1.1. Přetěžování metod... 73 9.1.2. Příklad polymorfismu s přetěžováním metod... 74 9.2. Rozhraní... 75 9.2.1. Deklarace rozhraní... 76 9.2.2. Rozhraní umožňuje volbu implementace... 77 9.2.3. Rozhraní a polymorfismus... 78 9.2.4. Rozhraní umožňuje předávat metody jako parametr... 79 9.2.5. Rozhraní a vícenásobná dědičnost... 79 9.2.6. Dědičnost mezi rozhraními... 79 10. Datové struktury... 81 10.1. Collections framework... 81 10.2. Základní rozhraní... 82 10.3. Kolekce... 82 10.3.1. Seznamy (List)... 83 10.3.2. Množiny (Set)... 84 10.3.3. Procházení kolekce (rozšířený příkaz for)... 85 10.3.4. Používání indexů u seznamů... 86 10.3.5. Používání iterátoru... 87 10.3.6. Prohledávání kolekce... 88 10.3.7. Třídění kolekcí... 89 10.4. Mapy (Map)... 93 10.4.1. Procházení mapy... 95 10.4.2. Mapa pro urychlení vyhledávání... 96 10.4.3. Mapy obsahující seznamy... 96 10.5. Pole (array)... 97 10.5.1. Jednorozměrné pole... 98 10.5.2. Procházení jednorozměrného pole... 99 10.5.3. Proměnlivý počet parametrů metody... 99 10.5.4. Vícerozměrná pole... 100 10.5.5. Parametry vstupní řádky... 101 11. Dědičnost... 103 11.1. Dědičnost a konstruktory, klíčové slovo super... 106 11.2. Vytvoření instance při dědičnosti... 107 11.3. Modifikátor přístupu protected... 108 11.4. Abstraktní třídy... 108 11.5. Polymorfismus a překrytí metod... 111 11.5.1. Přetypování referenčních typů... 111 11.5.2. Překrývání metod, pozdní vazba a polymorfismus... 112 11.5.3. Příklad polymorfismu... 113 11.6. Použití dědičnosti... 115 11.6.1. Důvody pro použití dědičnosti... 115 11.6.2. Porušení vztahu je nějakým při návrhu dědičnosti... 116 11.6.3. Dědičnost narušuje zapouzdření... 117 12. Výjimky... 119 12.1. Druhy výjimek... 119 12.2. Vyvolání výjimky... 120 12.3. Ošetření výjimky... 121 12.3.1. Odchytávání výjimek (try catch)... 121 12.3.2. Throws... 123 12.4. Často používané typy výjimek... 123 13. Vstupy a výstupy... 125

Obsah strana 6 13.1. Základní principy práce se soubory... 125 13.2. Vstupy a výstupy v Javě... 126 13.3. Vstupní proudy... 127 13.3.1. Čtení z textového souboru... 128 13.3.2. Čtení z konzole... 129 13.4. Výstupní proudy... 130 13.4.1. Zápis do textového souboru... 131 13.5. Další třídy a metody pro práci s proudy... 132 13.5.1. Čtení ze sítě... 132 13.5.2. Komprimace a dekomprimace souborů... 133 13.6. Třída File... 133 14. Projekt Obrázek... 135 14.1. Základní popis, zadání úkolu... 135 14.2. Struktura tříd... 135 14.3. Popis metod jednotlivých tříd... 136 14.4. Kód třídy Obrazek... 137 14.5. Postup řešení... 139 14.5.1. Dokreslení obrázku (přidání slunce)... 139 14.5.2. Průjezd auta... 140 14.5.3. Východ a západ slunce... 140 14.6. Domácí úkoly... 142 15. Projekt Kalkulačka... 143 15.1. Základní popis, zadání úkolu... 143 15.2. Struktura tříd... 143 15.3. Popis komunikace mezi objekty... 144 15.4. Popis kódu třídy Kalkulator... 144 15.5. Postup řešení:... 146 15.5.1. Doplnění autora a verze... 146 15.5.2. Vkládání prvního čísla... 147 15.5.3. Operace výmaz (C)... 148 15.5.4. Operace plus (+)... 149 15.5.5. Operace mínus ( )... 149 15.5.6. Komunikace mezi instancemi... 151 15.5.7. Vkládání dalších čísel... 151 15.5.8. Operace plus pokračování... 153 15.5.9. Řešení s konstantami... 154 15.6. Domácí úkoly... 154 16. Projekt Hádání slov... 157 16.1. Základní popis, zadání úkolu... 157 16.2. Struktura tříd... 157 16.3. Popis komunikace mezi objekty... 158 16.4. Popis kódu třídy PoskytovatelSlov... 159 16.5. Postup řešení... 161 16.5.1. Přidání možnosti hádat více slov... 161 16.5.2. Poskytování slov k hádání v náhodném pořadí... 162 16.6. Domácí úkol... 164 17. Projekt Trojúhelníky... 165 17.1. Základní popis, zadání úkolu... 165 17.2. Struktura tříd... 165 17.3. Popis komunikace mezi objekty... 166 17.4. Popis výčtového typu (enum) TypTrojuhelnika... 168 17.5. Popis kódu třídy Trojuhelnik... 168 17.6. Popis kódu třídy Trojuhelniky... 172

Obsah strana 7 17.7. Postup řešení... 174 17.7.1. Vytvoření metody main, pro spouštění aplikace z příkazové řádky... 174 17.7.2. Přidání nového typu trojúhelníka (rovnostranného)... 174 17.7.3. Zjišťování chyb ve třídě Trojuhelnik, generování výjimek... 175 17.7.4. Ošetřování výjimek ve třídě Trojuhelniky... 177 17.8. Domácí úkoly... 178 18. Projekt Škola... 179 18.1. Základní popis, zadání úkolu... 179 18.2. Struktura tříd... 179 18.3. Popis kódu třídy Skola... 180 18.4. Popis kódu tříd Utvar a Osoba... 181 18.5. Postup řešení... 182 18.5.1. Deklarace datových atributů a vkládání instancí... 182 18.5.2. Výpis organizační struktury... 183 18.5.3. Setřídění výpisu... 184 18.5.4. Zvýraznění organizační struktury (odsazování)... 185 18.5.5. Doplnění výpisu osob... 186 18.6. Domácí úkoly... 186 19. Projekt Adventura... 189 19.1. Základní popis, zadání úkolu... 189 19.2. Struktura tříd... 189 19.3. Popis komunikace mezi objekty... 190 19.4. Výpis kódu třídy Místnost... 192 19.5. Výpis kódu třídy Hra... 194 19.6. Výpis kódu třídy RizeniHry... 198 19.7. Výpis kódu třídy SeznamPrikazu... 199 19.8. Výpis kódu třídy Prikaz... 200 19.9. Postup řešení... 201 19.9.1. Úkol 1: doplnění další místnosti... 201 19.9.2. Úkol 2: změna příkazu napoveda na pomoc... 202 19.9.3. Úkol 3: doplnění vítězství... 204 19.9.4. Úkol 4: doplnění věcí do místností... 205 19.10. Domácí úkol... 209 20. Projekt Domácí mediotéka... 211 20.1. Základní popis, zadání úkolu... 211 20.2. Struktura tříd... 211 20.3. Výpis kódu třídy Evidence... 212 20.4. Výpis kódu tříd Video a CD... 213 20.5. Postup řešení... 216 20.5.1. Vytvoření předka tříd Video a CD... 216 20.5.2. Přesun titulu a délky do předka... 218 20.5.3. Jeden seznam ve třídě Evidence... 220 20.5.4. Přidání knih... 222 20.6. Domácí úkoly... 224 21. Seznam termínů a zkratek... 225 22. Literatura a webové zdroje... 227

Úvod strana 9 1. Úvod Tento text je určen pro studenty úvodního kurzu programování studijního oboru Informatika. Obsahuje úvod do objektové teorie, její realizaci v jazyce Java a popis základních jazykových konstrukcí. Javu učíme v základním kurzu programování od roku 2000, ze začátku paralelně s Pascalem, od roku 2004 výhradně Javu. Do roku 2004 jsme první semestr učili studenty programovat v Javě procedurálně a až druhý semestr jsme se snažili vysvětlit objekty. Naráželi jsme však na následující problémy: Část studentů v úvodním kurzu již měla předchozí znalosti programování obvykle Pascalu či PHP. Vzhledem ke svým předchozím zkušenostem s programováním a algoritmizací se tito studenti na úvodních cvičeních nudili a nemuseli se programování věnovat mimo cvičení. Pak se jim často stávalo, že zaspali okamžik, kdy by se měli začít učit. Vytvářelo to i špatnou atmosféru pro začínající studenty ti viděli, že někteří jejich kolegové nemají žádné problémy s programy a byli z toho zbytečně frustrovaní. Mezi algoritmickým myšlením a chápáním objektů je poměrně velký myšlenkový rozdíl. Mnoho studentů nebylo schopno v rámci druhého semestru přejít od algoritmického myšlení k objektovému. Nechápali, proč mají používat objekty, když předtím používali objektový jazyk neobjektově. Vzhledem k rozsahu jimi laděných programů je obtížné ukázat jim výhody objektového přístupu pro řešení složitých úloh. V Computing Curricula [CC2001] z roku 2001 se doporučuje v úvodních kurzech programování začít objektovým přístupem, tj. od začátku výuky programování soustředit pozornost na objektověorientované programování a návrh. Za základní výhodu tohoto přístupu je označováno brzké seznámení s objektově orientovaným programováním, které je standardem při tvorbě programového vybavení. Objektový přístup je výhodný pro složitější úlohy, tudíž studenti se při výuce budou od začátku seznamovat se složitějšími aplikacemi, které mají složitější vnitřní vazby. V rámci katedry jsme se rozhodli přejít při výuce programování k přístupu object-first. V úvodním kurzu tedy začínáme výukou objektů, v navazujícím kurzu Základy softwarového inženýrství si pak studenti tyto znalosti prohloubí a seznámí se i s návrhovými vzory, testováním tříd atd. Objekty byly navrženy pro pochopení/zvládnutí složitých problémů. Studentům je potřeba ukazovat používání objektů na složitých problémech. Přitom je potřeba výuku připravit tak, aby studenti mohli postupovat od jednoduchého ke složitějšímu. V naší výuce objektů jsme se inspirovali přístupem M. Köllinga [Kolling], autora výukového vývojového prostředí BlueJ a propagátora přístupu k výuce object-first. Rozhodli jsme se pro následující postup ve výuce: nejdříve ukážeme studentům na existující aplikaci, jak fungují objekty, jaký je rozdíl mezi třídou a instancí (vytvořit více instancí), jak volat metody instancí, na jiné úloze studenti mění hodnoty řetězců, naučí se na tom překládat a rozumět chybovým hlášením překladače, dále následuje úprava obsahu metod či psaní obsahu metod, dalším krokem je návrh metod v existujících třídách, dále studenti k existujícím třídám navrhují další třídy, posledním krokem je návrh aplikace od začátku do konce. Na přednáškách vykládáme objekty a jazyk, na cvičeních se řeší problémy. Cílem cvičení je trénování objektového myšlení na řešení předložených problémů, tj. ukázat jim problémy, diskutovat s nimi jak je řešit. Tomuto členění odpovídá i rozdělení tohoto textu do dvou částí. První část (kapitoly 2 13) obsahuje výklad jazykových konstrukcí. Zdrojové kódy v těchto kapitolách jsou většinou krátké ukázky, nejsou u nich uvedeny komentáře, protože jsou podrobně vysvětleny v textu. Jednotlivé kapitoly jsou řazeny tak, aby se postupovalo od základních vlastností a prvků ke složitějším. V druhé části (kapitoly 14 20) jsou popsány některé výukové projekty používané na cvičení. Zde jsou uvedeny celé zdrojové kódy, včetně komentářů. Studenti by se měli mimo jiné naučit rozumět cizímu zdrojovému kódu. Každý projekt končí zadáním domácích úkolů, které mají sloužit jako inspirace pro samostatnou práci studentů. I tyto projekty jsou řazeny od jednodušších ke složitějším.

Úvod strana 10 Tato skripta, stejně jako kurz pro který jsou určena, si nekladou za cíl naučit studenty všechny jazykové konstrukce a možnosti Javy. Z těchto důvodů ve skriptech nejsou popsány některé jazykové konstrukce z jazyka Java: vnitřní třídy a anonymní vnitřní třídy, generické typy (ve skriptech je popsáno pouze jejich používání), anotace, serializace objektů, problematika vláken a synchronizace. Nejsou zde uvedena pravidla pro navrhování tříd a návrhové vzory. Nejsou zde mnohé standardní knihovny Javy např. Swing a AWT, pomocí kterých se vytvářejí grafické aplikace, dále práce s databázemi, komunikace po síti, vytváření webových aplikací atd. Závěrem bychom chtěli poděkovat za cenné připomínky Ing. Martině Jandové, Ing. Rudolfu Pecinovskému, CSc. a za recenzní posudky Ing. Aleně Buchalcevové, PhD. a Prof. Janu Štelovskému. Doufáme, že tato skripta pomohou čtenářům při pronikání do tajů objektově orientovaného programování a programovacího jazyka Java. autoři

Objekty strana 11 2. Objekty Java je objektově orientovaný programovací jazyk přenositelný na různé platformy. Pracuje tedy s objekty. Co to vlastně jsou objekty? Jedná se o abstrakci z reality, každý objekt představuje spojení dat (údajů, proměnných, datových atributů) a činností s těmito daty (metod). Tato abstrakce je vždy účelová, o každém reálném objektu se sledují ty údaje, které jsou relevantní pro aplikaci. Pokud chceme pracovat s objekty, je nutné vědět, jaké jsou obecné vlastnosti objektů. Nyní tyto vlastnosti uvedeme a postupně si je objasníme. V této kapitole se také seznámíme se spoustou pojmů z objektového programování. Obecné objektové vlastnosti: používání abstrakce definování tříd objektů existence objektů (instancí) komunikace objektů (posílání zpráv, volání metod) zapouzdření a ukrývání implementace dědičnost polymorfismus Základní pojmy: objekty třídy instance datové atributy metody konstruktory balíčky deklarace inicializace identifikátor formální parametr metody skutečný parametr metody pomocná proměnná 2.1. Objekty a abstrakce Abstrakce je základní objektovou vlastností. Skutečnost, kterou chceme do programu promítnout, musíme vždy zjednodušit, pracovat jen s těmi daty, která jsou pro nás důležitá. Uvedeme si několik jednoduchých příkladů. První příklad: Když chceme udělat počítačovou evidenci knih, které jsou k dispozici v obchodě, bude základem abstrakce knihy. V knihkupectví nás bude pravděpodobně u každé knihy zajímat: autor, název, ISBN, vydavatel, žánr, cena, počet kusů na skladě. S knihou budeme provádět např. tyto činnosti: založení nové knihy, změna množství na skladě, změna ceny. Druhý příklad: Vytváříme jednoduchou evidenci knih ve své knihovně, abychom měli přehled o knihách. Protože je často půjčujeme, chceme si půjčky evidovat. Základem je opět kniha, ale tentokrát nás o ní bude zajímat autor, název, žánr, komu je zapůjčena atd. Činnosti budou např.: zapiš výpůjčku nebo kniha vrácena. Třetí příklad: Chceme napsat aplikaci pro kreslení. Tvary (čtverce, obdélníky, kruhy, trojúhelníky atd.), které budou nakresleny, jsou objekty. U každého nakresleného tvaru musíme sledovat např. tato data: souřadnice umístění, rozměry tvaru, barvu čáry, barvu výplně. Metody neboli činnosti, které bude možno v takové aplikaci provádět s jednotlivými tvary, budou např. tyto: nakreslení, zvětšení, zmenšení, posun, změna barvy, vymazání. Čtvrtý příklad: Pokud budeme psát aplikaci pro počítání obvodů a obsahů dvourozměrných tvarů, budou zde podobné objekty, ale s jinými daty a metodami. U jednotlivých tvarů stačí sledovat rozměry stran a popřípadě velikosti úhlů. Metody, které budou k dispozici, budou metody pro výpočet obsahu a obvodu.

Objekty strana 12 Pátý příklad: Jedná se o velmi zjednodušenou banku. Základem každé banky jsou účty jejích klientů. Každý učet v naší bance bude mít pouze číslo účtu, jméno vlastníka a uloženou částku. Činnosti, které bude možné s jednotlivými účty provádět, mohou být např. tyto: založení účtu, zjištění stavu účtu, výběr z účtu, uložení na účet, převod na jiný učet. Tento příklad budeme dále používat pro objasňování dalších pojmů a jejich realizace v Javě. 2.2. Třída a instance Vraťme se k našemu příkladu s bankou. V bance je samozřejmě mnoho účtů. Programátor musí vytvořit obecný popis všech účtů, vytvořit třídu Účet. Třída je obecný popis, ve kterém se deklarují (určí) data (datové atributy), která budou popisovat stav objektu, a metody, které definují činnosti, jaké je možné s objekty provádět. Jak je vidět na následujícím obrázku, programátor definuje, které údaje se budou o objektech sledovat a jaké činnosti bude s těmi daty možno provádět a jak se to bude dělat. Obrázek 2.1 Popis jednotlivých částí třídy V programu se poté vytvoří několik instancí této třídy, představující jednotlivé účty. Instance je tedy vytvořena v paměti počítače a vytváří jakýsi obraz reálného objektu např. učet Josefa Nováka nebo účet Jarmily Pavlíčkové. Obrázek 2.2 Znázornění rozdílu mezi třídou a jejími instancemi

Objekty strana 13 Data, která budeme o každé instanci sledovat, označujeme jako datové atributy instance. Činnosti, které je možné s danými instancemi provádět, označujeme jako metody (metody instance). Konstruktor je specifická metoda, pomocí které se vytvářejí instance. Při spouštění konstruktoru si musíme uložit odkaz (referenci) na vznikající instanci. K již vzniklé instanci je možno přiřadit i další odkazy. Na obrázku 2.3 máme znázorněny odkazy na účty s čísly 1 až 3. Na účet číslo 4 odkaz nemáme a nemůžeme s ním dále pracovat. Nelze na něm zavolat žádnou metodu (poslat mu zprávu). Na účty s čísly 1 a 3 byly vytvořeny další odkazy. Je možné jim poslat zprávu ze dvou míst. Obrázek 2.3 Znázornění odkazů na instance tříd V objektovém programování se používají pojmy objekt a instance jako ekvivalenty, my budeme používat termín instance, protože je přesnější. Abychom si tyto pojmy ještě více ujasnili, uvedeme si další příklad. Budeme vytvářet jednoduchou evidenci vozidel. Auta stojící na ulici jsou objekty, o kterých budou v programu záznamy. Pomocí abstrakce vytvoříme obecný popis auta vhodný pro náš účel a vytvoříme tak třídu Auto. Pokud bude aplikace fungovat, bude pro každý objekt v realitě vytvořena odpovídající instance třídy Auto v paměti počítače. Obrázek 2.4 znázorňuje popsanou situaci. Obrázek 2.4 Význam pojmů objekt, třída a instance

Objekty strana 14 2.3. Volání metod (posílání zpráv) Každá aplikace je tvořena několika třídami, v rámci běhu aplikace jsou vytvářeny instance těchto tříd a volány jejich metody. Vol ání metod se tak trochu podobá posílání SMS z mobilního telefonu. Můžeme poslat SMS jen tomu, na koho máme číslo. Posíláme např. zprávu Kup chleba! Pokud příjemce neumí česky, je nám to na nic (voláme metodu, kterou daná instance nezná, v Javě tento omyl odchytí již překladač). Pokud pošleme tuto zprávu např. Honzovi, ten na koupení chleba zapomene, když ji pošleme Pepovi, ten chleba přinese. U objektů mohou instance různých tříd reagovat na stejnou zprávu různě, v našem případě by Honza musel být instancí třídy Lajdák a Pepa instancí třídy Svědomitý. Jedna instance může také na stejnou zprávu reagovat různě v závislosti na svém stavu pokud bude svědomitý Pepa ve stavu spaní, tak žádný chleba nepřinese. Příklad s tvary: Když pošleme instanci třídy Ctverec zprávu kresli(), nakreslí se čtverec. Když pošleme stejnou zprávu (zavoláme metodu kresli()) instanci třídy Kruh, nakreslí se kruh. Tento jev, kdy posíláme stejnou zprávu (tj. voláme metodu stejného jména), ale provádí se činnosti různě implementované, se označuje jako polymorfismus. 2.4. Zapouzdření Pojem zapouzdření (encapsulation) popisuje princip umísťování dat a souvisejících metod k sobě do jednoho objektu, do jedné metody, atd. Zapouzdření musí být podporováno vhodnou jazykovou konstrukcí, v Javě i ostatních objektových jazycích se realizuje pomocí třída a vytváření instancí. Při zapouzdřování objektů je vhodné dodržovat tato pravidla: Snažit se umístit data a operace pracující s daty do stejné třídy. V našem příkladu s bankou jsou ve třídě Účet umístěny nejen datové atributy, ale i metody, které s účtem pracují. Chybou zapouzdření by bylo např. umístit metody pro výběr z účtu, uložení na účet a pro převod na jiný účet do samostatné třídy 1. Třída by neměla obsahovat jen část dat či část metod, ani by neměla obsahovat více dat či metod, než je nutné pro činnost, za kterou třída odpovídá. Častější chybou je, že třída obsahuje více dat, než kolik potřebuje. V našem příkladu s bankou by např. bylo chybou, kdyby se ve třídě Účet evidovala adresa banky. Jednotlivé zprávy posílané instanci by pokud možno měly být na sobě nezávislé, metody by měly požadovat jen nezbytně nutné parametry. Chybou tohoto typu by bylo, kdybychom metodu pro převod peněz na jiný účet rozdělili do dvou metod v první metodě bychom nastavili číslo cílového účtu, ve druhé zadali převáděnou částku a provedli vlastní převod. Správným řešením je, že metoda bude obsahovat dva parametry číslo cílového účtu a převáděnou částku a po počátečních kontrolách provede převod částky na zadaný účet. 2.5. Ukrývání implementace Každý objekt poskytuje svému okolí metody, které je možné zavolat. Seznam těchto metod (a dostupných datových atributů) je označován jako veřejné rozhraní třídy. V tomto rozhraní by neměly být zahrnuty datové atributy, ty by měly být schovány uvnitř instance a měly by být přístupné pouze pomocí metod. Pro ilustraci v našem jednoduchém příkladě s účty by hodnota stavu účtu neměla být z vnějšku přístupná. K zjištění stavu a změnám hodnot by měly sloužit metody zjištění stavu účtu, výběr z účtu, vložení na účet. Důvodem je, že pomocí metod může docházet k dalším kontrolám a instance se tak nemůže dostat do nesprávného stavu. V případě našeho účtu např. není povolen výběr do mínusu a v metodě pro výběr se tedy bude kontrolovat, zda je možno výběr uskutečnit nebo ne. Tento přístup poskytování pouze nezbytně nutných metod pro uživatele třídy se nazývá ukrývání implementace (information hiding). 1 Umísťování metod do samostatných jednotek se používalo dlouho ve strukturovaném programování. Jednou z nevýhod bylo velké množství parametrů těchto metod.

Objekty strana 15 Při návrhu tříd je vhodné se řídit těmito pravidly: ukrývejte datové atributy datové atributy by neměly být dostupné přímo, ale pomocí metod. ukrývejte implementaci třídy a minimalizujte veřejné rozhraní. Metody, které nejsou nutné pro uživatele třídy, znepřístupněte pro uživatele třídy. Postupy, které jsou složitější či u kterých lze předpokládat změny (např. konkrétní algoritmus třídění či konkrétní algoritmus pro výpočet úroků) umístěte do vnitřních metod, které nebude možné přímo volat. Minimalizace rozhraní by však neměla být na úkor použitelnosti vytvářené třídy. Předpokladem pro ukrývání implementace je, že programovací jazyk podporuje zapouzdření 2. Oba pojmy spolu úzce souvisí, což někdy vede k jejich nepřesnému používání či vzájemnému zaměňování. 2.6. Vytváření tříd v Javě Když chceme vytvořit třídu v Javě, musíme napsat její zdrojový kód do souboru. Zdrojové kódy se píší do textových souborů (formát prostý text). Soubor se zdrojovým kódem třídy má koncovku.java a jmenuje se stejně jako třída, která je v něm popsána. V souboru mohou být na začátku uvedeny klauzule package a import, jejichž význam si objasníme později. Popis třídy začíná hlavičkou třídy, v níž musí být uvedeno klíčové slovo class a jméno třídy. Další níže uvedené prvky jsou volitelné a budou objasněny postupně. Tělo třídy je uvedeno mezi složenými závorkami. Zde je třeba uvést, jaké datové atributy bude třída obsahovat a jaké metody bude možné volat. Třída může obsahovat i další prvky, které budou popsány později. Obecně vypadá deklarace třídy takto: [ package jménobalíčku; ] [ import JménoTřídy;... ] [publi c] [final abstract] class jmeno [ extends JménoRodičovskéTřídy] [implements JménoRozhraní ] { datové atribu ty třídy; datové atributy; vnoře né třídy; kons truktory; metody; Hlavička třídy Ucet z našeho úvodního příkladu bude vypadat takto: public c lass Ucet { //zde bude popsáno jaké datové atributy a metody bude třída obsahovat 2.6.1. Identifikátory Jméno třídy, datového atributu, metody atd. se označuje jako identifikátor. Pojmenování jednotlivých součástí třídy, i třídy samotné, se řídí určitými pravidly. Základní pravidla pro vytváření identifikátorů v Javě jsou následující: identifikátor je tvořen posloupností písmen, číslic a podtržítka, začíná písmenem, Java rozlišuje malá a velká písmena: cislo a Cislo jsou dva různé identifikátory, identifikátor nesmí obsahovat klíčové slovo Javy (seznam klíčových slov pro verzi 5.0 je uveden v tabulce 2.1). 2 Současné objektové programovací jazyky podporují obě vlastnosti, v historii se však najdou jazyky, které podporovaly pouze zapouzdřování.

Objekty strana 16 abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while Tabulka 2.1 Seznam klíčových slov Javy 5.0 Tato pravidla pro identifikátory jsou závazná a kontroluje je překladač. Další pravidla pro identifikátory stanovená firmou Sun je vhodné dodržovat pro lepší čitelnost a pochopitelnost kódu, ale nejsou kontrolována překladačem. Nyní uvedeme alespoň základní doporučení. Identifikátor by měl vystihovat obsah proměnné/datového atributu, význam formálního parametru, třídy nebo činnost metody. Při vytváření identifikátorů se v Javě používá tzv. velbloudí notace (výjimku představují konstanty), u víceslovných identifikátorů je každé první písmeno slova uvedeno velkým písmenem např. rodnecislo, stavuctu. Zda je první písmeno identifikátoru malé či velké se řídí následujícími pravidly: * velké písmeno na začátku, počáteční písmena každého dalšího slova velká, ostatní písmena malá používá se pro označení třídy a rozhraní, * malé písmeno na začátku, počáteční písmena dalších slov velká, ostatní písmena malá používá se pro proměnné tříd a instancí, pro pomocné proměnné metod, pro formální parametry metod a pro jména metod, * všechna písmena velká, jednotlivá slova oddělena podtržítkem _ používá se pro pojmenované konstanty. Nedoporučujeme používání diakritiky v identifikátorech. 2.6.2. Datové atributy instance Datové atributy uchovávají informace o instanci mezi jednotlivými voláními metod. Každý datový atribut musí mít určený typ a jméno (identifikátor). Určení jména a typu se označuje jako d eklarace. Přehled datových typů v Javě je uveden v kapitole 3, zde si pouze uvedeme, že vytvořením nové třídy vznikne další datový typ. Před datovým typem je uveden modifikátor přístupu, který určuje úroveň zapouzdření. V případě datových atributů se téměř vždy používá modifikátor private (podrobnosti viz podkapitola Modifikátory přístupu k datovým atributům a metodám na straně 20). Další specifické modifikátory budou objasněny v následujících kapitolách. Deklarace datového atributu se obecně zapisuje takto: [modifikátory] typ identifikátor; Následují příklady: private int cislouctu; //typ int je celé číslo private String jmenovlastnika; //typ String znamená řetězec znaků private double castka; //typ double je desetinné číslo Nastavení počáteční hodnoty se nazývá inicializace. Pokud není u datových atributů explicitně uvedena, přiřadí se defaultní hodnota. Deklaraci a inicializaci je možné spojit do jednoho příkazu. [modifikátory] typ identifikátor = hodnota;

Objekty strana 17 Příklad následuje: private double castka = 0; Každý příkaz v Javě je ukončen středníkem a píše se na samostatný řádek (z důvodu lepší čitelnosti kódu). Deklarace všech datových atributů by měly být na jednom místě v kódu, obvykle se uvádějí na začátku nebo na konci třídy. My budeme deklarace datových atributů uvádět vždy na začátku třídy. Deklarace třídy Ucet včetně datových atributů tedy bude vypadat takto: public class Ucet { private int cislouctu; private String jmenovlastnika; private double castka = 0; //zde budou následovat metody 2.6.3. Metody instance Metody představují dovednosti, činnosti, které může objekt (instance) provádět. Metody jsou deklarovány ve třídě. Metoda se skládá s hlavičky (podpisu) metody a těla metody, které je tvořeno pomocí příkazů a deklarací lokálních proměnných uvedených mezi složenými závorkami. [modifikátory] typnávratovéhodnoty jménometody ( [formálníparametry] ) [throws výjimky] { [deklarace_proměnných;] [příkazy;] Hlavička (podpis) metody má několik částí: modifikátor přístupu, další (nepovinné) modifikátory, typ návratové hodnoty, jméno (identifikátor), kulaté závorky (povinné), které mohou obsahovat deklaraci formálních parametrů metody, vyhazované výjimky (nepovinná část) viz kapitola 12. Metody mohou mít uvedeny různé modifikátory přístupu, jež jsou podrobněji popsány v podkapitole Modifikátory přístupu k datovým atributům a metodám. V hlavičce metody mohou být i některé další modifikátory. Typ návratové hodnoty metody je povinný. Metoda může vracet libovolný typ platný v Javě (viz kapitola 3). Pokud žádnou hodnotu nevrací, musí být uvedeno vyhrazené slovo void. Formální parametry metody slouží k předání vstupních hodnot do metody. Každý parametr je v hlavičce metody deklarován podobně jako datové atributy typem a jménem, není možné (ani smysluplné) uvádět modifikátor přístupu (parametr platí pouze v metodě). V hlavičce metody není možné přiřadit parametru defaultní hodnotu. Lokální proměnná (pomocná proměnná metody) se v metodě používá pro uložení nějakého mezivýsledku a po ukončení činnosti metody je zrušena. Deklarace a inicializace pomocné proměnné se od inicializace datového atributu liší tímto: neuvádějí se modifikátory přístupu, proměnné nejsou implicitně inicializovány, první hodnotu musí nastavit programátor. Problematika rozsahu platnosti lokálních proměnných je uvedena v kapitole 4 v souvislosti se sekvencí (blokem) příkazů.

Objekty strana 18 V těle metody, které je zapsáno mezi dvěma složenými závorkami, mohou být následující příkazy: volání metody, přiřazení, příkaz return, sekvence (posloupnost, blok příkazů), selekce (rozhodování, větvení), iterace (cyklus, opakování), příkaz skoku z cyklu, vyvolání a obsluha výjimek, prázdný příkaz, příkaz assert pro testování metody. Postupně si jednotlivé příkazy vysvětlíme v této i dalších kapitolách. Alespoň některé druhy metod si nyní ukážeme na našem jednoduchém příkladě s účty. Metoda bez parametrů s návratovou hodnotou Příkladem takovéto metody bude ve třídě Ucet metoda pro zjištění stavu účtu. Stav účtu je představován datovým atributem stav typu double, návratová hodnota metody tedy musí být také typu double. Pro vrácení hodnoty z metody má Java příkaz (klíčové slovo) return, uvedením tohoto příkazu se provádění příkazů v metodě ukončí a vrátí se hodnota za ním uvedená. V naší metodě tedy musí být tento příkaz uveden a musí vrátit hodnotu datového atributu stav. Metodu pojmenujeme trochu podivně getstav(). Důvodem pro toto pojmenování je další ze zvyklostí zavedených v Javě. Pokud metoda vrací hodnotu nějakého datového atributu, měla by se jmenovat getjmenoatributu(), proto tedy getstav() Metoda bude mít modifikátor přístupu public, patří do veřejného rozhraní třídy Ucet. Na následujícím obrázku je znázorněno, jak bude vypadat kód této metody (deklarace metody getstav). Obrázek 2.5 Popis metody s návratovou hodnotou Důležité je si uvědomit, že ačkoli metoda nemá parametry, kulaté závorky jsou v podpisu metody vždy uvedeny. Metoda s parametry bez návratové hodnoty Příkladem takovéto metody ve třídě Ucet je metoda pro vložení další částky na účet. V tomto případě potřebujeme metodě sdělit, kolik peněz na účet vkládáme. Tento údaj představuje vstupní parametr metody. Při deklaraci metody musíme uvést, jakého typu bude parametr vzhledem k tomu, že stav je typu double, tak i vkládané částky budou tohoto typu. Metoda přidá uvedenou částku na účet a nevrátí žádnou hodnotu, v deklaraci tedy bude uveden návratový typ void. Metoda, která nevrací hodnotu, nemá v kódu zpravidla uveden příkaz return (pokud ano, nesmí za ním být uvedeno nic) a

Objekty strana 19 končí provedením všech příkazů uvedených v metodě. Jak bude kód metody vypadat i s vysvětlivkami, vidíte na obrázku 2.6. Obrázek 2.6 Popis metody s parametrem V hlavičce metody se může deklarovat více parametrů, jednotlivé deklarace jsou od sebe odděleny čárkou. Metoda s parametry a s návratovou hodnotou Jako příklad takovéto metody můžeme ve třídě Ucet uvést metodu pro výběr peněz. Požadovaná částka bude vstupním parametrem metody a bude typu double. Pokud bude na účtu dostatek peněz, metoda provede odpočet částky z účtu a vrátí true (výběr se povedl). Jestliže požadovaná částka bude vyšší než stav účtu, vrátí metoda hodnotu false (výběr se nepovedl) a částka odečtena nebude. Podrobnější vysvětlení příkazu if, který se v metodě použije, najdete v kapitole 4. Nyní si uvedeme, jak bude vypadat deklarace třídy Ucet včetně těchto tří metod. Povšimněte si také odsazování jednotlivých části kódu a zápisu složených závorek. Párování závorek je možné zapisovat dvěma způsoby. První byl uveden na obrázku 2.5 s kódem metody getstav(). Druhý je používán ve všech ostatních případech. Vyberte si ten způsob zápisu kódu, který se vám jeví jako čitelnější. public class Ucet { private int cislouctu; private String jmenovlastnika; private double castka = 0; public double getstav(){ return stav; public void vloz (double castka){ stav = stav + castka;

Objekty strana 20 public boolean vyber (double castka){ if ((stav castka) >= 0) { stav = stav castka; return true; else { return false; //zde budou další metody 2.6.4. Modifikátory přístupu k datovým atributům a metodám Následující modifikátory uvádějí možnost přístupu k datovému atributu nebo metodě: private, (nic neuvedeno), protected, public. Označíme-li nějaký datový atribut nebo metodu jako private, znamená to, že je přístupná pouze z metod instance. V příkladě s účty jsou takto označeny všechny datové atributy. Stav účtu si v metodě jiné třídy nemohu přečíst přímo z datového atributu, ale pomocí metody getstav(). Obdobně z metod jiných tříd mohu změnit stav účtu zase jen prostřednictvím metod. Jako druhý modifikátor vlastně není nic uvedeno, ale znamená to, že pokud neuvedeme žádný modifikátor přístupu, použije se přátelský přístup. Datové atributy a metody jsou v tomto případě přístupné v rámci balíčku (viz následující podkapitola). Datové atributy a metody, které mají označení přístupu protected, jsou přístupné v rámci balíčku a také z potomků v rámci dědičné hierarchie (viz kapitola 11). Modifikátor protected se použije u metod, které usnadní psaní potomků, ale které nemají význam pro běžné použití instance třídy (poté by měl být použit modifikátor public). Označení přístupu public znamená, že daný datový atribut či metoda jsou přístupné z jakékoli jiné třídy. Jak již bylo uvedeno, pokud deklarujeme samostatnou třídu, můžeme před klíčovým slovem class uvést pouze modifikátor public nebo žádný. Jejich význam je stejný jako v případě datových atributů a me tod. Třídu označenou jako public vidí všechny ostatní třídy, třídu bez modifikátoru publ ic jen třídy ze stejného balíčku. 2.6.5. Konstruktor Ja k již bylo v textu uvedeno, instance jsou vytvářeny pomocí speciálních metod, které označujeme jako konstruktory. V Javě platí pro konstruktory několik pravidel, která je odlišují od ostatních metod: konstruktor se vždy jmenuje jako třída (výjimka z pravidla o malých počátečních písmenech metod), konstruktor nemá uveden žádný návratový typ (ani void), pokud žádný konstruktor nenapíšete, vytvoří překladač prázdný veřejný konstruktor bez parametrů, konstruktory se na rozdíl od ostatních metod nedědí ( viz kapitola 11 o dědičnosti). Konstruktor slouží k vytvoření instance a většinou také k inicializaci datových atributů. Ukážeme si, jak bude vypadat konstruktor naší třídy Ucet. V rámci vytváření instance vždy nastavíme číslo účtu a jméno vlastníka. Tyto hodnoty budou představovat vstupní parametry konstruktoru. V průběhu vytváření instance budou tyto hodnoty dosazeny do odpovídajících datových atributů. Kód konstruktoru bude vypadat takto:

Objekty strana 21 public Ucet (int cislo, String vlastnik){ cislouctu = cislo; jmenovlastnika = vlastnik; Je tedy možné vytvořit novou instanci třídy Ucet s daným číslem a vlastníkem, stav tohoto účtu bude 0.00. Pokud bychom chtěli vytvořit účet s určitou počáteční hodnotou, která by byla u různých instancí různá, musíme napsat ještě jeden konstruktor. Tento konstruktor bude mít navíc ještě jeden parametr typu double a bude představovat počáteční vklad. Kód tohoto konstruktoru bude vypadat takto: public Ucet (int cislo, String vlastnik, double pocatecnivklad){ cislouctu = cislo; jmenovlastnika = vlastnik; stav = pocatecnivklad; Jak vidíte, jedna třída může mít libovolný počet konstruktorů, musejí se od sebe lišit počtem, pořadím nebo typem parametrů. Této vlastnosti se říká přetěžování (overloading). Přetížit lze i obyčejné metody, v jedné třídě může být libovolný počet metod stejného jména, které se liší počtem, pořadím nebo typem parametrů. Metodu ale nelze přetížit pouze typem návratové hodnoty. Kód naší třídy Ucet rozšířený o konstruktory je uveden v následujícím výpise. public class Ucet { private int cislouctu; private String jmenovlastnika; private double stav = 0; public Ucet (int cislo, String vlastnik){ cislouctu = cislo; jmenovlastnika = vlastnik; public Ucet (int cislo, String vlastnik, double pocatecnivklad){ cislouctu = cislo; jmenovlastnika = vlastnik; stav = pocatecnivklad; public double getstav(){ return stav; public void vloz (double castka){ stav = stav + castka ; public boolean vyber (double castka){ if ((stav castka) >= 0) { stav = stav castka; return true; else { return false; //zde budou další metody

Objekty strana 22 2.7. Vytváření instancí a volání metod v Javě Zatím jsme si popsali, jak vytvořit třídu tj. jak udělat obecný popis nějakých objektů z reality. Nyní ukážeme, jak v programu (aplikaci) vytvářet jednotlivé instance a volat jejich metody. V Javě bude tento kód opět umístěn v nějaké třídě a její metodě. Může to být např. třída Banka. Nebudeme zde však uvádět celý kód třídy, ale pouze jednotlivé řádky kódu, které by byly umístěny v metodách. První věc, kterou si musíme objasnit je, jak vytvořit instanci a uložit si na ni odkaz, abychom s ní mohli dále pracovat. Pokud chceme vytvořit instanci třídy Ucet, musí být identifikátor použitý na uložení odkazu typu Ucet, protože každá vytvořená třída je zároveň datovým typem. Identifikátor si pojmenujeme ucet1. Deklarace identifikátoru pro uložení odkazu na instanci třídy Ucet bude vypadat takto: Ucet ucet1; Vytvoření nové instance proběhne pomocí volání konstruktoru. Volání konstruktoru v Javě je vždy spojeno s klíčovým slovem new. Který ze dvou vytvořených konstruktorů se použije, záleží na počtu skutečně zadaných parametrů. Vytvoření instance a přiřazení odkazu na ni do identifikátoru bude vypadat takto: ucet1 = new Ucet (1, Pepa ); Deklaraci a inicializaci je možné spojit dohromady do jednoho příkazu, viz obrázek 2.7. Obrázek 2.7 Popis vytváření instance pomocí konstruktoru Když máme v identifikátoru uložený odkaz na vytvořenou instanci, můžeme volat metody této instance (můžeme ji posílat zprávy). Pokud metoda nevrací hodnotu, uvedeme při jejím volání pouze odkaz na instanci, tečku a název metody. Pokud má metoda deklarovány formální parametry, musíme při volání uvést skutečné hodnoty, se kterými bude metoda pracovat. Můžeme zadat konstantu nebo identifikátor proměnné, která hodnotu obsahuje nebo na ni odkazuje. Třetí možností je uvést za parametr jinou metodu, která vrací hodnotu příslušného typu. V případě, že metoda vrací hodnotu a my s ní chceme dále pracovat, musíme výsledek metody přiřadit do proměnné odpovídajícího typu. Na následujícím obrázku je uvedeno, jak zavolat metodu vloz() s hodnotou parametru 100 a jak získat informaci o stavu účtu pomocí metody getstav(). Výsledek metody getstav() musíme uložit do proměnné typu double, protože metoda vrací hodnotu tohoto typu. Obrázek 2.8 Popis volání metod instance

Objekty strana 23 2.7.1. Volání metod v rámci jedné instance (this) Zatím jsme si ukázali, jak volat metody jiné instance, občas však potřebujeme z jedné metody zavolat jinou metodu stejné instance. V tomto případě potřebujeme odkaz sami na sebe pro odkaz sama na sebe je v Javě vyhrazeno klíčové slovo this. Následuje ukázka metody pro přičtení úroků, parametrem je procento úroku, které se má přičíst. public void prictiurok (double procento) { this.vloz(this.getstav() * procento); V metodě prictiurok() se volá metoda getstav() pro zjištění aktuálního stavu účtu a metoda vloz(), která vloží vypočtený úrok na účet. Klíčové slovo this je nepovinné, neboť překladač ho ve většině případů automaticky doplní. Metoda poté může vypadat následovně: public void prictiurok (double procento) { vloz(getstav() * procento); This se používá i pro odkaz na datové atributy instance. Většinou se neuvádí, neboť obdobně jako u volání metod doplní překladač this. V situacích, kdy jméno datového atributu koliduje se jménem lokální proměnné či s identifikátorem parametru metody, se však this uvádět musí. Příkladem je odlišení datových atributů od parametrů metod. Pokud metoda nebo konstruktor přiřazuje hodnotu parametru k datovému atributu, většinou se pro datový atribut a parametr metody používá stejný identifikátor. Má to dvě výhody kód metody je přehlednější a nemusí se vymýšlet dvojnásobek jmen identifikátorů. Klíčové slovo this se používá ještě při volání jednoho konstruktoru z druhého v rámci jedné třídy. Na druhý konstruktor se odkazujeme pomocí this (tj. ne jménem třídy), správný konstruktor se vybere dle počtu a typů parametrů. Omezením je, že volání druhého konstruktoru musí být prvním příkazem v konstruktoru. S využitím this by deklarace datových atributů a konstruktory třídy Ucet mohly vypadat následovně: public class Ucet { private int cislo; private String vlastnik; private double castka = 0; public Ucet (int cislo, String vlastnik){ this(cislo, vlastnik, 0); // volání druhého konstruktoru public Ucet (int cislo, String vlastnik, double pocatecnivklad){ this.cislo = cislo; this.vlastnik = vlastnik; castka = pocatecnivklad; // pokračování třídy Použití stejných jmen pro datové atributy a pro parametry metod je častým důvodem chyb. Pokud použijete stejné názvy, nezapomeňte na this u datových atributů.

Objekty strana 24 2.8. Modifikátor final Modifikátor final je příznakem neměnnosti/konečnosti. Používá se ve více situacích: final v deklaraci třídy Třída s modifikátorem final je konečná, tj. nelze vytvářet potomky této třídy. Příkladem mohou být třídy String, Math či obalové třídy (Integer, Long, Boolean, atd.). fina l v deklaraci metody Metoda s modifikátorem final je konečná, tj. tuto metodu nelze překrývat v potomkovi. Modifikátor final se uvádí v případě, že chceme zajistit neměnnost metody v potomcích, tj. u metod, které mají jiný modifikátor přístupu než private. Metody s modifikátorem přístupu private nelze překrýt z principu modifikátoru. Modifikátor final nelze použít u konstruktoru. Pokud je metoda final, může být v potomkovi přetížena v potomkovi může být metoda stejného jména, která se bude lišit počtem či typy parametrů. final u datového atributu Datovému atributu s modifikátorem final lze přiřadit hodnotu pouze jednou, další pokusy o přiřazení hodnoty končí chybou při překladu. Pokud je datový atribut referenčního typu, je možné pomocí metod měnit obsah instance, nelze však do atributu přiřadit jinou instanci. Datové atributy s modifikátorem final mají obvykle i modifikátor static datový atribut je poté společný pro všechny instance třídy, je v paměti pouze jednou. Popis modifikátoru static je v kapitole 7. Následuje deklarace třídy Bod, která obsahuje konstantu referenčního typu. class Bod { private int x, y; final static Bod POCATEK = new Bod(0, 0); Bod (int x, int y) { this.x = x; this.y = y; final u pomocné proměnné V deklaraci pomocné proměnné může být uveden jediný modifikátor final. Význam má stejný jako u datového atributu do proměnné lze přiřadit hodnotu pouze jednou, další pokusy o přiřazení hodnoty označí překladač za chybu. final u parametru metody Je to jediný modifikátor, který může být uveden v deklaraci parametru metody. Při překladu se kontroluje, že se v těle metody do parametru metody nic nepřiřazuje. Přiřazovat hodnotu k parametru metody nemá význam jak jsme si řekli již dříve, tak při volání metody se hodnoty primitivních datových typů kopírují, v případě referenčních typů se kopíruje odkaz. Tj. pokud uvedeme modifikátor final u parametru metody, tak nás pouze překladač upozorní na nesmyslnost přiřazení hodnoty/odkazu do parametru metody. 2.9. Rušení objektů V Javě se programátor nemusí starat o rušení instancí (objektů) JVM (Java Virtual Machine) obsahuje speciální proces Garbage Collector (GC), který pravidelně hledá instance, na které nevede žádný odkaz. Pokud nějakou takovou instanci nalezne (na obrázku 2.3 je takovou instancí David Ztracený ), tak v prvním kroku zavolá metodu finalize(). Ve druhém kroku GC instanci vymaže z paměti.

Objekty strana 25 Metodu finalize() má každá instance, neboť ji dědí ze třídy Object. Ve třídě Object je tato metoda prázdná a obvykle se ve třídách nepřekrývá (překrývání viz kapitola 11 věnovaná dědičnosti). JVM nezaručuje, že se metoda finalize() opravdu provede typicky při ukončení aplikace se již metoda finalize() nevolá. Tím, že se programátor nemusí starat o rušení objektů, je programování v Javě jednodušší a nedochází obvykle k chybám při práci s pamětí jako v C či v C++. Přesto by se měl programátor snažit dodržovat dvě pravidla: Omezovat vytváření objektů, čímž se omezí i náročnost jejich rušení (a aplikace má menší paměťové nároky). Omezování vytváření objektů by však nemělo být na úkor přehlednosti či znovupoužitelnosti kódu, pokud nějaký identifikátor odkazuje na již nepotřebnou instanci, měli bychom přiřadit tomuto identifikátoru hodnotu null (přiřazovacím příkazem promenna = null;). Tím se odkaz na instanci zruší a GC může instanci smazat z paměti (pokud na ni není odkaz odjinud). 2.10. Balíčky (package) Součástí distribuce Javy je několik tisíc již připravených tříd a rozhraní, které je třeba logicky uspořádat. Třídy jsou proto rozděleny do různých balíčků. Balíček (package) tvoří zároveň i základní jmenný prostor, v rámci kterého musí mít třída jednoznačné jméno. Ve více balíčcích mohou být různé třídy stejného jména. Jména balíčků vytvářejí stromovou (adresářovou) strukturu, část struktury balíčku standardu Javy je uvedena na obrázku 2.9. Programátoři v rámci rozsáhlejších aplikací vytvářejí další balíčky na začátku souborů se zdrojovým kódem uvedou klauzuli package následovanou jménem balíčku. Struktuře balíčků musí odpovídat i adresářová struktura, ve které jsou uloženy zdrojové a přeložené třídy. Obrázek 2.9 Část adresářové struktury balíčků API Javy 5.0 Existuje ještě tzv. nepojmenovaný balíček (noname package). V nepojmenovaném balíčku jsou všechny třídy, které nemají uvedenu klauzuli package a jsou uloženy ve stejném adresáři. Takto umístěné třídy budeme používat v těchto skriptech.

Objekty strana 26 Na třídy z nepojmenovaného balíčku se odkazujeme pouze jménem. Obdobně třídy z balíčku java.lang lze v programu používat jen s jejich jménem např. String, Integer, Object... Třídy z ostatních balíčků lze vždy označovat plným jménem včetně balíčku, např. java.util.arraylist. Variantou k zadání celého jména je použití klauzule import pro příslušnou třídu, poté již lze používat jméno bez jména balíčku: import java.util.arraylist;..... private ArrayList seznam; V klauzuli import lze zadat místo jména konkrétní třídy hvězdičku. Poté se importují všechny třídy a rozhraní z příslušného balíčku (ale ne z podřízených balíčků). import java.util.*;...... private ArrayList seznam; Při použití importu (a hlavně importů s hvězdičkou) může dojít k tomu, že se z různých balíčků importují dvě třídy stejného jména. V tomto případě je nutné dále používat celé jméno třídy. 2.11. Komentáře Rozlišují se dva typy komentářů: dokumentační, které se zahrnují do dokumentace vytvářené programem javadoc: /**... */ implementační, které jsou víceřádk ové (/*...*/) a jednořádkové ( // ). Dokumentační komentáře musí být uvedeny před každou deklarací třídy, metody, rozhraní či datového atributu, které mají modifikátor přístupu public či protected. Začínají znaky /** a končí znaky */. V textu komentáře by měly být použity klíčová slova pro javadoc viz tabulka 2.2. Text může též obsahovat formátovací znaky HTML. klíčové slovo @author @version @see popis jméno autora třídy číselné označení verze třídy @param jméno_parametru popis parametru @return odkaz na jinou třídu/metodu či na nějaké URL popis návratové hodnoty z metody @exception jméno_výjimky popis výjimky, která může nastat v metodě Tabulka 2.2 Základní značky pro javadoc Následuje příklad dokumentačních komentářů: /** * Tato třída slouží ke generování výstupu s různými způsoby * kódování českých znaků * * @author xabcd01 * @created 27. may 2001 */