Stručný obsah ČÁST I: INTERAKTIVNÍ REŽIM LEKCE 1 LEKCE 2 LEKCE 3 LEKCE 4 LEKCE 5 LEKCE 6 LEKCE 7 LEKCE 8 LEKCE 9 LEKCE 10 LEKCE 11 LEKCE 12 LEKCE 13 LEKCE 14
Předehra OOP – seznamte se Posíláme první zprávy Testovací třída Zprávy žádající hodnotu Zprávy žádající objekt Zprávy s parametry Parametry objektových typů Výlet do nitra instancí Rozhraní Pokračujeme s rozhraním Úvod do návrhových vzorů Dědičnost rozhraní Prostředník a Posluchač
31 41 49 57 67 77 85 95 105 115 129 141 151 165
ČÁST II: ZÁKLADY TVORBY OO PROGRAMŮ LEKCE 15 LEKCE 16 LEKCE 17 LEKCE 18 LEKCE 19 LEKCE 20 LEKCE 21 LEKCE 22 LEKCE 23 LEKCE 24 LEKCE 25 LEKCE 26 LEKCE 27 LEKCE 28 LEKCE 29 LEKCE 30 LEKCE 31 LEKCE 32
K1617.indd 3
První kód První konstruktor Parametry Atributy a metody Implementace rozhraní Komentáře Použití this Přetěžování Lokální proměnné Metody vracející hodnotu Přepravka Textové řetězce a práce s nimi Trocha logiky Metody a atributy třídy Refaktorace kódu Statický konstruktor, konstruktor třídy Ladicí program – debugger Vytvoření samostatné aplikace
179 191 199 207 219 233 247 255 265 275 285 295 307 319 333 347 365 377
15.1.2010 13:21:02
4
Stručný obsah
ČÁST III: POKROČILEJŠÍ TVORBA OO PROGRAMŮ LEKCE 33 LEKCE 34 LEKCE 35 LEKCE 36 LEKCE 37 LEKCE 38 LEKCE 39 LEKCE 40 LEKCE 41 LEKCE 42 LEKCE 43 LEKCE 44
Balíčky Zřetězení instancí Dekorátor Učíme auta zatáčet Ovládání z klávesnice Kontejnery a mapy Další programové konstrukce Tovární metoda podruhé Cykly Seznamy a jejich řazení Pole Finále
391 409 427 443 453 471 485 499 509 529 543 557
ČÁST IV: PŘÍLOHY
K1617.indd 4
Význam cizích slov Česko-americký slovník
563 565
Rejstřík
567
15.1.2010 13:21:02
Obsah ČÁST I
Interaktivní režim LEKCE 1
Předehra Použitá metodika Koncepce výkladu Jazyk programů Konference ke knize a OOP Doprovodné animace Co budeme potřebovat Správce souborů JDK a JRE Prostředí BlueJ Profesionální IDE
Práce s BlueJ Opakování
31 32 33 34 35 35 36 36 37 37 38
39 39
LEKCE 2
OOP – seznamte se Objektově orientovaný svět Objekty Třídy Zprávy Klasický versus objektový program
První projekt Grafický jazyk UML Třídy v projektu
Překlad Opakování
41 42 42 42 43 44
45 45 46
47 48
LEKCE 3
Posíláme první zprávy Instance a odkazy na ně Vytvoření nové instance Zásobník odkazů Zprávy posílané instancím
K1617.indd 5
49 51 52 53 54
15.1.2010 13:21:02
6
Obsah
Virtuální stroj Opakování
54 55
LEKCE 4
Testovací třída Testovací přípravek Vytvoření nové třídy Vytvoření testovacího přípravku Vytvoření testu Metody a konstruktory Opakování
57 58 58 60 62 63 64
LEKCE 5
Zprávy žádající hodnotu Typ návratové hodnoty Získání návratové hodnoty Primitivní a objektové typy Odkazy na objekty Zápis volání metody Zprávy/metody getXxx a setXxx Opakování
67 68 69 70 73 74 75 75
LEKCE 6
Zprávy žádající objekt Pravidla pro tvorbu identifikátorů Získání odkazu na vrácený objekt Instance typu String Jak zapisovat „stringy“ Správce paměti Použití metod vracejících hodnotu v testech Opakování
77 78 80 81 81 82 83 83
LEKCE 7
Zprávy s parametry Význam parametrů Konstrukce objektu s použitím parametrů Struktura dialogového okna pro posílání zpráv s parametry Pokračování příkladu
Ještě jednou objekt versus odkaz Parametry typu String
K1617.indd 6
85 86 86 86 88
89 89
15.1.2010 13:21:03
Obsah
Animace Cvičení Opakování
7
91 91 93
LEKCE 8
Parametry objektových typů Význam uvozovek při zadávání řetězců Třída Object Parametry objektových typů Přímé předání návratové hodnoty zprávy Stručnější zápis zpráv Cvičení Opakování
95 96 97 98 100 101 102 103
LEKCE 9
Výlet do nitra instancí Atributy instancí a atributy třídy Práce s atributy Zprávy žádající hodnotu atributu Dostupnost atributů Rozšíření testovacího přípravku Sledování hodnot atributů Statické atributy – atributy třídy Cvičení Opakování
105 106 106 107 108 109 110 111 112 113
LEKCE 10
Rozhraní Motivace Interface versus implementace Interface jako datový typ
116 117 118
Rozhraní versus interface
119
Praktické využití
K1617.indd 7
115
120
Příprava nového projektu Import třídy z jiného projektu
120 123
Implementace rozhraní třídou Cvičení Opakování
124 125 126
15.1.2010 13:21:03
8
Obsah
LEKCE 11
Pokračujeme s rozhraním Připravenost pro budoucí rozšíření Příklad: Mnohotvar
Testovací třída třídy Proměnný počet parametrů Návrhový vzor Prototyp Ověření funkce mnohotvaru Cvičení Opakování
129 130 131
131 133 137 137 138 138
LEKCE 12
Úvod do návrhových vzorů
141
Návrhové vzory Příklady návrhových vzorů
142 142
Knihovní třída (Utility class) Jednoduchá tovární metoda (Simple factory method) Jedináček (Singleton) Výčtový typ Služebník (Servant)
Implementace více rozhraní Cvičení Opakování
143 143 143 143 144
144 147 148
LEKCE 13
Dědičnost rozhraní Hierarchie typů Tři druhy dědění Jeden interface nám chybí Signatura versus kontrakt Definice nového rozhraní Nová hierarchie rozhraní Dědění rozhraní Úplná dokumentace projektu Cvičení Opakování
151 152 154 155 156 157 157 159 160 162 163
LEKCE 14
Prostředník a Posluchač Pozorovatel, Posluchač, Předplatitel (Observer, Listener, Subscriber) Prostředník (Mediator)
K1617.indd 8
165 166 167
15.1.2010 13:21:03
Obsah
Vynucení závislosti (Dependency Injection) Jak zabránit odmazávání tvarů Správce plátna a jeho projekt
9
168 168 169
Rekurze
173
Cvičení Opakování
174 174 ČÁST II
Základy tvorby OO programů LEKCE 15
První kód Nová prázdná třída Soubory v projektech BlueJ Zdrojový kód prázdné třídy Konstruktor Nastavení předvoleb Cvičení Opakování
179 180 181 183 186 187 188 188
LEKCE 16
První konstruktor Definice konstruktoru Jméno konstruktoru Pracující konstruktor Grafická úprava zdrojového kódu Složitější příklad Cvičení Opakování
191 192 192 194 194 195 196 196
LEKCE 17
Parametry Formální a skutečné parametry Přejmenování třídy Testovací třída třídy Světlo Cvičení Opakování
K1617.indd 9
199 200 202 203 204 205
15.1.2010 13:21:03
10
Obsah
LEKCE 18
Atributy a metody Světlo se musí učit Zavedení atributů Zapouzdření a skrývání implementace Přiřazení hodnoty atributu Definice metod Kvalifikace Konflikt jmen atributu a parametru Cvičení Opakování
207 208 208 209 210 211 212 213 214 217
LEKCE 19
Implementace rozhraní Propojenost zdrojového kódu s diagramem tříd Abstraktní metody a třídy Implementace metody deklarované implementovaným rozhraním
219 220 221 221
Anotace @Override
224
Interface a class-soubor Testovací třída Cvičení Opakování
224 224 228 230
LEKCE 20
Komentáře Zakomentování části kódu Komentáře v Javě Dokumentační komentáře Dokumentace tříd a celého projektu Standardní prázdná třída Formátování dokumentačních komentářů Dokumentační značky Komentáře označující sekce zdrojového kódu
Šablona prázdné metody Cvičení Opakování
233 234 234 235 237 237 239 240 241
244 245 245
LEKCE 21
Použití this Skrytý parametr this
K1617.indd 10
247 248
15.1.2010 13:21:03
Obsah
Nevhodnost kopírování kódu Podrobnosti o práci konstruktoru Úprava konstruktorů s využitím this Cvičení Opakování
11
250 251 252 254 254
LEKCE 22
Přetěžování Další konstruktory Přetěžování metod Identifikátory parametrů Identifikace volané metody Základní aritmetické operátory Cvičení Opakování
255 256 259 259 260 260 262 263
LEKCE 23
Lokální proměnné
265
Pomocné metody Lokální proměnné Atributy × parametry × lokální proměnné
266 267 268
Použitelnost (rozsah platnosti) Inicializace (přiřazení počáteční hodnoty) Délka života
268 269 269
Nastavování pozice a modulu Konstanty a magické hodnoty Cvičení Opakování
270 272 273 273
LEKCE 24
Metody vracející hodnotu Atributy a vlastnosti Přístupové metody Vlastnosti uložené v atributech Vracení hodnot získaných výpočtem Test shodnosti objektů Test vrácení správné hodnoty Cvičení Opakování
K1617.indd 11
275 276 276 277 278 278 280 282 283
15.1.2010 13:21:03
12
Obsah
LEKCE 25
Přepravka Atributy představující celou sadu hodnot Předávání parametrů hodnotou a odkazem Přepravka Konstanty Metody pracující s přepravkou Cvičení 1. Zprovoznění projektu 125c_12_Správce 2. Import a zprovoznění tříd Světlo, Šipka, Semafor a Auto 3. Doplnění a otestování našich tříd
Opakování
285 286 286 287 288 290 291 291 292 292
293
LEKCE 26
Textové řetězce a práce s nimi Problémy s porovnáváním objektů Skládání textových řetězců Textová reprezentace (podpis) Znak pro ukončení řádku Escape sekvence Standardní výstup Okno terminálu
Standardní chybový výstup Cvičení Opakování
295 296 297 297 299 300 302 303
304 304 305
LEKCE 27
Trocha logiky Problémy s porovnáváním objektů Operátor přetypování (Typ) Operátory porovnání < <= == >= > != Operátory a jejich arita Porovnávání objektů Operátor negace ! Operátory konjunkce && a & Operátory disjunkce || a | Operátor instanceof Kontrakt metody equals(Object) Hodnotové a odkazové typy Odkazové typy Hodnotové typy
K1617.indd 12
307 308 308 309 309 310 310 311 312 312 314 315 315 315
15.1.2010 13:21:03
Obsah
Cvičení Opakování
13
316 316
LEKCE 28
Metody a atributy třídy Počítané objekty Statické atributy Pořadí modifikátorů Úpravy programu Inovace metody toString() Město
319 320 320 320 320 322 323
Zadání Analýza
323 325
Cvičení Opakování
330 332
LEKCE 29
Refaktorace kódu Co je to refaktorování Jak řešit náš problém Rozhraní IModulový Třída služebníka Metoda pomProhoPoziceSKontrolou Zobecnění metody Úprava pro šipky Úpravy testovacích tříd
Testovací metoda testPoziceVelikost Zobecnění zkopírované metody Přizpůsobení metody lišícím se požadavkům
Cvičení Opakování
333 334 334 335 336 337 338 339 340
341 341 341
345 345
LEKCE 30
Statický konstruktor, konstruktor třídy
347
Konstruktor třídy – statický konstruktor Třída Volání Zavedení a inicializace třídy
348 355 357
Podrobnosti o inicializaci třídy
Poučení z krizového vývoje Postup vytvoření instance Znovu podrobnosti o konstrukci objektu
K1617.indd 13
358
360 361 361
15.1.2010 13:21:04
14
Obsah
Instanční poučení Cvičení Opakování
363 363 363
LEKCE 31
Ladicí program – debugger
365
Důležitost ladicího programu Spuštění ladicího programu Okno debuggeru Krokování programu Panel Pořadí volání Zásobník návratových adres Lokální proměnné metody Krokování testovacích metod Cvičení Opakování
366 366 368 368 370 371 374 374 375 375
LEKCE 32
Vytvoření samostatné aplikace
377
Zadání Třída Dispečer Rozhraní ITovárnaNaUFO Návrhový vzor Tovární metoda Rozhraní IUFO
378 379 380 380 381
Metoda popoje(int) Konstruktor Ovládání přímým zasíláním zpráv Ovládání z klávesnice
382 383 383 384
Vytvoření samostatné aplikace Hlavní třída aplikace Vytvoření spustitelného archivu Cvičení Opakování
384 384 385 386 386 ČÁST III
Pokročilejší tvorba OO programů LEKCE 33
Balíčky Balíčky a složky
K1617.indd 14
391 392
15.1.2010 13:21:04
Obsah
Velké programy a jejich problémy Konvence pro názvy projektů Vytváření balíčků v BlueJ Příkaz package Strom balíčků Jednoduché a úplné názvy Balíček java.lang Příkaz import Konvence pro názvy balíčků Změna rozdělení balíčků Nevhodnost hvězdičkové konvence Cvičení Opakování
15
392 393 394 396 397 398 399 399 400 402 405 406 406
LEKCE 34
Zřetězení instancí Podmínky, jimž musejí vyhovovat budoucí objekty Třída PoleCesty Třída Okruh Návrhový vzor Stavitel (Builder) Třída StavitelOkruhů Tvorba okruhů Statický import Třída OkruhTest Cvičení Opakování
409 410 410 414 415 415 419 421 422 422 425
LEKCE 35
Dekorátor Rekurze Analýza chybové zprávy Třída Multipřesouvač a rozhraní IMultiposuvný Cílevědomost objektů Návrhový vzor Dekorátor Třída Okružní Doplnění testu Cvičení Opakování
K1617.indd 15
427 428 429 431 432 433 435 438 440 440
15.1.2010 13:21:04
16
Obsah
LEKCE 36
Učíme auta zatáčet Referenční plocha a relativní souřadnice Tvorba objektů natočených do zadaného směru Efektivní překreslení měněných objektů Blok příkazů Rozhraní IOtočný Dekorátor Otočný Cvičení Opakování
443 444 445 447 448 449 451 452 452
LEKCE 37
Ovládání z klávesnice Seznámení s řadičem Příprava závodu Podmíněný příkaz Použití bloku příkazů Rozhraní IZávodník Předčasné return Vložený podmíněný příkaz Měření času Automatické a explicitní přetypování Dokončení třídy Závod Cvičení Opakování
453 454 457 458 459 460 461 462 463 464 464 468 468
LEKCE 38
Kontejnery a mapy Kontejnery a knihovna kolekcí Slovníky a mapy Interní třídy Rozhraní Map
a třída HashMap
472 472 473 476
Generické typy a typové parametry Rozhraní versus implementace Inicializace
476 477 477
Registrace Kontrola průjezdů Konec závodu Rozhraní IZávod
K1617.indd 16
471
478 480 481 481
15.1.2010 13:21:04
Obsah
Cvičení Opakování
17
481 482
LEKCE 39
Další programové konstrukce Kolekce, které lze získat od mapy Knihovna kolekcí Cyklus for( : ) Závod na několik kol Operátory inkrementace a dekrementace Výjimky a jejich vyhození Další opravy ve starších třídách Cvičení Opakování
485 486 487 488 489 492 493 495 496 496
LEKCE 40
Tovární metoda podruhé Problém s variantními okruhy Rozhraní ITovárnaOkruhů Složitější továrna Úplný podmíněný příkaz Metoda s proměnným počtem parametrů Klasický cyklus for Cvičení Opakování
499 500 500 501 502 504 505 507 507
LEKCE 41
Cykly Rozměr oblasti zabrané okruhem Odložená inicializace Zjišťování minim a maxim Opuštění cyklu uprostřed jeho těla Řetěz if … else if Vedlejší efekty metod Cyklus se závěrečnou podmínkou Změna modulu pro Okruh Třída Závod_T Cvičení Opakování
K1617.indd 17
509 510 510 512 512 513 515 516 517 520 527 527
15.1.2010 13:21:04
18
Obsah
LEKCE 42
Seznamy a jejich řazení
529
Výčtové typy
530
Použití výčtového typu
531
Stavový diagram Seznamy Úpravy třídy Závod_T Řazení obsahu seznamů Nativní (přirozené) řazení Alternativní řazení a návrhový vzor Příkaz (Command) Cvičení Opakování
531 532 533 537 537 539 541 541
LEKCE 43
Pole
543
Deklarace proměnné typu pole Vytvoření a inicializace pole Metody s proměnným počtem parametrů Použití pole Řazení obsahu pole Vypsání čísla slovy Cyklus while Přepínač Cvičení Opakování
544 544 546 547 548 549 551 552 554 554
LEKCE 44
Finále
557 ČÁST IV
Přílohy Význam cizích slov
563
Česko-americký slovník
565
Výslovnost některých slov v programu
Rejstřík
K1617.indd 18
566
567
15.1.2010 13:21:04
Reakce čtenářů Tuto knihu považuji za jedinečnou. Především díky tomu, že si autor uvědomil, že je důležitější umět správně objektově programovat než chrlit stovky příkazů a funkcí. Kniha je také psána autobiograficky, což u učebnic, a obzvláště u učebnic programování, vidím poprvé. Díky tomu jsem měl z čtení knihy dobrý pocit. Další věc, kterou jsem si pochvaloval, byly dostupné animace. Díky nim jsem pokaždé věděl, kde a co mám udělat. Kniha se tak stává velice „polopatickou“, což je pro začínající mladé programátory, jako jsem koneckonců i já, velký přínos. Ke knize nemám žádné výhrady a mohu ji vřele doporučit všem, kteří se bezmocně topí v objektově orientovaném světě programování. Ladislav Janeček začínající programátor Čo sa mi na knihe veľmi páčilo, bolo okrem iného aj to, že autor vysvetľoval pojmy zaujímavým štýlom a vysvetľoval hneď od začiatku veci, ktoré sa síce zvyknú učiť až v pokročilejších kurzoch, ale ktoré majú dôležité následky. Taktiež kladne musím hodnotiť postupnosť vysvetľovania, kedy sa čitateľovi nestane, že číta kód, ktorému nerozumie, lebo na jeho vysvetlenie sú potrebné pokročilejšie znalosti. Počas čítania knihy autor čitateľa nehrnie do zbrklého písania kódu a čitateľ začína písať zdrojový kód, až keď chápe základy OOP. Túto knihu by som odporučil každému, kto sa chce naučiť OOP. Každopádne musím ľutovať jedinú vec, a tou je fakt, že som túto knihu nemal, keď som sa začínal učiť OOP. Martin Škurla programátor Programování je mým koníčkem. Knihy R. Pecinovského doporučuji všem, kteří chtějí opravdu proniknout do tajů OOP a nechtějí skončit u programů typu „Hello world“. Kniha je velmi vhodná i pro naprosté začátečníky, zejména tzv. „věčné“ začátečníky, kteří by se rádi naučili programovat, ale daná problematika jim připadá příliš složitá a odrazující. Většina knih klasického ražení vás sice učí od začátku psát jednoduché programy, ale o OOP se zmiňuje spíš okrajově, jako by to bylo něco navíc. Pojmy jako návrhový vzor jsou pro ně neznámé. Naštěstí jsou i výjimky. Toto je jedna z nich. Nebýt pana Pecinovského, byl by ze mne asi věčný začátečník, popřípadě jen jakýsi pseudo OOP programátor. Martin Staněk středně pokročilý student Všetka literatúra, ktorú som doteraz o OOP prečítal, bola len suchou teóriou, ktorú som nedokázal uplatniť v praxi. Som rád, že sa mi do rúk dostala táto kniha. Pomocou nej som dostal teóriu do praxe. Netrpezlivo očakávam ďalší diel, pomocou ktorého sa dostanem na samotnú podstatu OOP. Stanislav Hruška programátor samouk
K1617.indd 19
15.1.2010 13:21:04
20
Úvod
Nenajdete mnoho česky psaných knih – učebnic programování, kde byste si na konci knihy „sami“ naprogramovali automobilové závody. A co je snem každého začínajícího mladého programátora? No přece naprogramovat hru a pochlubit se kamarádům. Máte-li o programování opravdový zájem, tato kniha vám může velmi pomoci na vaší dlouhé cestě. Programování není záležitost na několik týdnů nebo měsíců, ale dobrým programátorem se můžete stát za několik let. Důležitou součástí odborného textu jsou vypracované příklady a doprovodné animace. Příklady i animace jsou vypracovány ve špičkové profesionální kvalitě a doprovázejí každou lekci knihy. Příklady, animace, vývojové prostředí BlueJ i Java, to vše je ZDARMA! Vše vám bude fungovat ve Windows i na Linuxu. Kniha je napsána podle metodiky Design Patterns First a objektově orientované programování (OOP) a návrhové vzory jsou fenoménem dnešní doby. Výklad je náročný, ale zvládnutelný. Knihu bych doporučil všem, kdo to myslí s OOP opravdu vážně. Tato kniha je dle mého názoru velmi vhodná jako učebnice programování pro střední i vysoké školy pro obory zaměřené na informační technologie. Jiří Kubala, učitel IT Střední škola teleinformatiky, Ostrava-Poruba Táto kniha učí OOP trocha iným spôsobom ako iné učebnice. Nie len to, že kniha je vedená dialógom typu „Nevedko a Vševedko“, ale aj spôsob, akým preberá Objektové programovanie, sa líši od klasických učebníc programovania. Ťažko posúdiť, či to je lepší spôsob, no mne plne vyhovuje a myslím, že bude vyhovovať aj ďalším, ktorí stokrát začínali programovať a aj stokrát skončili. Je to ako keby ste pílili kus dreva, nešlo vám to a zrazu, keď si prehodíte pílku do druhej ruky, to ide akosi lepšie. Taká je aj táto kniha. Hoci veľa pasáží som už mal naštudovaných z inej literatúry, táto kniha mi umožnila niektoré veci vidieť aj z iného pohľadu. Veľmi oceňujem, že sa pracuje už na vytvorenom programe a teda nie sú to len samostatné príklady, ale sú tu pekne vidieť súvislosti medzi jednotlivými časťami programu. Vítam tiež možnosť si na webstránkach autora pozrieť videá/animácie, ktoré sú veľkou pomocou, keď nie je text celkom zrozumiteľný, alebo by bolo slovné opisovanie príliš zdĺhavé. Teším sa na druhý diel knihy. Tibor Bako OOP začiatočník Ideální kniha pro začínající, ale i pro zkušené programátory. Pro ty první je napsána stylem, který zaujme a udrží pozornost. Potřebné znalosti jsou postupně servírovány příjemnou nenásilnou formou a okamžitě demonstrovány a upevňovány pomocí příkladů a cvičení. Zkušenějším programátorům poskytne jiný (a podle mě ten správný) pohled na objektově orientované programování. Vít Grafnetter programátor
K1617.indd 20
15.1.2010 13:21:05
Úvod
21
Na rozdíl od řady ostatních učebnic programování, které jsem přečetl, nezahlcuje čtenáře pouze spoustou nových příkazů, ale učí ho opravdu programovat. A to originální a velice srozumitelnou formou. Přestože je kniha určena předně pro začínající programátory byla velikým přínosem i pro mě. Michal Palas student gymnázia
K1617.indd 21
15.1.2010 13:21:05