Myslíme objektově. v jazyku. Rudolf Pecinovský 2004. @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 1 z 433



Podobné dokumenty
Ukazka knihy z internetoveho knihkupectvi

knihovna programátora

Kurzy, Podrobnější informace najdete na Dotazy a přihlášky můžete posílat na

Kurzy, Podrobnější informace najdete na Dotazy a přihlášky můžete posílat na kurzy@amaio.cz

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

knihovna programátora

1. Dědičnost a polymorfismus

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

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

Generátor kódu. a jeho uplatnění ve výuce programování. Rudolf PECINOVSKÝ rudolf@pecinovsky.cz

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

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Vyřešené teoretické otázky do OOP ( )

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Matematika v programovacích

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

ALGORITMIZACE A PROGRAMOVÁNÍ

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

Metodika. Architecture First. Rudolf Pecinovský

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

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

Vývojové nástroje jazyka Java

Ukázka knihy z internetového knihkupectví

Překladač a jeho struktura

IB111 Úvod do programování skrze Python Přednáška 13

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Sada 1 - Základy programování

Objektové programování

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

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

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

Úvodem... 9 Kapitola 1 Karetních

Obsah. Úvod Začínáme s PowerPointem Operace se snímky Pro koho je kniha určena...10 Použité konvence...11

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

TÉMATICKÝ OKRUH Softwarové inženýrství

Simluátor Trilobota. (projekt do předmětu ROB)

Generické programování

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

Výčtový typ strana 67

Ukázka knihy z internetového knihkupectví

Dědění, polymorfismus

Úvod. Programovací paradigmata

1.5.1 Číselné soustavy

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.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

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

2 Postup při programování, úvod do programovacího jazyka Java

Základy objektové orientace I. Únor 2010

11. Přehled prog. jazyků

1. Úvod do obsluhy AutoCADu

IB111 Programování a algoritmizace. Programovací jazyky

Delphi - objektově orientované

Algoritmy a algoritmizace

Program a životní cyklus programu

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Quo vadis programování? Automatizace vyhodnocování studentských úloh

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

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

Obsah. Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

S2. Vytvoření Windows balíku pro vývoj na STM32 architektuře

KOMU JE KNIHA URČENA?

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

První kroky s METEL IEC IDE

Vlákno (anglicky: thread) v informatice označuje vlákno výpočtu neboli samostatný výpočetní tok, tedy posloupnost po sobě jdoucích operací.

KOMU JE KNIHA URČENA?

Seznámení s prostředím dot.net Framework

Programování v jazyce C a C++

StatSoft Jak vyzrát na datum

1. Programování proti rozhraní

( ) ( ) Rozklad mnohočlenů na součin I (vytýkání) Předpoklady:

Vývoj programů. ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Pohled do nitra mikroprocesoru Josef Horálek

Jak správně psát scénáře k případům užití?

Mzdy Optimum základy ovládání

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

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

knihovna programátora

typová konverze typová inference

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

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

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

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

Seminář Java II p.1/43

2. Modelovací jazyk UML 2.1 Struktura UML Diagram tříd Asociace OCL. 3. Smalltalk 3.1 Jazyk Pojmenování

Hromadná korespondence

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

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

Programování v jazyku LOGO - úvod

Transkript:

Myslíme objektově v jazyku Rudolf Pecinovský 2004 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 1 z 433

Stručný obsah Stručný obsah Stručný obsah...2 Podrobný obsah...4 Úvod...13 Část 1: Zapouzdření 18 1. Seznamujeme se s nástroji...19 2. Pracujeme s třídami a objekty...40 3. Vytváříme vlastní třídu...80 4. Dotváříme vlastní třídu...176 5. Návrhové vzory...229 Část 2: Více tváří 239 6. Rozhraní...240 7. Co takhle něco zdědit?...291 8. Třídy mohou také dědit...314 9. Budete si to přát zabalit?...376 10. Knihovny...393 Část 3: Přemýšlíme 395 11. Program začíná přemýšlet...396 12. Ještě jednu rundu, prosím...401 13. Kontejnery nejsou jen na odpadky...402 14. Pole...403 15. Jak nebýt výjimečný...404 16. Co jsme si ještě neřekli...405 Část 4: Přílohy 406 A Instalace vývojového prostředí...407 B Základy práce s BlueJ...414 C Syntaktické diagramy...416 D Použité projekty...417 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 2 z 433

Rejstřík...420 Část 5: KONEC 424 17. Číslování řádků programu...425 18. Odkladky...432 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 3 z 433

Podrobný obsah Podrobný obsah Stručný obsah...2 Podrobný obsah...4 Úvod...13 Použité konvence... 16 Část 1: Zapouzdření 18 1. Seznamujeme se s nástroji...19 1.1 Trochu historie... 19 První počítače... 19 Program musí být především spolehlivý... 20 1.2 Objektově orientované programování OOP... 21 Vývoj metodik programování... 21 Principy OOP... 22 1.3 Překladače, interprety, platformy... 23 Operační systém a platforma... 23 Programovací jazyky... 24 1.4 Java a její zvláštnosti... 25 Objektově orientovaná... 26 Jednoduchá... 26 Překládaná i interpretovaná...26 Multiplatformní... 27 1.5 Vývojové prostředí BlueJ... 28 1.6 Projekty a BlueJ... 29 Umístění projektů na disku... 29 Windows a substituované disky... 30 Vyhledání a otevření projektu... 32 1.7 Diagram tříd... 33 Manipulace s třídami v diagramu... 34 1.8 Shrnutí co jsme se naučili... 38 Nově zavedené termíny... 39 2. Pracujeme s třídami a objekty...40 2.1 Nejprve trocha teorie... 40 Třídy a jejich instance... 41 Zprávy... 41 Metody... 42 2.2 Analogie... 43 2.3 Třídy a jejich instance... 43 Vytváříme svou první instanci... 43 Pravidla pro tvorbu identifikátorů v jazyce Java... 46 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 4 z 433

Vytváříme svou první instanci pokračování...47 Posíláme instanci zprávu...49 Vytváříme další instance...50 Rušení instancí a správa paměti...50 2.4 Zprávy žádající o hodnotu...52 Datové typy...52 Primitivní datové typy...53 Objektové datové typy...54 Vracení hodnot primitivních typů...54 Vracení hodnot objektových typů...55 2.5 Parametry a jejich typy...58 Vyvolání konstruktoru s parametry...59 Parametry objektových typů...62 Posílání zpráv s parametry...63 2.6 Metody třídy...64 2.7 Instance versus odkaz...66 2.8 Výlet do nitra instancí...68 Atributy instancí...68 Opravit...70 Atributy třídy statické atributy...70 Opravit...71 2.9 Přímé zadávání hodnot parametrů objektových typů...73 Veřejné atributy...73 Odkazy vrácené po zaslání zprávy...75 2.10 Shrnutí co jsme se naučili...77 Nově zavedené termíny (abecedně)...79 3. Vytváříme vlastní třídu...80 3.1 První vlastní třída...82 3.2 Zdrojový kód třídy...84 Prázdná třída...85 Implicitní konstruktor...87 3.3 Odstranění třídy...88 3.4 Přejmenování třídy...89 3.5 Bezparametrický konstruktor...91 3.6 Ladění...95 Syntaktické chyby...96 Běhové chyby...97 Logické (sémantické) chyby...99 3.7 Konstruktor s parametry...100 Konstruktor this...101 3.8 Testování...104 TDD vývoj řízený testy...104 Testovací třída...105 Přípravek...106 Úprava obsahu přípravku...107 3.9 Deklarace atributů...109 Modifikátory přístupu...110 Vylepšujeme Strom...110 Možné důsledky zveřejnění atributů...112 3.10 Syntaktické definice...113 3.11 Definujeme vlastní metodu...115 Test vytvořených metod...117 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 5 z 433

Nejprve testy, pak program?... 120 Někdy jsou věci složitější... 123 Použití metod vracejících hodnotu... 124 Definice metod vracejících hodnotu... 125 Parametry a návratové hodnoty objektových typů... 126 3.12 Přetěžování... 127 3.13 Zapouzdření... 128 Rozhraní implementace... 128 Přístupové metody... 129 Konvence pro názvy přístupových metod... 131 Kontrakt... 132 3.14 Kvalifikace a klíčové slovo this... 132 Kvalifikace metod... 132 Kvalifikace atributů... 134 3.15 Atributy a metody třídy (statické atributy a metody)... 136 Atributy třídy... 136 Metody třídy... 137 3.16 Lokální proměnné... 139 3.17 Konstanty a literály... 143 Konstanty objektových typů... 145 Správná podoba literálů... 146 boolean... 146 int... 146 double... 146 String... 147 null... 148 3.18 Komentáře a dokumentace... 148 Tři druhy komentářů... 149 Uspořádání jednotlivých prvků v těle třídy... 157 BlueJ a komentářová nápověda... 158 Automaticky generovaná dokumentace... 160 Dokumentace celého projektu... 161 Pomocné značky pro tvorbu dokumentace... 164 @author... 164 @version... 164 @param... 164 @returns... 164 3.19 Závěrečný příklad UFO... 165 Třída Dispečer... 166 Jednodušší varianta... 166 Varianta ovládaná z klávesnice... 166 Třída UFO... 167 Třída UFOTest... 168 3.20 Vytvoření samostatné aplikace... 168 Třída spouštějící aplikaci... 169 Vytvoření souboru JAR s aplikací... 169 3.21 Shrnutí co jsme se v kapitole naučili... 171 4. Dotváříme vlastní třídu...176 4.1 Jednoduché vstupy a výstupy... 176 Doplnění projektu o třídu odjinud... 177 Textové řetězce... 177 Rozdíl mezi prázdným řetězcem a null... 179 Čísla... 180 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 6 z 433

4.2 Knihovny statických metod...181 4.3 Podrobnosti o operátorech...181 Binární aritmetické operátory + * / %... 182 Sčítání, odčítání, násobení...182 Slučování řetězců +...183 Dělení /...183 Zbytek po dělení (dělení modulo) %...184 Unární operátory +...185 Kulaté závorky ( )...185 Přiřazovací operátor =...186 Sdružené přiřazovací operátory +=, =, *=, /=, %=...187 Operátor přetypován (typ)...188 Pseudopřetypování na String...189 4.4 Počítáme instance...190 4.5 Inkrementační a dekrementační operátory...191 Odbočka o obecných zásadách programování...194 Jiný způsob inicializace rodného čísla...196 4.6 Standardní výstup...196 4.7 Metoda tostring()...198 4.8 Prázdná standardní třída...199 4.9 V útrobách testovací třídy...202 Přípravek...204 Automaticky generované testy...206 Vlastní testy...207 Úklid...208 Metody assertequals a asserttrue...208 Test testů...209 4.10 Debugger a práce s ním...211 Krokování programu...212 Okno debuggeru...215 Vlákna...216 Pořadí volání...216 Atributy třídy...217 Atributy instancí...217 Lokální proměnné...217 Atributy a proměnné objektových typů...218 Už nezastavuj ruším zarážky...220 Předčasný konec programu...220 Pozastavení běžícího programu...221 Krokování konstruktorů...221 4.11 Hodnotové a referenční typy...222 Hodnotové typy...222 Referenční datové typy... 223 Program demonstrující rozdíl...223 4.12 Projekt Zlomky...225 4.13 Shrnutí co jsme se naučili...226 Nové termíny...228 5. Návrhové vzory...229 Opravit...229 5.2 Přepravka (Messenger)...230 5.3 Jedináček (Singleton)...233 5.4 Výčtové typy...237 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 7 z 433

5.5 Shrnutí co jsme se naučili... 237 Nové termíny... 238 Část 2: Více tváří 239 6. Rozhraní...240 6.1 Kreslíme jinak... 241 6.2 Rozhraní jako zvláštní druh třídy... 242 6.3 Instance rozhraní... 244 6.4 Nový projekt... 244 Práce s novým plátnem... 248 Událostmi řízené programování... 250 6.5 Implementace rozhraní... 250 Implementace rozhraní v diagramu tříd... 251 Implementace rozhraní ve zdrojovém kódu... 252 6.6 Úprava zdrojového kódu třídy Strom... 252 Třída musí jít přeložit... 253 Testování... 256 Závěrečné úpravy... 261 Uložení odkazu na Plátno do atributu třídy... 261 Odstranění statického atributu krok... 262 Úpravy posunových metod... 262 Zefektivnění přesunu... 262 Efektivita vykreslování... 263 6.7 Implementace několika rozhraní... 264 Odvolání implementace rozhraní... 265 6.8 Návrhový vzor Služebník (Servant)... 266 Proč rozhraní... 267 Implementace... 268 Aplikace na náš projekt... 269 Závěrečný test... 270 6.9 Refaktorování... 272 Ukázka... 273 1. krok: Vytvoření testu... 274 2. krok: Definice nových atributů... 275 3. krok: Kopírování těla konstruktoru do těla metody... 276 4. krok: Dočasné odkonstatnění některých atributů... 277 5. krok: Definice potřebných lokálních proměnných... 277 6. krok: Odstranění tvorby nových instancí koruny a kmene... 277 7. krok: Vrácení koruny a kmene mezi konstanty... 278 8. krok: Vyvolání metody setrozměr(int,int) v konstruktoru... 278 9. krok: Odstranění zdvojeného kódu z konstruktoru... 278 10. krok: Doplnění metody setrozměr(rozměr)... 279 11. krok: Doplnění metody setoblast(oblast)... 279 6.10 Projekt Výtah... 280 Analýza problému... 281 Okolí... 281 Konstruktory... 281 Potřebné metody... 282 Implementace... 283 Implementovaná rozhraní... 284 Atributy... 284 Postup při návrhu metod... 285 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 8 z 433

Metoda dopatra(int)...285 Metoda přijeďk(iposuvný)...285 Metoda nástup(iposuvný)...286 Metody výstupvpravo() a výstupvlevo()...286 Test převozu pasažéra...286 Metody odvezvpravo(iposuvný,int) a odvezvlevo(iposuvný,int)...287 6.11 Shrnutí co jsme se naučili...288 Nové termíny...290 7. Co takhle něco zdědit?...291 7.1 Co to je, když rozhraní dědí?...292 7.2 Jak to zařídit...293 Duplicitně deklarovaná implementace...294 7.3 Společný potomek několika rozhraní...294 7.4 Návrhový vzor Stav (State)...298 Projekt Šipky...298 Shrnutí...303 Projekt Robot...304 7.5 Návrhový vzor Zástupce (Proxy)...304 7.6 Projekt Kabina...306 Předpřipravené třídy...307 Multipřesouvač...307 IMultiposuvný...307 IZastávka...308 Linka...308 Úloha Kabina...309 Projekt Šipky... Chyba! Záložka není definována. Shrnutí... Chyba! Záložka není definována. Projekt Robot... Chyba! Záložka není definována. 7.7 Shrnutí co jsme se naučili...313 Nově zavedené termíny...313 8. Třídy mohou také dědit...314 8.1 Podtřídy a nadtřídy...315 Specializace...315 Zobecnění...315 Realizace v OOP...316 Univerzální (pra)rodič...317 8.2 Experimenty s dědičností...318 Univerzální rodič Object...319 Atributy a bezparametrické konstruktory tříd v projektu...320 Hierarchie dědičnosti...322 Podobjekt rodičovské třídy...324 Explicitní volání konstruktoru předka...327 Chráněné atributy modifikátor přístupu protected...329 Dědičnost a metody tříd...330 Metody instancí, jejich dědění a překrývaní...331 Nové metody...332 Nepřekryté zděděné metody...332 Překryté zděděné metody...332 Test chování překrývajících a překrytých metod...334 Porovnání...337 Podobjekt...337 Soukromá metoda...337 Veřejná metoda...338 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 9 z 433

Instance vnučka... 338 Vyvolání překryté verze metody... 338 8.3 Vytváříme dceřinou třídu... 340 Jednoduchá dceřiná třída... 341 Konstruktory potomka... 343 Složitější dceřiná třída... 344 Příprava prázdné třídy a testovací třídy... 344 Definice konstruktorů... 345 Metoda kresli(java.awt.graphics2d)... 346 Metoda setpozice(int,int)... 346 Jak přesvědčit objekt, aby se pokaždé choval jinak... 349 Samostatná úloha: Terč... 351 8.4 Vytváříme rodičovskou třídu... 354 Společný rodič Posuvný... 354 Příprava... 354 Konstantní atributy třídy... 356 Proměnné atributy třídy... 356 Konstantní atributy instancí... 356 Proměnné atributy instancí... 357 Konstruktory... 357 Metody instancí... 358 Doladění dceřiných tříd... 359 Elipsa, Obdélník, Trojúhelník... 359 Čára... 360 Text... 360 Strom... 361 Společný rodič Hýbací... 362 8.5 Abstraktní metody a třídy... 363 Neimplementovaná metoda implementovaného rozhraní... 364 Nově deklarovaná abstraktní metoda... 365 Abstraktní třída bez abstraktních metod... 366 8.6 Návrhový vzor Stav podruhé... 367 Projekt Šipka... 367 8.7 Co je na dědičnosti špatné... 369 8.8 Kdy (ne)použít dědičnost... 370 Co jsme dělali špatně... 371 Kdy dát přednost skládání a kdy dědičnosti... 372 8.9 Shrnutí co jsme se naučili... 372 Nově zavedené termíny... 374 9. Budete si to přát zabalit?...376 9.1 Velké programy a jejich problémy... 376 9.2 Balíčky... 377 Podbalíčky... 378 Uspořádání podbalíčků s programy k dosavadní části knihy... 379 9.3 Balíčky a BlueJ... 380 Příprava stromu balíčků pro BlueJ ve správci souborů... 380 9.4 Hrajeme si s balíčky... 381 Rodičovský balíček v diagramu tříd... 383 Převedení obyčejné složky na balíček v BlueJ... 384 Vytvoření nového balíčku v BlueJ... 384 Putování stromem balíčků... 384 Automatická redefinice příkazu package... 385 9.5 Jmenné prostory a příkaz import... 386 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 10 z 433

Import více tříd...386 Podbalíčky...387 Balíček java.lang...388 Nevýhody koncepce balíčků v BlueJ...388 Přemosťovací třída...388 9.6 Přístupová práva v rámci balíčku...389 9.7 Tvorba vlastních aplikací...390 9.8 Knihovny...391 9.9 Shrnutí co jsme se naučili...391 Nové termíny...392 10. Knihovny...393 10.1 Pracujeme s náhodou...393 10.2 Návrhový vzor Adaptér...393 10.3 Pracujeme s obrázky...394 10.4 Přetypovávání na rodiče a na potomka...394 10.5 Shrnutí co jsme se naučili...394 Nově zavedené termíny...394 Část 3: Přemýšlíme 395 11. Program začíná přemýšlet...396 11.1 Jednoduché rozhodování...396 Třídy jako objekty...398 11.2 Výběr ze dvou možností...399 11.3 Když jinak...399 11.4 Násobný výběr,...399 11.5 Přepínač...399 11.6 Shrnutí co jsme se naučili...399 Nově zavedené termíny...400 12. Ještě jednu rundu, prosím...401 12.1 Podkapitola...401 12.2 Shrnutí co jsme se naučili...401 Nové termíny...401 13. Kontejnery nejsou jen na odpadky...402 13.1 Podkapitola...402 13.2 Shrnutí co jsme se naučili...402 Nově zavedené termíny...402 14. Pole...403 14.1 Podkapitola...403 14.2 Shrnutí co jsme se naučili...403 Nově zavedené termíny...403 15. Jak nebýt výjimečný...404 15.1 Podkapitola...404 15.2 Shrnutí co jsme se naučili...404 Nově zavedené termíny...404 16. Co jsme si ještě neřekli...405 16.1 Podkapitola...405 16.2 Shrnutí co jsme se naučili...405 Nově zavedené termíny...405 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 11 z 433

Část 4: Přílohy 406 A Instalace vývojového prostředí...407 A.1 Instalace Java 2 SDK... 407 A.2 Instalace prostředí BlueJ... 409 Instalace prostředí... 409 Instalace rozšíření... 409 První spuštění... 410 Konfigurace BlueJ... 411 B Základy práce s BlueJ...414 C Syntaktické diagramy...416 D Použité projekty...417 02_Objekty... 417 03_Třídy_A... 417 03_Třídy_Z... 417 03_UFO... 417 04_Zlomky... 418 05_Vzory... 418 06_Rozhraní_A... 418 06_Rozhraní_Z... 418 07_Dědění_rozhraní_Z... 418 08_Dědičnost_tříd_pokusy... 418 08_Dědičnost_tříd_A... 418 08_Dědičnost_tříd_B... 419 08_Dědičnost_tříd_C... 419 08_Dědičnost_tříd_D... 419 08_Dědičnost_tříd_E... 419 Rejstřík...420 Část 5: KONEC 424 17. Číslování řádků programu...425 18. Odkladky...432 18.1 Podkapitola... 432 @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 12 z 433

Úvod Úvod Otevíráte knížku, která vás chce naučit programovat moderním, objektově orientovaným stylem. Rozhodnete-li se s její pomocí vstoupit do světa programování, naučíte se vytvářet programy tak, abyste se za ně nemuseli ani po několika letech stydět. Už podle její tloušťky jste nejspíše odhadli, že není určena těm, kteří hledají dvousetstránkovou rychloučebnici, s jejíž pomocí se naučí programovat za víkend. Jestli jste tuto knihu otevřeli, tak asi patříte k těm, kteří vědí, že taková učebnice neexistuje. Dvousetstránková knížka bude možná levná, ale může věci pouze naznačovat, takže se její čtenář dostane ke skutečnému poznání až po dlouhém usilovném samostudiu. Tato knížka je určena pro ty, kteří to se svoji touhou naučit se programovat myslí vážně a chtějí se naučit programovat dobře. Nejsem přítelem stručných náznaků. Naopak, budu se v ní snažit vám předvést všechny klíčové dovednosti krok za krokem a ukázat vám úskalí, která vás mohou očekávat při tvorbě vašich vlastních programů. Musím vás také upozornit na to, že tato knížka se od běžných učebnic, s nimiž se můžete v současné době v knihkupectví setkat, poněkud liší. Současné učebnice programování jsou totiž většinou především učebnicemi nějakého programovacího jazyka. Jejich autoři se proto ve svém výkladu soustředí hlavně na výklad vlastností popisovaného jazyka a snaží se jich čtenářům vysvětlit co nejvíce. Předpokládají přitom, že vedlejším produktem jejich výkladu bude to, že se čtenář naučí současně programovat. Mé letité zkušenosti s programátory, které přeučuji z klasického programování na programování objektově orientované, však ukazují, že tohoto výsledku bývá dosaženo jen zřídka. Většina programátorů, kteří přicházejí do mých kurzů, zná poměrně dobře konstrukce svého programovacího jazyka, bohužel pouze někteří z nich v něm umí dobře programovat. Dopředu proto říkám: toto není učebnice programovacího jazyka, toto je učebnice programování. Mým cílem není naučit vás všem finesám a zákoutím použitého programovacího jazyka, ale naučit vás především efektivně navrhovat a vytvářet spolehlivé a snadno udržovatelné programy. Jinými slovy: chci vás naučit dovednostem, které budete moci použít, i když budete programovat v jiném programovacím jazyce (a k tomu určitě dojde já sám jsem jich byl nucen vystřídat za svoji praxi 24). Jazyky přicházejí a odcházejí. Základní programátorské @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 13 z 433

14 Myslíme objektově v jazyku Java 1.5 techniky a způsob myšlení však žijí daleko déle než jazyky, s kterými byly zavedeny. Výuce programovacího jazyka se však nevyhneme. Budete-li si chtít vyzkoušet to, co jste se naučili, nezbude vám, než program v nějakém programovacím jazyce vytvořit. Pro demonstraci látky vysvětlované v této učebnici budu používat programovací jazyk Java. Zvolil jsem jej z několika důvodů: v současné době je to nejrozšířenější programovací jazyk, je to moderní programovací jazyk, na němž lze demonstrovat použití všech důležitých postupů, programovací jazyk i vývojové nástroje je možné získat zdarma, vytvořené programy nejsou omezeny ne jediný operační systém, ale chodí prakticky všude, je k němu k dispozici vývojový nástroj specializovaný pro výuku, který je dokonce lokalizovaný do češtiny. Jak jsem již řekl, v této učebnici se chci soustředit spíše na to, jak programovat, a programovací jazyk používám pouze jako prostředek k tomu, abychom si mohli vysvětlené věci hned také vyzkoušet. Zkoušet ale budeme hodně, takže se v průběhu výuky naučíte nejenom programovat, ale zároveň získáte potřebnou praxi při řešení nejrůznějších úloh v programovacím jazyku Java. Nebudeme spolu řešit pouze jednoduché úlohy, jejichž hlavním účelem je demonstrovat vysvětlovanou vlastnost jazyka (i když se jim nebudu vyhýbat), ale budu se vám naopak snažit předkládat i úlohy složitější, a to i za cenu toho, že část úlohy, která bude používat doposud nevysvětlené konstrukce, za vás budu muset předem vyřešit sám. Takovéto úlohy daleko lépe odpovídají těm, s nimiž se budete v praxi setkávat. Typickou úlohou programátora totiž není navrhnout kompletní řešení nějakého jednoduchého problému, ale naopak doplnit stávající, většinou velmi složitý a někým jiným napsaný program, o nějakou novou funkci. Při práci na takovýchto příkladech si vyzkoušíte další potřebnou dovednost, kterou je schopnost orientovat se v programu, který je mnohem složitější, než byste sami dokázali v daném okamžiku naprogramovat. Tato kniha se od ostatních učebnic programování liší ještě v jedné věci: většina ostatních učebnice sice na začátku vysvětlí, co je to objektové programování, ale pak na něj na chvíli zapomenou a začnou výkladem klasických programovacích konstrukcí. My to uděláme právě obráceně. Jestli se vám má dostat objektově orientované myšlení pod kůži, musíme s jeho výkladem začít hned a nezatěžovat vás napřed klasickými konstrukcemi, které by vaše myšlení směřovaly trochu jinam, takže byste se museli po chvíli zase přeorientovávat. Na klasické konstrukce @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 14 z 433

Úvod 15 samozřejmě nezapomeneme, ale dojde na ně řada až v době, kdy již budete mít za sebou několik objektově orientovaných programů, které budete moci pomocí těchto konstrukcí dále vylepšovat. Kniha je rozdělena do čtyř částí. V první části se seznámíte s třídami a objekty a naučíte se pracovat s vývojovým prostředím. Druhá část před vámi odkryje klíčová zákoutí objektově orientovaného programování a naučí vás přemýšlet při tvorbě programů objektově. Třetí část pak doplní vaše znalosti o klasické programové konstrukce a ukáže vám, jak se řeší složitější úlohy z praktického života. Celou knihou se potáhne jedna úloha, která musí být dostatečně jednoduchá, abyste na ní vykládanou látku co nejlépe pochopili. Touto úlohou bude práce s grafickými tvary zobrazovanými na simulovaném plátně. Při práci s grafickými tvary si můžeme postupně vysvětlit i ty nejsložitější programátorské obraty způsobem, který je dostatečně průzračný a pochopitelný. Abyste nepodlehli dojmu, že programování spočívá pouze v kreslení grafických tvarů, budou pro vás paralelně k této úloze připraveny další, většinou složitější (a doufám i zajímavější) úlohy, na kterých si budete moci vyzkoušet, jak jste vykládanou látku pochopili. Úlohy v první části knihy budou, pravda, ještě triviální, protože toho ještě nebudete moc umět. Druhá část už přinese zajímavější úlohy s nejrůznějšími animacemi. Ve třetí části se pak rozmáchneme a začneme řešit úlohy, z nichž některé se mohou stát základem vašich budoucích programů. Žádná z úloh zadaných v této knize není pouze zadána, všechny úlohy jsou vyřešeny, abyste si mohli porovnat své řešení se vzorovým a abyste se v případě, kdy se dostanete do těžkostí a nebudete si vědět rady, měli kam obrátit pro inspiraci. Budete-li se však chtít opravdu naučit programovat, doporučuji vám vyřešit všechny tyto doplňkové úlohy vlastní hlavou. Na závěr tohoto úvodu dovolte ještě jednu omluvu. Vím, že kniha je výrazně tlustší, než začátečnické učebnice obvykle bývají. Není to proto, že bych toho v ní chtěl vysvětlit tak moc, je to spíš proto, že se snažím všechna krizová místa spolu s vámi projít krok za krokem. Nechtěl jsem jen naznačovat, na co si máte dát pozor, ale u většiny častých chyb jsem také uvedl příklad, v němž se chyba nebo nepříjemná situace vyskytuje, a zároveň ukázal řešení nebo potřebnou reakci. Protože je ale takových míst hodně, kniha nám trochu narostla. Doufám, že i vy budete tyto podrobné vysvětlivky považovat za užitečné. @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 15 z 433

16 Myslíme objektově v jazyku Java 1.5 Použité konvence K tomu, abyste se v textu lépe vyznali a také abyste si vykládanou látku lépe zapamatovali, používám několik prostředků pro odlišení a zvýraznění textu. Objekty Názvy Citace Adresy Program Názvy objektů v programu a další texty, které chci zvýraznit, vysazuji tučně. Názvy firem a jejích produkt vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji. Texty, které si můžete přečíst na displeji, např. názvy polí v dialogových oknech či názvy příkazů v nabídkách, vysazuji tučným bezpatkovým písmem. Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem. Texty programů a jejich částí vysazuji neproporcionálním písmem.. Kromě částí textu, které považuji za důležité zvýraznit nebo alespoň odlišit od okolního textu, najdete v textu ještě řadu doplňujících poznámek a vysvětlivek. Všechny budou v jednotném rámečku, který bude označen ikonou charakterizující druh informace, kterou vám chce poznámka či vysvětlivka předat. Otevřená Symbol jin-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly a ve kterých si povíme, co se v dané kapitole naučíme. schránka s dopisy označuje poznámku oznamující název předpřipraveného projektu, s nímž budeme v dalším textu pracovat a případně některé další podrobnosti. Všechny tyto projekty jsou stručně popsané v příloze Použité projekty na straně 417 a naleznete je na adrese http://vyuka.pecinovsky.cz, odkud si je můžete stáhnout. Určitě byste je měli mít stažené a připravené před tím, než začnete knížku doopravdy studovat. Obrázek knihy označuje poznámku týkající se používané terminologie. Tato poznámka většinou upozorňuje na další používané termíny označující stejnou skutečnost. Seznam všech terminologických poznámek najdete v rejstříku pod heslem terminologie. @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 16 z 433

Úvod 17 Obrázek počítače označuje zadání úkolu, který máte samostatně vypracovat.seznam všech úloh najdete v rejstříku pod heslem úloha. Píšící ruka označuje obyčejnou poznámku, ve které pouze doplňuji informace z hlavního proudu výkladu o nějakou zajímavost. Ruka s hrozícím prstem upozorňuje na věci, které byste měli určitě vědět a na které byste si měli dát pozor, protože jejich zanedbání vás většinou dostane do problémů. Usměváček vás bude upozorňovat na různé tipy, kterými můžete vylepšit svůj program nebo zefektivnit svoji práci. Mračoun vás naopak bude upozorňovat na různá úskalí programovacího jazyka nebo programů, s nimiž budeme pracovat, a bude vám radit, jak se těmto nástrahám vyhnout či jak to zařídit, aby vám alespoň pokud možno nevadily. Brýle označují tzv. poznámky pro šťouraly, ve kterých se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti, avšak které nejsou k pochopení látky nezbytné. Symbol znamení raka označuje poznámku, ve které poukazuji na interpretaci nějakého obratu či konstrukce v analogii ze světa robotů, kterou zavádím v kapitole Analogie na straně 43. Seznam všech odkazů na tuto analogii najdete v rejstříku pod heslem analogie. @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 17 z 433

Část 1: Zapouzdření @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 18 z 433

Kapitola 1: Seznamujeme se s nástroji 19 1. Seznamujeme se s nástroji Kapitola 1 Seznamujeme se s nástroji Co se v kapitole naučíme V této kapitole se seznámíte s nástroji, které budete při studiu dalších částí knihy potřebovat. Nejprve vám povím o historii a současných trendech v programování a prozradím vám, proč jsem pro výuku vybral programovací jazyk Java. Pak vám ukážu vývojové prostředí BlueJ a naznačím, jak je máte nainstalovat na svůj počítač. Poté vám vysvětlím, jak jsou organizovány doprovodné projekty k učebnici a ukážu vám, jak je připravit, abyste s nimi mohli v průběhu studia učebnice snadno pracovat. Na závěr vám předvedu, jak otevřít projekt ve vývojovém prostředí BlueJ, prozradím vám, co je to diagram tříd a naučím vás, jak je možno tento diagram v prostředí BlueJ upravovat. 1.1 Trochu historie První počítače Historie počítačů (tj. strojů, u nichž je postup výpočtu řízen programem) a programování se začala psát již v devatenáctém století. Charles Babbage tehdy dostal zakázku od anglického námořnictva na vylepšení svého počítacího stroje pro výpočet navigačních tabulek. V roce 1848 dokončil návrh počítacího stroje, který byl řízený programem zadávaným na děrných štítcích. Zbytek života se pak věnoval jeho konstrukci. Stroj byl mechanický a měl být poháněn parním strojem, ale z programátorského hlediska již umožňoval značnou část operací, kterými se honosí současné počítače. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 19 z 433

20 Myslíme objektově v jazyku Java 1.5 Zajímavé je, že prvním programátorem byla žena Ada Lovelance Augusta (mimochodem dcera známého romantického básníka lorda Byrona), která se s Babbagem spřátelila a pomáhala mu s některými výpočty. Jednou se na výletě v Itálii setkala s italským poručíkem, který pro místní smetánku přednášel o Babbageově stroji. Aby Babbageův stroj zpopularizovala, přeložila přednášku, která popisovala hardware tohoto počítače, do angličtiny a na Babbageův popud překlad doplnila poznámkami překladatele, kde vysvětlila možnosti stroje ze softwarového hlediska. Svůj výklad doplnila i krátkým programem na výpočet Fibonacciho čísel prvním publikovaným počítačovým programem na světě. (Na její počest byl v osmdesátých letech minulého století pojmenován programovací jazyk Ada.) Babbageovi se jeho počítač nepodařilo rozchodit, protože vyžadoval součástky z materiálu s pevností pancéřové oceli opracované s hodinářskou přesností, a to bylo pro tehdejší technologii příliš velké sousto. Rozchodil jej až jeho vnuk, který byl americkým generálem, a při odchodu do penze se rozhodl, že všem ukáže, že dědeček nebyl blázen a jeho stroj by byl schopen provozu. První funkční počítač postavil až v roce 1938 v Německu Konrád Zuse. Další počítače se objevily v průběhu druhé světové války. Nejslavnějším z nich byl ENIAC, který byl vyroben v roce 1944 a byl prvním čistě elektronickým počítačem (ostatní ještě používaly relé 1 či dokonce mechanické prvky). Skutečné počítačové (a tím i programátorské) orgie však začaly až v padesátých letech, kdy se začaly počítače sériově vyrábět a počítačová věda (computer science) se zabydlela na všech univerzitách. Program musí být především spolehlivý Počítače byly postupně nasazovány v dalších a dalších oblastech a programátoři pro ně vytvářeli dokonalejší a dokonalejší programy. Programy byly čím dál rafinovanější a složitější a to začalo vyvolávat velké problémy. Programátoři totiž přestávali být schopni své programy rozchodit a když je vítězně rozchodili, nedokázali z nich v rozumném čase odstranit chyby, které uživatelé v programu objevili. Tato krize vedla postupně k zavádění nejrůznějších metodik, které měly jediný cíl: pomoci programátorům psát spolehlivé a snadno upravovatelné programy. V padesátých letech minulého století se tak prosadily vyšší programovací jazyky, v šedesátých letech modulové programování, v sedmdesátých letech na ně navá- 1 Relé je elektromechanický prvek, kde průchod proudu cívkou zapříčiní sepnutí nebo rozpojení kontaktů. Rychlá relé dokázala sepnout i 100krát za sekundu to byla také maximální rychlost tehdejších počítačů. @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 20 z 433

Kapitola 1: Seznamujeme se s nástroji 21 zalo strukturované programování a v průběhu osmdesátých a zejména pak devadesátých let ovládlo programátorský svět objektově orientované programování, jehož vláda pokračuje dodnes. Hlavním cílem programátorů v počátcích programování bylo, aby jejich programy spotřebovaly co nejméně paměti a byly co nejrychlejší. Tehdejší počítače totiž měly paměti málo, byly velice pomalé a jejich strojový čas byl drahý. Se stoupající složitostí programů však byly takto psané programy stále méně stabilní a stále hůře udržovatelné. Současně s tím, jak klesala cena počítačů, jejich strojového času i paměti, začínal být nejdražším článkem v celém vývoji člověk. Cena strojového času a dalších prostředků spotřebovaných za dobu života programu začínala být pouze zlomkem ceny, kterou bylo nutno zaplatit za jeho návrh, zakódování, odladění a následnou údržbu. Začal být proto kladen stále větší důraz na produktivitu programátorů i za cenu snížení efektivity výsledného programu. Prakticky každý program zaznamená během svého života řadu změn. Tak, jak se průběžně mění požadavky zákazníka na to, co má program umět, je program postupně upravován, rozšiřován a vylepšován. Celé současné programování je proto vedeno snahou psát programy nejenom tak, aby pracovaly efektivně, tj. rychle a s minimální spotřebou různých zdrojů (operační paměť, prostor na disku, kapacita sítě atd.), ale aby je také bylo možno kdykoliv jednoduše upravit a vylepšit. Předchozí zásady krásně shrnul Martin Fowler ve své knize Refactoring: Napsat program, kterému porozumí počítač, umí i hlupák. Dobrý programátor píše programy, kterým porozumí i člověk. Mějte při tvorbě svých programů tuto větu neustále na paměti. 1.2 Objektově orientované programování OOP Vývoj metodik programování Jak jsem řekl, v průběhu doby se prosadilo několik metodik, které doporučovaly, jak programovat, abychom byli s programem co nejdříve hotovi a výsledný program byl co nejkvalitnější. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 21 z 433

22 Myslíme objektově v jazyku Java 1.5 Modulární programování ukazovalo, že rychlost vývoje i kvalitu výsledné programu zvýšíme, když vhodně rozdělíme velký projekt do sady menších, rozumně samostatných modulů. Strukturované programování se ponořilo do hloubky kódu a ukazovalo, že dalšího zvýšení produktivity vývoje i kvality výsledných programů dosáhneme dodržením několika jednoduchých zásad při vlastním psaní kódu. Objektově orientované programování (v dalším textu budu využívat zkratku OOP) se naopak obrátilo do vyšších hladin a ukázalo, že vhodným zvýšením abstrakce dokážeme rychle a spolehlivě navrhovat a vyvíjet ještě větší a komplikovanější projekty. Jednou z největších překážek v efektivní tvorbě kvalitních programů je tzv. sémantická mezera mezi tím, co chceme vytvořit a tím, co máme k dispozici. Naše programy mají řešit široké spektrum úkolů od řízení mikrovlnné trouby přes nejrůznější kancelářské a grafické programy a hry až po složité vědecké úlohy, kosmické lety či protivzdušnou obranu kontinentu. Ve svém rozletu jsme ale odkázáni na stroje, které si umějí pouze hrát s nulami a jedničkami. Čím budou naše vyjadřovací možnosti blíže zpracovávané skutečnosti, tím rychleji a lépe dokážeme naše programy navrhnout, zprovoznit a udržovat. Jinými slovy: Kvalita programu a rychlost jeho tvorby je velice úzce svázána s hladinou abstrakce, kterou při jejich tvorbě používáme. Budeme-li např. programovat ovládání robota, bude pro nás výhodnější programovací jazyk, v němž můžeme zadat příkazy typu zvedni pravou ruku, než jazyk, v němž musíme vše vyjadřovat pomocí strojových instrukcí typu dej do registru A dvojku a obsah registru A pak pošli na port 27. OOP přichází s výrazovými prostředky, které nám umožňují maximálně zvýšit hladinu abstrakce, na které se bavíme s našimi programy a tím maximálně zmenšit onu sémantickou mezeru mezi tím, co máme k dispozici a co bychom potřebovali. Principy OOP Objektově orientované programování vychází z myšlenky, že všechny programy, které vytváříme, jsou simulací buď skutečného nebo nějakého námi vymyšleného virtuálního světa. Čím bude tato simulace přesnější, tím bude výsledný program lepší. Všechny tyto simulované světy jsou ve skutečnosti světy objektů, které mají různé vlastnosti a schopnosti a které spolu nějakým způsobem komunikují. Komunikací se přitom nemyslí jen klasická komunikace mezi lidmi či zvířaty, ale i mnohem obecnější vzájemné interakce (např. židle a podlaha spolu komunikují @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 22 z 433

Kapitola 1: Seznamujeme se s nástroji 23 tak, že židle stojí na podlaze a naopak podlaha podpírá židli, aby se skrz ní neprobořila). Budeme-li chtít, aby naše programy modelovaly tento svět co nejvěrněji, měly by být schopny modelovat obecné objekty spolu s jejich specifickými vlastnostmi a schopnostmi a současně modelovat i jejich vzájemnou komunikaci. Máme-li být schopni rychle vytvářet kvalitní programy, měli bychom mít k dispozici jazyk, jehož jazykové konstrukce nám umožní se vyjadřovat co nejpřirozeněji a co nejméně se nechat znásilňovat omezeními počítače, na kterém má program běžet. Musí umožnit co nejvyšší míru abstrakce, při níž se můžeme vyjadřovat tak, abychom mohli přirozeně popsat modelovanou skutečnost. Všechny moderní programovací jazyky se honosí přídomkem objektově orientované. Tím se nám snaží naznačit, že nabízejí konstrukce, které umožňují rozumně modelovat náš okolní, objekty tvořený svět (a nejen jej). 1.3 Překladače, interprety, platformy Tato podkapitola je určena těm, kteří se nespokojí jen s tím, že věci fungují, ale chtějí také vědět, jak fungují. Naznačíme si v ní, jak je to v počítači zařízeno, že programy pracují. Operační systém a platforma Operační systém je podle definice sada programů, jejímž úkolem je zařídit, aby počítač co nejlépe sloužil zadanému účelu. Operační systémy osobních počítačů se snaží poskytnout co největší komfort a funkčnost jak lidským uživatelům, tak programům, které operační systém nebo tito uživatelé spouští. (Teď nehodnotím, jak se jim to daří.) Operační systém se snaží uživatele odstínit od hardwaru použitého počítače. Uživatel může střídat počítače, avšak dokud bude na všech stejný operační systém, bude si se všemi stejně rozumět. Při obsluze lidského uživatele to má operační systém jednoduché: člověk komunikuje s počítačem pomocí klávesnice, obrazovky, myši a případně několika dalších zařízení. Ty všechny může operační systém převzít do své správy a zabezpečit, aby se nejrůznější počítače chovaly vůči uživateli stejně. U programů to má ale složitější. Programy totiž potřebují komunikovat nejenom s operačním systémem (např. když chtějí něco přečíst z disku nebo na něj zapsat), ale také přímo s procesorem, kterému potřebují předat své instrukce k vykonání. Problémem ale je, že různé procesory rozumí různým sadám instrukcí. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 23 z 433

24 Myslíme objektově v jazyku Java 1.5 Abychom věděli, že náš program na počítači správně poběží, musíme vědět, že počítač bude rozumět té správné sadě instrukcí a že na něm poběží ten správný operační systém. Kombinaci operační systém + procesor budeme v dalším textu označovat jako platforma. Nejrozšířenější platformou současnosti je operační systém Windows na počítačích s procesory kompatibilními s procesorem Intel Pentium. Další vám známou platformou bude nejspíš operační systém Linux na počítačích s procesory kompatibilními s Pentiem. Oba zmíněné operační systémy však mají své verze běžící na počítačích s jinými procesory. Programovací jazyky Jak asi všichni víte, pro zápis programů používáme nejrůznější programovací jazyky. Ty jsou vymýšleny tak, aby v nich mohl člověk co nejlépe popsat svoji představu o tom, jak má počítač splnit požadovanou úlohu. Program zapsaný v programovacím jazyku pak musíme nějakým způsobem převést do podoby, které porozumí počítač. Podle způsobu, jakým postupujme, dělíme programy na překládané a interpretované. U překládaných programů se musí napsaný program nejprve předat zvláštním programu nazývanému překladač (někdo dává přednost termínu kompilátor), který jej přeloží (zkompiluje), tj. převede jej do podoby, s níž si již daná platforma ví rady, tj. musí jej přeložit do kódu příslušného procesoru a používat instrukce, kterým rozumí použitý operační systém. Přeložený program pak můžeme kdykoliv na požádání spustit. Naproti tomu interpretovaný program předáváme v podobě, v jaké jej programátor vytvořil, programu označovanému jako interpret. Ten obdržený program prochází a ihned jej také provádí. Výhodou překládaných programů je, že většinou běží výrazně rychleji, protože u interpretovaných programů musí interpret vždy nejprve přečíst kus programu, zjistit, co má udělat a teprve pak může tento požadavek vykonat. Výhodou interpretovaných programů bývá na druhou stranu to, že jim většinou tak moc nezáleží na tom, na jaké platformě běží. Stačí, když na daném počítači běží potřebný interpret. Naproti tomu překládané programy se většinou musí pro každou platformu trochu (nebo také hodně) upravit a znovu přeložit. Vedle těchto základních druhů programů existují ještě hybridní programy, které jsou současně překládané i interpretované a které se snaží sloučit výhody obou skupin. Hybridní program se nejprve přeloží do jakéhosi mezijazyka, který je vymyšlen tak, aby jej bylo možno co nejrychleji interpretovat. Takto přeložený @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 24 z 433

Kapitola 1: Seznamujeme se s nástroji 25 program je potom interpretován speciálním interpretem označovaným často jako virtuální stroj 1. Chytřejší verze těchto interpretů (virtuálních strojů) dokonce dokáží odhalit často se opakující části kódu a někam stranou je přeložit, aby je nemusely pořád kolem dokola interpretovat. Program pak může běžet skoro stejně rychle jako překládaný (a někdy i rychleji). Hybridní programy spojují výhody obou kategorií. K tomu, aby v nich napsané programy mohly běžet na různých platformách, stačí pro každou platformu vyvinout potřebný interpret virtuální stroj. Je-li pak tento virtuální stroj dostatečně chytrý (a to jsou v současné době prakticky všechny), běží program téměř stejně rychle, jako kdyby byl přeložený. Na překládané, interpretované a hybridní bychom měli dělit programy, avšak často se takto dělí i programovací jazyky. Je sice pravda, že to, zda bude program překládaný, interpretovaný nebo hybridní není závislé na použitém jazyku, ale je to především záležitostí implementace daného jazyka, nicméně každý z jazyků má svoji typickou implementaci, podle které je pak zařazován. Prakticky všechny jazyky sice mohou být implementovány všemi třemi způsoby a řada jich opravdu ve všech třech podobách existuje (jako příklad bychom mohli uvést jazyky Basic, Java nebo Pascal), ale u většiny převažuje typická implementace natolik výrazně, že se o těch ostatních prakticky nemluví. Z vyjmenované trojice je např. klasický Basic považován za interpretovaný jazyk, Java za hybridní a Pascal za překládaný. Hybridní implementace jazyků se v posledních letech výrazně prosadily a jsou dnes králi programátorského světa. Vyvíjí v nich převážná většina programátorů a procento implementací v těchto jazycích neustále vzrůstá. 1.4 Java a její zvláštnosti O splnění zásad objektově orientovaného programování se snaží tzv. objektově orientované jazyky. Mezi nimi je v současné době nejpopulárnější programovací jazyk Java, který se narodil v roce 1995. Hned po svém vzniku zaznamenal velký 1 Virtuální stroj se mu říká proto, že se vůči programu v mezijazyku chová obdobně, jako se chová procesor vůči programu v čistém strojovém kódu. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 25 z 433

26 Myslíme objektově v jazyku Java 1.5 ohlas a během několika let v něm začalo vyvíjet své programy více než 3 milióny programátorů a toto číslo stále stoupá. V roce 2003 se podle průzkumů renomovaných společností stal nejpoužívanějším programovacím jazykem. Na převážné většině univerzit se Java používá jako vstupní jazyk pro výuku programování. Jaké jsou vlastnosti tohoto programovacího jazyka, že v tak krátké chvíli tak významně ovlivnil programátorský svět? Důvodů je celá řada. Zde uvedu jen ty z nich, které se výhodně projeví při výuce programování. Objektově orientovaná Java plně podporuje objektově orientované programování. Na rozdíl od C++ a dalších jazyků klasického ražení již neumožňuje napsat program, který by nebyl objektově orientovaný. Její autoři se přitom do ní snažili začlenit převážnou většinu zásad objektově orientovaného programování. Předchozí tvrzení musím trochu zlehčit. Platí obecná zásada, že jako čuně mohu programovat v jakémkoliv programovacím jazyce. Java (a s ní i dalších moderní programovací jazyky) nedovolují zapsat program, který by nebyl alespoň formálně objektově orientovaný. Bude-li objektově orientovaný doopravdy, tj. i svou architekturou a duchem, to už záleží na programátorovi. To za vás žádný programovací jazyk neudělá. Jednoduchá Java je velice jednoduchý jazyk. Základy jeho syntaxe může člověk, který umí programovat, zvládnout během několika hodin. Pak už se může soustředit na poznání a pochopení funkce klíčových knihoven a na jejich co nejefektivnější využití. Jednoduchost jazyka však neznamená jeho omezenost. Jak jsem již řekl, Java je v současnosti nejpoužívanějším programovacím jazykem. Programují se v ní aplikace všech rozměrů od drobných programů, které se umísťují na čipové karty, přes programy pro mobilní telefony, desktopové aplikace až po obří projekty rozprostřené na řadě vzájemně komunikujících počítačů. Překládaná i interpretovaná Java je současně překládaná i interpretovaná (řadí se proto mezi hybridní programovací jazyky). Programy v jazyku Java se nejprve přeloží do speciálního tvaru nazývaného bajtkód, který pak analyzuje a interpretuje speciální program nazývaný virtuální stroj Javy (Java Virtual Machine používá se pro něj zkratka @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 26 z 433

Kapitola 1: Seznamujeme se s nástroji 27 VM). Úkolem virtuálního stroje je nejenom vykonat příslušný program, ale také tento program odstínit od hardwaru a operačního systému, na kterém program běží. Cílem překladu do bajtkódu je převést program do podoby, s níž se bude virtuálnímu stroji co nejlépe pracovat. Současné virtuální stroje jsou dokonce natolik inteligentní, že umí provádění programu za běhu optimalizovat, takže program na nich běží skoro tak rychle, jako kdyby byl přeložený, a v některých speciálních případech dokonce rychleji. Multiplatformní Jedním z klíčových záměrů autorů Javy bylo vytvořit nejenom jazyk, ale celou platformu (= prostředí, ve kterém běhají programy). Tuto platformu realizuje virtuální stroj spolu se základní knihovnou nejpoužívanějších funkcí. Virtuální stroj umožňuje, aby jeden a týž program běhal na různých počítačích a operačních systémech. Pro každou konfiguraci hardwaru a operačního systému lze definovat její vlastní virtuální stroj. Ten se pak stará o správný běh programů, takže se program (a s ním i uživatel) vůbec nemusí starat o to, na jakém hardwaru a operačním systému zrovna běží. Java běhá pod systémy Windows, Unix, Linux, MacOS, Solaris a řadou dalších operačních systémů. Vytvoříte-li program v Javě, můžete jej spustit téměř na libovolném počítači. Jak mnozí z vás ví, programy v Javě je možné spouštět i na řadě mobilních telefonů a dokonce ovládají i miliony čipových karet. Java je totiž nejenom programovací jazyk, ale také platforma. Tímto termínem označujeme soubor programů, které se vůči programům běžícím na dané platformě chovají obdobně jako operační systém odstiňují je od detailů použitého hardwaru a operačního systému. Kdykoliv tyto programy po systému něco chtějí, požádají o to platformu a ta jim příslušné služby zprostředkuje. Takovým programům pak může být jedno, pod jakým operačním systémem běží, protože se beztak baví pouze s platformou. Java nabízí dvě verze platformy. Jednodušší JRE (Java Runtime Environment běhové prostředí Javy) poskytuje vše potřebné pro běh programů. Komplexnější SDK (Software Development Kit sada nástrojů pro vývoj softwaru), označovaná někdy také JDK (Java Development Kit) je vlastně JRE doplněné o základní vývojové nástroje (překladač, generátor dokumentace, ladící program a další) a poskytuje tak vše potřebné pro vývoj programů. Vy se chcete naučit pomocí této učebnice programovat, tak budete potřebovat mít instalované SDK. Uživatelům, kteří pak budou spouštět vaše programy, stačí JRE. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 27 z 433

28 Myslíme objektově v jazyku Java 1.5 Obě verze si můžete stáhnout a instalovat zdarma. Postup instalace tohoto prostředí je vysvětlen v příloze Instalace vývojového prostředí na straně 407. V dalším textu budu předpokládat, že máte SDK nainstalováno. 1.5 Vývojové prostředí BlueJ Mnozí autoři učebnic vystačí při výkladu s nástroji z SDK doplněnými o nějaký editor, ve kterém píší zdrojové texty programů. Obdobným způsobem pracuje i část programátorů (podle některých průzkumů takto pracuje asi 7 % programátorů). Většina programátorů však dává přednost speciálním vývojovým prostředím označovaným souhrnně zkratkou IDE Integrated Development Environment (integrované vývojové prostředí), což je sada programů, která nabízí řadu funkcí, jež vývoj programů výrazně zefektivňují. IDE dáme přednost i my. V této učebnici budu používat vývojové prostředí BlueJ (čtěte blúdžej), které bylo vyvinuté speciálně pro výuku objektově orientovaného programování a oproti jiným IDE nabízí několik vlastností, jež se nám budou při výkladu základů OOP hodit. Je maximálně jednoduché, takže se začátečníci mohou soustředit na své programy a nejsou rozptylováni záplavou možností, kterými je rozptylují profesionální vývojová prostředí a které na počátku beztak neumí využít. Je názorné, protože slučuje možnosti klasického textového zápisu programů s možností definice jeho architektury v grafickém prostředí. Tato koncepce se stává základním postupem návrhu programů. BlueJ je prozatím jediné prostředí, které je k dispozici zdarma a přitom je schopno vytvořit na základě grafického návrhu kostru programu a průběžně zanášet změny v programu do jeho grafické podoby a naopak změny v grafickém návrhu do textové podoby programu, aniž by ovlivnilo ty části programu, které programátor zadal ručně. Je interaktivní umožňuje přímou práci s objekty. Ostatní prostředí vám většinou povolují pouze vytvořit program, který můžete spustit. Přímou komunikaci s jednotlivými součástmi programu, tj. vytváření objektů a zasílání zpráv řízené interaktivně uživatelem, však většinou neumožňují. Toto prostředí se používá ve vstupních kurzech programování na stovkách univerzit a školících středisek po celém světě (v létě 2004 se k používání tohoto prostředí hlásilo okolo 400 univerzit a školících center). Jak se můžete přesvědčit na stránkách http://www.bluej.org, jeho výhodné vlastnosti přivedly řadu programá- @Java_PO.doc, verze 0.33.197, uloženo: út 29.6.04 23:55 Strana 28 z 433

Kapitola 1: Seznamujeme se s nástroji 29 torů k tomu, že je začali používat i pro vývoj menších profesionálních aplikací. Tito programátoři oceňují zejména jeho malou paměťovou náročnost (BlueJ vystačí se 48 MB RAM, zatímco běžná profesionální vývojová prostředí požadují minimálně 256 MB RAM) a originální, jinde nenabízené možnosti interaktivního ladění programů. Stejně jako SDK, i vývojové prostředí BlueJ si můžete stáhnout a instalovat zdarma. Vše potřebné pro jeho instalaci se dozvíte v příloze Instalace prostředí BlueJ na straně 409. V dalším textu budu předpokládat, že máte toto prostředí nainstalováno spolu s rozšířením, o němž se v této kapitole zmiňuji. 1.6 Projekty a BlueJ V současných vývojových prostředích již nepracujeme s programy, ale s projekty. Projekt může obsahovat jeden program (tj. něco, co spustíme a ono to běží) nebo několik programů to podle toho, jak se nám to zrovna hodí. Typickým příkladem jednoduchého projektu sestávajícího z několika programů byl vítězný projekt mladší kategorie z programátorské soutěže BB2002 1. Byl jím soubor deskových her, který obsahoval 5 programů: hry Dáma a Reversi vytvořené v programovacím jazyku Baltík, hru Piškvorky vytvořenou v jazyku Baltazar, hlavní program umožňující volbu hry vytvořený opět v jazyku Baltík a skript umožňující přepínání programů vytvořený v jazyku JavaScript. Jednotlivé hry byly v případě potřeby spustitelné samostatně. Jejich sloučením do většího celku a doplněním o nadstavbové uživatelské rozhraní pro výběr hry vzniklo takové malé herní centrum, které mělo pro řadu uživatelů větší užitnou hodnotu, než sada samostatných, na sobě nezávislých her. Umístění projektů na disku Doporučuji vám, abyste si pro projekty zřídili novou složku. Do ní pak budete umisťovat jak svoje projekty, tak projekty, které budou součástí tohoto seriálu. Jednou z možností je zřídit na datovém disku složku Java s podsložkami Texty a Projekty. Do složky Texty si můžete vložit texty týkající se programování a Javy, ve 1 Program si můžete stáhnout na stránkách www.sgp.cz. @Java_PO.doc, verze 0.33.197, uloženo: úterý 29.června.2004 23:55 Strana 29 z 433