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

Rozměr: px
Začít zobrazení ze stránky:

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

Transkript

1

2

3

4 O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích. Je autorem metodiky výuky programování Karel, navazující metodiky Baltík a moderní metodiky výuky objektově orientovaného programování známé pod anglickým názvem Design Patterns First. Učí programování na VŠE a současně pracuje jako Senior EDU Expert ve firmě ICZ a.s., kde má na starosti doškolování profesionálních programátorů. O knize Tato kniha je druhým vydáním populární učebnice programování, která je na našem trhu zcela ojedinělá. Na rozdíl od ostatních učebnic se totiž neomezuje na výuku syntaxe jazyka a práce s knihovnami, ale učí čtenáře doopravdy programovat. Učí jej, jak má při programování myslet. Kniha je sice primárně určena začátečníkům, ale ohlasy na první vydání ukázaly, že v ní najdou poučení i zkušení programátoři. Většina učebnic a kurzů programování totiž vyvolává falešnou představu, že objektově programovat znamená používat třídy a dědičnost. Tato kniha je první, která ukazuje, že objektově orientované programování přináší především jiný způsob myšlení. Jak výstižně napsal jeden čtenář: Myslel jsem si, že nejsem žádné programátorské ucho. Když jsem ale přečetl vaši učebnici, otevřel jsem oči a hubu. Konečně jsem pochopil věci, které mi ostatní učebnice nedokázaly vysvětlit. Kniha vznikla na základě dlouholetých autorových zkušeností se školením profesionálních programátorů, výukou programování na univerzitě i vedením žákovských programátorských kroužků. Autor v ní uvádí čtenáře krok za krokem do tajů objektově orientovaného programování a ukazuje mu, jak možnosti této moderní technologie co nejlépe využít a kde si dát naopak pozor na její úskalí. Výklad je postaven na příkladech, které autor spolu s čtením postupně řeší a přitom čtenáře učí nejenom základním programátorským návykům a dovednostem, ale předvede mu i nejrůznější užitečné triky, z nichž mnohé nikde jinde vysvětlené nenajdete. Současně upozorňuje na nejčastější začátečnické chyby, které před svými čtenáři ostatní učebnice většinou tají. Navíc probírá i řadu témat (např. návrhové vzory), které patří do základní výbavy objektového programátora, přestože jsou většinou probírána až v pokročilých nebo dokonce nadstavbových kurzech.

5 Kurzy, které vede Rudolf Pecinovský, patří k nejkvalitnějším v České republice a zaručují dokonalé pochopení problematiky a okamžitou využitelnost získaných vědomostí v praxi. Je v nich optimálně sklouben výklad principů s praktickými cvičeními a nácvikem samostatného řešení praktických úloh. Chcete-li se naučit opravdu dobře programovat, přihlaste se do některého z následujících kurzů: Úvod do objektově orientovaného programování pro neprogramátory je určen pro ty, kteří se nehodlají živit přímo programováním, ale musejí s programátory velmi často jednat a potřebují se v dané oblasti trochu vyznat. Navštěvují jej zejména analytici, vedoucí projektových týmů a manažeři. Úvod do objektově orientovaného programování v Javě pro začínající programátory je určen pro ty, kteří s programováním teprve začínají a nemají žádné (a nebo jen minimální) předchozí zkušenosti s programováním. Úvod do objektově orientovaného programování v Javě pro strukturované programátory je určen pro ty, kteří doposud programovali v některém strukturovaném jazyce, a nebo programovali v objektovém jazyce, ale cítí, že jim objektově orientovaný způsob myšlení není vlastní. Kurz navštěvují především programátoři, kteří začali programovat v PHP nebo Delphi a přecházejí na Javu. Neméně početnou skupinou jsou programátoři v Javě, kteří se v předchozích kurzech sice naučili syntaxi jazyka, ale cítí, že by potřebovali zlepšit objektovou orientovanost svých programů. Kurz programování v Javě pro pokročilé je určen pro posluchače se základními zkušenostmi s objektovým programováním a Javou. Prohlubuje jejich znalosti a soustředí se na oblasti, které základní kurzy většinou přeskakují nebo je probírají jen okrajově. Posluchači se naučí pracovat s mnoha užitečnými třídami ze standardní knihovny a osvojí si řadu pokročilých technologií. Kurz návrhových vzorů je určen pro programátory se základními znalostmi objektového programování. Seznámí se zde s 33 návrhovými vzory a naučí se je využívat ve svých programech. Vedle těchto standardních kurzů nabízíme i další odborné akce: Přednášky a série přednášek na domluvená témata pro větší skupiny posluchačů. Tyto přednášky mohou mít i podobu klasického výukového kurzu. Konzultace nad konkrétními problémy zákazníků. Podrobnější informace najdete na Dotazy a přihlášky můžete posílat na kurzy@amaio.cz

6 Rudolf Pecinovský Myslíme objektově v jazyku Java kompletní učebnice pro začátečníky, 2., aktualizované a rozšířené vydání Copyright Grada Publishing a.s., 2009 V knize použité názvy mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Vydala Grada Publishing a.s. U Průhonu 22, Praha 7 jako svoji publikaci Odborní lektoři Prof. RNDr. PhDr. Antonín Slabý, CSc., Doc. Ing. Vojtěch Merunka, Ph.D., Ing. Alena Buchalcevová, Ph.D. Odpovědná redaktorka Jaroslava Palasová Návrh vnitřního layoutu Rudolf Pecinovský Zlom Jana Davídková, Rudolf Pecinovský Počet stran 576 První vydání, Praha 2009 Vytiskly Tiskárny Havlíčkův Brod, a.s. Husova Ulice 1881, Havlíčkův Brod ISBN

7 Mé ženě Jarušce a dětem Štěpánce, Pavlínce, Ivance a Michalovi

8 St ruč ný o bsa h 8 Myslíme objektově v jazyku Java Stručný obsah Poděkování...21 Předmluva k prvnímu vydání...22 Úvod...23 Část 1: Zapouzdření Seznamujeme se s nástroji Třídy a objekty v interaktivním režimu Vytváříme vlastní třídu Přidáváme atributy a metody Dotváříme vlastní třídu Návrhové vzory Část 2: Více tváří Rozhraní Budete si to přát zabalit? Co takhle něco zdědit? Dědit mohou i třídy Knihovny Program ve výjimečné situaci Část 3: Učíme program přemýšlet Program začíná přemýšlet Ještě jednu rundu, prosím Interní datové typy Kontejnery nejsou jen na odpadky Statické kontejnery pole Závěrečný projekt a kudy dál Rejstřík...565

9 Po dr o bn ý obs a h Podrobný obsah 9 Podrobný obsah Poděkování...21 Předmluva k prvnímu vydání...22 Úvod...23 Komu je kniha určena...23 Co se naučíte...23 Styl výuky...24 Programovací jazyk...25 Uspořádání...26 Čeština...26 Proč je kniha tlustá...27 Potřebné vybavení...27 Doporučená konfigurace...27 Sada JDK (Java Development Kit)...28 Vývojové prostředí...28 Konfigurační soubor pro prostředí BlueJ...29 Doprovodné programy...29 Doprovodné animace...29 Použité konvence...29 Odbočka...31 Část 1: Zapouzdření Seznamujeme se s nástroji Trochu historie První počítače...34 Co je to program...35 Program musí být především spolehlivý Objektově orientované programování OOP Vývoj metodik programování...36 Principy OOP Překladače, interprety, platformy Operační systém a platforma...37 Programovací jazyky Java a její zvláštnosti Klíčové vlastnosti Javy...40 Objektově orientovaná Jednoduchá...40 Multiplatformní...40 Java je jazyk i platforma...40 Vývojářská sada Vývojové prostředí BlueJ Projekty a BlueJ Umístění projektů na disku...42 Windows a substituované disky...43 Vyhledání a otevření projektu...44

10 10 Myslíme objektově v jazyku Java 1.7 Diagram tříd...45 Manipulace s třídami v diagramu Shrnutí co jsme se naučili Třídy a objekty v interaktivním režimu Nejprve trocha teorie...51 Třídy a jejich instance Zprávy Metody Analogie Třídy a jejich instance...53 Vytváříme svou první instanci Pravidla pro tvorbu identifikátorů v jazyce Java Vytváříme svou první instanci pokračování Posíláme instanci zprávu Vytváříme další instance Rušení instancí a správa paměti Restartování virtuálního stroje Instance versus odkaz Zprávy žádající o hodnotu...63 Datové typy Primitivní datové typy Objektové datové typy Vracení hodnot primitivních typů Vracení hodnot objektových typů Parametry a jejich typy...68 Vyvolání konstruktoru s parametry Parametry objektových typů Posílání zpráv s parametry Metody třídy Výlet do nitra instancí...75 Atributy instancí Atributy třídy statické atributy Přímé zadávání hodnot parametrů objektových typů...79 Veřejné atributy Odkazy vrácené po zaslání zprávy Shrnutí co jsme se naučili Vytváříme vlastní třídu První vlastní třída Zdrojový kód třídy...87 Prázdná třída Bílé znaky a uspořádání programu Soubory projektu Odstranění třídy Implicitní konstruktor Přejmenování třídy Ladění...98 Syntaktické chyby Běhové chyby Logické (sémantické) chyby Konstruktor s parametry Použití skrytého parametru this Přetěžování Testování TDD vývoj řízený testy Zprovoznění nástrojů pro automatizaci testů

11 Podrobný obsah 11 Testovací třída Přípravek Úprava obsahu přípravku Shrnutí co jsme se v kapitole naučili Zdrojový kód Ladění Konstruktory a metody Přidáváme atributy a metody Deklarace atributů Modifikátory přístupu Vylepšujeme třídu Strom Možné důsledky zveřejnění atributů Definujeme vlastní metodu Test vytvořených metod Reakce na chybu v testu Nejprve testy, pak program? Někdy jsou věci složitější Použití metod vracejících hodnotu Definice metod vracejících hodnotu Parametry a návratové hodnoty objektových typů Doplnění projektu o třídu odjinud Přístupové metody Atributy versus vlastnosti Konvence pro názvy přístupových metod Kvalifikace a klíčové slovo this Kvalifikace metod Kvalifikace atributů Atributy a metody třídy (statické atributy a metody) Atributy třídy Metody třídy Čtení chybových hlášení Lokální proměnné Konstanty a literály Konstanty objektových typů Správná podoba literálů boolean int double String null Zapouzdření a skrývání implementace Rozhraní versus implementace Signatura kontrakt Komentáře a dokumentace Proč psát srozumitelné programy Tři druhy komentářů Zakomentování a odkomentování části programu Pomocné značky pro tvorbu dokumentace Okomentování třídy Strom Uspořádání jednotlivých prvků v těle třídy Prázdná standardní třída BlueJ a komentářová nápověda Automaticky generovaná dokumentace Dokumentace celého projektu Třída Object

12 12 Myslíme objektově v jazyku Java 4.13 Metoda tostring() Sčítání řetězců Jak definovat metodu tostring() Závěrečný příklad UFO Předběžné poznámky Stručný přehled Třída Dispečer Jednodušší varianta Varianta ovládaná z klávesnice Třída UFO Atributy Konstruktor Metoda setrychlost(int,int) Metody getx(), gety(), getxrychlost(), getyrychlost(), getxtah(), getytah() Metoda nakresli() Metoda popojeď(int) Metody vpravo(), vlevo(), vzhůru(), dolů(), vypnimotory() Metoda tostring() Třída UFO_ Třída UFOTest Vytvoření samostatné aplikace Prohlížení obsahu JAR-souborů Třída spouštějící aplikaci Vytvoření souboru JAR s aplikací Stěhování projektu mezi platformami Problémy s kódováním znaků Shrnutí co jsme se v kapitole naučili Zdrojový kód Atributy a lokální proměnné Dokumentace Aplikace Dotváříme vlastní třídu Jednoduché vstupy a výstupy Textové řetězce Rozdíl mezi prázdným řetězcem a null Čísla Podrobnosti o operátorech Binární aritmetické operátory + * / % Sčítání, odčítání, násobení Slučování řetězců Dělení / Zbytek po dělení (dělení modulo) % Unární operátory Kulaté závorky () Přiřazovací operátor = Složené přiřazovací operátory +=, =, *=, /=, %= Operátor přetypování (typ) Univerzální přetypování na String Počítáme instance Inkrementační a dekrementační operátory Způsoby předávání hodnot Jiný způsob inicializace rodného čísla Standardní výstupy Standardní chybový výstup V útrobách testovací třídy Přípravek

13 Podrobný obsah 13 Automaticky generované testy Vlastní testy Úklid Metody assertequals a asserttrue Test testů Debugger a práce s ním Krokování programu Okno debuggeru Vlákna Atributy třídy Atributy instancí Lokální proměnné Pořadí volání zásobník návratových adres Krokování konstruktoru Atributy a proměnné objektových typů Už nezastavuj ruším zarážky Předčasný konec programu Pozastavení běžícího programu Hodnotové a odkazové objektové typy Odkazové datové typy Hodnotové typy Program demonstrující rozdíl Hodnotové typy podruhé Projekt Zlomky Metoda equals(object) Operátor porovnání == Operátor logické konjunkce && Operátor instanceof Definice equals(object) pro Zlomek Shrnutí co jsme se naučili Návrhové vzory Knihovní třída (Utility) Přepravka (Messenger) Tovární metoda (Factory method) Jedináček (Singleton) Výčtové typy Návrhový vzor Prázdný objekt (Null Object) Shrnutí co jsme se naučili Část 2: Více tváří Rozhraní Návrhový vzor Prostředník (Mediator) Kreslíme jinak Syntaxe rozhraní Instance rozhraní Nový projekt Práce s novým plátnem Událostmi řízené programování Implementace rozhraní Implementace rozhraní v diagramu tříd Odvolání implementace rozhraní Implementace rozhraní ve zdrojovém kódu Úprava zdrojového kódu třídy Strom Třída musí jít přeložit...256

14 14 Myslíme objektově v jazyku Java Testování Opomenuté testy Efektivita vykreslování Závěrečné úpravy Uložení odkazu na správce plátna do atributu třídy Odstranění statického atributu krok Úpravy posunových metod Zefektivnění přesunu Vnořený blok Implementace několika rozhraní Návrhový vzor Služebník (Servant) Proč zavádíme rozhraní Implementace Aplikace na náš projekt Závěrečný test Refaktorování Ukázka krok: Vytvoření testu krok: Doplnění prázdných verzí testovaných metod krok: Definice nových atributů krok: Kopírování těla konstruktoru do těla metody krok: Dočasné odkonstantnění některých atributů krok: Definice potřebných lokálních proměnných krok: Odstranění tvorby nových instancí koruny a kmene krok: Vrácení koruny a kmene mezi konstanty krok: Vyvolání metody setrozměr(int,int) v konstruktoru krok: Odstranění zdvojeného kódu z konstruktoru krok: Doplnění metody setrozměr(rozměr) krok: Doplnění metody setoblast(oblast) Projekt Výtah Analýza problému Okolí Konstruktory Potřebné metody Implementace Implementovaná rozhraní Atributy Postup při návrhu metod Metoda dopatra(int) Metoda přijeďk(iposuvný) Metoda nástup(iposuvný) Metody výstupvpravo() a výstupvlevo() Test převozu pasažéra Metody odvezvpravo(iposuvný,int) a odvezvlevo(iposuvný,int) Shrnutí co jsme se naučili Budete si to přát zabalit? Velké programy a jejich problémy Balíčky Podbalíčky Uspořádání podbalíčků s programy k dosavadní části knihy Názvy tříd Balíčky a BlueJ Příprava stromu balíčků pro BlueJ ve správci souborů Příprava stromu balíčků v BlueJ Vytvoření struktury balíčků pro tuto kapitolu Putování stromem balíčků Odstraňování balíčků

15 Podrobný obsah 15 Zavírání a otevírání projektů Naplňujeme balíčky Automatické vložení příkazu package Balíčky a příkaz import Import celého balíčku Import a podbalíčky Balíček java.lang Změna balíčku Názvy balíčků Příkazový panel Nevýhody koncepce balíčků v BlueJ Zobrazení příkazového panelu Použití příkazového panelu Opakované používání příkazů Přístupová práva v rámci balíčku Neveřejné třídy Tvorba vlastních aplikací Statický import Shrnutí co jsme se naučili Co takhle něco zdědit? Co to je, když rozhraní dědí? Jak to zařídit Duplicitně deklarovaná implementace Společný potomek několika rozhraní Třída Oblast a rozhraní IHýbací Návrhový vzor Stav (State) Projekt Šipky Shrnutí Návrhový vzor Zástupce (Proxy) Projekt Kabina Předpřipravené třídy Třída rup.česky.tvary.multipřesouvač Rozhraní rup.česky.tvary.imultiposuvný Rozhraní doprava.izastávka Třída doprava.linka Úloha: třída doprava.kabina Shrnutí co jsme se naučili Dědit mohou i třídy Podtřídy a nadtřídy Specializace Zobecnění Realizace v OOP Univerzální (pra)rodič Object Experimenty s dědičností Atributy a bezparametrické konstruktory tříd v projektu Hierarchie dědičnosti Podobjekt rodičovské třídy Explicitní volání konstruktoru předka Dosažitelnost parametru this Postup budování instance Chráněné atributy modifikátor přístupu protected Dědičnost a metody tříd Metody instancí, jejich dědění a překrývání Nové metody Nepřekryté zděděné metody...339

16 16 Myslíme objektově v jazyku Java Překryté zděděné metody Test chování překrývajících a překrytých metod Porovnání Podobjekt Soukromá metoda Veřejná metoda Instance vnučka Vyvolání překryté verze metody Vytváříme dceřinou třídu Jednoduchá dceřiná třída Konstruktory potomka Složitější dceřiná třída Definice konstruktorů Metoda kresli(kreslítko) Metoda setpozice(int,int) Jak přesvědčit objekt, aby se pokaždé choval jinak Samostatná úloha: Terč Vytváříme rodičovskou třídu Společný rodič Posuvný Příprava Konstantní atributy třídy Proměnné atributy třídy Konstantní atributy instancí Proměnné atributy instancí Konstruktory Metody instancí Třídy jako objekty class-objekt třídy Doladění dceřiných tříd Elipsa, Obdélník, Trojúhelník Čára Text Strom Dodatečné rozšíření rodičovské třídy Společný rodič Hýbací Abstraktní metody a třídy Neimplementovaná metoda implementovaného rozhraní Zděděná a neimplementovaná abstraktní metoda Přidání metody zobraz() Nově deklarovaná abstraktní metoda Abstraktní třída bez abstraktních metod Nová schopnost přizpůsobivost Návrhový vzor Stav podruhé Projekt Šipka Co je na dědičnosti špatné Třída ZpětnáKabina Omezení kladená na konstruktory Konečné třídy Poznámka o dobrých mravech Konečné metody ZpětnáKabina podruhé Tovární metoda podruhé Jak něco udělat před spuštěním rodičovského konstruktoru Využití tovární metody Kdy (ne)použít dědičnost Potomci, kteří nejsou speciálním případem rodiče Kdy jsme použili dědičnost místo správného skládání Potomci, kteří jsou příliš speciální

17 Podrobný obsah 17 Kdy dát přednost skládání a kdy dědičnosti Shrnutí co jsme se naučili Knihovny Zbylé primitivní datové typy long short byte float char Primitivní a obalové datové typy Třída System Formátovaný výstup Národní prostředí Ukázka Základní matematické funkce Pracujeme s náhodou Ukončení aplikace Třída String Definice vlastní knihovny a její začlenění do BlueJ Vytvoření JAR-souboru s knihovnou Přidání knihovny do BlueJ Shrnutí co jsme se naučili Program ve výjimečné situaci Nejdůležitější výjimky Vyhození výjimky Výjimky a dostupný kód Co výjimky umí getmessage() tostring() printstacktrace() printstacktrace( PrintStream ) Zachycení vyhozené výjimky Analýza rekurzivní metody Několik současně odchytávaných výjimek Společný úklid Testování správného vyhození výjimky Hierarchie dědičnosti výjimek Definice vlastních výjimek Kontrolované výjimky Převedení kontrolované výjimky na nekontrolovanou Shrnutí co jsme se naučili Část 3: Učíme program přemýšlet Program začíná přemýšlet Ternární operátor?: Jednoduchý podmíněný příkaz Vyhození výjimky Blok příkazů (složený příkaz) Podmínky a jejich skládání Porovnávací operátory Logické výrazy Použití v programu Návrhový vzor Adaptér (Adapter)

18 18 * Myslíme objektově v jazyku Java 13.6 Ošetření klávesnice Návrhový vzor Pozorovatel (Posluchač) potřetí Možné události klávesnice Co prozradí událost java.awt.event.keyevent Střelba Třída Střela Třída Dělo Statický konstruktor Vylepšené dělo Rychlost ošetření klávesnice Vnořené podmíněné příkazy Výběr ze dvou možností Kaskáda možností Přepínač Sestřelování letadel Přepínač nad výčtovým typem Ještě jednou metoda equals(object) Překrytí metody equals(object) Shrnutí co jsme se naučili Ještě jednu rundu, prosím Cykly Jak máme rychlý počítač cyklus s koncovou podmínkou Jeden test nestačí cyklus s počáteční podmínkou Cyklus s parametrem Nekonečný cyklus Vnořování cyklů Cyklus s podmínkou uprostřed Příkaz break s návěštím Cyklus s prázdným tělem Skákající balonek Zadání Příprava testu Předběžné úvahy, definice konstruktorů Koncepce simulace pádu Dotažení simulace pádu Metody přemístina(int,int) a spadni() Balon se odráží Zmenšování odrazů Jak dělat několik věcí najednou Vlákna Spuštění pádu v samostatném vlákně Čekání na ukončení vlákna Opuštění více bloků současně Shrnutí co jsme se naučili Interní datové typy Přehled Terminologie Společné charakteristiky Použití Globální typy typové členy vnořené a vnitřní Vnořené datové typy Adaptér vnořený do svého rozhraní Vnitřní třídy Balonek s vnitřní třídou

19 Podrobný obsah Lokální třídy Pojmenované lokální třídy Anonymní třídy Balonek s anonymní třídou Shrnutí co jsme se naučili Kontejnery nejsou jen na odpadky Co je to kontejner Kolekce (Collection) Množina (Set) Seznam (List) Mapa (Map), Slovník (Dictionary) Koncepce kontejnerů ve standardní knihovně Další kontejnery Zásobník (Stack) Fronta (Queue) Strom (Tree) Graf Parametrizované datové typy Definice parametrizovaných typů Použití parametrizovaných typů Jak chápat definice typů a jejich metod Žolíky Práce s kontejnery ve standardní knihovně Deklarujte typy co nejobecněji Rozhraní java.util.collection<e> Pracujeme s množinami Rozhraní java.util.set<e> Třída java.util.linkedhashset<e> Brownův pohyb molekul Konstrukce molekuly Náhodné rozmístění molekul Pohyb molekul a jejich srážky Pravidelné spuštění úloh pomocí instance třídy java.util.timer Animátor Animátor jako soukromá vnořená třída Návrhový vzor Iterátor (Iterator) Princip Použití iterátorů v Javě Rozhraní java.util.iterátor<e> Molekuly s vývěvou Pracujeme se seznamy Rozhraní java.util.list<e> Třídy java.util.arraylist<e> a java.util.linkedlist<e> Návrhový vzor Pozorovatel Mnohotvar Základní koncepce a první testy Dovedení programu k úspěšnému vykonání testů Metoda nakresli(kreslítko) Metoda přidej(ihýbací) Přidání hýbacích vlastností Metoda setpozice(int,int) Metoda setrozměr(int,int) Soukromá přepravka Zavedení vrstev práce se seznamy Třída java.util.listiterator<e> Primitivní a obalové datové typy

20 20 Myslíme objektově v jazyku Java Pracujeme s mapami Rozhraní java.util.map<k,h> Rozhraní java.util.map.entry<k,h> Mapy v balíčku rup.česky.tvary Třída Směr Třída Barva Hodnotové typy a metoda hashcode() Hešové tabulky Pravidla pro ukládání Pravidla pro vyhledávání Vytváření hešových tabulek Metoda hashcode() Ještě jednou hodnotové typy Shrnutí co jsme se naučili Statické kontejnery pole Pole jako kontejner Pole odkazů na objekty Pole a BlueJ Pole hodnot primitivních typů Hlídání mezí polí Inicializace polí v deklaraci Inicializace vytvářeného pole Neinicializovaná pole objektových typů Vypsání čísla slovy Vícerozměrná pole Obdélníková pole Neobdélníková pole Inicializace vícerozměrného pole Pascalův trojúhelník Třídy StringBuilder a StringBuffer Metoda main(string[]) Metody s proměnlivým počtem parametrů Shrnutí co jsme se naučili Závěrečný projekt a kudy dál Závěrečný projekt: Displej Zadání Analýza Displej Číslice Segment Zpět u číslic Dotahujeme segmenty Dotahujeme číslice Dotahujeme displej Závěr Kudy dál Rejstřík...565

21 Po dě ko vá ní Poděkování Vím, že se v českých knížkách většinou neděkuje, ale tahle kniha byla spojena s takovými oběťmi řady lidí z mého blízkého i vzdálenějšího okolí, že bych měl velkou újmu na duši, kdybych tak neučinil. Chtěl bych především nesmírně poděkovat své ženě Jarušce, která byla po celou dobu mojí největší oporou a jejíž nekonečná trpělivost a vstřícnost mi pomohla dokončit knihu v termínu, který se příliš nelišil od toho, jenž jsme původně s nakladatelem dohodli, a ne až někdy za rok po něm. Původně jsem se domníval, že s druhým vydáním nebude moc práce. Šeredně jsem se zmýlil, protože veškeré úpravy, které jsem se rozhodl do knihy zanést (a že jich bylo požehnaně), musely zapadnout do předchozího textu. O to náročnější byla redakční práce, při níž bylo třeba mimo jiné zkontrolovat, že tomu tak doopravdy je. Nemenší poděkování patří i dětem, které se mi také snažily v rámci svých možností pomáhat. Především Ivance, která pomáhala mamince s některými redakčními pracemi a našli mi v rukopise řadu těžkopádných formulací, Michalovi, který zanášel připomínky čtenářů a Pavlínce, která mne osvobodila od starostí o administrativu a účetnictví. Na vylepšování textu nového vydání se ale podílela řada dalších lidí. Mezi nimi musím poděkovat především těm, kteří si dali tu práci a při objevení chybky v minulém vydání mi o ní napsali. Mezi nimi pak především Jaromíru Tesařovi, Bohumíru Zámečníkovi a Jiřímu Jílkovi, kteří si dali tu práci, a opravdu zaznamenávali všechny nesrovnalosti, na které při čtení narazili. Nemalý podíl na úpravách textu mají i Jarmila Pavlíčková a Luboš Pavlíček, s nimiž jsem v posledních letech několikrát probíral styl výuky i použité příklady. Svůj podíl na kvalitě výsledného textu má i Alena Buchalcevová, které se podařilo v téměř hotovém textu najít ještě několik nepřesností. Poděkování patří Janě Davídkové, která s níž jsme vtiskávali knize konečnou grafickou podobu. Přes záplavu nejrůznějších poznámek, programů a odboček, kterými se text hemží, se jí podařilo vše uspořádat do podoby, která v neznalém čtenáři vyvolá dojem, že text byl napsán tak, aby šel dobře zalomit. Stejně bych chtěl poděkovat o Evě Steinbachové z redakce počítačové literatury nakladatelství Grada, která celou práci průběžně sledovala, zprostředkovávala komunikaci mezi mnou a nakladatelstvím a v neposlední řadě upozorňovala na drobná opomenutí, která by mohla způsobit problémy při následné výrobě knihy.. Rád bych touto cestou poděkoval i Michaelu Köllingovi a jeho spolupracovníkům, jejichž myšlenky mne kdysi inspirovaly k novému uspořádání výkladu a jejichž vývojový nástroj BlueJ realizaci takového výkladu vůbec umožnil. Na závěr pak musím vyjádřit svůj velký dík veškerému osazenstvu oddělení Development ve firmě ICZ. Tito lidé mě k Javě přivedli, a po celou dobu přípravy knihy mě všestranně podporovali. Bez jejich podpory by kniha nevznikla.

22 22 Myslíme objektově v jazyku Java P ř e d m l u v a k p r v n í m u v y d á n í Předmluva k prvnímu vydání Rudu Pecinovského jsem poprvé potkal v době, kdy jsme oba studovali na Jaderné fakultě ČVUT v Praze. Doopravdy jsme se ale poznali až mnohem později, když jsme na počátku devadesátých let spolupracovali na překladu manuálů k jistému dodnes populárnímu programovému prostředí. Brzy jsme zjistili, že máme jeden společný zájem učit lidi, jak kvalitně psát programy. V současné době dominuje při tvorbě aplikací objektově orientované programování. Moderní vývojové nástroje, které jsou na trhu k dispozici, jeho znalost předpokládají, aplikační knihovny z něj vycházejí, softwarové firmy ho vyžadují, nově vznikající programovací jazyky jsou čistě objektové. A když už jsme u těch jazyků: Java je dnes asi nejpoužívanější jazyk pro vývoj nových aplikací a zcela určitě to je jazyk, který se nejdynamičtěji rozvíjí. Přesto téměř všechny učebnice Javy, které na trhu najdete, začínají procedurálním programováním a k objektově orientovanému programování se dostanou až ke konci. Objekty pak často vypadají jako nepříliš pohodlná nadstavba nad procedurálním programováním. Řekl jsem, že tak vypadají téměř všechny knihy. Kniha Rudy Pecinovského je totiž velmi příjemnou výjimkou. Je to učebnice, která objekty opravdu začíná a prvních několik kapitol se ani ničím jiným nezabývá. Teprve poté, co zvládnete základní pojmy a dovednosti objektově orientovaného programování, se začne zabývat konstrukcemi, jako je cyklus nebo podmínka. Tento postup, který si autor vyzkoušel na začínajících programátorech v programátorských kroužcích a který používá při výuce profesionálů, vás naučí od počátku myslet objektově. Ukazuje objekty jako něco opravdu přirozeného, jako něco, co výrazně usnadňuje přemýšlení o řešené úloze. Při čtení Rudovy knihy jsem občas litoval, že už umím programovat, a tak jen doufám, že slibované další díly budou stejně dobré. M. Virius

23 Úvod 23 Úv od Úvod Otevíráte knížku, která vás chce naučit programovat moderním, objektově orientovaným stylem. Stylem, jímž se v dnešní době vyvíjí drtivá většina klíčových aplikací, ale k jehož výuce ještě řada škol nedospěla. Po nastudování této knížky budou proto mnozí z vás vědět o moderním programování víc než leckterý z učitelů. Komu je kniha určena Tato knížka je určena pro ty, kteří to se svoji touhou naučit se moderně 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ám v ní snažit 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ů. Knížka je primárně určena těm, kteří ještě nikdy neprogramovali. První vydání jsem psal na základě zkušeností z výuky programování na základních a středních školách doplněných o další zkušenosti získané z vedení kurzů pro profesionální programátory přecházející z klasického programování na programování objektově orientované. Při vedení těchto kurzů jsem si uvědomil, že to, co děti (a částečně i dospělí, kteří s programováním teprve začínají) pochopí poměrně snadno, zvládají programátoři s předchozími zkušenostmi z neobjektového programování obtížně 1. Spoustu úsilí totiž musí věnovat tomu, aby se nejprve odnaučili mnohé z toho, co si před tím pracně osvojili. Teprve pak začnou pomalu vstřebávat jiný způsob programátorského myšlení, jenž objektově orientované programování vyžaduje. Od čtenářů jejího předchozího vydání jsem dostal řadu mailů, v nichž mi psali, že jsou sice zkušenými programátory, ale teprve zde pochopili některé věci, které jim ostatní učebnice a kurzy nedokázaly vysvětlit. Uvědomil jsem si přitom, že knihu mohou s výhodou použít i ti, kteří již nějakou dobu programují a potřebují se přeškolit z klasického, strukturovaného programování na programování objektově orientované (80 % účastníků mých kurzů). Při úpravách pro toto vydání jsem se proto snažil, aby se kniha stala co nejužitečnější pro obě skupiny čtenářů. Zanedlouho po vyjití prvního vydání jsem začal učit programování na katedře informačních technologií Fakulty statistiky a informatiky VŠE v Praze. Ke svému milému překvapení jsem zjistil, že tu kniha patří mezi doporučené učebnice stejně jako na řadě dalších univerzit, které se snaží naučit své studenty programovat objektově. K tomu, aby se stala plnohodnotnou učebnicí, jí však chyběl výklad některých pasáží, které se již do minulého vydání nevešly. Domluvili jsme se proto s nakladatelstvím, že toto vydání upravím a rozšířím tak, aby pokrylo látku prvního semestru výuky programování na FSI VŠE. Co se naučíte Musím vás upozornit na to, že 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 jeho knihoven. Dozvíte se z nich, kde použít kulaté 1 Statistiky uvádějí, že typická doba přechodu je 12 až 18 měsíců, přičemž čím je programátor zkušenější, tím déle mu přerod trvá.

24 24 Myslíme objektově v jazyku Java a kde hranaté závorky, kam patří středník a řadu další důležitých informací. Bohužel se v nich ale nedozvíte skoro nic o tom, jak při vývoji programů přemýšlet, aby vás nezaskočily náhlé změny zadání, kterými je současné programování pověstné. Autoři totiž předpokládají, že se při čtení jejich knihy naučíte programovat nějak sami od sebe. Zkušenosti s programátory, kteří navštěvují moje kurzy ve firmě či na VŠE, 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 nějakého objektově orientovaného programovacího jazyka, bohužel skoro nikdo z nich v něm neumí objektově programovat. Obdobné je to i se studenty, kteří s programováním začali před tím, než přišli na vysokou školu. 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 specialitá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 používat, ať budete programovat v jakémkoliv objektově orientovaném jazyce. Jazyky přicházejí a odcházejí. Základní programátorské techniky a způsob myšlení však žijí daleko déle než jazyky, se kterými byly zavedeny. Díky tomu, že se místo na programovací jazyk soustředím spíše na vlastní programování, vznikl v knize prostor pro výklad řady programátorských technik, o nichž se klasické učebnice vůbec nezmiňují, a to dokonce ani učebnice pro zkušené programátory; technik, které se většinou přednášejí až v nadstavbových kurzech. Přitom vůbec nejde o techniky složité, které by začátečník nezvládl pochopit. Učebnice je pomíjejí pouze proto, že nesouvisí přímo se syntaxí jazyka, ale týkají se obecného programování. Na školách se setkáte se dvěma přístupy k výuce programování. Jeden vychovává studenty tak, aby vyhrávali programátorské soutěže. Učí je různé finty a triky, které se dají upotřebit při řešení opravdu zapeklitých problémů, ale vedle toho již nezbývá místo na získání návyků umožňujících efektivně řešit 95 % běžných úloh. Druhý styl výuky učí studenty programovat tak, aby si programováním dokázali co nejlépe vydělávat. Učí studenty základní pravdě, že jediné, na co se mohou při vývoji programů spolehnout, je skutečnost, že zadání úlohy se zanedlouho změní, a že proto musí navrhovat programy tak, aby je tyto změny nezaskočily, ale aby je dokázali do svého návrhu rychle a efektivně začlenit. Tato učebnice se soustředí na druhý způsob výuky. Nebude vám proto ukazovat skoro žádné triky, které použijete v 5 % opravdu zapeklitých úloh, ale zato vás naučí řadu triků, které vám pomohou efektivně vyřešit běžné problémy, které by na vás mohly číhat při řešení těch zbylých 95 % úloh. Naučíte se s ní vytvářet programy tak, aby s vámi mohly růst a aby vás nezaskočily rychle se měnící požadavky zákazníků (a připravte se na to, že tyto měnící se požadavky vás potkají i v případě, kdy vaším zákazníkem jste vy sami). Styl výuky Před chvílí jsem řekl, že kniha pokrývá látku prvního semestru výuky programování na FSI VŠE. Není to však odborným stylem psaná vysokoškolská učebnice. Naopak. Snažil jsem se ji psát tak, aby se dobře četla i středně bystrému středoškolákovi či středoškolačce a aby, jak s oblibou říkám, vykládaná látka dobře tekla do hlavy. Už podle tloušťky knihy 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 následném dlouhém a usilovném samostudiu. Předpokládám proto, že už víte, že tenké učebnice patří ve skutečnosti k těm nejdražším, protože to, co ušetříte při jejich koupi, mnohonásobně ztratíte při následném zdlouhavém osvojování si stručně a náznakově probrané látky.

25 Úvod 25 Tato kniha se od ostatních učebnic (a řady univerzitních kurzů) programování liší ještě v jedné věci: většina ostatních učebnic a kurzů objektově orientovaného jazyka sice na začátku vysvětlí, co je to objektové programování, ale pak na něj na chvíli zapomene a začne výkladem klasických programovacích konstrukcí. Když se pak pracně probojují k výkladu objektových konstrukcí, studenti již mají nacvičené strukturované programování, takže nadále vyvíjejí strukturované programy, pouze v nich používají objektové konstrukce. Neuvědomují si přitom, že používat třídy a objekty ještě neznamená programovat objektově 1. 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 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. Oproti běžným zvyklostem spolu v této učebnici nebudeme ř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. Programovací jazyk Sliboval jsem, že se nebudu soustředit na výuku jazyka, ale na výuku programování. 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 2, je to moderní programovací jazyk, na němž lze demonstrovat použití všech důležitých postupů, oproti jiným současným jazykům je doopravdy jednoduchý, takže se jej snadno naučíte, překladač i ostatní vývojové nástroje je možné získat zdarma, vytvořené programy nejsou omezeny na jediný operační systém, ale můžete je přenášet mezi různými operačními systémy, je k němu k dispozici vývojový nástroj specializovaný pro výuku, který je dokonce lokalizován do češtiny. 1 Výzkum z přelomu století ukázal, že pouze 10 % programů psaných v objektově orientovaných jazycích je navrženo opravdu objektově. (Goddard, D Is it really object oriented?. Data Based Advis. 12, 12 (Dec. 1994), ) Od té doby se situace trochu zlepšila, nicméně strukturovaně navržené programy psané v objektových jazycích stále převažují. 2 Zájemce odkážu na kde najdou vývoj popularity jednotlivých programovacích jazyků od roku 2001.

26 26 Myslíme objektově v jazyku Java 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. Uspořádání Kniha je rozdělena do tří čá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. Většina úloh, na jejichž řešení vykládanou látku demonstruji, jsou simulace nebo jednoduché hry. Říkal jsem si, že pro vás budou takovéto příklady mnohem zajímavější než obsluha bankovních účtů a další praktické úlohy, s nimiž se v učebnicích často setkáváme. Navíc se domnívám, že se na nich dá vysvětlovaná látka předvést mnohem názorněji. Úlohy v první části knihy budou, pravda, celkem triviální, protože toho ještě nebudete moc umět, i když i tady si zkusíte naprogramovat část jednoduché hry. Druhá část už přinese zajímavější úlohy s nejrůznějšími animacemi, ale stále půjde převážně pouze o součásti větších projektů. Ve třetí části se pak konečně objeví úlohy, které budete moci vyřešit od počátku do konce. Žádná z úloh zadaných v této knize není pouze zadána. Všechny zadané ú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. Čeština Někteří čtenáři mne občas napadají za to, že ve svých textech používám důsledně českou terminologii. Za dlouhou dobu své učitelské praxe jsem si však vyzkoušel, že používání původních anglických termínů v začátečnických kurzech není dobré řešení. Začátečníci mívají problémy s pochopením vlastní látky a přidání termínů, kterým nerozumějí (znalost angličtiny u nás stále není na takové úrovni, jakou bychom rádi viděli), jim situaci pouze ztěžuje. Praxe pak ukazuje, že mnozí anglicky hovořící programátoři schovávají za anglické termíny to, že problému sami nerozumějí a při používání slangu působí na neznalé okolí jako odborníci. Když na začátečníka vybafnu např. název singleton, málokterý bude vědět, co to slovo znamená, a nezbude mu, než si je zapamatovat jako nějaký nový, cizí termín. Když se pak po pár týdnech výuky zeptám, jaké vlastnosti má návrhový vzor singleton, začnou žáci nejprve tápat, který z probraných vzorů to je, a v řadě případů jej zamění s nějakým jiným. Když naproti tomu použiji pro daný návrhový vzor termín jedináček, všichni si jej ihned pevně spojí se svojí představou jedináčka. Nejenom že jej pak i po týdnech správně vyloží, ale navíc i lépe pochopí jeho podstatu. Prosím proto čtenáře, kteří jsou hrdí na svoji znalost angličtiny, aby se smířili s tím, že budu vycházet vstříc většině, která konstrukce označené českými termíny lépe pochopí a daleko lépe si je zapamatuje. Ti, kteří můj počeštěný výklad nepotřebují, se jistě již dávno poučili z některé anglicky psané učebnice.

27 Úvod 27 Protože je však programátorský svět veskrz anglický 1, uvedu u každého termínu při jeho zavedení i příslušný anglický ekvivalent. Všem vám pak doporučuji si tento ekvivalent zapamatovat, protože řada českých i slovenských autorů z nejrůznějších důvodů trvá na používání anglických termínů doplněných českými, resp. slovenskými koncovkami. Proč je kniha tlustá 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 projít všechna krizová místa spolu s vámi krok za krokem. Nechtěl jsem před vás jen předhodit hotová řešení, ale chtěl jsem vám názorně ukázat, jak byste mohli k takovémuto řešení sami dospět. Obdobně jsem nechtěl 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 trochu narostla. Doufám, že i vy budete tyto podrobné vysvětlivky považovat za užitečné. Knize přidalo na tloušťce i to, že jsem občas zabrousil do oblastí, které se sice do začátečnických příruček obvykle neprobojují, avšak jejich neznalost pak dělá začátečníkům o to větší problémy. Kniha vznikala pomalu a dlouho. Přes veškeré úsilí, které jsme ji já i moji spolupracovníci věnovali, nemohu vyloučit, že v textu či doprovodných příkladech zůstaly skryté nějaké chyby. Předem se za ně omlouvám a prosím vás, abyste mi o nich napsali na adresu rudolf@pecinovsky.cz. Já bych je opravil a opravu vystavil na webové stránce této knihy Potřebné vybavení Pro úspěšné studium této knihy budete potřebovat čtyři věci: dostatečně výkonný počítač, základní vývojovou sadu Javy, vývojové prostředí BlueJ, programy používané v příkladech, budete-li se chtít podívat na doprovodné animace, tak budete potřebovat internetový prohlížeč, který je schopen přehrát flashové animace. Doporučená konfigurace Používáte-li operační systém Windows, měla by to být minimálně verze Windows 2000 (Java 5.0 je schopná běhat i na Windows 98). Používáte-li systém Linux, lze předpokládat, že budete mít dostatečně novou verzi. Jste-li uživateli počítačů Macintosh, měli byste mít systém podporující minimálně Javu 5.0. Pro úspěšné spouštění programů pod Javou 5.0 na Windows 98 byste měli vystačit s 64 MB paměti, při přechodu na novější operační systémy a novější verze Javy však nároky na paměť rychle 1 Když jsem po škole nastupoval v akademii, položil mi můj školitel otázku: Umíte anglicky? Než jsem si zformuloval odpověď, která by charakterizovala úroveň mých znalostí, odpověděl si sám: No ono je to jedno buďto budete umět anglicky nebo změníte zaměstnání. A totéž platí pro všechny, kteří se chtějí vážně zabývat programováním.

28 28 Myslíme objektově v jazyku Java rostou. Pro provoz pod Windows XP bych vám doporučoval 256 MB, u pažravých Windows Vista 1024 MB. S uvedenými konfiguracemi byste měli při troše trpělivosti vystačit. Těm méně trpělivým bych však pro pohodlnou práci doporučoval raději dvojnásobek. Paměťové nároky pro Linux a Macintosh jsou obdobné vždy záleží na verzi používaného systému. Jsou však řádově srovnatelné s nároky systémů z rodiny Windows. Vývojová sada JDK, o níž budu hovořit za chvíli, zabere na disku po rozbalení (v závislosti na verzi) přibližně 300 až 400 MB a dokumentace dalších 250 až 350 MB. Budete-li si chtít rozbalit soubor se zdrojovými kódy, abyste se mohli podívat, jak je to či ono v Javě naprogramováno, budete potřebovat dalších 70 až 90 MB. Sada JDK (Java Development Kit) K vývoji programů budete potřebovat vývojovou sadu JDK, kterou můžete zdarma stáhnout na webové adrese nebo získat na CD přibaleném k některému počítačovému časopisu. Nabízí-li vám někdo starší počítač s již nainstalovanou Javou, zkontrolujte, že se jedná o Javu 5.0 nebo mladší. Na starších verzích Javy naše programy pracovat nebudou. Každopádně bych vám doporučoval použít co nejnovější verzi. Od verze 5.0 sice v jazyku nepřibyly žádné vlastnosti ani funkce, které by se dotkly programátorských začátečníků (hovořím o verzích 6.0 a 7.0, které byly známé v době vydání knihy), ale každá novější verze udělala výrazný krok v efektivitě. Po verzi 5.0 proto doporučuji sáhnout pouze v případě, že používáte operační systém Windows 98, který již mladší verze nepodporují, nebo pracujete na počítači Macintosh a nechce se vám investovat do nové verze operačního systému. K vývojové sadě si nezapomeňte stáhnout a nainstalovat i dokumentaci. Je přibližně stejně rozsáhlá, jako samotná vývojová sada (ale nebojte se, nemusíte ji číst celou) a při jakémkoliv programování za hranicemi příkladů z učebnice se bez ní neobejdete. Vývojové prostředí S JDK při vývoji programů teoreticky vystačíte (některé učebnice ani nic jiného nepoužívají), nutí vás však starat se o řadu konfiguračních detailů, které vás odvádějí od vlastního programování. Převážná většina programátorů proto používá vývojové prostředí, které tyto detaily vyřeší za ně a navíc jim pomůže i v řadě dalších oblastí. Já budu při výkladu používat vývojové prostředí BlueJ, které můžete (rovněž zdarma) stáhnout na adrese Ve srovnání s vlastní Javou je toto prostředí nenáročné. Instalační soubory mají necelé 4 MB a po instalaci zaberou přibližně dvojnásobek. Někteří čtenáři minulého vydání si stěžovali, že je práce v tomto prostředí obtěžuje, protože prostředí se výrazně odlišuje od běžného standardu. Opravdu se odlišuje jeho možnosti můžete skrz naskrz prozkoumat tak za 20 minut, kdežto naučit se dokonale některé standardní vývojové prostředí je zhruba stejně těžké jako naučit se Javu. Navíc prostředí BlueJ umožňuje velmi jednoduše znázornit strukturu programu, což jiná prostředí neumožňují. Ty, kterým BlueJ nesedne, k jeho používání nenutím. Budete je potřebovat pouze v 2. kapitole, protože žádné jiné prostředí prozatím možnost interaktivního režimu nenabízí. Od 3. kapitoly se však už můžete přepnout na libovolné jiné a pasáže, v nichž vysvětluji některé postupy vázané na prostředí, prostě přeskočit a nastudovat si tyto postupy pro prostředí vámi používané. Mohu-li vám však doporučit, zůstaňte během studia této učebnice u BlueJ (alespoň do konce druhé části). Pak už budete mít dostatečné návyky, abyste mohli přejít na libovolné jiné nejlépe na NetBeans nebo Eclipse.

29 Úvod 29 Konfigurační soubor pro prostředí BlueJ K prostředí BlueJ doporučuji stáhnout a instalovat konfigurační soubor, který najdete na adrese spolu s návodem, jak jej použít a konfiguraci BlueJ upravit. Po instalaci tohoto konfiguračního souboru se BlueJ lokalizuje a začne se s vámi bavit česky. Oproti původní konfiguraci budou naše programy navíc i trochu barevnější, což vám umožní se v nich lépe orientovat. Poslední výhodou této konfigurace je, že přepne celé prostředí do kódování UTF-8, takže přestanete mít problémy s přenášením souborů mezi jednotlivými platformami a uživatelé používající Windows si budou moci vesele vyměňovat své programy s uživateli systémů Linux či Macintosh, a to nezávisle na tom, používají-li diakritiku. Doprovodné programy Na stránce s konfiguračním souborem, tj. na adrese najdete také dva soubory s projekty použitými v knize. První z nich obsahuje zdrojové soubory programů přesně v té podobě, jak jsou uvedeny v knize, tj. včetně diakritiky. Druhý je pak určen pro ty, kteří diakritiku v programech nesnáší. Abyste si mohli navíc převést do nediakritického tvaru i jiné programy, je pro vás na webu připraven program Odhackuj (jeho název je schválně bez diakritiky), který zkopíruje soubory uložené v kódování UTF-8 do zadaného adresáře a přitom zbaví jejich názvy i jejich obsah veškeré diakritiky. Tento program je napsaný v Javě, takže by měl chodit na všech počítačích. Na této stránce bude zároveň průběžně aktualizovaný návod na stažení Javy a BlueJ určený pro ty, kteří budou mít s jejich stažením problémy. Kdyby ani tento návod nestačil, pošlete mail a pokusíme se vaše instalační problémy nějak vyřešit. Doprovodné animace Sami jistě ze zkušenosti víte, že dobrý příklad je v řadě situací lepší než řada slov. Od minulého vydání jsem proto připravil celou řadu animovaných ukázek, v nichž krok za krokem demonstruji některé vysvětlované postupy. Najdete je na adrese Tyto animace využijete hlavně při čtení první části knihy, protože demonstrují především práci s prostředím BlueJ a tvorbu základních konstrukcí. Ukazují jak tyto konstrukce použít a předvádějí chování programů, v nichž jsou vysvětlené konstrukce použity. Animace však nejsou navázány na konkrétní kapitoly knihy. Vznikly jako doprovod k mým přednáškám na VŠE a VOŠIS. Vedle českých animací najdete na zmíněné stránce i řadu anglických, které zase slouží jako doprovod k mému kurzu programování, který běží na stránkách firmy Sun. 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 První výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně. Názvy Citace 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.

30 30 Myslíme objektově v jazyku Java Adresy Názvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem. Program 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. Symbol jin-jang bude uvozovat poznámky, s nimiž se setkáte na počátku každé kapitoly. Zde vám vždy prozradím, co se v dané kapitole naučíte. Otevřená schránka s dopisy označuje informace o projektu, s nímž budeme v dalším textu pracovat nebo v něm najdete vzorové řešení. 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 nebo na konvence, které se k probírané problematice vztahují. Seznam všech terminologických poznámek najdete v rejstříku pod heslem terminologie. 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, která pouze doplňuje 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.

31 Úvod 31 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é sou- vislosti, 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 nějaké analogii, nejčastěji v analogii ze světa robotů, kterou zavádím v podkapitole Analogie na straně 53. Seznam odkazů na tuto analogii najdete v rejstříku pod heslem analogie. Odbočka Občas je potřeba vysvětlit něco, co nezapadá přímo do okolního textu. V takových případech používám podšeděný blok se silnou čarou po straně. Tento podšeděný blok je takovou drobnou odbočkou od ostatního výkladu. Nadpis podšeděného bloku pak najdete i v podrobném obsahu mezi nečíslovanými nadpisy.

32

33 Část 1: Zapouzdření

34 1. Seznamujeme se s nástroji 34 Myslíme objektově v jazyku Java 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, které se hemžily chybami. 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. Zajímavé je, že prvním publikujícím programátorem byla žena Augusta Ada Lovelance (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 (později generálem a předsedou vlády sjednocené Itálie) Menabreou, 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 Bernoulliho čísel prvním publikovaným počítačovým programem na světě 1. (Na její počest byl v osmdesátých letech minulého století pojmenován programovací jazyk Ada.) 1 Poznámky překladatele doplnila až po Babbageově přemlouvání. Babbage ji chtěl ušetřit práci a program pro ni napsal, jenže ona mu v něm našla chybu a definitivní, publikovaná verze je již její dílo. Není tedy prvním člověkem, který program napsal, ale je prvním člověkem, který svůj program publikoval.

35 Kapitola 1: Seznamujeme se s nástroji 35 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 1. 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é 2 č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. Problémem prvních počítačů byla jejich vysoká poruchovost. Antonín Svoboda tehdy přišel s řadou konstrukčních vylepšení umožňujících vytvořit z nespolehlivých součástek spolehlivý počítač 3. Konstruktéři se postupně naučili vytvářet vysoce spolehlivé počítače. Nejslabším článkem celého komplexu se tak stával program. Co je to program Program bychom mohli charakterizovat jako v nějakém programovacím jazyce zapsaný předpis, popisující, jak má procesor, pro nějž je program určen (v našem případě počítač) splnit zadanou úlohu. Cílovým procesorem nemusí být vždy počítač. Oblíbeným příkladem programů jsou např. kuchařské předpisy. V předpočítačových dobách zaměstnávaly některé instituce (např. armáda) velké skupiny počtářů, které na mechanických kalkulačkách řešili podle zadaných programů výpočty, které dnes předhazujeme počítači. Na programu je důležité, že musí být napsán v nějakém programovacím jazyce, kterému rozumí programátor i počítač. Vybrat jazyk pro kuchařský předpis je jednoduché, vybrat jazyk pro počítač je mnohem složitější. Kvalita použitého jazyka totiž naprosto zásadně ovlivňuje i kvalitu výsledných programů. Proto také prošly jak programovací jazyky, tak metodiky jejich používání celou řadou revolučních změn. 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 modulární programování, v sedmdesátých letech na ně navá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. (Jednotlivé termíny si za chvíli probereme podrobněji). 1 Takhle se to alespoň dlouho tvrdilo. V roce 1991 však Doron Swade, kurátor londýnského muzea vědy, sestavil Babaggeův počítač pouze s použitím technologií dostupných v polovině devatenáctého století. 2 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čů. 3 V tehdejší době (tj. v padesátých letech) byla naše republika na špičce světového vývoje počítačů. Svobodovy myšlenky byly později uplatněny v počítačích řídících americké kosmické lodě. Jenže to už bylo v době, kdy byl z naší republiky vypuzen, emigroval do USA a tam působil jako špičkový počítačový odborník.

36 36 Myslíme objektově v jazyku Java 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ší. Tyto metodiky na sebe postupně navazovaly. Každá z nich těžila ze zkušeností získaných při aplikaci předchozí metodiky a stavěla na nich. První revolucí bylo zavedení vyšších programovacích jazyků, které programátory osvobodily od zapisování programů v podobě, která přesně odpovídala použitým instrukcím použitého počítače, a zavedly vyjadřování, které bylo daleko bližší zvyklostem lidí. Zavedení vyšších programovacích jazyků umožnilo tvorbu složitějších programů. Vyvíjené programy byly zanedlouho tak složité, že se v nich programátoři přestali vyznávat. Modulární programování ukazovalo, že rychlost vývoje i kvalitu výsledného programu zvýšíme, když vhodně rozdělíme velký projekt do sady menších, rozumně samostatných modulů. Produktivita programátorské práce se zvýšila, ale záhy se začalo ukazovat, že programátoři mají problémy nejenom s rozchozením obřích programů, ale i jednotlivých modulů. Strukturované programování se proto 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. Jeho hlasatelé předváděli, že opuštěním nejrůznějších fint, kterými se programátoři snažili o optimalizaci kódu, a maximálním zpřehledněním vytvářeného programu dosáhneme nejenom vyšší produktivity, ale v mnoha případech i vyšší efektivity výsledného programu. Se stále rostoucí složitostí vyvíjených programů se začalo ukazovat, že 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.

37 Kapitola 1: Seznamujeme se s nástroji 37 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. Objektově orientované programování (v dalším textu budu využívat zkratku OOP) se proto 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. 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. Chceme-li však jeho výhod plně využít, nesmíme zapomínat na nic z toho, s čím přišly předchozí metodiky. 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í (říkáme, že si navzájem posílají zprávy). Touto 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í 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 (tj. vzájemné posílání zpráv). Čím bude tento model věrnější, tím budou naše programy přesnějším modelem skutečností a tím i použitelnější, ale také spolehlivější a snáze udržovatelné. 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 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

38 38 Myslíme objektově v jazyku Java 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í. 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 postupujeme, 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. Mohli bychom říci, že platformou těchto programů je právě onen interpret. Vytvoříte-li pro nový počítač interpret, můžete na něj vzápětí přenést i všechny vytvořené programy. Kdykoliv tyto programy po systému něco chtějí, požádají o to svoji platformu (interpret) a ta jim příslušné služby zprostředkuje. Takovým programům pak může být jedno, na jakém procesoru a pod jakým operačním systémem běží, protože se beztak baví pouze se svojí platformou. 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. Při implementaci programu pro více platforem bývá pracnost přizpůsobení programu jednotlivým platformám srovnatelná s pracností vývoje jeho první verze.

39 Kapitola 1: Seznamujeme se s nástroji 39 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ý program je potom interpretován speciálním interpretem označovaným často jako virtuální stroj 1. 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ý virtuální stroj. Ten pak vytváří vyšší, mnohem univerzálnější platformu. Je-li tento virtuální stroj dostatečně chytrý (a to jsou v současné době prakticky všechny), dokáže odhalit často se opakující části kódu a někam stranou je přeložit, aby je nemusel pořád kolem dokola interpretovat. Ty nejchytřejší virtuální stroje dokonce sledují, co program dělá, a zjistí-li, že je to výhodné, přeloží rychle část programu znovu tak, aby využila některých právě platících speciálních podmínek, a mohla běžet ještě rychleji. Na těchto strojích pak může běžet hybridní program skoro stejně rychle jako překládaný a v některých speciálních případech dokonce i rychleji. Přitom si stále udržuje svoji nezávislost na hardwarové platformě a použitém operačním systému. 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 Hned po svém vzniku zaznamenal velký 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 a tuto pozici si od té doby stále udržuje. Na převážné většině univerzit se Java používá jako vstupní jazyk pro výuku programování. 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.

40 40 Myslíme objektově v jazyku Java Klíčové vlastnosti Javy 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) nedovoluje 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ů pro čipové karty, přes programy pro mobilní telefony a nejrůznější zabudovaná zařízení, až po obří projekty rozprostřené na řadě vzájemně komunikujících počítačů. Multiplatformní Java se řadí mezi hybridní jazyky. To znamená, že je současně překládaná i interpretovaná. 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 VM). 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ědí, 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 jazyk i platforma Jedním z klíčových záměrů autorů Javy bylo vytvořit nejenom jazyk, ale celou platformu. Tuto platformu realizuje výše zmíněný virtuální stroj spolu se základní knihovnou nejpoužívanějších funkcí.

41 Kapitola 1: Seznamujeme se s nástroji 41 Asi bych se zde měl zmínit o tom, že Java není jediná platforma, ale jsou to hned čtyři platformy: J2SE (Java 2 Standard Edition) označuje základní platformu určenou pro vývoj desktopových aplikací a jednodušších verzí serverových aplikací. Tuto edici budeme používat i my. J2EE (Java 2 Enterprise Edition) označuje nadstavbu nad J2SE obsahující další knihovny specializované pro tvorbu rozsáhlých distribuovaných aplikací. J2ME (Java 2 Micro Edition) označuje zjednodušenou verzi určenou pro vývoj aplikací pro malá zařízení, jejichž typickými představiteli jsou mobilní telefony. Java Card je ještě osekanější verze používaná při vývoji aplikací určených pro čipové karty. Tato platforma bývá někdy zařazována pod J2ME. Vývojářská sada Jako vývojáři musíte rozlišovat dvě verze programových balíků, které můžeme stáhnout: Jednodušší JRE (Java Runtime Environment běhové prostředí Javy) poskytuje vše potřebné pro běh programů. Komplexnější JDK (Java Development Kit sada pro vývoj v Javě) označovaná někdy také SDK (Software Development Kit sada pro vývoj softwaru) je vlastně sada 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é JDK (připomínám, že se musí jednat o verzi 5.0 či vyšší). Uživatelům, kteří pak budou spouštět vaše programy, stačí JRE. V dalším textu budu předpokládat, že máte JDK 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 vyvinuto 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 zahrnují 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 schopno vytvořit na základě grafického návrhu kostru programu

42 42 Myslíme objektově v jazyku Java 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í. K používání tohoto prostředí ve vstupních kurzech programování se veřejně hlásí zhruba tisícovka univerzit a školicích středisek po celém světě. Jak se můžete přesvědčit na stránkách jeho výhodné vlastnosti přivedly řadu programá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čí v nouzi se 64 MB RAM, zatímco požadavky běžných profesionálních vývojových prostředí jsou mnohonásobně větší) a originální, jinde nenabízené možnosti interaktivního vývoje. V dalším textu budu předpokládat, že máte toto prostředí nainstalováno spolu s rozšířením, o němž jsem se zmiňoval v pasáži Potřebné vybavení na straně 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 BB 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 složce Projekty si pak zřiďte pro každý projekt novou složku, ve které budou umístěny všechny soubory, které k němu budou patřit. Jakmile složku pro své projekty zřídíte, můžete do ní hned stáhnout projekty k této učebnici, zmiňované v pasáži Potřebné vybavení na straně Program si můžete stáhnout na stránkách

43 Kapitola 1: Seznamujeme se s nástroji 43 Windows a substituované disky V operačním systému Windows můžete používat 26 logických disků pro každé písmeno abecedy jeden. Většina uživatelů však používá pouze zlomek tohoto počtu. Disky A: a B: bývaly donedávna vyhrazeny pro mechaniky pružných disků, na disku C: má většina uživatelů operační systém. Pak na počítači nejdete ještě pár dalších jednotek vyhrazených pro další oddíly velkého disku, pro CD-ROM a případně ještě nějaké síťové disky či zařízení, která se vůči počítači tváří jako další disk (např. paměť Flash-RAM) a tím výčet končí. Průměrný uživatel tak má většinu písmen abecedy nevyužitých. Operační systém umožňuje použít tyto názvy pro tzv. substituované disky, což jsou složky, které se rozhodnete vydávat za logický disk. Protože o této možnosti většina uživatelů neví a přitom je to funkce velice užitečná, ukážu vám, jak ji můžete využít. Substituované disky se definují pomocí příkazu SUBST název_disku substituovaná_složka Nejjednodušší způsob, jak definovat ve Windows např. substituovaný disk J:, je vložit do složky, kterou budete chtít substituovat jako disk J:, dávkový soubor s příkazem k substituci. (Písmeno J se pro Javu hodí nejlépe, ale můžete si vybrat jakékoliv jiné.) Pokud jste ještě nepracovali s dávkovými soubory, tak vězte, že to jsou obyčejné textové soubory, do nichž zapisujete příkazy pro operační systém. Jejich název může být libovolný, ale musí mít příponu bat (zkratka ze slova batch dávka). V dávkovém souboru budou následujícím příkazy (na velikosti písmen nezáleží): SUBST J: /d SUBST J:. První příkaz má za úkol zrušit případnou doposud nastavenou substituci disku J: (není-li v daném okamžiku označený disk substituován, systém vypíše chybovou zprávu, ale jinak se nic nestane), druhý příkaz pak substituuje aktuální složku jako disk J:. Soubor umístíte do složky, z níž budete chtít udělat substituovaný disk. Kdykoliv pak tento dávkový soubor spustíte, dávka substituuje složku, v níž je umístěna, jako příslušný disk. Dávka se přitom spouští obdobně jako aplikace např. poklepáním na ikonu jejího souboru v Průzkumníku. Budete-li chtít mít danou substituci nastavenu trvale, můžete umístit zástupce dávkového souboru do startovací nabídky do složky Start Programy Po spuštění a systém spustí příslušnou dávku po každém restartu počítače. Po spuštění příslušného dávkového souboru (spouští se poklepáním jako jakýkoliv jiný program nebo skript) se rozšíří používané disky o právě substituovaný disk v našem případě o disk J:. Kdykoliv od této chvíle budete pracovat s diskem J:, budete ve skutečnosti pracovat s obsahem substituované složky. A naopak: cokoliv uděláte s obsahem substituované složky, uděláte zároveň s obsahem disku J:. Abyste mohli složku substituovat jako nějaký disk, nesmí váš operační systém používat disk označený tímto písmenem pro nějaké hardwarové zařízení (např. pevný disk, CD-ROM, Flash-disk apod.). Písmeno může být použito nejvýše pro jiný substituovaný disk, protože tuto substituci můžete před nastavením nové substituce zrušit (pro tento případ je v dávkovém souboru první příkaz). Substituované složky umožňují sjednotit prostředí několika počítačů. Tuto knihu např. připravuji na několika počítačích, přičemž každý z nich má jinak uspořádané složky (vadí mi to, ale nemohu s tím nic dělat). V každém z nich jsou ale definovány následující substituované disky:

44 44 Myslíme objektově v jazyku Java J: pro složku s vývojovými nástroji Javy, S: pro složku, ve které je text knihy, V: pro složku, ve které jsou programy pro knihu. Po této úpravě mi již nutnost přecházení mezi různými počítači nevadí, protože vím, že na každém z nich najdu potřebné nástroje a dokumentaci na discích J:, S: a V:. Používáte-li operační systém Windows, můžete urychlit budoucí vyhledání složky s projekty právě tím, že pro ni zřídíte zvláštní substituovaný disk. Kdykoliv se pak obrátíte na příslušný disk, obrátíte se ve skutečnosti k příslušné složce. Pomocí substituce si tak můžete zkrátit cestu k často používaným složkám. Vyhledání a otevření projektu V následujícím textu budeme pracovat s projektem 01_Tvary, který je určen pro první seznámení s prostředím BlueJ, třídami a objekty a s nímž budeme pracovat celou příští kapitolu. Předpokládám, že máte instalováno vše, o čem jsem se zmiňoval v úvodu v pasáži Potřebné vybavení na straně 27. Spusťte BlueJ, zadejte příkaz Projekt Otevřít. Po zadání příkazu se otevře dialogové okno Otevřít projekt (viz obr. 1.1), v němž vyhledáte a označíte složku s projektem 01_Tvary a stisknete tlačítko Otevřít. Po otevření projektu by okno BlueJ mělo vypadat obdobně jako na obrázku 1.2. Obrázek 1.1 Otevření existujícího projektu Na obrázku 1.1 si všimněte, že ikony projektů (přesněji ikony složek, v nichž je uložen projekt) vypadají jinak než ikony obyčejných složek. BlueJ totiž do složky, ve které budou soubory jeho projektu, přidá svůj vlastní soubor bluej.pkg, do nějž si ukládá informace o grafickém uspořádání objek-

45 Kapitola 1: Seznamujeme se s nástroji 45 tů v zobrazovaném diagramu. Podle přítomnosti tohoto souboru pak pozná, zda se jedná o složku s jeho projektem nebo o nějakou obyčejnou složku. Obrázek 1.2 Okno BlueJ po otevření projektu 01_Tvary 1.7 Diagram tříd Velký obdélník zabírající většinu okna projektu obsahuje tzv. diagram tříd našeho projektu. Diagram tříd popisuje strukturu našeho programu a vzájemné vazby mezi jeho částmi. Malé obdélníky v diagramu tříd představují části programu, které nazýváme třídy (za chvíli si o nich budeme povídat podrobněji). Jsou znázorněny podle konvencí grafického jazyka UML 1 (vybarvení obdélníků do konvence nepatří, ale zvyšuje přehlednost a názornost diagramu). Čárkované šipky prozrazují, kdo koho používá např. šipky vedoucí od tříd Obdélník, Trojúhelník a Elipsa ke třídě Plátno naznačují, že tyto třídy třídu Plátno používají (jak se vzápětí dozvíte, tyto obrazce se na plátno kreslí). 1 UML je zkratkou z anglického Unified Modeling Language sjednocený modelovací jazyk. Je to grafický jazyk, ve kterém programátoři navrhují své aplikace před tím, než začnou psát program. Více se o tomto jazyku můžete dozvědět např. v knize Schmuller Joseph: Myslíme v jazyku UML, Grada, 2001 (ISBN ).

46 46 Myslíme objektově v jazyku Java Bílý obrázek listu papíru v levém horním rohu diagramu představuje textový soubor se základním popisem celého projektu. Když na něj poklepete, otevře se okno editoru, v němž si budete moci tyto informace přečíst a v případě potřeby je i upravit či doplnit. Šrafování spodní části obdélníků symbolizuje to, že třídy ještě nejsou přeloženy do bajtkódu. To lze snadno napravit: stiskněte tlačítko Přeložit v levé části aplikačního okna. Uvidíte, jak jedna třída za druhou ztmavne (tím prostředí naznačuje, že se překládá), aby pak opět zesvětlela a její šrafování zmizelo (již je přeložena). Od této chvíle můžete třídu používat. Manipulace s třídami v diagramu Polohu jednotlivých tříd v diagramu můžete měnit. Najedete-li ukazatelem myši na obdélník představující danou třídu, změní se podoba kurzoru ze šipky na ukazující ruku. V tomto okamžiku můžete obdélník uchopit (tj. stisknout a podržet primární [většinou levé] tlačítko myši) a přesunout jej do požadované pozice, kde jej upustíte (pustíte tlačítko myši). Po stisku tlačítka myši rám obdélníku ztuční. V průběhu přesunu se s ukazatelem myši bude přesouvat průsvitná kopie příslušného objektu, takže budete průběžně znát původní i nově nastavovanou pozici obdélníku (viz obrázek 1.3). Obrázek 1.3 Posunutí ikony třídy v diagramu

47 Kapitola 1: Seznamujeme se s nástroji 47 Jsou-li zástupci tříd navzájem spojeni šipkami, bude BlueJ vaše přesuny sledovat a po umístění obrázku třídy do nové pozice šipky vždy příslušně překreslí. Můžete si tak diagram upravit do podoby, v níž vám bude připadat nejpřehlednější a nejnázornější. Obdélníky zastupující třídy můžete nejenom přesouvat, ale můžete měnit i jejich rozměr. Všimněte si, že poté, co na obdélník klepnete, objeví se u pravého dolního rohu ztučnělého rámu dvojité přeškrtnutí. Najedete-li ukazatelem myši do oblasti označené tímto přeškrtnutím, změní se jeho podoba na dvojitou šikmou šipku. Nyní můžete uchopit roh obdélníku, přesunout jej do nové pozice a upravit tak velikost obdélníku (viz obrázek 1.4). Obrázek 1.4 Změna velikosti ikony třídy v diagramu Někdy se stane, že se nám projekt rozrůstá a rozrůstá a najednou bychom potřebovali posunout více tříd najednou, abychom udělali místo pro třídy, které se chystáme do projektu přidat. Postup je jednoduchý, ale nejprve se musíme naučit vybírat skupiny tříd. Třídy jde zařazovat a vyřazovat ze skupiny vybraných tříd několika způsoby, které můžete kombinovat: Stisknete přeřaďovač CTRL nebo SHIFT (je to jedno) a klepete postupně na obdélníky, které chcete zahrnout od výběru. Najedete ukazatelem myši do volného prostoru a stisknete tlačítko myši. Při stisknutém tlačítku pak popojedete ukazatelem a za ním se roztáhne výběrový podšeděný obdélník. Která třída do něj padne alespoň svojí částí, ta se zařadí mezi vybrané a její okraj se zvýrazní (viz obr. 1.5).

48 48 Myslíme objektově v jazyku Java Obrázek 1.5 Výběr skupiny tříd pomocí výběrového obdélníku Stisknete-li před předchozí operací přeřaďovač CTRL nebo SHIFT, budou se třídy zasažené výběrovým obdélníkem přidávat ke třídám dříve vybraným. Někdy toho vyberete víc než potřebujete, a budete chtít některé třídy z výběru vyjmout. Pak máte dvě možnosti: Klepnutím myší do volného prostoru zrušíte výběr všech tříd. Klepnutím na třídu při stisknutém přeřaďovači CTRL nebo SHIFT změníte výběr dané třídy vybranou odvyberete a nevybranou vyberete. Celou operaci přesunu skupiny tříd si můžeme vyzkoušet: 1. Roztáhněte trochu okno projektu, aby bylo kam třídy přesunout. 2. Vyberte třídy tak, jak je naznačeno na obr Najeďte na některou z vybraných tříd tak, aby se ukazatel myši změnil na ukazující ruku (předpokládám standardní nastavení podoby ukazatelů). 4. Uchopte myší tuto třídy (a s ní i ostatní vybrané) a přesuňte je do požadované cílové pozice viz obr Uchopte znovu některou z vybraných tříd a pokuste se ji přesunout někam jinam (nejlépe do původní pozice). Ověřte si, že dokud výběr nezrušíte, jsou všechny třídy vybrány a přesouvají se jako celek.

49 Kapitola 1: Seznamujeme se s nástroji 49 Obrázek 1.6 Přesun bloku tříd 1.8 Shrnutí co jsme se naučili Program je předpis zapsaný v nějakém programovacím jazyce a definující, jak má procesor, pro nějž je určen, splnit zadanou úlohu. U programů je nejdůležitější jejich spolehlivost a snadná udržovatelnost. Každý program je jakousi simulací reálného nebo virtuálního světa. Efektivita programování a robustnost vyvinutých programů je silně ovlivněna mírou abstrakce použité při jejich tvorbě. Čím může být naše vyjadřování blíže modelované skutečnosti, tím lépe se nám podaří napsat správný, spolehlivý a robustní program. Programy dělíme na překládané, interpretované a hybridní. Někdy se obdobné dělení používá i pro programovací jazyky. Překládané programy bývají rychlejší, interpretované zase bývají méně závislé na použité platformě. Platformou se nazývá kombinace procesor-operační systém. U interpretovaných jazyků však tuto platformu nahrazuje interpret, prostřednictvím nějž program komunikuje se systémem.

50 50 Myslíme objektově v jazyku Java Hybridní programy spojují výhody obou. Překládají se do mezijazyka optimalizovaného pro rychlou interpretaci. Ten je pak interpretován programem označovaným jako virtuální stroj. Moderní, objektově orientované jazyky se snaží zohlednit skutečnost, že jsou modelem světa tvořeného vzájemně interagujícími objekty. Java je moderní programovací jazyk, který je jednoduchý, objektově orientovaný a jeho programy jsou přenositelné mezi platformami. Javu zařazujeme mezi hybridní jazyky. Programy napsané v Javě se překládají do bajtkódu, který je pak interpretován virtuálním strojem. Java je nejenom jazyk, ale také platforma, přesněji čtyři platformy: J2SE, J2EE, J2ME a Java Card. Pro výuku se používá J2SE. Pro vývoj programů v Javě potřebujeme instalovat programovou sadu nazývanou SDK nebo JDK. Pro úspěšné spuštění programů v této učebnici potřebujete verzi 5.0 nebo vyšší (mladší). Při vývoji programů se většinou používají speciální vývojová prostředí označovaná zkratkou IDE. V této učebnici budeme používat vývojové prostředí BlueJ. Současná vývojová prostředí organizují vyvíjené programy do tzv. projektů. Při umísťování projektů na disku můžeme pod operačním systémem Windows s výhodou použít substituce. Strukturu programu můžeme znázornit v diagramu tříd. Při znázorňování struktury programu používáme grafický jazyk UML. Třídy jsou v diagramu tříd znázorněny rozdělenými obdélníky, v jejichž horní části je název třídy. Spodní část je v BlueJ prázdná. Prostředí BlueJ nám umožňuje měnit v diagramu tříd umístění i velikost obdélníků představujících jednotlivé třídy. Jsou-li mezi třídami natažené šipky, BlueJ je po změně umístění či velikosti obdélníků natáhne znovu, aby odpovídaly jejich novým pozicím a rozměrům.

51 2. Třídy a objekty v interaktivním režimu Kapitola 2: Třídy a objekty v interaktivním režimu 51 Kapitola 2 Třídy a objekty v interaktivním režimu Co se v kapitole naučíme Tato kapitola předpokládá, že již máte otevřen projekt 01_Tvary, o kterém jsme se bavili v minulé kapitole. Nejprve si povíme, co to vlastně ty třídy a objekty jsou, a seznámíme se s novým termínem instance. Pak se naučíme pracovat s třídami a objekty v prostředí BlueJ. Vysvětlíme si, jak se objekty vytvářejí, jak reagují na zprávy, co to jsou jejich atributy a že vedle zpráv posílaných instancím existují i zprávy posílané celé třídě. Naučíte se vytvářet instance tříd, posílat jim zprávy a prohlížet si hodnoty jejich atributů. 2.1 Nejprve trocha teorie Než se vrhneme na vlastní programování, povíme si nejprve trochu o nejdůležitějších termínech, s nimiž se budeme v dalším výkladu setkávat. Abych vás tou teorií příliš neunavoval, tak tyto termíny opravdu jen zavedu a nebudu je nijak rozpitvávat povím vám pouze to, co budete potřebovat vědět pro porozumění textu této a následující kapitoly. K řadě z nich se pak ještě vrátíme a vysvětlíme si je podrobněji i s ukázkami na příkladech. Třídy a jejich instance Jak jsem již naznačil, výchozím bodem celého objektově orientovaného programování je tvrzení, že svět je světem objektů, které si navzájem posílají zprávy. Objekty, s nimiž se ve svém okolí setkáváme, můžeme rozdělit do skupin, které mají nějaké společné vlastnosti a které v programování označujeme jako třídy. Vlastní objekty pak označujeme jako instance příslušné třídy např. židle, na které sedíte, je instancí třídy židlí. Mohli bychom tedy říci, že instance (objekt) je nějakou konkrétní realizací obecného vzoru definovaného v příslušné třídě (židle, na které sedím, je konkrétní realizací obecné židle).

52 52 Myslíme objektově v jazyku Java Pojem objekt a instance jsou ve skutečnosti synonyma, která můžete s klidným svědomím zaměnit. Termínu objekt se dává většinou přednost tehdy, hovoříme-li o obecných objektech, kdežto termínu instance dáváme přednost v situacích, kdy chceme zdůraznit, do jaké třídy objekty, o nichž hovoříme, patří. Třídy popisují společné vlastnosti svých instancí a definují také nástroje pro jejich vytváření. Přirovnáme-li programování k hraní si na pískovišti, pak třída je něco jako formička a její instance jsou bábovičky, které za pomoci této formičky vytváříme. Při jiném přirovnání bychom mohli prohlásit, že třída je vlastně továrna na objekty své instance. Třída může mít obecně libovolný počet instancí. Existují však i třídy, které dovolí vytvoření pouze omezeného počtu instancí, někdy dokonce povolí jen jedinou instanci jedináčka. Nevyskytují se příliš často, ale na druhou stranou nejsou žádnou exotickou výjimkou (s jednou se potkáme hned v prvním projektu). Zprávy Objekty si navzájem posílají zprávy, ve kterých se žádají o různé služby, přičemž onou službou může být často jen informace. Můžeme se např. židle zeptat, je-li čalouněná. V praxi bychom to realizovali nejspíše tak, že bychom k ní poslali upřený pohled, v programu k ní vyšleme zprávu. V minulé kapitole jsme si řekli, že program je předpis popisující, jak splnit zadanou úlohu, a zapsaný v nějakém programovacím jazyce (dokud není zapsaný v programovacím jazyce, není to program, ale algoritmus). Tato definice je možná přesná, nicméně je tak obecná, že je pro naše účely prakticky nepoužitelná. Definujme si proto, že objektově orientovaný program je v nějakém programovacím jazyce zapsaný popis použitých tříd, objektů a zpráv, které si tyto objekty posílají, doplněný u složitějších programů ještě o popis umístění programů na jednotlivých počítačích a jejich svěření do správy příslušných služebních programů (např. operačních systémů či aplikačních serverů). Budete-li slyšet programátory velkých aplikací hovořit o deploymentu, tak vězte, že hovoří o výše zmíněném rozmísťovacím aspektu svých programů. Předchozí definici jsem uváděl proto, aby si ti, kteří mají nějaké zkušenosti s klasickým programováním, uvědomili, že u objektově orientovaného programování vstupují do trochu jiného programátorského vesmíru, než ve kterém se pohybují ti, kteří programují klasicky. Do vesmíru, v němž sice budou nadále používat mnohé z toho, co používá klasické, neobjektové programování, ale v němž se základní úvahy o koncepci a konstrukci programu ubírají naprosto jinými cestami, než na které byli doposud zvyklí. Metody Zde se objevuje drobný terminologický guláš. Java převzala terminologii jazyka C++ a nehovoří o posílání zpráv, s nímž přišli zakladatelé objektově orientovaného programování, ale o volání metod, které je bližší programátorům pracujícím v klasických jazycích. Pokud jste již někdy programovali, tak pro ty z vás, kteří programovali v Baltíkovi, budou metody něco podobného jako Baltíkovi pomocníci, ti, kteří programovali v jiných jazycích, je mohou považovat ze ekvivalenty procedur a funkcí.

53 Kapitola 2: Třídy a objekty v interaktivním režimu 53 Metoda je část programu, kterou instance spustí v reakci na obdržení zprávy. Každá zpráva má v programu přiřazenu svoji vlastní metodu. Programátor v metodě definuje, jak bude objekt na příslušnou zprávu reagovat. Svým způsobem je jedno, jestli řeknete, že instanci pošlete zprávu nebo že zavoláte její metodu. Termín zpráva budu proto používat spíš v souvislosti s popisem chování programu (tj. prakticky celou tuto kapitolu), termínu metoda pak budu dávat přednost ve chvíli, kdy budu hovořit o konkrétní části programu realizující odpověď na zaslání příslušné zprávy. Jak jsem ale řekl, oba termíny jsou si ekvivalentní. 2.2 Analogie V dopisech čtenářů a v rozhovorech na různých internetových konferencích jsem se setkal se dvěma reakcemi čtenářů minulého vydání. První prohlašovali, že jim uváděné analogie výrazně pomohly pochopit vysvětlovaný problém, druzí naopak tvrdili, že jim tyto analogie pouze odváděly pozornost. Nepatříte-li k těm, kteří mají rádi teoretické koncepty ilustrované analogiemi z reálnějšího světa a domníváte-li se naopak, že by taková analogie vše jen zatemnila, klidně tuto podkapitolu přeskočte a následující analogické poznámky ignorujte. Prozatím jsme se o třídách, objektech, zprávách a atributech bavili jako o něčem abstraktním, co se sice projevuje způsobem, který dokážeme vnímat, ale ne vždy jej dokážeme také pochopit. Zkusím vám proto vše připodobnit k něčemu hmatatelnému třeba tato představa některým z vás pomůže při chápání některých konstrukcí, které budeme ve zbytku knihy vytvářet. Představte si svůj projekt jako město robotů. Každá třída v něm vystupuje jako továrna vyrábějící roboty. Jejími instancemi jsou vozidla vybavená robotími osádkami takovou robotí pracovní četou. Jedna továrna může vyrábět třeba vozidla s četou hasičů, druhá vozidla s četou opravářů, třetí vozidla s četou malířů. Každá továrna vyrábí všechna vozidla stejná s naprosto stejnými osádkami. Každý člen osádky vozidla je specializovaný na jedinou funkci, kterou je reakce na konkrétní zprávu a představuje tak ekvivalent metody. Vozidlo představující instanci je vybaveno radiostanicí, takže může z okolního světa přijímat zprávy. Když přijme zprávu, která vyžaduje splnění některého z úkolů, pro které bylo postaveno, pověří příslušného specializovaného robota (metodu), aby úkol splnil. Robot může při plnění úkolu posílat zprávy libovolné osádce (včetně té svojí), a požádat ji, aby vykonala nějakou akci potřebnou pro splnění úkolu. 2.3 Třídy a jejich instance Vytváříme svou první instanci V jazyku Java vytváříme instance tříd zasláním dvojice zpráv: 1. Nejprve pošleme virtuálnímu stroji zprávu sestavenou z klíčového slova new, za nímž uvedeme název třídy, jejíž instanci vytváříme. Zprávou new jej žádáme o vytvoření nové instance, které

54 54 Myslíme objektově v jazyku Java spočívá především ve vyhrazení (alokaci) paměti pro vytvářený objekt. Název třídy následující za klíčovým slovem new pak předává informaci o tom, kolik místa bude třeba v paměti vyhradit. 2. Pouhé vyhrazení paměti k vytvoření instance nestačí. To je pouze nutnou podmínkou k tomu, aby bylo možno vytvářený objekt připravit inicializovat. Po uvedeném vyhrazení paměti proto musí vždy následovat zaslání speciální (bezejmenné) zprávy žádající inicializaci připraveného objektu, která spočívá v uložení potřebných počátečních hodnot a spuštění potřebných podpůrných akcí. Reakci na tuto zprávu, tj. inicializaci vyhrazené paměti má na starosti speciální metoda označovaná jako konstruktor. Konstruktor obdrží od virtuálního stroje odkaz na právě alokovanou paměť a zařídí vše potřebné, aby vznikla plnohodnotná instance jeho třídy. Svoji činnost ukončí tím, že volajícímu programu vrátí odkaz (ten, který před chvílí obdržel od virtuálního stroje), prostřednictvím nějž se bude zbytek programu na nově vytvořenou instanci obracet. Protože činnost konstruktoru je pro vytvoření instance klíčová, nebudu se bránit obratu konstruktor vytvoří instanci. Berte to tak, že alokovaná paměť je pouze surovinou, z níž tvůrce konstruktor teprve vytvoří výsledné umělecké dílo objekt. Je to obdobné jako když hrnčíř vytvoří z dodané hlíny džbánek nebo když kovář udělá z dodaného železa pluh. Program v Javě nikdy nepracuje s instancí přímo, ale vždy pouze prostřednictvím odkazu na ni. Použijeme-li naši analogii, pak bychom mohli říci, že nikdy nebudete mít v držení celou pracovní četu (= instanci), protože byste ji ani neunesli. Budete mít vždy pouze její telefonní číslo (= odkaz), na které jí můžete zavolat, kdykoliv od ní budete něco potřebovat (budete jí chtít poslat zprávu). Podrobnosti o tom, proč tomu tak je, se dozvíte v podkapitole Instance versus odkaz na straně 61. Volání konstruktoru naznačujeme dvojicí závorek uvedených za názvem třídy následujícím za operátorem new. Protože každá instance musí být inicializovaná, musí být součástí každého vytváření nové instance i volání konstruktoru. Máme-li na inicializaci instance nějaké zvláštní požadavky, uvádíme je v těchto závorkách. Vyzkoušíme si vše v praxi. Budeme pokračovat v práci na projektu 01_Tvary, který jsme v minulé kapitole otevřeli. V tomto projektu je šest tříd: Plátno Instance třídy Plátno představuje kreslící plátno, na kterém se budou zobrazovat námi vytvořené tvary. Tato instance je jedináček, tj. je jedinou instancí své třídy, která pak začala používat antikoncepci, takže už nikdy žádnou jinou instanci mít nebude. Obdélník, Trojúhelník a Elipsa Jejich instance představují objekty, které lze na plátno nakreslit a z nichž můžeme sestavovat složitější tvary. Barva Tato třída má právě sedmnáct předem vytvořených instancí představujících osm základních barev (černou, modrou, červenou, fialovou, zelenou, azurovou, žlutou a bílou) a devět dalších doplňujících barev (krémovou, šedou, ocelovou, růžovou, hnědou, khaki, cihlovou a stříbrnou). Tyto barvy se používají pro vybarvení plátna a zobrazovaných tvarů. Pokud vám nabídka barev nevyhovuje, můžete vytvořit další a používat pak ty. Každá třída má definovanou svoji oblíbenou (implicitní) barvu. Časem si ukážeme, jak barvu instance ovlivnit. Směr8 Instance třídy Směr8 představují čtyři hlavní a čtyři vedlejší světové strany, tj. východ, severovýchod, sever, severozápad, západ, jihozápad, jih a jihovýchod. Pomocí těchto instancí je možno definovat směr, do kterého bude vytvářený trojúhelník natočen. Nezadáme-li směr

55 Kapitola 2: Třídy a objekty v interaktivním režimu 55 natočení, vytvoří se rovnoramenný trojúhelník s vrcholem otočeným na sever. Na rozdíl od barvy již žádný další směr vytvořit nemůžete. Vyjmenované třídy jsou v diagramu tříd zobrazeny jako vodorovně rozdělené obdélníky, v jejichž horní části je zapsán název třídy. Jazyk UML, od jehož pravidel se způsob kreslení tříd v BlueJ odvozuje, sice definuje i obsah spodní části, ale autoři prostředí BlueJ vás nechtěli hned zpočátku zahrnovat záplavou informací a v zájmu maximální přehlednosti diagramu tříd ponechali spodní část obdélníku prázdnou. Šťouralové se asi hned zeptají, proč třída Směr8 vypadá jinak než ostatní třídy. Prozatím jim prozradím, že je to proto, že definuje konečný počet předem známých instancí, k nimž už nemůžete žádnou přidat. Jinak je to stejná třída jako ostatní. Podrobněji si o tomto druhu tříd povíme v kapitole Výčtové typy na straně 237. Zkuste nyní vytvořit např. instanci obdélníku. Klepněte v diagramu tříd pravým tlačítkem myši na obdélník představující třídu Obdélník. Rozbalí se místní nabídka, v jejíž horní části je seznam příkazů začínajících klíčovým slovem new, které slouží k vytvoření a inicializaci nových instancí. Klepněte na ten z příkazů pro vytvoření nové instance, který má za sebou prázdné závorky, takže inicializuje čerstvě vytvořenou instanci prostřednictvím konstruktoru, který neočekává žádné speciální požadavky a který proto označujeme jako implicitní (viz obr. 2.1). Obrázek 2.1 Vytvoření instance třídy Obdélník

56 56 Myslíme objektově v jazyku Java BlueJ otevře dialogové okno (viz obr. 2.2), v němž vás seznámí se základními informacemi o vyvolávaném konstruktoru a jím inicializované instanci. Zároveň se vás zeptá, jak budete chtít pojmenovat odkaz na vytvořený objekt, přičemž vám nabídne jméno odvozené od jména třídy, jejíž instanci vytváříte. Obrázek 2.2 Dialogové okno po zavolání bezparametrického konstruktoru. Pravidla pro tvorbu identifikátorů v jazyce Java Jména odkazů, tříd a dalších pojmenovaných částí programu se označují termínem identifikátory, protože nám tyto části identifikují. Každý programovací jazyk definuje sadu pravidel, jimž musí jeho identifikátory vyhovovat. V jazyku Java musí identifikátory vyhovovat následujícím pravidlům: Smějí obsahovat pouze písmena, číslice a znaky _ (podtržítko) a $ (dolar). Za písmeno je přitom považován jakýkoliv znak, který sada UNICODE považuje za písmeno. Sem patří nejen písmena s diakritikou, ale také např. čínské či japonské znaky. Nesmějí začínat číslicí. Nesmějí být shodné s žádným klíčovým slovem 1, tj. s žádným ze slov: abstract assert boolean break byte case catch class const continue default do double else enum extends final finally float for goto char if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while Délka identifikátorů (počet jejich znaků) není v jazyku Java omezena to u řady jiných programovacích jazyků neplatí. 1 Klíčová slova jsou identifikátory, které mají v jazyku předem daný speciální význam a nesmějí se proto použít na nic jiného.

57 Kapitola 2: Třídy a objekty v interaktivním režimu 57 Java patří mezi jazyky, kterým záleží na tom, zda napíšete identifikátor velkými či malými písmeny. Identifikátory něco, Něco a NĚCO jsou proto chápány jako tři různé identifikátory. Jak jsem již řekl, podle definice jazyka patří mezi písmena všechny znaky včetně českých, ruských či japonských, nicméně některá vývojová prostředí se s neanglickými znaky příliš nekamarádí. Největší problémy dělají v názvech souborů. BlueJ jako výukové prostředí nemá s diakritikou problémy. Budete-li však chtít používat jiná prostředí, ověřte si proto tuto skutečnost před tím, než začnete identifikátory s diakritikou používat. Vytváříme svou první instanci pokračování Máme tedy otevřené dialogové okno z obr. 2.2 na straně 56. Protože nemáme žádný pádný důvod definovat nějaký zvláštní vlastní název, můžeme akceptovat název, který nám program nabídne, tj. název obdélník1. Po potvrzení jména odkazu vytvoří BlueJ instanci třídy Obdélník, odkaz na ni umístí do zásobníku odkazů, který se nachází pod diagramem tříd a pojmenuje jej zadaným názvem (viz obr. 2.3). Obrázek 2.3 Odkaz na první instanci v zásobníku odkazů

58 58 Myslíme objektově v jazyku Java Java sice délku identifikátorů nijak neomezuje, avšak prostor pro zobrazení jména odkazu v obdélníku představujícím v zásobníku odkazů odkaz na instanci je omezený. Při zadávání názvů ručně vytvářených instancí proto dávejte přednost kratším názvům (tak do 10 znaků), které se zobrazí celé. Položky v zásobníku odkazů jsou zobrazeny jako obdélníky se zaoblenými rohy obsahující dvouřádkový popisek: v prvním řádku je uvedeno jméno odkazu a v druhém řádku jméno třídy, na jejíž instanci daná položka odkazuje. Na počátku kapitoly jsme si řekli, že se při vytváření instance zavolá speciální metoda nazývaná konstruktor. Konstruktor instancí třídy Obdélník je naprogramován tak, že si zapamatuje pozici, rozměr a barvu vytvářeného obdélníku a zároveň zařídí, aby se na plátně zobrazil příslušný obrázek. Pokud ještě žádné plátno neexistuje, tak požádá třídu Plátno, aby je vytvořila, protože jinak by nebylo na co kreslit. Vedlejším efektem vytvoření první instance tedy je, že se otevře okno plátna, na kterém bude zobrazen náš obdélník (viz obr. 2.4). Obrázek 2.4 Okno plátna s nakresleným obdélníkem Pokud okno plátna nevidíte, bude asi schované pod nějakým jiným oknem dost možná právě pod oknem BlueJ. Zobrazíte je tak, že na panelu úloh klepnete na jeho tlačítko (naše plátno se chová jako samostatná aplikace, tak má na panelu úloh svoje tlačítko), nebo tak, že budete postupně minimalizovat či posouvat otevřená okna, až okno plátna najdete. Třída Plátno je zrovna třídou, která před vámi svůj konstruktor schovává, takže vám nedovolí vytvořit její instanci prostřednictvím operátoru new (Java neumožňuje vytvořit novou instanci a neříct, který konstruktor ji bude inicializovat). Třída totiž trvá na tom, aby její instance byla jedináček (chce, aby se všechny obrazce kreslili na stejné plátno). To ale naštěstí nevadí, protože se s ní třídy Obdélník, Elipsa a Trojúhelník (přesněji jejich konstruktory) dokáží dohodnout, aby vše fungovalo tak, jak to fungovat má. Zanedlouho si ukážeme náhradní způsob, jak v případě potřeby získat odkaz na instanci plátna.

59 Kapitola 2: Třídy a objekty v interaktivním režimu 59 Posíláme instanci zprávu Nyní zkusíme nově vytvořenému obdélníku poslat nějakou zprávu. Klepněte proto pravým tlačítkem myši na odkaz na náš nově vytvořený obdélník (tj. na zaoblený obdélník v zásobníku odkazů). Rozbalí se poměrně dlouhá místní nabídka, která má v největší, střední části černé položky zastupující zprávy (vysvětlení proč vypadají právě takto si necháme na později) a v dolní části červené položky zastupující příkazy pro vývojové prostředí. Najeďte myší do horní části a zadejte příkaz void posunvpravo() (viz obr. 2.5) a ejhle, obdélník se po plátně opravdu posune vpravo. Obrázek 2.5 Poslání zprávy odkazované instanci Pošlete instanci další zprávy. Prozatím se však omezte na zprávy void posunvpravo(), void posunvlevo(), void posunvzhůru(), void posundolů() a void smaž(). (O tom, proč tyto zprávy začínají právě slovem void, si povíme za chvíli.) Vytváříme další instance Říkali jsme si, že běžná třída může mít více instancí. Tak si to hned vyzkoušíme a vytvoříme další obdélník požádejte třídu Obdélník stejným způsobem o vytvoření další instance. Potvrďte opět

60 60 Myslíme objektově v jazyku Java nabízený název a zkontrolujte, že se v zásobníku odkazů objevil příslušný odkaz a že se v levém horním rohu plátna opravdu nakreslil druhý obdélník. Nyní si již můžete vybírat mezi dvěma adresáty svých zpráv. Z čí místní nabídky zadáte příkaz k poslání zprávy, té instanci se zpráva odešle a ta instance na ni zareaguje. Vytvořte instance dalších tříd. Pošlete jednotlivým instancím zprávy void posunvpravo(), void posunvlevo(), void posunvzhůru() a void posundolů() a ověřte, že na každou zprávu reaguje ten objekt, kterému jste ji poslali. Posunu obrazců se dosahuje obdobným způsobem, jakým byste postupovali vy, kdybyste je kreslili pastelkami na papír. Máte-li některý z obrazců posunout do nové pozice, musíte jej nejprve vygumovat ve staré pozici a pak nakreslit v pozici nové. Obrazec se ale maže vždy celý, takže budou-li se dva obrazce překrývat, odmaže se při mazání přesouvaného obrazce i část obrazce, se kterým se překrývá. Protože o sobě obrazce nevědí, nemohou tuto nepříjemnost samy napravit. Odmazanou část obrazce obnovíte tak, že obrazec, jehož část se odmazala, požádáte, aby se překreslil, tj. pošlete mu zprávu void nakresli(). Tuto nepříjemnou vlastnost odstraníme až v kapitole Rozhraní na straně 244, kdy se seznámíme s nástroji, s jejichž pomocí bude možné problém vyřešit. Když budete mít vytvořených instancí více, už se vám do oblasti vyhrazené pro zásobník instancí nevejdou. Zásobník se proto doplní o posuvník a další odkazy se začnou umísťovat do následující řady (viz obr. 2.6). Budete-li chtít vidět zásobník odkazů celý, můžete uchopit předěl mezi diagramem tříd a zásobníkem odkazů a změnit podíl plochy věnované diagramu tříd a zásobníku odkazů. Můžete samozřejmě změnit i velikost celého okna. Rušení instancí a správa paměti Pokud již nějaký odkaz v zásobníku odkazů nepotřebujete, můžete jej odstranit. K tomu je třeba zadat v jeho místní nabídce povel Odstranit (naleznete jej ve spodní části nabídky viz obr. 2.6). Po zadání povelu odkaz ze zásobníku zmizí. To však ještě neznamená, že byl objekt doopravdy zrušen. Jak jsem již řekl, v zásobníku nejsou skutečné objekty, ale pouze odkazy na ně. O tom, jestli a kdy má být příslušný objekt doopravdy zrušen, rozhoduje správce paměti, o kterém si povíme v následující podkapitole. Odstranění odkazu ze zásobníku odkazů nebude mít žádný vliv na podobu plátna. Obrazce na plátně nemůžeme s objekty ztotožnit, jsou totiž pouze výsledkem nějaké činnosti těchto objektů. Budete-li chtít objekt z plátna smazat, pošlete mu zprávu void smaž(). Tuto zprávu mu však musíte poslat před tím, než jej ze zásobníku odstraníte, protože pak již nebudete mít k dispozici odkaz, takže nebudete mít komu zprávu poslat.

61 Kapitola 2: Třídy a objekty v interaktivním režimu 61 Obrázek 2.6 Zrušení odkazu na objekt 2.4 Restartování virtuálního stroje Budete-li chtít smazat všechny odkazy ze zásobníku odkazů, dosáhnete toho nejjednodušeji restartováním celého virtuálního stroje. Restartování virtuálního stroje naštěstí neznamená restartování celého počítače (většinou ;-)). Je to poměrně jednoduchá operace. Stačí zadat klávesovou zkratku CTRL+SHIFT+R, nebo (pokud si ji např. nepamatujete) vyvolat místní nabídku Indikátoru činnosti (to je ta pruhovaná tyčka nad levým okrajem zásobníku odkazů) a v ní zadat příkaz Restartovat VM (viz obr. 2.7). 2.5 Instance versus odkaz Jak jsme si již řekli, v jazyku Java program nikdy neobdrží instanci, kterou vytvořil. Obdrží pouze odkaz na tuto instanci. Vlastní instance je zřízena někde ve zvláštní paměti, které se říká halda (anglicky heap). Ta je vyhrazena právě pro zřizování objektů a stará se o ni správce paměti, což je speciální součást virtuálního stroje, která má na starosti přidělování paměti nově vznikajícím objektům a rušení objektů, které již nikdo nepotřebuje, a zabíraly by proto v paměti zbytečně místo. Aby mohl tuto správu provádět dostatečně efektivně, nikoho k haldě nepustí, a program se proto musí k objektům na haldě obracet prostřednictvím příslušných odkazů.

62 62 Myslíme objektově v jazyku Java Obrázek 2.7 Restartování virtuálního stroje z místní nabídky Indikátoru činnosti Správce paměti je v anglických textech někdy označován jako garbage collector, což v překladu znamená sběrač odpadků, popelář či uklizeč. Programátoři si na něm totiž nejvíce cení, že po nich dokáže uklidit. Někteří autoři tento termín nepřekládají, jiní používají termín sběrač neplatných objektů. Jak jsem již ale řekl, správce paměti nemá na starosti pouze úklid paměti, ale také její přidělování, a proto dávám přednost termínu správce paměti. V klasických programovacích jazycích se o přidělování a uvolňování paměti staral většinou programátor 1. Ale právě správa paměti byla zdrojem velice záludných chyb. Proto moderní jazyky svěřují tuto činnost správci paměti, který svoji práci zastane v převážné většině případů mnohem lépe než člověk. Produktivita programátorské práce tímto řešením stoupla několikanásobně a výrazně se snížila chybovost programů. Jak jsem již řekl na počátku našich hrátek s geometrickými tvary, třída Plátno trvá na tom, že její instance bude jedináček. (Proto také nenabízí konstruktor, protože pak bychom si mohli vytvářet 1 Správce paměti není vynález tvůrců Javy. S prvním správcem paměti přišel programovací jazyk Lisp, který vznikl koncem padesátých let minulého století. Po nástupu Javy se ale správce paměti stal povinnou součástí všech nově zaváděných jazyků usilujících o široké přijetí.

63 Kapitola 2: Třídy a objekty v interaktivním režimu 63 a inicializovat její instance dle libosti.) Z toho tedy zákonitě vyplývá, že každé zaslání zprávy getinstance() vrátí odkaz na stejnou instanci (proč se zpráva jmenuje tak divně, vysvětlím za chvíli). Můžete si to hned vyzkoušet. Pošlete třídě Plátno znovu zprávu getinstance() a opět zadejte v dialogovém okně, že chcete získat odkaz. V zásobníku odkazů se tak objeví další odkaz, pro nějž nám BlueJ nabídne název plátno2. Máme tedy dva odkazy, o nichž tvrdíme, že odkazují na stejný objekt. Pojďme se o tom přesvědčit. Požádejte jeden odkaz, aby jím odkazovaná instance změnila svůj rozměr, a pak o totéž požádejte druhý odkaz (zadáte samozřejmě jiný rozměr). Obě dvě žádosti ovlivní velikost jednoho a téhož okna. Oba dva odkazy totiž ukazují na jednu a tu samou instanci. Nesměšujte nikdy instanci s odkazem na ni! Až budete s objekty pracovat ve svých programech, pamatujte, že budete mít vždy k dispozici pouze odkazy na objekty, s nimiž pracujete. Může se proto lehko stát, že si budete na několika místech pamatovat odkaz na stejný objekt, ale stejně dobře se může stát, že jediný dostupný odkaz na důležitý objekt omylem přemažete a objekt pak bude sice dál existovat (a třeba dělat nějakou neplechu), ale vy se k němu již nikdy nedostanete. Jak jsme si již říkali, v naší analogii bychom mohli odkaz chápat jako telefonní číslo na danou instanci. K vlastní instanci se nikdy nedostanete a přemažete-li či zahodíte toto telefonní číslo, ztratíte tak také jakoukoliv možnost instanci o něco požádat. V programu totiž neexistuje telefonní seznam nebo informační služba, které se můžete zeptat na číslo, jež jste zapomněli. A i kdyby existovala, stejně by vám hrozilo, že než byste se na číslo doptali, správce paměti by daný objekt již dávno jako nepotřebný smazal. Proto ji ani nemá smysl zřizovat. Jednodušší je odkazy na objekty nezapomínat. 2.6 Zprávy žádající o hodnotu Zprávy, které jsme doposud vytvořeným instancím posílali, požadovaly po instancích nějakou (viditelnou) akci. V programech však často nepotřebujeme, aby instance něco provedla, ale aby nám něco prozradila (většinou o sobě). Abychom mohli s touto informací pracovat, předáváme při poslání zprávy žádající informaci také požadavek, jakého typu má daná informace být (např. číslo, text, apod.). V místních nabídkách instancí a tříd začínají příkazy, jejichž zadáním vysíláme zprávy, názvem datového typu, který má mít vrácená informace. Příkazy vysílající zprávy, které po instanci žádnou informaci nepožadují a spokojí se s tím, že oslovená instance provede nějakou akci, začínají magickým slůvkem void (anglicky prázdno). Příkazy vysílající zprávy, které po instanci chtějí, aby nám vrátila nějakou informaci, začínají názvem typu, který bude mít vracená hodnota. Hodnota, kterou nám instance předá, bývá označována tzv. návratová hodnota. Někdy se používá také termín výstupní hodnota. Možná se někteří budou podivovat nad tím, proč říkáme, že nám instance vrací hodnotu, když jsme jí žádnou nepůjčili. Jak poznáte v příští kapitole, vrácení hodnoty má na starosti příkaz return (česky vrátit), který se tak jmenuje proto, že se má na starosti návrat z vyvolané části programu a s ním i případné předání požadované hodnoty.

64 64 Myslíme objektově v jazyku Java Datové typy Než se rozhovoříme o tom, jak pracovat se zprávami, které vracejí hodnoty, musíme si nejprve povědět něco o datových typech. Typ údaje popisuje, co je daný údaj zač. Svůj typ mají veškerá data, se kterými program pracuje. Java (a naprostá většina ostatních moderních jazyků) trvá na tom, aby byl u každého údaje předem znám jeho typ. Za to se nám odmění tím, že bude pracovat rychleji (nemusí v průběhu výpočtu bádat nad tím, co je které dato zač) a navíc odhalí řadu našich chyb již v zárodku. Java rozděluje datové typy na primitivní a objektové. Primitivní datové typy, mezi něž patří např. čísla, jsou zabudovány hluboko v jazyku a jejich chování je pevně dané. K vytvoření hodnot primitivních datových typů nepotřebujeme konstruktor (potřebnou inicializaci vyřeší virtuální stroj sám), ale na druhou stranu jim zase nemůžeme posílat žádné zprávy. Objektové datové typy jsou nám již dobře známé třídy. Těch bývá v programu definováno většinou mnohem víc. V našem úvodním pidiprojektu je jich definováno 6, v rozsáhlejších projektech jich mohou být definovány stovky a tisíce. Jenom ve standardní knihovně Javy 6.0 jich je definováno více než (primitivních datových typů je 8). Objektové datové typy (tj. třídy) si může každý programátor definovat sám. S jistou rezervou bychom mohli říci, že objektové programování spočívá v návrhu a implementaci těch správných objektových datových typů. V nejbližších kapitolách se budeme setkávat s následujícími datovými typy: Primitivní datové typy int označuje typ celých čísel, jejichž hodnoty se mohou pohybovat přibližně v rozsahu ±2 miliardy (přesně od do ). Název typu je zkratkou ze slova integer (= celé číslo). Je to nejpoužívanější datový typ. boolean double definuje typ logických hodnot, které mohou nabývat pouze hodnot true (pravda, ano, ) a false (nepravda, ne, ). Název tohoto typu nám připomíná matematika George Boola, který se v 19. stoletý zabýval logikou a na jehož počest se práce s logickými výrazy označuje jako Booleova algebra. označuje typ reálných čísel. Čísla typu double se v Javě pamatují s přesností na 15 platných číslic a v rozsahu do (číslo s 308 nulami). Své jméno dostal od toho, že v době svého zavedení (šedesátá léta minulého století) definoval čísla s dvojitou přesností oproti číslům tehdy většinou používaným. Nepleťte si platné číslice a desetinná místa. Např. číslo 0,00123 má pět desetinných míst, ale pouze tři platné číslice. Na druhou stranu číslo nemá žádné desetinné místo a může mít tři až pět platných číslic podle toho, jsou-li závěrečné nuly přesné, anebo vznikly zaokrouhlením. V kapitole Zbylé primitivní datové typy na straně 389 se seznámíme se zbylými primitivními datovými typy.

65 Kapitola 2: Třídy a objekty v interaktivním režimu 65 Objektové datové typy String definuje typ znakových řetězců, tj. posloupností znaků, které chápeme jako jediný objekt. Aby program zadávané řetězce správně rozpoznal, musíte tyto texty zadávat vždy uzavřené mezi uvozovkami např. "Znakový Řetězec". String je druhý nejpoužívanější datový typ. Své jméno dostal podle anglického slova string = řada, série, řetěz(ec), provázek, Mezi objektovými typy má typ String výjimečné postavení, protože je zapuštěn hluboko do definice jazyka a tvůrci jazyka mu oproti ostatním objektovým typům přidali některé dodatečné vlastnosti, které u jiných datových typů nenajdeme. S řadou z nich se seznámíte již v této a příští kapitole. Barva, Elipsa, Obdélník, Plátno, Směr8, Trojúhelník jsou objektové typy, s nimiž jste se již seznámili v diagramu tříd projektu. Na rozdíl od typu String, který je součástí standardní knihovny, jsem pro vás tyto datové typy naprogramoval já a vy od příští kapitoly začnete programovat vlastní. Těžiště objektového programování spočívá v umění definovat správné objektové datové typy a v umění správně definovat jejich vzájemnou spolupráci. Před chvílí jsem vám říkal, že objektových datových typů (tříd) je ve standardní knihovně Javy 6.0 více než , a prozatím jsme si pověděli pouze o jednom. V průběhu učebnice se postupně seznámíme ještě s několika dalšími. Informace o těch ostatních musíte získat z dokumentace. Ta je k dispozici zdarma (stejně jako celá Java), ale zatím jenom anglicky. Dokumentace samozřejmě nepopisuje všechny třídy včetně nejrůznějších pomocných tříd vytvořených pro interní potřebu knihovny. Popisuje pouze veřejné třídy, které jsou zahrnuty do tzv. API (zkratka z Application Program(ming) Interface překládá se většinou jen jako aplikační rozhraní), v němž jsou třídy určené k obecnému použití. Nicméně i těch je pěkná řádka verze 1.0 začínala s 211 veřejnými třídami (vešla se celá na jednu disketu), verze 6.0 jich měla již Vracení hodnot primitivních typů Tak dost již teoretických řečí a pojďme spolu zase něco dělat. Budeme-li chtít po nějakém objektu, aby nám prozradil svoje souřadnice na plátně, pošleme mu postupně zprávy int getx() a int gety(), po nichž nám objekt vrátí vždy celé číslo (int) udávající jeho vzdálenost v bodech od levého horního rohu plátna. Budeme-li naopak chtít, aby nám prozradil svůj rozměr, pošleme mu postupně zprávy int getšířka() a int getvýška(), po nichž nám objekt vrátí vždy celé číslo udávající příslušný rozměr v bodech. Informaci, kterou požadujeme, nám objekt vrátí v textovém poli dialogového okna, které se v reakci na vyslání zprávy otevře. Tady se možná někteří z vás podivili, proč je součástí názvů uvedených zpráv slovíčko get. Je to všeobecná konvence, podle které názvy zpráv, na které příslušná instance odpovídá vrácením nějaké hodnoty popisující její stav, začínají předponou get, za níž následuje název oné vracené informace. Je-li vracená hodnota logickou hodnotou, používá se místo předpony get předpona is. Zjišťovací metody jsou typem přístupových metod, o kterých budeme podrobněji hovořit v podkapitole Přístupové metody na straně 131.

66 66 Myslíme objektově v jazyku Java Na konci minulé podkapitoly jsme zásobník i plátno vyčistili, takže můžeme začít znovu pomocí implicitního (tj. bezparametrického) konstruktoru vytvořte nový obdélník a nazvěte jej o1. Tomuto obdélníku pak zašlete zprávu int getšířka(). Jako odpověď otevře BlueJ dialogové okno, v němž nám požadovaný údaj prozradí (viz obr. 2.8). Obrázek 2.8 Vrácená hodnota po zaslání zprávy int getšířka() objektu o1 Vracení hodnot objektových typů Výše popsané zprávy vracely celočíselnou hodnotu, tj. hodnotu primitivního typu. Nic však nebrání tomu, aby zprávy požádaly o hodnoty objektových typů, přesněji odkazy na tyto hodnoty. (Jak jsme si již několikrát řekli, program nikdy nepracuje s instancemi, ale vždy pouze s odkazy na ně.) Práce s takovýmito návratovými hodnotami je však trochu komplikovanější, protože k převzetí odkazu musíme ještě zadat název položky, která bude vytvořena v zásobníku odkazů a do které bude odkaz na požadovaný objekt uložen. Zprávou požadující vrácení hodnoty objektového typu je např. zpráva getbarva(), kterou mají všechny tři geometrické tvary na počátku svého seznamu. Podívejme se nyní, jak budeme postupovat při poslání této zprávy a zejména pak při zpracování obdrženého výsledku. V zásobníku odkazů máme odkaz o1 ukazující na obdélník, jehož barvu chceme zjistit. Pošleme proto tomuto obdélníku zprávu getbarva(). Obdélník zprávu zpracuje a vrátí odkaz na svoji Obrázek 2.9 Předání návratové hodnoty objektového typu

67 Kapitola 2: Třídy a objekty v interaktivním režimu 67 barvu. BlueJ pak otevře dialogové okno, v němž nás šipkou v textovém poli upozorní na to, že vrácenou hodnotou byl odkaz na objekt. Oproti minulé verzi dialogového okna ožijí v tomto okně dvě tlačítka po pravé straně: Tlačítko Prohlížet nám umožní se podívat do útrob vraceného objektu. Prozatím si jej nebudeme všímat budeme si o něm povídat v podkapitole Výlet do nitra instancí na straně 75. Tlačítko Získat odkaz je určeno pro převzetí vraceného odkazu a jeho uložení do zásobníku odkazů. S tím si budeme hrát nyní. Chtěli jsme odkaz, tak stiskneme tlačítko Získat odkaz. BlueJ otevře dialogové okno, v němž se nás zeptá na požadované jméno (identifikátor) nově vzniklého odkazu. Protože víme, jaká je barva obdélníku, můžeme odkaz nazvat přímo názvem této barvy a stiskem OK svoji volbu potvrdit. Obrázek 2.10 Zadání názvu vráceného odkazu BlueJ pak uloží odkaz do zásobníku, kde s ním můžeme pracovat podobně jako s odkazy na objekty, o jejichž vytvoření jsme požádali konstruktor (viz obr. 2.11). Obrázek 2.11 S odkazem získaným zasláním zprávy můžeme pracovat jako s jakýmkoliv jiným

68 68 Myslíme objektově v jazyku Java Použijeme-li naši analogii, pak bychom mohli říci, že pošleme-li někomu zprávu, v níž žádáme hodnotu objektového typu, dostaneme vždy pouze telefonní číslo na příslušnou instanci. Vzácnou výjimkou mezi objektovými typy je typ String. Když jsem se o něm poprvé zmiňoval, říkal jsem, že se v některých situacích chová obdobně jako primitivní datové typy. Jednou z takovýchto situací je v programu BlueJ předávání návratové hodnoty, při němž se String chová současně jako primitivní typ, protože zobrazí požadovanou hodnotu, a současně jako objektový datový typ, protože nám umožní získat odkaz. Zkuste např. poslat odkazu na červenou barvu zprávu String getnázev(). V dialogovém okně, které pak BlueJ otevře, uvidíte jak hodnotu tohoto řetězce, tak živá tlačítka nabízející možnost prohlížení a získání odkazu (viz obr. 2.12). Obrázek 2.12 Při vracení objektu typu String se zobrazí i příslušný řetězec 2.7 Parametry a jejich typy Prozatím jsme se omezovali na používání konstruktorů, jejichž závorky za názvem konstruktoru byly prázdné, a které proto označujeme jako implicitní nebo bezparametrické. Tyto konstruktory vytvářely stále stejně veliké a pokaždé stejně vybarvené obrazce ve stále stejném místě plátna. Nyní si ukážeme, jak tento nudný stereotyp změnit. Budeme modifikovat chování konstruktorů prostřednictvím parametrů, s jejichž pomocí budeme moci všechny výše uvedené charakteristiky nastavit. Prostřednictvím parametrů předáme konstruktoru hodnoty, kterými budeme specifikovat některé naše požadavky na vytvářené instance. Někteří autoři používají pro parametry termín argument, občas se také můžete setkat s termínem vstupní hodnota jako opozitum k výstupní hodnotě vracené po zaslání některých zpráv. Jak jste si mohli všimnout v místních nabídkách, jednotlivé konstruktory se liší tím, kolik parametrů mají v závorkách uvedeno a které to jsou. Při definici konstruktoru proto tvůrce uvede v závorkách za názvem třídy čárkami oddělený seznam parametrů, které je konstruktor schopen zpracovat.

69 Kapitola 2: Třídy a objekty v interaktivním režimu 69 Definice několika verzí konstruktorů s různými sadami typů parametrů bývá označována jako přetěžování daného konstruktoru. Jednotlivé verze se pak nazývají přetížené. Aby program dokázal s předanými hodnotami co nejefektivněji pracovat, musí vědět, co jsou zač. Je zřejmé, že např. konstruktor trojúhelníků bude zcela jinak pracovat s barvou svého objektu, jinak se směrem, do nějž má být vytvářený trojúhelník natočen, a zcela jinak s číslem představujícím jeho rozměr nebo souřadnici. Seznam parametrů v závorkách proto obsahuje nejenom názvy (identifikátory) jednotlivých parametrů, které nám napoví jejich význam, ale také jejich datové typy, podle nichž počítač pozná, jak má s daným parametrem pracovat. Jak se můžete přesvědčit v nabídkách, v seznamu je vždy uveden nejprve typ parametru a teprve pak název, který nám naznačuje, k čemu se daný parametr používá. Vyvolání konstruktoru s parametry Ukažme si vše na příkladu. Zkusíme vytvořit další instanci třídy Obdélník, u které si objednáme její umístění i velikost. Pošleme proto zprávu, jež vytvoří instanci a zavolá konstruktor, který nám umožní zadat jak x-ovou a y-ovou souřadnici vytvářeného obdélníku, tak jeho rozměry. Vhodná zpráva je v nabídce uvedena jako příkaz (viz obr. 2.13) new Obdélník(int x, int y, int šířka, int výška ) Obrázek 2.13 Zavolání konstruktoru umožňujícího zadat požadovanou souřadnici a rozměr

70 70 Myslíme objektově v jazyku Java Po zadání příslušného povelu se otevře velké dialogové okno (viz obr. 2.14), v němž nás BlueJ vyzve nejenom k zadání (nebo alespoň potvrzení) názvu odkazu na vytvářený objekt, ale také k zadání hodnot jednotlivých parametrů. Obrázek 2.14 Okno konstruktoru s parametry Horní část okna zobrazuje popis funkce volaného konstruktoru spolu s popisem významu jednotlivých parametrů. Neděste se toho, že popis je trochu kryptický (zašifrovaný) je to opsaná část programu sloužící k automatizované tvorbě dokumentace. Aby Java mohla tuto dokumentaci vytvořit, požaduje dodržení jistých konvencí, které sice trochu ztěžují přímé čtení programu, ale na druhou stranu umožňují právě vytvoření profesionální dokumentace. Tvorbě dokumentace bude věnována pasáž Automaticky generovaná dokumentace na straně 164. Prozatím si pamatujte, že za následuje název parametru a jeho popis. V této části nemusí být vždy uvedeny všechny parametry a dokonce v ní může chybět i popis. Bude zde vždy jen to, co se tvůrce programu rozhodl popsat. Berte proto tento návod pouze jako pomůcku a smiřte se s tím, že programy tvůrců, kteří jsou líní dělat dokumentaci, takovouto nápovědu nabízet nebudou. Snažte se k nim nezařazovat a své programy vždy řádně dokumentujte. Zde bych vás chtěl upozornit na poslední řádek horní části, který je těsně nad dělící čarou a je vysazen tučně. Zde je zobrazena hlavička konstruktoru, která specifikuje to nejdůležitější, co potřebujete o konstruktoru vědět.

71 Kapitola 2: Třídy a objekty v interaktivním režimu 71 V hlavičce je uveden název třídy, jejíž instanci inicializuje, následovaný závorkami se seznamem všech parametrů. Na rozdíl od komentáře, kde může něco chybět, tady nic chybět nesmí. Je-li parametrů více, jsou jejich deklarace odděleny čárkami. Všimněte si, že u každého parametru je uveden nejprve typ a za typem název (identifikátor) daného parametru. Takto budete od příští kapitoly uvádět parametry i vy ve svých programech. Autoři BlueJ se snažili ulehčit uživatelům orientaci v situacích, kdy je zadávaných parametrů více, a zopakovali typ i název parametru vpravo vedle vstupního pole, do nějž se má zadat jeho hodnota. Jednotlivé prvky okna jsme si probrali a můžeme začít vyplňovat. Pro nově konstruovaný obdélník zadáme název o2. Dejme tomu, že vytvoříme obdélník tak, aby zabral celé plátno, které má v počátečním stavu rozměr bodů. Zadáme proto parametry podle obrázku Obrázek 2.15 Vyplněné okno parametrického konstruktoru Po zadání příkazu se na plátně objeví vytvořený obdélník. Protože zabírá celé plátno a protože je červený, přebarví celé plátno na červeno. 1. Vytvořte další obrazce, kterým zadáte požadované souřadnice a rozměry. 2. Uveďte plátno do (zdánlivě) počátečního stavu tím, že obdélníku zabírajícímu celé plátno pošlete zprávu void smaž(). Po této zprávě obdélník překreslí celou svoji plochu barvou pozadí plátna, čímž automaticky všechny ostatní zobrazené tvary smaže. Parametry objektových typů Z konstruktorů, které každá ze tříd Obdélník, Elipsa a Trojúhelník nabízí, jsme doposud použili pouze dva: bezparametrický konstruktor a konstruktor, který umožnil zadat počáteční pozici a rozměr

72 72 Myslíme objektově v jazyku Java obdélníku. Při volání zbylých konstruktorů je totiž třeba zadat parametr objektového typu a to se nyní naučíme. Prozatím jsem vám všechno předváděl na obdélnících. Aby to ostatním obrazcům nebylo líto, budeme si chvíli hrát s nimi. Každý z tvarů má definovanou svoji implicitní barvu, kterou se na plátno nakreslí. Budeme-li chtít vytvořit obrazec jiné barvy, musíme zavolat konstruktor, který je schopen převzít požadovanou barvu jako parametr, a vytvářený obrazec s ní vybarvit. Hodnotu objektového typu můžeme zadat dvěma způsoby: Máme-li v zásobníku odkaz na příslušnou hodnotu, stačí klepnout myší do vstupního textového pole příslušného parametru a potom klepnout v zásobníku na tento odkaz. BlueJ sám zapíše potřebný text. Nemáme-li v zásobníku odkaz na předávanou hodnotu, musíme ji zapsat textově. Tento způsob zadávání se ale budeme učit až za chvíli. V zásobníku odkazů máme odkaz na červenou barvu. Rozhodneme-li se proto vytvořit ve středu plátna červený kruh o průměru 100 bodů (přesněji elipsu o výšce a šířce 100 bodů), můžeme pro zadání barvy tento odkaz využít viz obr Obrázek 2.16 Objektový parametr můžeme zadat klepnutím na odkaz v zásobníku

73 Kapitola 2: Třídy a objekty v interaktivním režimu 73 Posílání zpráv s parametry Ukážeme si nyní, že parametry můžeme využívat i při předávání zpráv. Konstruktory jsou pouze zvláštním druhem zpráv, takže většinu toho, co můžeme použít u konstruktorů, můžeme použít i u obyčejných zpráv. Přesouvání jsme si již užili dost, tak zkusíme něco jiného např. změnit velikost objektu. Zkuste změnit rozměry celoplátnového obdélníka o2 tak, aby zůstal tak široký jako plátno (tj. 300 bodů), ale aby byl pouze 20 bodů vysoký. Zadejte proto v jeho místní nabídce povel void setrozměr(int šířka, int výška) a v následně otevřeném dialogovém okně zadejte příslušné hodnoty jeho parametrů. Jak jste si jistě domysleli, stejně jako konvence s předponou get existuje i konvence s předponou set, kterou začínají názvy zpráv, které nastavují hodnoty ovlivňující stav instance. Nastavovací metody jsou druhým typem přístupových metod, o kterých budeme podrobněji hovořit v podkapitole Přístupové metody na straně 131. Protože upravovaný obdélník zabíral celé plátno, zmizely se změnou jeho rozměrů i všechny další tvary, které jste na plátno při řešení posledního úkolu nechali nakreslit. V poznámce na str. 60 jsem říkal, že obrazec znovu zobrazíte tím, že mu pošlete zprávu void nakresli(). To však samozřejmě není jediné řešení. Obrazec se překreslí také po zaslání kterékoliv ze zpráv, které mění jeho pozici nebo polohu. Pošlete i ostatním obrazcům v zásobníku zprávu, v níž je žádáte o změnu jejich pozice nebo rozměru. Pokud vás ještě neomrzelo posouvání objektů, můžete jim zkusit poslat i zprávy void posunvpravo(int vzdálenost) nebo void posundolů(int vzdálenost), které posunou příslušný objekt o zadaný počet bodů požadovaným směrem. Stejně jako konstruktorům můžete parametry objektových typů předávat i zprávám. Každému z tvarů můžete např. poslat zprávu void setbarva(barva nová), v níž mu oznámíte, na jakou barvu se má přebarvit. Vytvořte pomocí bezparametrického konstruktoru instance elipsy a trojúhelníku a získejte instance jejich barev. Nastavujte pak různým obrazcům různé barvy. Zkuste pomocí příkazů vytvořit nějaký zajímavý obrázek. 2.8 Metody třídy Někdy potřebujeme zaslat zprávu, která se netýká jedné konkrétní instance, ale týká se celé třídy. Rodičovská třída totiž své instance po jejich zřízení neopouští, ale uchovává informace, které jsou pro všechny její instance společné, aby je instance mohly v případě potřeby využít. Zároveň také

74 74 Myslíme objektově v jazyku Java často poskytuje metody, které umožňují tyto informace ovlivnit nebo vykonat jinou akci, jež není svázána s žádnou její konkrétní instancí. V naší analogii bychom mohli metody třídy definovat jako roboty, kteří pracují přímo v továrně. Stejně jako pracovní četě (=instanci) je i v továrně (=třídě) vyhrazen pro každou zprávu, kterou lze do továrny poslat, speciální robot (= metoda třídy), který zabezpečí správnou reakci na tuto zprávu. Podívejme se např. na náš předchozí příklad s geometrickými tvary. Na příkaz void přesunxxx() se obrazce přesunou o předem stanovaný počet obrazových bodů směrem XXX. Velikost tohoto kroku je přitom pro všechny instance dané třídy stejná je to právě ten druh informace, kterou instance sdílejí prostřednictvím své rodičovské třídy. Rozhodneme-li se proto velikost tohoto implicitního přesunu změnit, musíme poslat zprávu třídě. Otevřete si znovu místní nabídku třídy Obdélník (viz např. obrázek 2.1 na straně 55). V její střední části si můžete všimnout dvou položek, jejichž zadáním posíláme zprávu celé třídě. Zasláním zprávy int getkrok() se třídy zeptáte na současnou velikost kroku, zasláním zprávy void setkrok(int velikost) nastavíte novou velikost tohoto kroku. Tato velikost pak bude platit pro všechny instance dané třídy, tj. i pro ty, které vznikly před tím, než jste nastavili novou velikost kroku, a které proto doposud používaly velikost původní. Zkuste znovu změnit velikost kroku, avšak tentokrát pro jinou třídu. Nastavte jí krok např. na 5 bodů a znovu vše vyzkoušejte. Velmi užitečnou metodou třídy bude při vašich experimentech metoda smaž() třídy Plátno. Po našich předchozích pokusech máte již plátno jistě zaplněné několika grafickými tvary. Zavolejte proto tuto metodu z místní nabídky třídy plátno a budete mít plátno čisté. Metoda smaž() pouze smaže plátno, tj. natře je na aktuální barvu pozadí. V žádném případě neodstraňuje objekty z paměti pouze smaže obrázek, který na plátno nakreslily. Můžete se o tom přesvědčit tak, že kterýkoliv z objektů, na nějž máte odkaz, požádáte, aby se znovu nakreslil, tj. zadáte v jeho místní nabídce příkaz void nakresli(). Metoda smaž() třídy Plátno není pravou metodou třídy. Měla by to být správně metoda konkrétního plátna. Protože však víme, že toto plátno je jedináček, je z jistého úhlu pohledu jedno, jak metodu deklaruji. V našem programu je definována jako metoda třídy proto, abyste k ní měli snadný přístup a nemuseli kvůli smazání plátna pracně získávat odkaz na jeho instanci. Přiznávám, že z hlediska správného programování je to nečisté, ale pro naše praktické účely je to výhodné. Třídy, které chtějí, aby jejich instance byly jedináčci, musí spolupracujícím třídám a jejich instancím nějak umožnit získat odkaz na tohoto jedináčka, aby s ním mohly komunikovat. Používají k tomu většinou metodu, která se tváří, že pro vás požadovaný odkaz vyrobí. Říká se jí proto tovární metoda. Takovou metodu má i třída Plátno vyvoláte ji zasláním zprávy Plátno getinstance() a získáte od ní odkaz na třídního jedináčka.

75 Kapitola 2: Třídy a objekty v interaktivním režimu 75 Na rozdíl od konstruktorů však tovární metoda nezaručuje, že po každém zavolání vrátí odkaz na nově vytvořenou instanci. Naopak klidně vám pokaždé vrátí totéž. To je také případ našeho plátna. Získejte odkaz na instanci plátna a vyzkoušejte jeho metody. Nelekněte se však, když plátno po změně svého rozměru nebo barvy pozadí všechny objekty smaže. Jak jste si již mohli vyzkoušet, po zprávě void nakresli() se daný tvar znovu překreslí. 2.9 Výlet do nitra instancí Zatím jsme si ukazovali, jak instance reagují na zprávy, které jim posíláme. Nic jsme si ale doposud neříkali o tom, jak instance pozná, kde se má nakreslit, odkud se má přesunout nebo jak zjistí, jakou má její obrazec barvu. Aby mohl objekt na naše zprávy správně reagovat, musí uchovávat informace popisující stav objektu. Tyto informace označujeme jako atributy. Své atributy mají jednotlivé instance, ale může je mít i celá třída. Rozlišujeme proto atributy instancí a atributy třídy. Atributy třídy jsou sdíleny všemi jejími instancemi a jakákoliv jejich změna se proto ihned promítne do všech instancí dané třídy. Někteří autoři používají pro atributy termíny vnitřní proměnné nebo členské proměnné. Já však o nich budu v dalším textu hovořit téměř výhradně jako o atributech. Kdybychom se vrátili k naší analogii, mohli bychom si atributy představit jako zásuvky s informacemi. Atributy instancí má každá instance (četa) ve svém vozidle, atributy třídy jsou v informačním centru v továrně (=třídě). Změní-li některý z robotů (=metod) hodnotu uloženou v šuplíku v autě (tj. hodnotu atributu instance), ovlivní tato změna chování ostatních robotů (=metod), protože až se půjdou do šuplíku podívat, najdou tam hodnotu, kterou tam jejich kolega uložil. Změní-li kdokoliv hodnotu uloženou v šuplíku v továrně (tj. hodnotu atributu třídy), ovlivní tato změna chování všech, kdo se po této změně půjdou do tohoto šuplíku podívat, tj. i chování ostatních instancí a jejich metod. Atributy instancí Prozatím jsme o atributech hovořili pouze jako o něčem, co existuje, ale neměli jsme možnost se o tom přesvědčit. Hned to napravíme. Protože nevím, jak moc jste experimentovali, nemohu zaručit, že se budou následující obrázky v knize shodovat s těmi, které vám bude ukazovat váš počítač. Chcete-li je synchronizovat, restartujte opět virtuální stroj. Tím zařídíte, že by naše obrázky měly zase vypadat stejně.

76 76 Myslíme objektově v jazyku Java Pomocí bezparametrického konstruktoru vytvořte instanci obdélníku a nazvěte ji o1. Vyvolejte pravým tlačítkem myši její místní nabídku a zadejte v ní povel Prohlížet. Tím spustíte prohlížeč objektů (uživatelé Windows si mohou všimnout, že se na liště úloh objeví další aplikace), který otevře své okno a vypíše v něm hodnoty atributů příslušné instance (viz obr. 2.17). Obrázek 2.17 Okno prohlížeče atributů instance Prohlížeč v okně zobrazí jednotlivé atributy dané instance. U každého z nich uvede jeho typ a název. U atributů primitivních typů a typu String uvede navíc i jejich hodnotu. U atributů ostatních objektových typů uvede místo hodnoty pouze symbol označující, že se jedná o odkaz. Klepnete-li však na atribut objektového typu, ožije vpravo tlačítko Prohlížet, jehož stiskem můžete otevřít pro odkazovanou instanci obdobné okno, v jakém se zrovna nacházíte, a podívat se na hodnoty atributů tohoto atributu. Slovo private, které informaci o typu a názvu uvozuje, oznamuje, že atribut je soukromým majetkem instance, ke kterému nemá nikdo cizí přístup. O jeho významu si podrobněji povíme v dalších kapitolách. Všechny instance stejné třídy mají stejnou sadu atributů. Tou je vybaví konstruktor při jejich inicializaci. Instance různých tříd mívají obecně různé atributy, ale pokud instance skupiny tříd představují objekty podobného druhu (např. naše obdélníky, elipsy i trojúhelníky jsou všechno geometrické tvary), budou mít i podobnou nebo dokonce stejnou sadu atributů. Naše obdélníky, elipsy a trojúhelníky mají následujících sedm atributů: Atribut pořadí označuje pořadí vytvoření daného obrazce v rámci všech obrazců dané třídy. Toto pořadí se počítá od restartu virtuálního stroje. Atribut název uchovává odkaz na řetězec označující daný obrazec. Název obsahuje jméno třídy, jejíž je obrazec instancí, následované podtržítkem a pořadovým číslem obdélníku. Tento atribut slouží především k tomu, abyste mohli při ladění programu snáze poznat, o kterou instanci se jedná.

77 Kapitola 2: Třídy a objekty v interaktivním režimu 77 Atributy xpos a ypos uchovávají pozici instance, přesněji pozici levého horního rohu opsaného obdélníku. Jejich hodnotu zjistíme posláním zpráv int getx() a int gety() a nastavujeme ji posláním zprávy void setpozice(x,y). Atributy šířka a výška uchovávají informace o rozměru dané instance u našich tvarů jsou to opět informace o šířce a výšce opsaného obdélníku. Atribut barva uchovává odkaz na objekt, který nese všechny potřebné informace o barvě daného objektu. Trojúhelníky mají navíc ještě atribut směr, který označuje, do kterého směru je natočen vrchol daného trojúhelníku. Ve škole jste se nejspíš setkali pouze s opsanou kružnicí. Opsaný obdélník je něco obdobného nejmenší obdélník, do kterého se celý obrazec vejde, a který má svoje strany rovnoběžné s okraji plátna. Mění-li se stav objektu (v našem případě mění-li se jeho poloha, velikost či barva), mění se i hodnoty jeho atributů. BlueJ zobrazované hodnoty atributů instancí průběžně aktualizuje. Nechte okno otevřené a zkuste požádat instanci, do jejíchž útrob nahlížíte, aby se někam posunula. Přesvědčte se, že se hodnoty atributů uchovávajících informace o pozici instance po splnění tohoto příkazu změní. Zkuste vyvolat další metody a podívejte se, jak ovlivňují hodnoty jednotlivých atributů. Atributy třídy statické atributy Atributy, které nám prohlížeč doposud zobrazoval, jsou atributy příslušné instance. Svoje atributy však může mít i celá třída. Atributy třídy pak všechny její instance sdílejí. Atributy třídy bývají často označovány jako statické atributy, protože jsou v programu uvozeny slovem static. Zůstaneme-li u naší analogie, můžeme říci, že atributy třídy (šuplíky) jsou na pevném místě (v továrně), kam se na jejich obsah chodí jednotlivé instance dívat nebo jej měnit. Tyto atributy bychom proto mohli označit za statické, protože se nehýbají. Naproti tomu atributy instancí si každá instance vozí s sebou. Zobrazení okna s atributy třídy dosáhnete dvěma cestami: V diagramu tříd zadáte v místní nabídce příslušné třídy příkaz Prohlížet. V okně prohlížeče instancí stisknete tlačítko Ukázat statické atributy (atributy třídy). V obou případech odpoví BlueJ otevřením okna s atributy příslušné třídy.

78 78 Myslíme objektově v jazyku Java Obrázek 2.18 Okno prohlížeče atributů třídy Jak ukazuje obr. 2.18, třída Obdélník má pět atributů: Veřejný atribut IMPLICITNÍ_BARVA obsahuje odkaz na barvu, kterou bude mít vytvořený obdélník v případě, že jej vytvoříte pomocí konstruktoru, jemuž nezadáváte požadovanou barvu jako parametr, tj. konstruktoru, který takovýto parametr nemá. Všimněte si, že při zvýraznění tohoto atributu obživne i tlačítko Získat odkaz (viz obr. 2.18), které bylo doposud u objektových atributů mrtvé. Je to proto, že tento atribut je veřejný, a proto nám BlueJ umožňuje získat jeho obsah. Soukromý atribut MAX_KROK uchovává maximální povolenou velikost kroku (viz dále). Soukromý atribut PLÁTNO uchovává odkaz na plátno, aby si instance nemusely pokaždé, když jej potřebují, o něj říkat třídě Plátno. Atribut krok obsahuje velikost implicitního kroku, o kterou se obrázek obdélníka posune po plátně v případě, zavoláme-li některou z bezparametrických posunových metod. Jeho velikost zjišťujeme a nastavujeme metodami int getkrok() a void setkrok(int velikost), o nichž jsme hovořili v kapitole Metody třídy na straně 73. Třída nám nedovolí nastavit větší velikost, než je velikost uložená ve výše zmíněném atributu MAX_KROK. Atribut počet uchovává počet doposud vytvořených instancí. Odtud si konstruktor bere číslo, které přidává každé instanci za název třídy na konec hodnoty ukládané do atributu název. Studenti se v tomto místě občas ptají, proč mezi statickými atributy je implicitní barva a proč tam nejsou implicitní poloha a implicitní rozměr. Důvody rozhodnutí autorů třídy pro zavedení či nezavedení toho či onoho atributu mohou být různé. Mne vedla k zavedení atributu IMPLICITNÍ_BARVA potřeba mít jeden atribut třídy objektového typu, abych vám mohl předvést některé jeho vlastnosti. Řadu začátečníků překvapí, když zjistí, že některá třída nebo instance má mezi svými atributy odkazy na instance téže třídy. Zamyslíte-li se ale nad tím, musíte připustit, že nic z toho, co jsme si doposud o atributech řekli, definici takovýchto atributů nezakazuje.

79 Kapitola 2: Třídy a objekty v interaktivním režimu 79 Možná o tom nevíte, ale od samého počátku dokonce s takovýmito třídami pracujete. Podíváte-li se na atributy třídy Barva nebo Směr8, zjistíte, že jejími atributy jsou právě odkazy na instance těchto tříd. Obě třídy mají tyto atributy deklarovány jako veřejné, takže vám nic nebrání získat na ně odkaz, který pak použijete pro snadné předání požadovaných parametrů při posílání zpráv. Obrátíte-li se na naši analogii s vozidly osazenými roboty, pak atributy, které jsou odkazy na instance vlastní třídy, jsou vlastně zásuvky s telefonními čísly těchto instancí. Instanci nic nebrání v tom, aby si vozila telefonní čísla (=odkazy) na jiné instance téže třídy a zrovna tak v tom nic nebrání ani třídě. Jak jsem již řekl, atributy třídy jsou pro všechny instance společné. Nezávisle na tom, odkud okno prohlížeče atributů třídy otevřete, otevře se vždy stejné okno. Budete-li mít proto vytvořeny dvě instance a požádáte-li v obou z nich o zobrazení statických atributů, tak se při druhé žádost žádné nové okno neotevře, ale pouze se aktivuje dříve otevřené okno. 1. Vyzkoušejte reakci hodnoty atributu počet na vytvoření další instance. 2. Vyzkoušejte reakci hodnoty atributu krok na změnu zadanou voláním metody void setkrok(int velikost). 3. Ověřte, že se při dalších žádostech o atributy třídy znovu aktivuje dříve otevřené (a doposud nezavřené) okno Přímé zadávání hodnot parametrů objektových typů Při zadávání hodnot parametrů objektových typů nemusíme být odkázáni pouze na to, jestli se nám podaří umístit do zásobníku odkazů odkaz na objekt, který chceme předat jako parametr. I objektové parametry můžeme zadávat přímo, i když je to trochu těžší, ale opravdu jen trochu. Abychom mohli odkaz na jakýkoliv objekt zadat přímo jako hodnotu parametru, musíme mít šanci se k němu dostat. Při tom můžeme využít jednou ze dvou skutečností: třída či instance má veřejný atribut, který na tento objekt odkazuje, existuje metoda, která vrací odkaz na požadovanou instanci. Veřejné atributy Jednodušší případ nastane ve chvíli, kdy víme, že odkaz na příslušný objekt lze získat z některého veřejného atributu třídy (atributu, u nějž nám prohlížeč prozradí, že je public). Pak stačí do příslušného vstupního pole zadat název příslušné třídy následovaný tečkou a názvem vyhlédnutého atributu (řekneme si třídě o odkaz na její veřejný atribut). Nesmíte přitom zapomenout na nutnost dodržování velikosti písmen.

80 80 Myslíme objektově v jazyku Java Vyzkoušíme si to např. na atributech třídy Směr8. Podívejte se nejprve na její veřejné atributy (viz obr. 2.19) a všimněte si, že jejich identifikátory používají pouze velká písmena to budeme muset respektovat. Obrázek 2.19 Přehled veřejných atributů třídy Směr8 Rozhodneme-li se proto vytvořit v pozici [50;100] na jih otočený trojúhelník široký 150 a vysoký 200 bodů a pojmenovat jej TJ, zadáme parametry zprávy podle obrázku Obrázek 2.20 Přímé zadání směru

81 Kapitola 2: Třídy a objekty v interaktivním režimu 81 Obdobně bychom postupovali i v případě, když bychom chtěli zadat některou z předdefinovaných barev i ty jsou totiž veřejnými atributy třídy Barva. Odkazy vrácené po zaslání zprávy Při zadávání odkazů na instance objektových datových typů můžeme využít i hodnot, které nám vrátí volání některých metod. Víme například, že všechny instance geometrických tvarů umějí reagovat na zprávu Barva getbarva() a vrátit svoji barvu. Musí to umět i právě vytvořený trojúhelník. Postup zadání takto získané hodnoty odkazu je velmi podobný tomu, který jsme použili před chvílí při zadávání odkazu na atribut: 1. Napíšeme název toho, na koho se obracíme. Voláme-li metodu třídy, napíšeme název třídy, voláme-li metodu instance, napíšeme název odkazu na tuto instanci. 2. Za název přidáme tečku. 3. Za tečku napíšeme název metody, kterou voláme, následovaný seznamem parametrů v kulatých závorkách. Nemá-li metoda parametry, budou závorky prázdné. Má-li metoda parametry, musíme uvést ve správném pořadí seznam jejich hodnot oddělených čárkami. Vyzkoušejme si to. Vytvořme nad trojúhelníkem stejně vybarvený obdélník nazvaný OTJ. Umístíme jej na souřadnice [50;50] a uděláme jej široký 150 a vysoký 50 bodů. Zavoláme proto konstruktor obdélníku a při zadávání barvy si o barvu řekneme právě vytvořenému trojúhelníku, takže zadáme TJ.getBarva() (viz obr. 2.21). Obrázek 2.21 Zadání odkazu na objekt prostřednictvím volání metody Obdobně bychom postupovali i tehdy, když bychom chtěli získat zadávanou barvu zasláním zprávy Barva getbarva(string názevbarvy) třídě Barva. Tato zpráva vyžaduje zadání parametru, kterým je

82 82 Myslíme objektově v jazyku Java název požadované barvy. A protože název barvy je text, musíme jej zadat v uvozovkách. Kdybychom proto chtěli tento způsob získání barvy použít při kreslení černé elipsy umístěné kamsi dovnitř právě nakresleného obrazce, zadali bychom barvu výrazem Barva.getBarva( "černá" ); Okno konstruktoru, v němž zadáváme parametry pro inicializaci této elipsy, si můžete prohlédnout na obrázku Ze zadávaného textu je ale vidět jen kousek. Obrázek 2.22 Zadání odkazu voláním metody s parametrem Jediným problémem zůstává, jak se dozvíte, které názvy barev můžete zadat. K tomu slouží metoda vypišznáménázvy(), která otevře dialogové okno, v němž vypíše všechny názvy barev, které v daném okamžiku zná a které tedy můžete zadat. Obrázek 2.23 Vypsání názvů známých barev

83 Kapitola 2: Třídy a objekty v interaktivním režimu Shrnutí co jsme se naučili Shrňme si, co jsme se v této kapitole dozvěděli: OOP chápe okolní svět jako svět objektů, které sdružujeme do tříd. Každý objekt je instancí nějaké třídy. Termíny objekt a instance jsou synonyma. Objekty mezi sebou komunikují prostřednictvím zpráv. Objektově orientovaný program je v nějakém programovacím jazyce zapsaný popis tříd, jejich instancí a zpráv, které si objekty mezi sebou posílají. Reakci na zaslanou zprávu má na starosti speciální část programu, označovaná jako metoda. V jazyku Java vytváříme nové objekty zasláním zprávy s klíčovým slovem new následovaným názvem třídy a seznamem parametrů v kulatých závorkách. Klíčové slovo new vytvoří novou instanci třídy, jejíž název je uveden za ním. Pak se vyvolá tzv. konstruktor, který instanci inicializuje na základě parametrů předaných v závorkách. Konstruktory jsou speciální metody zodpovědné za správnou inicializaci nově vytvořených instancí svých tříd. Konstruktor vrací odkaz na právě vytvořený objekt. Neposkytne-li třída konstruktor, nemůžeme vytvářet její instance. Některé třídy žádáme o odkazy na jejich instance prostřednictvím tzv. továrních metod. Tovární metody mohou (na rozdíl od konstruktorů) vracet pokaždé odkaz na týž objekt. O vyhrazení paměťového místa pro vytvářený objekt a o jeho úklid poté, co přestaneme objekt potřebovat, se stará správce paměti. Program nikdy nepracuje s objektem, ale vždy pouze s odkazem na objekt. Odkazy, třídy, zprávy a další objekty, s nimiž v programu pracujeme, označujeme identifikátory. Identifikátory mohou obsahovat písmena (včetně písmen s diakritikou nebo např. japonských znaků), číslice a znaky _ (podtržítko) a $ (dolar). Nesmí začínat číslicí. V identifikátorech se rozlišují velká a malá písmena. Zprávy můžeme zasílat nejenom jednotlivým instancím, ale také celé třídě. Zasláním zprávy můžeme požadovat nejenom provedení nějaké akce, ale také např. vrácení hodnoty. Každá hodnota, kterou v programu použijeme, musí mít definován svůj datový typ. Datové typy dělíme na primitivní a objektové. Mezi primitivní datové typy patří boolean, int a double. Mezi objektově datové typy patří typ String a všechny třídy, které jsou v našem projektu. Třídy, které jsou určeny k všeobecnému použití, jsou zahrnovány do tzv. API.

84 84 Myslíme objektově v jazyku Java Abychom si mohli vracené hodnoty prohlédnout, otevře BlueJ v reakci na zaslání zprávy požadující vrácení hodnoty dialogové okno, v němž vracenou hodnotu zobrazí. Vrací-li metoda hodnotu objektového typu, můžeme v dialogovém okně klepnout na příslušný záznam a pak požádat buď o prohlédnutí dané instance nebo o předání odkazu na ni. Při předání odkazu se tento uloží do zásobníku odkazů. Zprávy mohou mít parametry. Každý parametr má (stejně jako ostatní druhy dat) vždy definován svůj datový typ. Objekty si pamatují svůj stav prostřednictvím atributů. Vedle atributů instancí mohou být definovány i atributy třídy, které všechny instance dané třídy sdílí. V místní nabídce třídy můžeme BlueJ požádat o zobrazení atributů této třídy. U veřejných atributů objektových typů je prohlížeč instancí ochoten nám poskytnou jejich odkaz. Máme-li odkaz na instanci, můžeme BlueJ požádat o zobrazení jejích atributů a atributů její třídy. Odkazy na instance, které jsou veřejnými atributy tříd, můžeme zadávat jako parametry přímo zadáním názvu dané třídy následovaného tečkou a názvem příslušného atributu. Odkazy na instance objektových typů lze získávat i voláním metody vracející potřebný odkaz.

85 3. Vytváříme vlastní třídu Kapitola 3: Vytváříme vlastní třídu 85 Kapitola 3 Vytváříme vlastní třídu Co se v kapitole naučíme V minulé kapitole jsme si s objekty hráli a ukazovali si, jak co funguje. V této kapitole začneme opravdu programovat a napíšeme své první řádky. Nezačneme však od nuly, ale budeme rozšiřovat projekt, s nímž jsme se seznámili v minulé kapitole. Jak jsem sliboval v první kapitole, uděláme drobnou terminologickou změnu. Java realizuje poslání zprávy prostřednictvím zavolání odpovídající speciální části programu, které říkáme metoda. Od této chvíle proto budu většinou používat místo termínu posílání zpráv termín volání metod. V této a několika příštích kapitolách budeme pokračovat v práci s projektem 01_Tvary. Vedle něj začnete potřebovat ještě projekt _Přídavky, jenž obsahuje třídy, které v průběhu kapitol přidáme nebo vytvoříme. Kromě toho v něm najdete zdrojový kód třídy Strom v různých fázích rozpracovanosti tak, jak ji budeme v této a příštích kapitolách postupně tvořit. Jednotlivé etapy přípravy jsou definovány jako třídy s názvem zakončeným číslem kapitoly a případným písmenem. Ve této kapitole tak vznikne třída Strom_3, v dalších kapitolách přidáme další. Aby těch úvodních poznámek nebylo málo, přidám ještě jednu. V průběhu dalšího textu budu velmi často říkat, že něco definujeme nebo deklarujeme. Mezi těmito termíny je drobný rozdíl, který občas začátečníkům uniká: Budu-li říkat, že něco deklaruji, znamená to, že někde veřejně vyhlašuji, jaké má dané něco vlastnosti nebo se zavazuji, že splním to, co dané něco požaduje. Řeknu-li naopak, že něco definuji, znamená to, že dané něco v programu zavádím, nechávám tomu přidělit paměť, přiřadit počáteční hodnotu apod. Ještě se k této problematice v některých speciálních případech vrátím.

86 86 Myslíme objektově v jazyku Java 3.1 První vlastní třída Říkali jsme si, že základem všeho jsou objekty a ty že jsou instancemi svých tříd. Abychom mohli vytvořit nějaký objekt, musíme mít nejprve definovanou třídu, jejíž instancí objekt bude. Zkusíme si proto vytvořit novou, prázdnou třídu. Postup je jednoduchý: 1. Stiskněte vlevo tlačítko Nová třída (viz obr. 3.1). (V tuto chvíli je jedno, jsou-li ostatní třídy přeloženy nebo ne.) Obrázek 3.1 Vytvoření nové třídy 2. V následně otevřeném dialogovém okně zadejte název třídy, který musí odpovídat pravidlům pro tvorbu identifikátorů. Protože chceme vytvořit prázdnou třídu, nazvěte ji příhodně Prázdná (viz obr. 3.2). Mezi programátory v Javě se ustálila konvence, podle které se názvy tříd definují vždy s velkým počátečním písmenem a u několikaslovních názvů objektů programu (tj. nejen tříd) používají tzv. velbloudí notaci, při níž každé slovo několikaslovného názvu objektu začíná vždy velkým písmenem např. NázevTřídyZNěkolikaSlov.

87 Kapitola 3: Vytváříme vlastní třídu 87 Obrázek 3.2 Zadání názvu vytvářené třídy 3. Přepněte přepínač pod vstupním polem do poslední polohy nazvané Prázdná třída a své zadání potvrďte. BlueJ pak přidá právě vytvořenou třídu do diagramu tříd viz obr Obrázek 3.3 Přidání nové třídy do diagramu tříd 4. Podívejte se na disk do složky, ve které máte uloženy soubory projektu, a přesvědčte se, že se zde objevil nový soubor nazvaný Prázdná.java. Tento soubor označujeme jako zdrojový soubor a budete do něj za chvíli zapisovat program, v němž budete definovat požadované chování třídy a jejích instancí. V diagramu tříd je obdélník představující novou třídu prozatím vyšrafován, ale my již víme, že šrafování znamená jen to, že třída ještě není přeložena. Mohli bychom ji sice přeložit, ale protože jsme ji prozatím nic nenaučili, neměli bychom ji z čeho zkoušet. Nebudeme tedy nad ní dlouze bádat a podíváme se jí pěkně na zoubek. 3.2 Zdrojový kód třídy Vybavení třídy potřebnými schopnostmi je na nás. Má-li třída a její instance něco umět, musíme to nejprve zapsat do jejího zdrojového kódu, který je uložen ve zdrojovém souboru, což je textový soubor, jenž se automaticky vytvořil při vytvoření třídy (v našem případě to byl soubor Prádná.java).

88 88 Myslíme objektově v jazyku Java Abychom do tohoto souboru mohli něco zapsat, musíme jej nejprve otevřít. Můžeme toho dosáhnout dvěma způsoby: poklepáním na třídu v diagramu tříd, zadáním příkazu Otevřít v editoru v místní nabídce třídy (viz obr. 3.4). Obrázek 3.4 Příkaz o otevření zdrojového kódu třídy v editoru Vyberte si postup, který je vám sympatičtější, a otevřete editor se zdrojovým kódem třídy Prázdná. Text, který uvidíte (viz obr. 3.5), vygeneroval BlueJ v okamžiku, kdy jste jej požádali o vytvoření nové třídy. Je to prázdná definice třídy, do které budete vpisovat váš program. Jinými slovy: BlueJ za vás napsal to, co byste stejně museli napsat. Obrázek 3.5 Okno zabudovaného editoru Prázdná třída To, co BlueJ připravil, je nejjednodušší možná definice třídy, která vypadá následovně: public class Prázdná {} Vysvětleme si nyní význam jednotlivých částí této definice: public Klíčové slovo public oznamuje, že třída je veřejná a že s ní proto může pracovat kdokoliv. Je sice možné definovat třídu i bez použití klíčového slova public, ale tuto možnost nyní využívat nebudeme a situace, kdy to může být vhodné, si ukážeme až téměř ke konci knihy.

89 Kapitola 3: Vytváříme vlastní třídu 89 Bílé znaky a uspořádání programu Pro mezeru, tabulátor, konec řádku a konec stránky se používá souhrnné označení bílé znaky (v anglický textech se používá termín white space). Java (na rozdíl od některých jiných jazyků) zachází se všemi stejně. Kde může být v programu mezera, tam může být kterýkoliv jiný bílý znak např. konec řádku. V rozebírané definici prázdné třídy je dvojice složených závorek na stejném řádku jako definice třídy, kdežto v okně editoru je každá závorka na samostatném řádku. Java na uspořádání textu do řádků nehledí a nijak nelpí na tom, na kolika řádcích bude příkaz rozprostřen nebo jestli umístíte několik příkazů na jeden řádek. Při psaní programu se proto snažte uspořádat jednotlivé příkazy tak, aby byl program co nejpřehlednější. class Prázdná Klíčové slovo class oznamuje, že za ním následuje definice třídy. Za klíčovém slovem class následuje název neboli identifikátor třídy musí proto splňovat příslušná pravidla (viz pasáž Pravidla pro tvorbu identifikátorů v jazyce Java na straně 56). Kromě toho musí platit, že název veřejné třídy musí být totožný s názvem souboru, v němž je uložen její zdrojový kód, a to včetně velikosti jednotlivých znaků. (Z toho logicky vyplývá, že v jednom souboru může být zdrojový kód nejvýše jedné veřejné třídy.) Soubor se zdrojovým kódem musí mít příponu java. { } Všechny doposud probrané části tvoří hlavičku definice třídy, podle které překladač pozná její základní charakteristiky. Za hlavičkou následuje tělo definice třídy uzavřené ve složených závorkách. Protože je naše definice dosud prázdná, je prázdný i obsah závorek. S výjimkou dvou přesně specifikovaných příkazů (budeme o nich mluvit později) musí být v jazyku Java vše ostatní, tj. atributy i metody, definováno v těle třídy. Poté, co zadáte výše popsanou minimální definici třídy, stiskněte tlačítko Přeložit (je úplně vlevo viz obr. 3.6). BlueJ váš program nejprve uloží, pak se zamyslí (přesněji řečeno překládá) a pokud jste neudělali chybu, tak dole v informačním panelu pod editovaným textem napíše: Třída byla úspěšně přeložena žádné syntaktické chyby Obrázek 3.6 Po úspěšném překladu vypíše editor zprávu

90 90 Myslíme objektově v jazyku Java Vedlejším projevem úspěšného překladu je i přebarvení sloupce s čísly řádků. Podle jeho barvy můžete poznat, zda je třída, jejíž zdrojový kód prohlížíte, přeložena. Zkuste napsat do některého z prázdných řádků mezeru a sloupec zešedne. Přeložte znovu třídu a sloupec zesvětlá. Tím jste dokončili svoji první definici třídy. Vraťte se do okna projektu a podívejte se, jak se její místní nabídka překladem změnila (viz obr. 3.7 porovnejte ji s nabídkou nepřeložené třídy na obr. 3.4). Objevila se v ní např. zpráva pro vytvoření nové instance. Můžete hned vyzkoušet její funkci a instanci vytvořit. Ověříte si tak, že vaše nová třída doopravdy funguje a je např. schopna vytvářet nové instance. Obrázek 3.7 Přeložená prázdná třída je funkční Obrázek 3.8 Obsah složky projektu

91 Kapitola 3: Vytváříme vlastní třídu Soubory projektu Podívejte se nyní na disk do složky, v níž máte uloženy soubory projektu. Můžete se přesvědčit, že se zde objevil nejen soubor Prázdná.java (v tom je, jak víte, vámi napsaný zdrojový kód), ale také soubor Prázdná.class, v němž je uložen přeložený bajtkód. Kromě toho zde naleznete ještě soubor Prázdná.ctxt, ale to je pomocný soubor prostředí BlueJ, který pro svoji práci nepotřebujete (pokud jej smažete, BlueJ si jej při příštím překladu dané třídy vytvoří znovu). Obdobnou trojici souborů naleznete pro každou třídu viz obr Obsah složky je zobrazen prostřednictvím programu mucommander, který je napsán v Javě, takže běží na všech platformách, na kterých běhá Java. Navíc je lokalizován do češtiny a je k dispozici zdarma jako freeware. Pokud byste o něj měli zájem, můžete si jej stáhnout na adrese Soubor s příponou.class, v němž je uložený přeložený bajtkód, bývá označován jako class-soubor příslušné třídy. Obrázek 3.9 Složka projektu po smazání souborů s příponami.class a.ctxt, přejmenování souboru bluej.pkg a vytvoření jeho prázdné verze

92 92 Myslíme objektově v jazyku Java Kdybyste chtěli svůj projekt stěhovat na jiný počítač, stačí, když na něj přenesete pouze soubory s příponou java. Budete-li chtít, aby v přeneseném projektu zůstalo zachováno také uspořádání tříd v diagramu tříd, musíte přenést také soubor bluej.pkg. Ostatní soubory si BlueJ bez problémů a bez zdržování vytvoří, takže se s nimi přenášet nemusíte. Problémy by mohly někdy nastat pouze při přenášení souborů s diakritikou mezi různými operačními systémy. K této problematice se ještě vrátím v podkapitole Stěhování projektu mezi platformami na straně 179. Zdrojový soubor je obyčejný textový soubor. Otevřete-li jej v libovolném textovém editoru, zjistíte, že obsahuje pouze zadaný text, který můžete v tomto editoru klidně upravovat. Jenom dejte pozor na to, abyste jej neupravovali v době, kdy máte v prostředí BlueJ otevřen projekt, do nějž program patří. To byste museli po dokončení úprav v druhém editoru a uložení upraveného souboru přikázat editoru BlueJ, aby soubor opět načetl (příkaz Soubor Načíst znovu nebo klávesová zkratka CTRL+R). Reakci BlueJ na nepřítomnost souborů s příponami.class a.ctxt si můžete vyzkoušet. Zavřete projekt (nemusíte zavírat celý BlueJ, opravdu stačí zavřít aktuální projekt), otevřete složku projektu a smažte všechny soubory s příponami.class a.ctxt. Pak projekt znovu otevřete. Jedinou změnou, kterou zaznamenáte, bude šrafování tříd. BlueJ pozná, že třídy nejsou přeloženy (přesněji pozná, že nemá k dispozici jejich (smazané) class-soubory). Kdybyste ale odstranili soubor bluej.pkg, byla by situace složitější. Zkuste si to, ale nemažte jej stačí jej pouze přejmenovat. Poté vytvořte nový, prázdný soubor pojmenovaný bluej.pkg. Obsah složky projektu pak bude vypadat obdobně jako na obr Zkuste nyní projekt znovu otevřít např. zadáním příkazu Projekt Znovu otevřít. BlueJ sice ve složce najde soubor bluej.pkg, takže ji bude považovat za svůj projekt, ale protože tento soubor bude prázdný, uspořádá třídy v projektu po svém a po svém nastaví i velikost a umístění okna projektu. Pravděpodobný výsledek si můžete prohlédnout na obr Stejného výsledku byste dosáhli i tehdy, když byste soubor bluej.pkg nevytvářeli a otevřeli projekt pomocí příkazu Projekt Otevřít ne-bluej. Nyní projekt opět zavřete, smažte nově vytvořený soubor bluej.pkg a přejmenujte původní, přejmenovaný soubor zpět na bluej.pkg. Otevřete-li nyní projekt, vrátí se diagramu tříd původní uspořádání. 3.4 Odstranění třídy Prázdná třída, kterou jsme před chvílí vytvořili, může sloužit opravdu jen k výukovým účelům. V praxi bychom pro ni asi žádné uplatnění nenašli. Využijeme ji proto ještě k tomu, abychom si na ni ukázali, jak je možno třídu z diagramu tříd odstranit. Než si to ale vyzkoušíte, tak třídu přeložte, abyste ověřili, že při jejím odstranění BlueJ odstraní opravdu všechny soubory, které s ní souvisejí. Navíc od ní vytvořte jednu instanci a nechte uložit odkaz na ni do zásobníku odkazů.

93 Kapitola 3: Vytváříme vlastní třídu 93 Obrázek 3.10 Podoba okno projektu poté, co BlueJ nalezl prázdný soubor bluej.pkg Postup odstranění třídy z projektu je jednoduchý: v místní nabídce rušené třídy zadáte příkaz Odstranit. Protože odstranění třídy je přece jenom operace, která má na celý projekt zásadnější dopad, tak se vás BlueJ pro jistotu nejprve zeptá, jestli to s tím odstraněním třídy myslíte vážně. Jakmile svůj úmysl potvrdíte, odstraní nejenom zdrojový soubor třídy, ale i ostatní soubory s ní spojené a vůbec všechny zmínky o tom, že třída byla někdy součástí projektu. Obrázek 3.11 Před odstraněním třídy vyžaduje BlueJ potvrzení Možná vás překvapí, že po žádosti o odstranění třídy sice třída z diagramu tříd zmizí, avšak její instance v zásobníku odkazů zůstane. Je to proto, že žádost o odstranění třídy je vlastně žádostí o odstranění příslušných souborů z disku. Avšak od chvíle, kdy jste vytvořili instanci třídy, má počítač všechny potřebné informace v operační paměti. Odtud je odstraníte pouze tak, že restartujete virtuální stroj.

94 94 Myslíme objektově v jazyku Java 3.5 Implicitní konstruktor V místní nabídce třídy Prázdná se po překladu objevil příkaz new Prázdná(), pomocí nějž jsme vytvořili její instanci. V minulé kapitole jsme si říkali, že novou instanci nelze vytvořit, aniž bychom ji pak inicializovali speciální metodou, které se říká konstruktor. Jak to, že se tato zpráva objevila v místní nabídce a opravdu se nám jejím zadáním podařilo vyrobit instanci, když jsme žádnou takovou metodu (řádný konstruktor) nevytvořili? Kde se vzala? Konstruktor musí mít každá třída. Pokud proto programátor pro třídu žádný konstruktor nedefinuje, domyslí si překladač, že mu bude stačit ten nejjednodušší a definuje jej pro ni sám. Tento konstruktor označujeme jako implicitní a nedělá nic jiného, než že vezme odkaz na vytvořený objekt obdržený od virtuálního stroje a předá jej okolnímu programu. Jakmile programátor definuje jakýkoliv vlastní konstruktor, překladač se již nenamáhá a implicitní konstruktor nepřidává. Jinými slovy: jakmile programátor definuje ve třídě první konstruktor, musí je definovat všechny, protože překladač již za něj nic nedoplní. Zkuste si vytvořit prázdnou třídu ještě jednou. Je opravdu jednoduchá, takže by vám to nemělo dělat žádný problém. Nyní začneme třídu vylepšovat a definujeme ji tak, aby její instance vytvářely na plátně nějaký obrázek. Pro začátek začneme s něčím opravdu jednoduchým vytvořme např. třídu, jejíž instance nakreslí na plátno symbolický listnatý strom s korunou a kmenem. Pusťme se tedy do toho. Měli bychom začít tím, že tuto třídu naučíme vytvářet své instance. K tomu potřebujeme definovat konstruktor. Musíme si proto prozradit, jak vypadá definice konstruktoru. Pro jednoduchost začneme ekvivalentem implicitního konstruktoru. Definice prázdné třídy s prázdným bezparametrickým konstruktorem bude vypadat následovně: public class Prázdná { public Prázdná() { } } Projděme si nyní uvedený zdrojový kód a podívejme se znovu na význam a umístění jednotlivých částí řádek za řádkem: 1. Hlavička třídy, kterou již známe. 2. Otevírací složená závorka označuje začátek těla třídy. Budeme ji psát na samostatný řádek za hlavičku. Není to sice nutné, ale bude se nám lépe kontrolovat párování otevíracích a zavíracích závorek. Všechny texty uvnitř těla třídy budeme pro přehlednost odsazovat. Velikost odsazení bývá většinou nastavena na 2 až 4 znaky já budu používat 4 znaky, ale vy si můžete nastavit odsazení vlastní. 3. Hlavička konstruktoru. Vidíte, že se podobá hlavičce třídy (a jak zanedlouho zjistíte, je stejná s hlavičkami běžných metod). I tato hlavička je uvozena modifikátorem public, kterým oznamujeme, že s konstruktorem může pracovat každý. Za modifikátorem public následuje jméno třídy, jejíž instanci konstruktor inicializuje a po skončení práce vrátí odkaz na tuto instanci.

95 Kapitola 3: Vytváříme vlastní třídu 95 Za typem vracené instance následuje seznam parametrů v závorkách. U bezparametrického konstruktoru je tento seznam prázdný. Jak uvidíte později, každá metoda musí za případnými modifikátory uvádět typ hodnoty, kterou vrací. Za ním pak uvádí svůj název. Konstruktor je mimo jiné speciální tím, že je to jediná metoda, která nemá název (nebo chcete-li, má jej prázdný). Abych byl úplně přesný, tak interně se konstruktor jmenuje <init> (až budeme naše programy ladit, sami se o tom přesvědčíte), ale protože tento název neodpovídá pravidlům pro tvorbu identifikátorů, pracuje se v programech s konstruktorem jako s bezejmennou metodou. K této otázce se ještě vrátím až budeme probírat definice metod. 4. Tělo konstruktoru je (stejně jako tělo třídy) uzavřeno ve složených závorkách. Stejně jako u tříd budeme otevírací složenou závorku psát na samostatný řádek, abychom si tak usnadnili následnou kontrolu jejího spárování. Stejně jako u těla třídy budeme vnitřek těla konstruktoru odsazovat. 5. Konec těla konstruktoru. Závorku uzavírající tělo konstruktoru budeme psát na samostatný řádek. Uzavírací závorku budeme zarovnávat pod otevírací závorku těla konstruktoru. 6. Konec těla třídy. Stejně jako u konstruktoru i u třídy budeme její uzavírací závorku psát na samostatný řádek. Uzavírací závorku těla třídy budeme zarovnávat pod příslušnou otevírací závorku. Jednou z velmi častých chyb je špatné uzávorkování částí zdrojového textu. Jeho kontrolu výrazně usnadňují dvě věci: Psaní otevíracích a zavíracích závorek na samostatné řádky a pod sebe. Nápověda od editoru. Umístíte-li kurzor za nějakou závorku, editor zvýrazní její protějšek (vyzkoušejte si to). Zkušenější programátoři často umisťují otevírací závorku těla třídy, konstruktoru atd. na konec předchozího řádku. Ušetří tím jeden řádek, ale ztíží tím kontrolu toho, že každá uzavírací závorka má svoji odpovídající otevírací závorku a naopak. Vřele vám proto doporučuji, abyste alespoň zpočátku určitě umisťovali jak otevírací, tak uzavírací závorku na samostatné řádky. Vyhnete se tak řadě oblíbených chyb. Řekli jsme si, že instance naší třídy nakreslí na plátno jednoduchý listnatý strom s korunou a kmenem. Kdybychom jej měli nakreslit ručně, asi bychom vytvořili zelenou instanci elipsy, kterou bychom použili jako korunu, a doplnili ji dole hnědým obdélníkem, který by představoval kmen. (Zkuste si to v interaktivním režimu!) Při tvorbě programu budeme postupovat naprosto stejně, pouze místo zadávání příkazů z nabídky tyto příkazy napíšeme do těla konstruktoru. Naše první smysluplná definice třídy tedy může vypadat např. následovně:

96 96 Myslíme objektově v jazyku Java public class Prázdná { public Prázdná() { new Elipsa ( 0, 0, 100, 100, Barva.ZELENÁ ); new Obdélník( 45, 100, 10, 50, Barva.HNĚDÁ ); } } Co jsme udělali? V těle konstruktoru jsme zadali dva příkazy. Na pátém řádku programu jsme zavolali konstruktor elipsy, kterému jsme předali následujících pět parametrů: vodorovnou a svislou souřadnici jsme nastavili na 0, šířku a výšku jsme nastavili na 100, barvu jsme definovali tak, že jsme předali odkaz na atribut ZELENÁ třídy Barva. Obrázek 3.12 BlueJ odhalil používání tříd, natáhl automaticky šipky závislostí a při překladu třídy přeložil současně i třídy, na nichž daná třída závisí

97 Kapitola 3: Vytváříme vlastní třídu 97 Obdobně jsme postupovali i na šestém řádku v případě obdélníka, který představuje kmen. Zde jsme si pouze museli nejprve spočítat vodorovnou souřadnici kmene, aby byl umístěn přesně pod středem koruny. Má-li mít kmen např. šířku 10 bodů, musí být umístěn 5 bodů před tento střed a to jsme udělali. Všimněte si, že každý příkaz je ukončen středníkem. Na to musíte dát pozor. Zapomenutý středník patří k jedněm z nejčastějších začátečnických chyb (naštěstí je to chyba lehce odhalitelná a odstranitelná). Přeložte nyní upravený program a podívejte se na diagram tříd. BlueJ zaregistroval, že jsme v těle třídy použili třídy Obdélník, Elipsa a Barva, a okamžitě k nim natáhl šipky závislostí (viz obr abyste automaticky natažené šipky lépe viděli, tak jsem aplikační okno trochu roztáhl a prázdnou třídu přesunul). Při překladu naší třídy pak přeložil i tyto tři třídy, protože je naše třída používá. A protože třídy Obdélník a Elipsa používají třídu Plátno, přeložil i tu. Zbylých tříd (tj. tříd Trojúhelník a Směr8) si nevšímal, protože je překládaná třída nepoužívá. Požádejte nyní v diagramu tříd třídu Prázdná, aby vytvořila novou instanci stromu. Po jejím vytvoření bude plátno vypadat podle obr Obrázek 3.13 Plátno se stromem 3.6 Přejmenování třídy Když instance naší třídy kreslí strom, bylo by vhodné, aby se tato skutečnost odrazila i v názvu třídy. Třídu proto přejmenujeme a BlueJ nám v tom pomůže. Změníme-li totiž v souboru, v němž je uložen zdrojový kód, název veřejné třídy, změní BlueJ při ukládání potřebným způsobem i název souboru. Můžete si vše hned vyzkoušet: změňte název třídy Prázdná na Strom. Nemusíte ji ani překládat k tomu, aby BlueJ zareagoval, bohatě stačí třídu uložit (stisknete CTRL+S nebo v editoru zadáte příkaz Třída Uložit). BlueJ pak okamžitě přejmenuje příslušnou třídu v diagramu tříd (viz obr. 3.14) a jak se můžete přesvědčit pomocí nějakého správce souborů, změní příslušně i název zdrojového souboru na disku a smaže případné související soubory navázané na původní název.

98 98 Myslíme objektově v jazyku Java Při pokusu o překlad přejmenované třídy však překladač vypíše v informačním panelu v dolní části okna editoru chybovou zprávu (viz obr. 3.14) invalid method declaration; return type required v níž nás překladač upozorňuje na to, že jsme špatně definovali metodu, protože jsme v ní neuvedli typ návratové hodnoty. Současně v editačním panelu zvýraznil řádek, kde chybu objevil. Podíváte-li se ale na označený řádek, ihned poznáte, že chyba spočívala v něčem jiném: při přejmenovávání třídy jsme zapomněli zadat nový typ návratové hodnoty konstruktoru, tj. typ instance, kterou bude konstruktor inicializovat a vracet odkaz na ni. To za nás BlueJ neudělá (profesionální vývojová prostředí to však dělají). Po přejmenování tohoto typu na Strom již proběhne překlad bez problémů. Obrázek 3.14 Po uložení souboru s přejmenovanou třídou BlueJ tuto třídu v diagramu tříd okamžitě přejmenuje 3.7 Ladění Ne vždy se nám podaří napsat program bez chyby (před chvílí jsme se o tom přesvědčili). Pravdou je spíše opačné tvrzení téměř každý program obsahuje nějakou chybu. Chyby, které se v programech objevují, bychom mohli rozdělit do tří skupin:

99 Kapitola 3: Vytváříme vlastní třídu 99 Syntaktické chyby jsou prohřešky proti pravidlům zápisu jazyka. Tyto chyby jsou svým způsobem nejpříjemnější, protože je odhalí již překladač a poměrně jasně nás na ně upozorní, i když občas neodhalí příčinu chyby správně (viz náš problém s nepřejmenovaným typem návratové hodnoty). Syntaktickou chybou by v našich prvních programech bylo např. vynechání některé ze závorek, případně přidání nadbytečné závorky, vynechání středníku, zkomolení názvu typu návratové hodnoty, atributu či třídy apod. Běhové chyby jsou chyby, na které se nepodaří přijít během překladu a které se projeví až za běhu programu a vedou k nějakým výjimečným situacím. Mezi takovéto chyby patří např. dělení nulou, pokus o použití objektu, který ještě nebyl vytvořen apod. Tyto chyby jsou sice nepříjemné, ale při důkladném testování programu bychom je měli mít šanci všechny (nebo alespoň skoro všechny) odhalit a opravit. Logické chyby (často se setkáte s označením sémantické 1 chyby) jsou chyby v logice programu, které zapříčiní, že program nedělá přesně to, co má. Ty se umějí nejlépe maskovat a dá většinou nejvíce práce je odhalit a opravit. Sémantickou chybou by v našem předchozím programu např. bylo, kdybychom špatně spočítali souřadnice nebo velikost obrazců a výsledný strom by pak vypadal divně, pokud by vůbec vypadal jako strom. Vyzkoušíme si nyní všechny druhy chyb a podíváme se, jak na ně bude počítač (a následně i my) reagovat. Syntaktické chyby Jak jsem již řekl, odhalování a opravování syntaktických chyb je nejjednodušší, i když i ony nám jsou schopny občas připravit pěkný rébus. Již jsme se s takovou chybou setkali nyní si o nich povíme podrobněji. Udělejte nejprve v programu chybu odstraňte např. středník za prvním příkazem a zkuste program znovu přeložit. BlueJ váš program opět nejprve uloží a pak jej začne překládat. Protože však najde v programu chybu, překlad nedokončí a místo očekávané hlášky Třída byla úspěšně přeložena žádné syntaktické chyby zobrazí v dolním informačním poli chybovou zprávu ';' expected (viz obr. 3.15). Navíc ve zdrojovém textu zvýrazní řádek, v němž chybu odhalil. Obrázek 3.15 BlueJ ohlásil chybu při překladu 1 Sémantický = významový.

100 100 Myslíme objektově v jazyku Java Tato zpráva je sice psána anglicky, ale klepnutím na otazník na pravém okraji informačního pole otevřete dialogové okno, které vám většinou chybové hlášení přeloží a často i česky vysvětlí viz obr Tato vysvětlení sice nejsou k dispozici pro všechny chyby, nicméně nejčastější chyby takto vysvětleny jsou. Minule se překladač spletl v odhadu příčiny chyby, nyní se spletl v označení řádku s chybou. Zapomenutý středník je typickou chybou, na kterou překladač přijde na jiném místě programu, než na kterém k chybě došlo. Chybu totiž neoznámí v místě, kde jsme ji udělali, ale v místě, kde ji odhalil. V našem předchozím příkladě mu samozřejmě nevadilo, že jsme středník neudělali hned za voláním konstruktoru. Jak jsem již řekl, Javě je poměrně jedno, jak program uspořádáme do řádků. Překladač proto objeví chybějící středník až v okamžiku, kdy narazí na něco, co nemůže do zpracovávaného příkazu zařadit. V našem případě to byl další operátor new nalezený na následujícím řádku. Jakmile chybu opravíte, BlueJ váš program přeloží a budete jej moci znovu používat. Obrázek 3.16 Pro většinu chyb má BlueJ připraveno české vysvětlení Zkuste vyrobit další syntaktické chyby tak, že odstraníte nebo přidáte do programu nějaký znak, a podívejte se, jak na ně bude BlueJ reagovat. Běhové chyby Běhové chyby jsou v pořadí nepříjemnosti chyb uprostřed. Překladač je sice neodhalí již při překladu, avšak chyba se iniciativně projeví při běhu programu většinou tím, že program zkolabuje. Abychom takovéto chyby odhalili, musí program krizovým místem proběhnout. Musíme si proto připravit sadu testů, které postupně prozkoumají všechna zákoutí programu a umožní nám takovéto chyby najít dřív, než na ně přijde zákazník. Podívejme se, jak v případě takovýchto chyb reaguje BlueJ. Zkuste např. v prvním příkazu nahradit první nulu výrazem 0/0 (v programech se pro dělení používá znak / ) a požádejte opět o překlad.

101 Kapitola 3: Vytváříme vlastní třídu 101 Dřívější verze překladačů si takové chyby většinou nevšimly. Používáte-li však Javu 6.0 či novější a instalovali si upravenou konfiguraci, překladač vás na tuto chybu upozorní oknem (viz obr. 3.17). Upozornění překladače má pouze povahu varování, protože neví, jestli jste uvedený výraz nezadali do programu schválně. Program se proto úspěšně přeloží a je na vás, zda chybu ze zdrojového kódu odstraníte nebo ji tam ponecháte. Obrázek 3.17 Varování překladače, když ve zdrojovém kódu objeví potenciální chybu Požádáte-li nyní třídu Strom o vytvoření instance, nepodaří se jí to. BlueJ proto otevře textový editor, zobrazí ve zdrojovém kódu místo, kde došlo k chybě, a ve spodním informačním poli vypíše, o jakou chybu se jedná. V našem případě zde napsal (viz obr. 3.18): ArithmeticException: / by zero Tuto zprávu bychom mohli přeložit tak, že vznikla výjimka při aritmetické operaci. Na druhém řádku je pak specifikováno, že se jedná o dělení nulou. Obrázek 3.18 Reakce prostředí na běhovou chybu BlueJ navíc otevře okno terminálu, kde se o objevené chybě rozepíše poněkud podrobněji viz obr (Zprávy vypisované v tomto okně se naučíme číst později.)

102 102 Myslíme objektově v jazyku Java Obrázek 3.19 Okno terminálu s výpisem historie vzniku chyby Takováto chyba je však příliš primitivní a v programu byste ji asi neudělali. Zkusíme nějakou rafinovanější. Odstraňte z příkazu dělení nulou a zkuste je nahradit zápornou hodnotou. Příkaz pak bude mít podobu: new Elipsa( -3, 0, 100, 100, Barva.ZELENÁ ); Takováto podoba běhové chyby je daleko pravděpodobnější. Je nenápadná a k podobnému přehlédnutí může snadno dojít. Výsledek je však stejný: dojde k výjimečné situaci a program se zastaví v místě, kde k ní došlo (viz obr. 3.20). V uvedeném případě pak vypíše: IllegalArgumentException: Parametry nemají povolené hodnoty: x=-3, y=0, šířka=100, výška=100 Problém je v tom, že tentokrát k chybě dojde v konstruktoru elipsy, který odmítne vytvořit elipsu na záporných souřadnicích (to se ještě dá ze zprávy vyčíst). Vy však potřebujete vědět, kde chyba doopravdy vznikla. V našem jednoduchoučkém programu je to jasné, ale ve složitějších programech je to docela problém. Naštěstí Java nabízí prostředky, jak to zjistit. Jejich použití ale patří k vyšší škole programátorského umění, takže si o nich povíme až později. Obrázek 3.20 Konstruktor elipsy odmítá vytvořit instanci se zápornými souřadnicemi

103 Kapitola 3: Vytváříme vlastní třídu 103 Logické (sémantické) chyby Základním problémem logických chyb je to, že si je nemusíme dlouho uvědomovat. Možná někteří z vás slyšeli o aféře s mikroprocesory Intel Pentium, které v jednom z triliónů případů ne zcela přesně vydělily dvě čísla. Nic nehavarovalo, jenom výsledek měl někde na desátém desetinném místě chybu. Na takovou chybu se dá přijít opravdu jen náhodou. V tom právě spočívá záludnost logických chyb. Intel se snažil tuto chybu bagatelizovat poukázáním na řídkost jejího výskytu a relativní nicotnost jejího projevu (desáté desetinné místo se ve výsledku málokdy projeví). Jenže při obřím počtu operací, které počítač každou sekundu provede, její výskyt zase nebyl tak řídký, a je řada programů, kde takováto chyba mohla na konci vést k fatálním haváriím. (Intel také dlouho vzdorovat nevydržel a nakonec všechny vadné procesory vyměnil.) Uděláte-li v programu chybu, která je hned viditelná (např. umístíte-li špatně kmen vůči koruně stromu), je to v pohodě. Uděláte-li však chybu, která se navenek nijak výrazně neprojevuje, avšak o to citelněji škodí, je to obrovský problém. I logické chyby se snažíme odhalit sadou propracovaných testů, avšak u složitějších programů můžeme těžko zaručit, že jsme otestovali opravdu vše a že program žádné logické chyby neobsahuje. V dalším textu se vám budu snažit průběžně dávat tipy na to, jak logické chyby odhalovat, ale dopředu vám říkám, že pro jejich odhalení žádné zaručené pravidlo neexistuje. 3.8 Konstruktor s parametry Doufám, že jsem vás předchozí podkapitolou o chybách moc nevyděsil a že můžeme pokračovat a dále vylepšovat náš první program. Strom jsme sice nakreslili, ale vytvoříme-li druhý, nebudeme jej moci od prvního odlišit, protože se budou překrývat. Vytvoříme proto druhý konstruktor, který bude mít parametry, jež nám umožní specifikovat, kam se má vytvářený strom nakreslit. Vzpomeneme si, že parametry se píší do kulatých závorek za název typu inicializované instance a že před každým parametrem musí být nejprve uveden jeho typ. Je-li parametrů více, oddělují se čárkou. V naší analogii bychom mohli parametry považovat za pojmenované kapsy (schránky), které má robot na sobě. Chce-li někdo vyvolat danou metodu-robota, musí nejprve do těchto schránek vložit informace, podle kterých robot pozná, co má vlastně dělat. Dokud mu tyto informace nedodáte, překladač program ani nepřeloží. Definice konstruktoru umožňujícího nakreslit strom na zadané souřadnice by mohla vypadat následovně: public Strom( int x, int y ) { new Elipsa ( x, y, 100, 100, Barva.ZELENÁ ); new Obdélník( x+45, y+100, 10, 50, Barva.HNĚDÁ ); }

104 104 Myslíme objektově v jazyku Java Nenechte se zmást číslováním řádků. Čísla řádků ve výpisech programů jsou určena pouze k tomu, abych se na ně mohl v dalším textu odvolávat. Definice všeho, co k třídě patří, musí být samozřejmě uvnitř těla třídy. Tuto novou definici proto umístíte v těle třídy před nebo za definici bezparametrického konstruktoru, kterou jste zadali před chvílí viz definici třídy Strom se třemi konstruktory na str Proberme si předchozí definici podrobněji: 1. V hlavičce konstruktoru se objevil neprázdný seznam parametrů. Všimněte si, že u každého parametru je uveden nejprve jeho typ a za ním identifikátor, jehož prostřednictvím se program na parametr v těle konstruktoru odvolává. 2. Složená závorka otevírající tělo konstruktoru. 3. Tam, kde jsme v bezparametrickém konstruktoru dosazovali hodnoty vodorovné a svislé souřadnice konstruované elipsy, dosazujeme nyní hodnoty parametrů x a y. Zásada je taková, že kde chceme dosadit hodnotu parametru, tam vložíme jeho název. 4. V dalším příkazu jsme použití parametrů ještě vylepšili a dosadili jsme je přímo do výrazů. Jako vodorovnou souřadnici obdélníka dosadíme číslo, které je o 45 větší než hodnota parametru x, a za svislou souřadnici číslo, které je o 100 větší než hodnota parametru y. 5. Složená závorka zavírající tělo konstruktoru. Pokud jste se v dřívějších dobách setkali s programováním, možná vás nutili používat pouze procedury a funkce, které jste před tím v programu definovali. Java na vás takovéto požadavky neklade. Na pořadí, v jakém definujete jednotlivé konstruktory a další prvky programu, jí nezáleží. Zvolte je proto tak, abyste se v programu co nejlépe orientovali. Přidejte výše uvedený kód do těla třídy vedle bezparametrického konstruktoru a třídu přeložte. Vraťte se pak do prostředí BlueJ a vytvořte na různých místech plátna několik instanci třídy Strom. Přesvědčte se, že se stromy nakreslily opravdu tak, jak bylo vaším záměrem. Vytvořte některou z tříd ČinkaO (O=Obdélník), ČinkaK (K=Kruh), Hvězda, Panáček, Panenka, jejichž instance se na plátně zobrazí obdobně, jako na obrázku Obrázek 3.21 Obrázky tvarů, které si můžete samostatně vytvořit

105 Kapitola 3: Vytváříme vlastní třídu 105 Použití skrytého parametru this Oba konstruktory, které jsme doposud vytvořili, jsou si velice podobné. To je u konstruktorů velmi časté, protože mají velice podobné úkoly. Programátoři jsou ale lidé líní (proto se také dali na programování) a neradi píší něco dvakrát. Opakované psaní stejného kódu je navíc i nebezpečné, protože když budeme chtít v tomto kódu později něco změnit, musíme si pamatovat, kde všude jsme jej použili, všechna místa navštívit a do kódu příslušnou změnu zanést. Stačí na jedno místo zapomenout nebo v něm opravu zanést trochu jinak a chybička je na světě. Obecně bychom mohli říci, že opakování kódu patří k závažným programátorským hříchům. Java naštěstí nabízí způsob, jak se opakovanému psaní těla konstruktoru vyhnout umožňuje, aby jeden konstruktor požádal jiný, aby za něj inicializaci instance (nebo alespoň její část) provedl. Využíváme přitom skrytého parametru this, v němž virtuální stroj předá konstruktoru odkaz na vytvořenou instanci. Kdykoliv konstruktor po této instanci něco chce, obrací se na ni prostřednictvím tohoto odkazu. V pasáži Vytváříme svou první instanci na straně 53 jsme si říkali, že virtuální stroj alokuje paměť pro novou instanci a odkaz na ni předá konstruktoru. Neřekli jsme si však jak tak teď to víte: předává ji v parametru this. Protože se tento parametr vyskytuje ve všech konstruktorech a metodách instancí, vyšli autoři jazyka vstříc lenosti programátorů a definovali syntaxi tak, že se tento parametr v hlavičkách neuvádí. Víme ale, že tam je a můžeme jej kdykoliv použít. Jak se zanedlouho dozvíme, všechny metody se v programu volají tak, že napíšeme odkaz na instanci, jejíž metodu voláme, a za něj tečku následovanou názvem volané metody a seznamem hodnot jejích parametrů. Kdybychom stejně zavolali jiný konstruktor (připomínám, že konstruktor je metoda beze jména), vypadal by příslušný příkaz: this.( seznam_parametrů ); Uvědomíme-li si však, že u běžných metod slouží tečka k oddělení dvou identifikátorů, tak nám dojde, že ji tu vlastně nepotřebujeme. Syntaktická pravidla jazyka ji proto vypouštějí a dokonce ji ani napsat nesmíme. Správně zadané předání řízení jinému konstruktoru proto vypadá this( seznam_parametrů ); Takovéto volání jiného konstruktoru musí být úplně prvním příkazem těla konstruktoru. Před ním smí být již pouze bílé znaky. Protože však víme, že se jedná o inicializaci instance, pochopíme, že tou by se mělo začít a že když už se jeden konstruktor svého práva na inicializaci vzdal ve prospěch jiného, měl by s jakoukoli další akcí počkat až na dokončení inicializace pověřeným kolegou. Využijeme-li klíčové slovo this, mohla by definice třídy Strom vypadat např. následovně: public class Strom { public Strom() { this( 0, 0 );

106 106 Myslíme objektově v jazyku Java } } public Strom( int x, int y ) { new Elipsa ( x, y, 100, 100, Barva.ZELENÁ ); new Obdélník( x+45, y+100, 10, 50, Barva.HNĚDÁ ); } Vyzkoušejte si, že i po této změně vše pracuje podle očekávání. Zkusme nyní naši definici ještě vylepšit a definovat konstruktor, který by umožňoval zadat i výšku a šířku konstruovaného stromu. U tohoto stromu se budeme snažit dodržet pravidlo, že výška kmene je polovinou výšky koruny a šířka kmene je zhruba desetinou šířky koruny. Tím se nám sice definice trochu zkomplikuje, ale na druhou stranu získáme obecnou definici, která dokáže vytvářet stromy libovolné velikosti a v libovolné pozici. Protože bychom po prostém přidání této definice měli opět zdvojený kód, tak v konstruktoru se souřadnicemi opět použijeme volání konstruktoru s využitím klíčového slova this. Máme-li definovat konstruktor, který dokáže nastavit i výšku a šířku stromu, musíme vědět, jak se v programu zadává násobení a dělení. Prozradím vám, že naprostá většina programovacích jazyků používá pro násobení symbol * (hvězdička) a pro dělení symbol / (lomítko). Stejně je tomu i v Javě. Abychom měli přehled aritmetických operátorů kompletní, tak vám prozradím, že Java zavádí ještě operátor %, který vrací zbytek po dělení svých dvou operandů (např. 5 % 3 je 2). Výsledný kód vypadá následovně: public class Strom { public Strom() { this( 0, 0 ); } } public Strom( int x, int y ) { this( x, y, 100, 150 ); } public Strom( int x, int y, int šířka, int výška ) { new Elipsa ( x, y, šířka, 2*výška/3, Barva.ZELENÁ ); new Obdélník( x+9*šířka/20, y+2*výška/3, šířka/10, výška/3, Barva.HNĚDÁ ); } Při seznamování s příkazy jsem vám říkal, že Java nelpí na tom, aby byl příkaz na jednom řádku. V předchozím programu jsem toho využil a příkaz na řádku 16 bezostyšně zalomil na dva řádky, protože se mi na jeden řádek nevešel. V programátorském světě bývá dobrým zvykem nedělat řádky delší než 80 znaků 1. Tuto zásadu se snažím dodržovat i v doprovodných programech k této učebnici. 1 Tuto délku řádku zavedly první programovací jazyky padesátých let jako povinnou (jazyk Fortran měl délku řádku a uspořádání textu na řádku definováno jako součást syntaxe), protože se jejich programy děrovaly do děrných štítků, které měly právě 80 sloupců. 80 sloupců pak měly i monitory prvních osobních počítačů.

107 Kapitola 3: Vytváříme vlastní třídu 107 Prvé dva konstruktory v programu samy nic nedefinují a nechávají za sebe pracovat jiný konstruktor, kterému pouze předají vhodné hodnoty parametrů. Všimněte si, že prvý konstruktor pověřuje druhý a druhý pověřuje třetí. Při zavolání bezparametrického konstruktoru se proto nejprve zavolá druhý konstruktor, kterému se předají nulové souřadnice, a ten místo sebe zavolá třetí konstruktor, jemuž předá převzaté souřadnice a přidá k nim informace o požadované implicitní velikosti stromu. S takovýmto řešením se v programech setkáte často je to vlastně dotažená zásada, že se ve zdrojovém kódu nemá pokud možno žádná část programu opakovat. V prvém konstruktoru jsou proto definovány implicitní souřadnice a v druhém pak implicitní velikost. Kdybychom hned v prvém konstruktoru volali třetí konstruktor, museli bychom uvést implicitní souřadnice i zde. Když bychom se je pak později rozhodli změnit, museli bychom si pamatovat, že jsou na dvou místech a na obou místech je pak také opravit. Opět platí: v takto jednoduchém programu byste to asi nepřehlédli (i když kdo ví ), ale ve složitějších programech by už bylo nebezpečí přehlédnutí veliké. Znovu proto připomínám: Naučte se psát i jednoduché programy podle zásad, které je třeba dodržovat při psaní programů složitých. Zlozvyky se velice těžko odnaučují a kromě toho nikdy nevíte, jak vám váš program v průběhu doby naroste. Definujte výše popsané obecnější konstruktory s parametry i pro svoji třídu, kterou jste vytvořili podle úkolu na konci podkapitoly o bezparametrickém konstruktoru. 3.9 Přetěžování V minulé podkapitole jsem vám říkal, že definujeme-li několik verzí konstruktorů nebo stejnojmenných metod, které se liší pouze počtem a/nebo typem svých parametrů, označujeme to za přetěžování. Občas se mne studenti ptají, jak program pozná, kterou verzi přetíženého konstruktoru či metody má v reakci na danou zprávu použít. Prozradím vám, že klíčovou úlohu zde hrají typy parametrů. Mohli byste si to např. představit tak, že interně používá překladač jméno konstruktoru, které je složené z jeho vlastního jména (možná si ještě z poznámky na straně 95 pamatujete, že interně se konstruktor jmenuje <init>) následované seznamem typů parametrů. Vezměme si třeba obdélník ten má tři konstruktory, které bychom podle předchozího pravidla mohli pojmenovat např. (oddělovací znak # jsem si vymyslel sám): <init> <init>#int#int#int#int <init>#int#int#int#int#barva Obdobně je to i s metodami. Podíváme-li se např. na metody realizující odpověď na zprávu požadující posun vpravo, budou dvě, pojmenované podle našeho předchozího pravidla: posunvpravo posunvpravo#int Stejně dobře bychom však pro ně mohli zavést interní názvy: <init>() <init>(int,int,int,int) <init>(int,int,int,int,barva)

108 108 Myslíme objektově v jazyku Java resp. posunvpravo() posunvpravo(int) Všimněte si, že v tomto interním jméně není ani zmínka o typu návratové hodnoty. Proto nemůžeme definovat metody, které by se lišily pouze v typu návratové hodnoty, protože by pak měly pro překladač stejná jména a to překladač nepřipustí (můžete si to vyzkoušet). Při zápisu zpráv jsem doposud uváděl názvy parametrů tak, jak je BlueJ vypisoval v místní nabídce třídy nebo instance. Tento způsob budu v dalším textu používat pouze v případě, kdy vás budu žádat, abyste z místní nabídky třídy nebo instance poslali třídě či instanci zprávu. Pak má smysl, protože vám umožní požadovanou položku v nabídce rychle najít. Při zmínkách o konstruktorech a metodách v programu budu ale od této chvíle uvádět v závorkách za názvem seznam typů jejich parametrů, protože ten daný konstruktor či metodu jednoznačně charakterizuje (a podle něj je poznává i překladač). Současně také přestanu uvádět typ návratové hodnoty. Výše zmíněné metody bych tedy dále uváděl jako metody posunvpravo() a posunvpravo(int), pětiparametrický konstruktor obdélníka bych uváděl jako Obdélník(int,int,int,int,Barva) Testování V podkapitole o chybách jsme si říkali, že chceme-li minimalizovat počet chyb ve výsledném programu, musíme pro něj pečlivě připravit sadu testů, kterým budeme program průběžně podrobovat, abychom se na konci práci nedivili, že něco, co kdysi fungovalo, fungovat přestalo. Moderní programování jde ale ještě dál. V současné době se stále více prosazuje myšlenka definovat nejprve sadu testů a teprve pak psát testovaný program. Při psaní programu se pak stačí soustředit pouze na to, aby výsledný program prošel napsanými testy. Jakmile program testy projde, programátor se zamyslí, jak by jej měl dále vylepšit, zase napíše testy a opět se snaží upravit program tak, aby testy prošel. Tato metodika již získala své jméno: Test Driven Development vývoj řízený testy. Používá se pro ni zkratka TDD 1. Budu-li se na ni chtít v textu někdy odvolat, tak použiji tuto zkratku. TDD vývoj řízený testy Postup doporučovaný TDD je možná na první pohled nesmyslný, ale při bližším zkoumání zjistíte, že má řadu výhod: V průběhu psaní testů si programátor ujasní, co přesně má vytvářený program dělat. Při psaní programu může kdykoliv spustit předpřipravenou sadu testů a průběžně na nich kontrolovat, kolik jich už proběhlo a kolik práce mu ještě zbývá. Ve chvíli, kdy proběhnou všechny testy, je programátor s prací hotov a nemusí již přemýšlet nad tím, jestli v jeho programu nejsou chyby. 1 O této metodice vyšla velice zajímavá knížka Beck K.: Test-Driven Development By Example, Addison Wesley, Český překlad Vývoj programů řízený testy, Grada, 2004 (ISBN ).

109 Kapitola 3: Vytváříme vlastní třídu 109 Zkušenost ukazuje, že máte-li připravenou sadu testů před začátkem programování, je produktivita vaší práce výrazně vyšší nejspíš proto, že jste klidnější, protože jste si jisti, že vám tyto testy kryjí záda a že můžete v každé situaci vyzkoušet, jestli se program po úpravě chová lépe nebo hůře. Budeme se proto této zásady snažit držet i v této učebnici. Bohužel, nebudu se jí moci držet pořád (i když bych rád), protože by rozsah knihy narostl do neúměrné velikosti. Jednou za čas si však vývoj části programu za pomoci této metodiky ukážeme. Zprovoznění nástrojů pro automatizaci testů Testování je sice velice důležité a potřebné, ale na druhou stranu to byla spolu s psaním dokumentace vždy nejméně oblíbená programátorská činnost. Situace se změnila v druhé polovině devadesátých let, kdy se objevila knihovna JUnit umožňující testování automatizovat. Knihovna se rychle rozšířila a v současné době je jednou z povinných součástí profesionálních vývojových prostředí. Autoři prostředí BlueJ jsou také přesvědčeni o důležitosti testů. Proto tuto knihovnu do programu zabudovali a navíc přidali několik dalších nástrojů, které přípravu a spouštění testů ještě dále zjednodušují. Tyto nástroje nyní zprovozníme. 1. Zadejte v prostředí BlueJ příkaz Nástroje Nastavení. 2. V následně otevřeném dialogovém okně BlueJ: Nastavení aktivujte kartu Různé. 3. Zaškrtněte políčko Zobrazit nástroje pro testování (viz obr. 3.22). 4. Stiskem OK své zadání potvrďte. Obrázek 3.22 Aktivace testovacích nástrojů Okno BlueJ bude od této chvíle obsahovat v levém pruhu jeden indikátor Záznam a tři nová tlačítka, jejichž význam a použití si ukážeme za chvíli. Současně se místní nabídka tříd rozšíří o příkaz k definici testovací třídy (viz obr. 3.23, v němž jsem navíc přesunul třídu IO, aby se čára závislosti zbytečně neklikatila).

110 110 Myslíme objektově v jazyku Java Testovací třída Testovací třída je třída jako každá jiná. Její zvláštnost spočívá v tom, že je napojena na jednu chytrou knihovnu. Navíc dokáže úzce spolupracovat s prostředím BlueJ a nabídnout nám tak některé velice výhodné služby. Obrázek 3.23 Po zobrazení testovacích nástrojů přibudou v levém panelu tři tlačítka a indikátor záznam a v místní nabídce třídy přibude příkaz pro vytvoření testovací třídy Pro případy, kdy je třeba blíže specifikovat nějakou speciální vlastnost třídy, zavádí jazyk UML tzv. stereotyp, což je text uzavřený ve «francouzských uvozovkách» (zdvojených špičatých závorkách), který se vkládá nad název třídy. Puristé možná namítnou, že česká pravidla vkládají francouzské uvozovky»špičkami dovnitř«, ale my je vědomě porušíme a budeme se držet programátorské verze, která je vkládá «špičkami ven», takže je lze dobře použít jako další verzi závorek. Kdybyste někdy potřebovali vložit francouzské uvozovky z klávesnice, tak vám prozradím, že otevírací mají kód 0171 a zavírací Pomocí něj je můžete zadat z numerické klávesnice.

111 Kapitola 3: Vytváříme vlastní třídu 111 Abychom v diagramu tříd na první pohled odlišili testovací třídy od ostatních tříd, umožňuje BlueJ vybarvit jejich ikony jinou barvou a navíc je označuje stereotypem <<unit test>>. Termín unit test naznačuje, že se jedná o test jednotky. O tom, co je to jednotka, přitom rozhoduje programátor může to být třída, část třídy, anebo naopak celý projekt. Do testovací třídy pak umisťujeme všechny testy prověřující danou jednotku. Testovací třídu můžeme vytvořit např. tak, že v místní nabídce třídy, kterou chceme testovat, zadáme příkaz Vytvořit testovací třídu. BlueJ pak vytvoří novou třídu, jejíž název bude začínat názvem testované třídy a končit slovem Test. Ikonu této třídy zasune v diagramu tříd pod ikonu třídy, v jejíž místní nabídce jsme vytvoření testovací třídy zadali (viz obr. 3.24). Obrázek 3.24 Testovací třída třídy Strom V diagramu tříd se bude ikona testovací třídy držet ikony testované třídy jako klíště. Kamkoliv ikonu testované třídy posunete, posune se ikona testovací třídy za ní. BlueJ vám dokonce ani nedovolí ikonu testovací třídy samostatně posunout. Přípravek Velmi často je výhodné provádět každý z testů se stejnou výchozí sadou objektů. K tomuto účelu nabízí BlueJ možnost definovat tzv. přípravek, což je sada objektů, které se vytvoří před spuštěním každého testu, doplněná případně o nastavení nějakých okrajových podmínek.

112 112 Myslíme objektově v jazyku Java Definice přípravku je jednoduchá: odkazy na všechny objekty, které chcete do přípravku umístit, nejprve připravíte do zásobníku odkazů a pak v místní nabídce příslušné testovací třídy zadáte příkaz Zásobník odkazů > testovací přípravek. BlueJ pak všechny odkazy ze zásobníku odkazů odebere, umístí je do testovacího přípravku a restartuje virtuální stroj. Můžeme si to hned vyzkoušet. 1. Restartujte virtuální stroj (to se naučte dělat před každým vytvářením přípravku). BlueJ totiž naprogramuje veškerou činnost, kterou jste udělali od posledního restartu virtuálního stroje. 2. Požádejte třídu Strom, aby vytvořila následující objekty: strom1 vytvořený bezparametrickým konstruktorem, strom2 vytvořený na souřadnicích x=25, y=150, strom3 o šířce 100 a výšce 90 vytvořený na souřadnicích x=100, y= Požádejte třídu StromTest, aby vaši dosavadní činnost uložila jako přípravek. Třída si pak všechny odkazy zapamatuje a restartuje virtuální stroj (a tím zároveň smaže odkazy ze zásobníku odkazů). 4. Požádejte nyní třídu StromTest, aby naplnila zásobník odkazů z přípravku (tj. zadejte v její místní nabídce příkaz Testovací přípravek -> Zásobník odkazů). Třída vytvoří všechny instance, na které byly před tím v zásobníku odkazů odkazy, a tyto odkazy umístí do zásobníku. Odkazy budou mít i stejná jména, jen jejich pořadí se možná bude lišit, ale na tom beztak nezáleží. Jak už jsem řekl, při tvorbě přípravku si musíte uvědomit, že BlueJ sleduje vaše chování od posledního restartu virtuálního stroje, tj. např. od chvíle, kdy jste naposledy vytvořili, resp. přeložili nějakou třídu. Budete-li si před vlastním vytvořením přípravku hrát a vytvářet a mazat různé objekty, BlueJ po žádosti o uložení obsahu zásobníku do přípravku uloží nejenom poslední akce, ale také všechny vaše hrátky od posledního restartu virtuálního stroje. BlueJ si totiž nevytváří přípravek na základě toho, co najde v zásobníku odkazů, ale na základě toho, jaké zprávy jste poslali od posledního restartu virtuálního stroje. Chcete-li proto mít jistotu, že sledování vaší činnosti začne právě teď, požádejte BlueJ o restartování virtuálního stroje. Restart můžete vynechat pouze tehdy, pokud jste před začátkem záznamu přeložili nějakou třídu, protože žádost o překlad automaticky restartuje virtuální stroj. Úprava obsahu přípravku Někdy se stane, že si dodatečně uvědomíme, že by se nám hodilo, aby přípravek vypadal trochu jinak. Není problém stačí nasypat obsah přípravku do zásobníku, přidat nebo odebrat příslušné instance a výslednou podobu zásobníku opět uložit do přípravku. Opět si to hned zkusíme: 1. Restartujte virtuální stroj. 2. Požádejte třídu StromTest o naplnění zásobníku odkazů. 3. Požádejte třídu Strom o vytvoření instance strom4 na souřadnicích x=200, y=0, o rozměrech šířka=100, výška= Požádejte třídu StromTest o převedení zásobníku odkazů na přípravek. 5. Třída otevře dialogové okno, v němž vás upozorní na to, že daný test již má deklarovaný přípravek, a zeptá se vás, jestli jej chcete nahradit (viz obr. 3.25). Odpovězte stiskem tlačítka Nahradit.

113 Kapitola 3: Vytváříme vlastní třídu 113 Obrázek 3.25 Svůj úmysl předefinování testovacího přípravku musíte potvrdit 6. Od této chvíle má třída deklarován nový přípravek, který můžete ihned vyzkoušet. Po jeho aktivaci by mělo plátno vypadat obdobně jako na obr Obrázek 3.26 Vzhled plátna generovaný upraveným testovacím přípravkem Výše popsaným způsobem má smysl upravovat testovací přípravek tehdy, chcete-li do něj zahrnout ještě nějaký další objekt. Není moudré se takto interaktivně pokoušet z přípravku nějaký objekt odstranit. V takovém případě je výhodnější otevřít zdrojový kód třídy a zařazení objektu do zásobníku odkazů změnit ručně. K této problematice se ještě vrátíme, až toho budeme vědět dost na to, abychom si mohli prohlédnout zdrojový kód testovací třídy a ukázat si, jak jej můžeme sami upravovat. Prozatím se spokojíme s tím, že testovací přípravek je naším testem, který nám umožní ověřit, že náš program funguje správně. Závěrečnou verzi třídy, k níž jsme dospěli v této kapitole, najdete v projektu _Přídavky pod názvem Strom_3. Do projektu jej můžete načíst postupem popsaným v podkapitole Doplnění projektu o třídu odjinud na straně 130. Vytvořte testovací třídy s přípravky i pro vaše vlastní třídy a vyzkoušejte, že fungují.

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků,

Více

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 O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích.

Více

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

Kurzy, Podrobnější informace najdete na www.amaio.cz Dotazy a přihlášky můžete posílat na kurzy@amaio.cz O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích.

Více

knihovna programátora

knihovna programátora knihovna programátora Učebnice pro ty, kteří nechtějí zůstat obyčejnými kodéry, ale chtějí se stát špičkovými architekty Postupuje podle metodiky Architecture First Soustředí se na návrh programů a osvojení

Více

knihovna programátora

knihovna programátora knihovna programátora Učebnice pro ty, kteří nechtějí zůstat obyčejnými kodéry, ale chtějí se stát špičkovými architekty Postupuje podle metodiky Architecture First Soustředí se na návrh programů a osvojení

Více

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

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33 Stručný obsah Část 1: Zahřívací kolo Kapitola 1 Co je a k čemu je návrhový vzor 33 Kapitola 2 Zásady objektově orientovaného programování 39 Kapitola 3 Co konstruktor neumí (Jednoduchá tovární metoda Simple

Více

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

Generátor kódu. a jeho uplatnění ve výuce programování. Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Generátor kódu a jeho uplatnění ve výuce programování Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Trendy poslední doby Další a další státy si uvědomují nutnost zařazení výuky programování do učiva základních

Více

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

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 Ú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 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

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

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20 Obsah 5 Obsah Předmluva k aktuálnímu vydání 15 1 Úvod k prvnímu vydání z roku 2000 16 Typografické a syntaktické konvence................ 20 2 Základní pojmy 21 2.1 Trocha historie nikoho nezabije................

Více

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

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013 Předměty Algoritmizace a programování Seminář z programování Verze pro akademický rok 2012/2013 Verze pro akademický rok 2012/2013 1 Přednášky Jiřina Královcová MTI, přízemí budovy A Tel: 48 53 53 521

Více

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

knihovna programátora

knihovna programátora knihovna programátora Učebnice pro ty, kteří nechtějí zůstat obyčejnými kodéry, ale chtějí se stát špičkovými architekty Postupuje podle metodiky Architecture First Soustředí se na návrh programů a osvojení

Více

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

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

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

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů... 8-1 8.2 Standardně zavedené proudy... 8-1 8. David MATOUŠEK OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PØÍKLADECH Praha 2011 David Matoušek Objektové programování v C++ v pøíkladech Lektoroval Ing. Bohumil Brtník, Ph.D. Bez pøedchozího písemného svolení nakladatelství

Více

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

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo Viditelnost Přístup ke třídám i jejim prvkům lze (podobně jako např. v C++) regulovat. Přístupem se rozumí jakékoli použití dané třídy, prvku

Více

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz

Vaše jistota na trhu IT. Balíčky. Rudolf Pecinovský rudolf@pecinovsky.cz Vaše jistota na trhu IT Balíčky Rudolf Pecinovský rudolf@pecinovsky.cz Problémy velkých aplikací Rozsáhlé aplikace používají velké množství názvů objektů a jejich zpráv, které různé části programu sdílí

Více

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

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz

Metodika. Architecture First. Rudolf Pecinovský rudolf@pecinovsky.cz Copyright Rudolf Pecinovský, Soubor: 2014_Comm_PrW_Architecture First Methodology.doc, verze 1.00.2413, uloženo po 9.6.2014 14:43 1 z 39 Metodika Architecture First Rudolf Pecinovský rudolf@pecinovsky.cz

Více

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

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

11.5.2012. 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

11.5.2012. 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 Obsah přednášky 9 Základy programování (IZAPR, IZKPR) Přednáška 9 Základy dědičnosti, přístupová práva Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 03 022, Náměstí Čs. legií

Více

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

11 Diagram tříd, asociace, dědičnost, abstraktní třídy 11 Diagram tříd, asociace, dědičnost, abstraktní třídy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost diagramům tříd, asociaci,

Více

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Vzdělávací oblast Informatika a informační a komunikační technologie pro vzdělávací obor Programování

Více

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

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

Vyřešené teoretické otázky do OOP ( ) Vyřešené teoretické otázky do OOP (16. 1. 2013) 1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní chaotičnost, špatná syntaxe a sémantika

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

Vstupní požadavky, doporučení a metodické pokyny

Vstupní požadavky, doporučení a metodické pokyny Název modulu: Základy PHP Označení: C9 Stručná charakteristika modulu Modul je orientován na tvorbu dynamických stánek aktualizovaných podle kontextu volání. Jazyk PHP umožňuje velmi jednoduchým způsobem

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Josef Pecinovský PowerPoint 2007

Josef Pecinovský PowerPoint 2007 Josef Pecinovský PowerPoint 2007 Jak na PowerPoint 2007 v rekordním čase Josef Pecinovský Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3054. publikaci Odpovědný redaktor Karel Samohýl

Více

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

Kurzy, Podrobnější informace najdete na www.amaio.cz Dotazy a přihlášky můžete posílat na kurzy@amaio.cz O autorovi Rudolf Pecinovský patří ke špičkovým odborníkům na výuku programování. Publikoval již 39 učebnic, které byly přeloženy do pěti jazyků, a nepřeberné množství článků a příspěvků na odborných konferencích.

Více

KOMU JE KNIHA URČENA?

KOMU JE KNIHA URČENA? 7 Kapitola 0. O této knížce KOMU JE KNIHA URČENA? Tuto učebnici jsem vytvářel na základě mých přednášek a úvodních kursů na Vysoké škole manažerské informatiky a ekonomiky. Většina mých studentů měla malou

Více

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika Vyšší odborná škola ekonomická a zdravotnická a Střední škola, Boskovice INOVACE PŘEDMĚTŮ ICT MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika Zpracoval: Jaroslav Kotlán srpen 2009s Úvod Modul Programování

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

1 Webový server, instalace PHP a MySQL 13

1 Webový server, instalace PHP a MySQL 13 Úvod 11 1 Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

KOMU JE KNIHA URČENA?

KOMU JE KNIHA URČENA? 7 Kapitola 0. O této knížce KOMU JE KNIHA URČENA? Tuto učebnici jsem vytvářel na základě mých přednášek a úvodních kurzů na vysokých školách i ve firmě moderníprogramování. Většina mých studentů měla malou

Více

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

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 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

Více

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 0 5 8 4 U k á z k a k n i h

Více

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech 7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,

Více

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

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová Programové konvence, dokumentace a ladění 2. přednáška Alena Buchalcevová Proč dodržovat programové konvence? velkou část životního cyklu softwaru tvoří údržba údržbu provádí většinou někdo jiný než autor

Více

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

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví Ukázka knihy z internetového knihkupectví www.kosmas.cz Věnováno mé rodině ACCESS 2007 PODROBNÝ PRŮVODCE 5 Úvod... 13 Komu je tato kniha určena...13 Co v této knize naleznete...14 Použité konvence a struktura

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 1 1 4 5 Oracle průvodce správou,

Více

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

Programování v C++ 2, 4. cvičení Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Úvodem... 9 Kapitola 1 Karetních

Úvodem... 9 Kapitola 1 Karetních Úvodem... 9 Základní znalosti o programovacích jazycích...10 Jazyk C# a platforma.net...10 Visual C# 2010 Express...11 Instalace platformy.net 4.0 a Visual C# 2010 Express...11 Zdrojový kód aplikací...12

Více

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

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

Více

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

Programování II. Třídy a objekty (objektová orientovanost) 2018/19 Programování II Třídy a objekty (objektová orientovanost) 2018/19 Osnova přednášky Objektový přístup (proč potřebujeme objekty). Třídy, objekty,... Příklad. Proč potřebujeme objekty? Udržovatelnost softwaru

Více

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

10 Balíčky, grafické znázornění tříd, základy zapozdření 10 Balíčky, grafické znázornění tříd, základy zapozdření Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům balíčkům, grafickému

Více

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/04.0006

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/04.0006 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/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod 11. 1. Vítejte v Ruby 15. O autorovi 9 Poděkování 9 Začínáme programovat v Ruby on Rails 9 O autorovi 9 Poděkování 9 Úvod 11 Komu je kniha určena 11 Jak je kniha uspořádána 11 Co ke knize potřebujete 12 Konvence 12 Zdrojový kód 13 Poznámka redakce českého

Více

Jméno a Příjmení. Třída. Škola

Jméno a Příjmení. Třída. Škola Studentský dotazník Vážení studenti, cílem tohoto průzkumu je zjistit váš postoj k matematice a k výukovému nástroji Khan Academy. Vaše názory a odpovědi pomohou dalším studentům a učitelům při zapojování

Více

1. Webový server, instalace PHP a MySQL 13

1. Webový server, instalace PHP a MySQL 13 Úvod 11 1. Webový server, instalace PHP a MySQL 13 Princip funkce webové aplikace 13 PHP 14 Principy tvorby a správy webového serveru a vývojářského počítače 14 Co je nezbytné k instalaci místního vývojářského

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz Počítáme v Excelu v rekordním čase Druhé, aktualizované vydání Vladimír Bříza Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 2787.

Více

DOTAZNÍK PRO URČENÍ UČEBNÍHO STYLU

DOTAZNÍK PRO URČENÍ UČEBNÍHO STYLU DOTAZNÍK PRO URČENÍ UČEBNÍHO STYLU Projekt MOTIVALUE Jméno: Třida: Pokyny Prosím vyplňte vaše celé jméno. Vaše jméno bude vytištěno na informačním listu s výsledky. U každé ze 44 otázek vyberte a nebo

Více

Ukázka knihy z internetového knihkupectví

Ukázka knihy z internetového knihkupectví Ukázka knihy z internetového knihkupectví www.kosmas.cz Josef Pecinovský Jak na Windows Vista v rekordním čase Josef Pecinovský Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3053. publikaci

Více

Kapitola 1 První kroky v tvorbě miniaplikací 11

Kapitola 1 První kroky v tvorbě miniaplikací 11 Obsah Úvodem 9 Komu je kniha určena 9 Kapitola 1 První kroky v tvorbě miniaplikací 11 Co je to Postranní panel systému Windows a jak funguje 12 Co je potřeba vědět před programováním miniaplikací 16 Vaše

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

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

2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování 1. Teoretické základy modelování na počítačích 1.1 Lambda-kalkul 1.1.1 Formální zápis, beta-redukce, alfa-konverze 1.1.2 Lambda-výraz jako data 1.1.3 Příklad alfa-konverze 1.1.4 Eta-redukce 1.2 Základy

Více

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

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

ŠVP Gymnázium Ostrava-Zábřeh. 4.8.16. Úvod do programování

ŠVP Gymnázium Ostrava-Zábřeh. 4.8.16. Úvod do programování 4.8.16. Úvod do programování Vyučovací předmět Úvod do programování je na naší škole nabízen v rámci volitelných předmětů v sextě, septimě nebo v oktávě jako jednoletý dvouhodinový kurz. V případě hlubšího

Více

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda

Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda Anotace sady: Úvod do objektově orientovaného programování, VY_32_INOVACE_PRG_OOP_01 Autor: Blanka Sadovská Klíčová slova: OOP, konstruktor, destruktor, třída, objekt, atribut, metoda Druh učebního materiálu:

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

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

Programování v C++ 1, 6. cvičení Programování v C++ 1, 6. cvičení dědičnost, polymorfismus 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 3 Shrnutí minule procvičené

Více

Programování v jazyce C a C++

Programování v jazyce C a C++ Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu

Více

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.

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. 23. Třídy, generické třídy, instance, skládání, statické metody a proměnné. Zapouzdření, konstruktory, konzistence objektu, zpřístupnění vnitřní implementace, modifikátory public a private. Polymorfismus,

Více

Struktura e-learningových výukových programù a možnosti jejího využití

Struktura e-learningových výukových programù a možnosti jejího využití Struktura e-learningových výukových programù a možnosti jejího využití Jana Šarmanová Klíčová slova: e-learning, programovaná výuka, režimy učení Abstrakt: Autorská tvorba výukových studijních opor je

Více

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

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

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

Obsah. Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10 Obsah Úvodem 9 Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10 KAPITOLA 1 Co budeme potřebovat 11 Co knihovna jquery nabízí 11 Editor zdrojového kódu 12 Webový server 12 Software pro ladění

Více

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

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9) Programování v C++ Úplnej úvod Co se naučíte? tak samozřejmě C++, s důrazem na: dynamické datové struktury Objektově Orientované Programování STL (standardní knihovna šablon) vytváření vlastních šablon

Více

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

Jak správně psát scénáře k případům užití? Jak správně psát scénáře k případům užití? Autor RNDr. Ilja Kraval 2007 http://www.objects.cz K napsání tohoto článku mne inspiroval tento mail: Dobrý den pane Kravale, chci Vás poprosit o radu, která

Více

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Předmět: Programování

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Předmět: Programování Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování Předmět: Programování Charakteristika vyučovacího předmětu Cílem předmětu je poskytnout žákům ucelený

Více

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

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.

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. 13 Rozhraní, výjimky Studijní cíl 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. Doba nutná k nastudování 2 2,5 hodiny

Více

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

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

Maturitní témata Školní rok: 2015/2016

Maturitní témata Školní rok: 2015/2016 Maturitní témata Školní rok: 2015/2016 Ředitel školy: Předmětová komise: Předseda předmětové komise: Předmět: PhDr. Karel Goš Informatika a výpočetní technika Mgr. Ivan Studnička Informatika a výpočetní

Více

Metodika výuky multimediálního vzdělávání odborných pracovníků Práce s webem

Metodika výuky multimediálního vzdělávání odborných pracovníků Práce s webem Metodika výuky multimediálního vzdělávání odborných pracovníků Práce s webem 1. blok Teorie tvorby www Základní technologie Vlastnosti různých softwarů Základy webové grafiky V prvním bloku se účastníci

Více

Procházka. Hledáme. na internetu

Procházka. Hledáme. na internetu David Procházka Hledáme na internetu 2., aktualizované vydání Hledáme na internetu v rekordním čase 2., aktualizované vydání David Procházka Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

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

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Java/QE Akademie - Osnova

Java/QE Akademie - Osnova Java/QE Akademie - Osnova Lekce 1 1. Co je to Java? 1.1. Struktura Java kódu 2. Potřebné nástroje pro vývoj 2.1. JVM 2.2. JRE 2.3. JDK 3. Co je to proměnná a její zápis v Javě 3.1. Klasické proměnné 3.2.

Více

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20

Více

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

Programování v C++ 3, 3. cvičení Programování v C++ 3, 3. cvičení úvod do objektově orientovaného programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Dokončení spojového

Více

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

Quo vadis programování? Automatizace vyhodnocování studentských úloh Vaše jistota na trhu IT Quo vadis programování? Automatizace vyhodnocování studentských úloh Rudolf PECINOVSKÝ rudolf@pecinovsky.cz Vladimír Oraný vladimir.orany@gmail.com Vaše jistota na trhu IT Obsah

Více

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

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

Vývoj a ověřování metodiky výuky programování

Vývoj a ověřování metodiky výuky programování Copyright Rudolf Pecinovský, Soubor: 2016_INF_Architecture First.doc, verze 1.00.2413, uloženo út 19.1.2016 10:03 1 z 11 Vývoj a ověřování metodiky výuky programování Rudolf Pecinovský Informatika XXIX

Více

Metodika Architecture First a její podpora v prostředí BlueJ++

Metodika Architecture First a její podpora v prostředí BlueJ++ Metodika Architecture First a její podpora v prostředí BlueJ++ Rudolf PECINOVSKÝ rudolf@pecinovsky.cz DidInfo 2015 1 Proč prosazuji metodiku Architecture First Technologická signatura Je třeba předvídat

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

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

PB161 Programování v jazyce C++ Přednáška 7 PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z

Více

Ukázka knihy z internetového knihkupectví www.kosmas.cz

Ukázka knihy z internetového knihkupectví www.kosmas.cz Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 1 2 0 1 U k á z k a k n i h

Více

Základy objektové orientace I. Únor 2010

Základy objektové orientace I. Únor 2010 Seminář Java Základy objektové orientace I Radek Kočí Fakulta informačních technologií VUT Únor 2010 Radek Kočí Seminář Java Základy OO (1) 1/ 20 Téma přednášky Charakteristika objektově orientovaných

Více

Obsah. O auto ro vi 13 V ěnování 14 Poděkování 15 Z p ětn á vazba od čtenářů 16. P rogram ování pro M in ecraft v Jávě 17

Obsah. O auto ro vi 13 V ěnování 14 Poděkování 15 Z p ětn á vazba od čtenářů 16. P rogram ování pro M in ecraft v Jávě 17 O auto ro vi 13 V ěnování 14 Poděkování 15 Z p ětn á vazba od čtenářů 16 Zdrojové kódy ke knize 16 Errata 16 KAPITOLA 1 P rogram ování pro M in ecraft v Jávě 17 Příprava serveru Minecraftu 18 Řešení problémů

Více