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 ani šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno.

Rudolf Pecinovský

Java 9
Kompletní příručka jazyka

Vydala Grada Publishing, a.s.
U Průhonu 22, Praha 7
obchod@grada.cz, www.grada.cz
tel.: +420 234 264 401, fax: +420 234 264 400
jako svou 6768. publikaci

Odpovědný redaktor: Jaroslava Palasová
Návrh vnitřního layoutu: Rudolf Pecinovský
Zlom: Rudolf Pecinovský
Formá: ePub Štěpán Böhm
Počet stran 560
První vydání, Praha 2018
Vytiskly Tiskárny Havlíčkův Brod, a. s.

© Grada Publishing, a.s., 2018
Cover Design © Grada Publishing, a. s., 2018
Cover Photo © Depositphotos

Názvy produktů, firem apod. použité v knize mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků.

ISBN 978-80-271-0931-9 (ePub)
ISBN 978-80-271-0930-2 (pdf)
ISBN 978-80-271-0715-5 (print)

Všem, kteří se chtějí něco naučit

Úvod

Tato kniha seznamuje s devátou verzí jazyka Java. Soustředí se především na výklad vlastností jazyka a minimalizuje výklad probírající obsah standardní knihovny – tomu se budou věnovat další příručky z této série.

Komu je kniha určena

Kniha je určena všem, kteří se chtějí naučit jazyk Java. Nevyžaduje od čtenáře žádné předchozí znalosti programování a snaží se, byť stručně, vysvětlit vše, co je potřeba.

Naprostým začátečníkům bych sice doporučil, aby začali s některou z mých příruček úvodu do programování, v nichž nevysvětluji, jak se program zapisuje, ale soustředím se především na to, jak se vymýšlí. V těchto příručkách spolu navrhujeme architekturu programu. Zakódování navrženého programu (tj. jeho zápis v programovacím jazyce) přenecháváme generátoru kódu, který je integrální součástí použitého vývojového prostředí. K výkladu zápisu programu v kódu, na nějž se soustředí tato učebnice, pak přejdeme až v okamžiku, kdy složitost navrhovaných programů překročí možnosti onoho generátoru. V té době ale již mají účastníci kurzu základy objektově funkcionálního paradigmatu zažité a nedělají proto chyby, s nimiž zápasí studenti, kteří začali studiem syntaxe použitého programovacího jazyka.

Na druhou stranu nechci nikoho zrazovat, a proto jsem se v této knize pokusil důkladně vysvětlit i základní programové konstrukce a doporučené způsoby jejich využití, takže i naprostí začátečníci zde najdou všechny potřebné informace.

Jak už jsem řekl, kniha se soustředí na výklad jazyka. Tím, že výklad knihoven (např. práce s kolekcemi, datovody, soubory a datovými proudy, regulárními výrazy či vlákny) odložím do jiných příruček, ušetřím prostor, který mohu věnovat podrobnému výkladu těch vlastností jazyka, na které v jiných příručkách často nezbývá místo. Jejich neznalost ale vede k hodinám marného pátrání po skutečném původci vzniklé chyby a následným experimentálním změnám programu s myšlenkou: „Co kdyby to náhodou vyšlo?“

Koncepce výkladu

Značná část učebnic začíná definicí programu typu Hello world, což je koncepce převzatá z historické učebnice jazyka C vydané v roce 1978. Základní nevýhodou této koncepce je, že na počátku používá několik programových konstrukcí, které čtenáři vysvětlí až někde v průběhu dalšího výkladu.

Tehdy to dost dobře jinak ani nešlo. Od té doby se objevila řada nástrojů, které umožňují koncipovat výklad tak, aby se v něm používaly pouze konstrukce, které již byly vysvětleny. O to se pokouším i v této knize a používat doposud nevysvětlené konstrukce opravdu výjimečně pouze v situacích, kdy to výrazně zpřehlední výklad. Aby se mi to podařilo, používám k výkladu program JShell, který je standardní součástí vývojářské sady.

Knihu jsem se navíc pokusil napsat tak, aby mohla sloužit stejně dobře jako učebnice jazyka i jako referenční příručka, ve které by bylo možno v případě potřeby najít klíčové informace rychleji a snáze než na internetu. Pasáže vysvětlující jednotlivé programové konstrukce jsem se proto snažil jasně oddělit od pasáží probírajících teorii, jak řešit tu kterou třída problémů, a sloužících především začátečníkům, kteří ještě nemají s programováním žádné zkušenosti.

Rozdělení textu

Text je rozdělen do čtyř částí. První část začíná úvodem do prostředí JShell, které bude v celé první části využíváno ke spouštění demonstračních programů. Ve zbytku první části pak probírám algoritmické konstrukce a prostředky, které Java nabízí k jejich realizaci.

Druhá část se soustředí na základy objektově orientovaného programování. Začíná teoretickou kapitolou vysvětlující hlavní zásady objektově orientovaného paradigmatu. Po ní následují kapitoly postupně probírající základní objektové konstrukce a jejich účel.

Třetí část je věnována výkladu nadstavbových objektových konstrukcí včetně rozboru některých základních pravidel, jejichž nedostatečné pochopení dělá studentům často problémy. Závěr třetí části je věnován koncepci modularity, která je novinkou deváté verze. Modularita sice není součástí jazyka, ale platformy; nicméně její osvojení přináší výrazné zvýšení spolehlivosti vyvíjených programů a do jisté míry i efektivity jejich vývoje i následného provozu.

Závěrečná část je věnována přílohám. První vás seznámí s omezeními jazyka Java, druhá vám představí klíčové datové typy knihovny, kterou začneme zhruba od poloviny knihy používat.

Terminologie

Při zavádění české terminologie se bohužel potýkáme často s tím, že v anglické literatuře zavádějí mnozí autoři terminologii vlastní. V oblasti, kterou se má zabývat tato publikace, je terminologický guláš obzvlášť vydatný. Budu-li proto uvádět ve svém výkladu anglické ekvivalenty zaváděných termínů, budu používat terminologii zavedenou v oficiální referenční publikaci Java® Language Specification – Java SE 9 Edition ([3]), na níž se budu občas odvolávat zkratkou JLS.

Použité nástroje

Pro úspěšné studium knihy budete potřebovat několik programů, které musíte nejprve stáhnout a instalovat.

Vývojová sada JDK 9

Především budete potřebovat mít instalovanou vývojovou sadu pro Javu 9 označovanou JDK, což je zkratka z anglického Java Development Kit. Stáhnete ji ze stránky http://www.oracle.com/technetwork/java/javase/downloads/. Jenom musíte před vlastním stažením nastavit přepínač u seznamu stáhnutelných souborů do polohy Accept License Agreement, protože jinak vás stránka daný program stáhnout nenechá.

Spolu s vývojovou sadou vřele doporučuji stáhnout i dokumentaci. Tu najdete na téže stránce, jenom musíte popojet trochu níže do sekce Additional Resources, ve které najdete podsekci Java SE 9 Documentation.

Vývojové prostředí JShell

Pro většinu výkladu budu využívat prostředí JShell, které je součástí JDK a se kterým vás seznámí úvodní kapitola. (Podrobnější seznámení s tímto prostředím najdete v příručce Java 9 – JShell.) Výhodou tohoto přístupu je, že součástí programů nemusí být nejrůznější vata, bez které byste standardní program v Javě nespustili. Navíc již nemusíte instalovat žádné další vývojové prostředí, takže nebudete muset zápasit s důsledky známé skutečnosti, že zvládnutí současných profesionálních vývojových prostředí je náročnější než zvládnutí základů jazyka.

V závěru knihy budu potřebovat vysvětlit některé konstrukce, které se v prostředí JShell dost dobře vysvětlit nedají. Až na to dojde, tak vás upozorním.

Samostatné vývojové prostředí

Od kapitoly 12 Vývojová prostředí a vytvoření aplikace začnu vedle prostředí JShell používat i prostředí NetBeans.Budu v něm demonstrovat vlastnosti, které se projeví až u samostatně vyvíjených programů. Nelpím přitom na tom, abyste používali právě toto prostředí, ale doporučuji je těm, kteří ještě nemají s profesionálními vývojovými prostředími žádné zkušenosti.

Každopádně budeteli chtít experimentovat s profesionálním prostředím hned od počátku, můžete si je instalovat. Adresy, z nichž si můžete stáhnout některé z doporučovaných prostředí, najdete na počátku dané kapitoly.

Doprovodné programy

Všechny doprovodné programy zmiňované a používané v textu najdete na stránce knihy na adrese http://knihy.pecinovsky.cz/57_j9lang. Zde je umístěn generátor, který vám požadované programy dodá.

Doprovodné programy jsou zpočátku skripty prostředí JShell, v druhé části to pak jsou projekty pro vývojové prostředí NetBeans, které lze snadno transformovat na projekty pro vaše oblíbené vývojové prostředí.

Knihu jsem se snažil zalomit tak, aby všechny výpisy programů a komunikace s počítačem, které se vejdou na jednu stránku, byly vždy na jedné stránce a nelámaly se přes hranu stránky. Čtenářům papírové verze by se tak měly minimalizovat problémy při studiu doprovodných textů diskutujících obsah těchto výpisů.

Čtenáři elektronické verze jsou na tom s listováním hůře. Těm bych doporučil, aby si text knihy otevřeli dvakrát a umístili oba dokumenty vedle sebe. (Na většině současných počítačů s širokými monitory by to neměl být problém.) Pak lze mít v jednom dokumentu otevřenou stránku s výpisem a ve druhém dokumentu stránku s rozborem obsahu daného výpisu.

Problémy s klávesnicí

Až do verze Java SE 9.0.1 se prostředí JShell nekamarádilo se standardní českou klávesnicí, přesněji neumožňovalo zadat znak &. Obávám se, že tento stav bude trvalý, a to proto, že tento znak se na standardní české klávesnici zadává prostřednictvím klávesové zkratky AltGr+C, která je ekvivalentní s klávesovou zkratkou Alt+Ctrl+C, a ta je zřejmě (z hlediska JShell) příliš podobná zkratce Ctrl+C.

Tento problém nastává naštěstí pouze při používání standardního rozložení. Pokud je ale používáte, tak je jedno, jestli se pokoušíte zadat daný znak z klávesnice, anebo jestli jej zadáváte prostřednictvím schránky „oblíbenou“ kombinací Ctrl+C, Ctrl+V. Existuje několik způsobů řešení tohoto problému:

•Nejhorším řešením je přepínání mezi českým a americkým rozložením kláves. Pak se vám totiž pod rukama střídají dvě klávesnice, a to vede k jisté klávesnicové schizofrenii.

•Trváte-li na standardním rozložení kláves, můžete tento znak zadat prostřednictvím numerické klávesnice zadáním Alt+038.

Historie rozložení České (QWERTY)

Před rokem 1989 jsem pracoval v Tesle Elstroj, kde se vyvíjel počítač SAPI 86, jenž se měl stát českým ekvivalentem počítačů PC. Hrubě se nám ale nelíbil návrh rozložení kláves, který pro češtinu navrhl v roce 1986 Microsoft. Byl jsem proto pověřen navrhnout alternativní rozložení, které by více odpovídalo potřebám našich uživatelů.

Můj návrh vycházel z klávesnice psacího stroje, která byla nedotknutelná. Znaky, které na psacím stroji nebyly, jsem umístil na stejná místa, na nichž se nacházely na US klávesnici, jenom je bylo třeba vyvolat stisknutím přeřaďovače AltGr, resp. jemu ekvivalentní kombinaci přeřaďovačů Alt+Ctrl. Tím se na klávesnicích s US potiskem, kterých byla tehdy většina, minimalizovaly problémy s hledáním nestandardních znaků. Toto rozložení se mělo stát standardem pro naši republiku. Tesla Jihlava již začala tuto klávesnici vyrábět (ještě ji mám schovanou .

Pak ale přišla revoluce a vše se změnilo. Naše řešení byla zavržena a byla dána přednost řešením z USA. Jenomže pak se firma Apple rozhodla lokalizovat svůj operační systém pro českou republiku a k mému příjemnému překvapení zvolila pro klávesnici mnou navržený layout.

Když později Microsoft lokalizoval Windows NT, členy lokalizačního týmu se stalo i několik uživatelů počítačů Apple, kteří si na moji klávesnici zvykli, a tak ji do české lokalizace Windows propašovali. Protože je však rozčilovalo stěhování znaků Y a Z při přecházení mezi počítači s českou a anglickou lokalizací, tak umístění těchto znaků prohodili, aby odpovídalo anglické klávesnici. Tak vzniklo rozložení označované jako České (QWERTY).

Možnost volby tohoto rozložení kláves se od té doby stalo standardní součástí operačního systému Windows. Jistě chápete, jak mne těší, že se mi podařilo zasít do systémů Windows a MacOS své semínko.

•Kompromis mezi střídáním klávesnic a standardním českým rozložením představuje rozložení, které je k dispozici pod názvem České (QWERTY), o němž se můžete podrobněji dozvědět v podšeděném rámečku Historie rozložení České (QWERTY).

Syntaktické definice a diagramy

V testu je uváděna řada nejrůznějších programových konstrukcí, jejichž zápis se řídí přesně danými syntaktickými pravidly. Většina učebnic možné způsoby zápisu většinou formálně nedefinuje, anebo používá syntaktické definice odvozené z Backusovy normální formy. Syntaktické definice jsou výhodné pro strojové zpracování, lidé se v nich často špatně orientují. Rozhodl jsem se proto zobrazovat syntaktická pravidla zápisu jednotlivých konstrukcí pomocí syntaktických diagramů.

Syntaktický diagram ukazuje, jak je možno zobrazovanou konstrukci zapsat. Pojedete-li po čarách, tak jakýkoliv průjezd generuje syntakticky správnou konstrukci. Toho, kdo syntaktické diagramy ještě nezná a chtěl by rychle některý vidět, bych odkázal např. na diagram na obrázku 2.1.

Použité typografické 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.

TermínyPrvní výskyt nějakého termínu a další texty, které chci zvýraznit, vysazuji tučně.

NázevNázvy firem a jejích produktů vysazuji kurzivou. Kurzivou vysazuji také názvy kapitol, podkapitol a oddílů, na které se v textu odkazuji.

OdkazCelá kniha je prošpikovaná křížovými odkazy na související pasáže. Neníli odkazovaný objekt (kapitola, obrázek, výpis programu, …) na některé ze sousedních stránek, je pro čtenáře tištěné verze doplněn o číslo stránky, na níž se nachází. Čtenářům elektronické verze stačí, když na něj klepnou, a použitý prohlížeč by je měl na odkazovaný objekt ihned přenést.

CitaceTexty, 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.

AdresyNázvy souborů a internetové adresy vysazuji obyčejným bezpatkovým písmem.

ProgramIdentifikátory a další části programů zmíněné v běžném textu vysazuji neproporcionálním písmem, které je v elektronických verzích pro zvýraznění tmavě červené.

metoda(?)Při odkazech na metody budu v závorkách za názvem metody vždy uvádět seznam typů jejich parametrů – např. equals(Object). Nebudeli v danou chvílí jasné, jaké má zmiňovaná metoda parametry, budu do závorek psát otazník – např. metoda(?).

zadáníVe výpisech komunikace s prostředím JShell bude zadání uživatele vysazeno tučně (v elektronických verzích pro zvýraznění tmavě červeně), a odpovědi prostředí netučně (a černě).

Kromě výše zmíněných čá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 jing-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í aplikující probranou látku. Příslušný projekt získáte pomocí generátoru projektů popsaného výše.

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.

Brýle označují tzv. „poznámky pro šťouraly“, ve kterých se vás snažím seznámit s některými zajímavými vlastnostmi probírané konstrukce nebo upozorňuji na některé souvislosti, avšak které nejsou k pochopení látky nezbytné.

Odbočka – podšeděný blok

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.

Zpětná vazba

Přes veškeré úsilí, které jsme knize 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. Objevíte-li proto v knize nějakou chybu nebo budete mít návrh na nějaké její vylepšení, neostýchejte se napsat na adresu rudolf@pecinovsky.cz. Pokusím se na stránku knihy http://knihy.pecinovsky.cz/57_j9lang co nejdříve zanést příslušná errata s opravou, kterou pak zapracujeme do případného dalšího vydání.

Pokud vám bude někde připadat text nepříliš srozumitelný nebo budete mít nějaký dotaz, ať už k vykládané látce či použitému vývojovému prostředí, pošlete mail s předmětem 57_Java9-UcRef_DOTAZ. Bude-li se dotaz týkat něčeho obecnějšího, zveřejním na stránce knihy odpověď i pro ty ostatní, které by mohl obdobný dotaz napadnout za pár dní, anebo jsou natolik ostýchaví, že se netroufnou sami zeptat.

Část I:

Neobjektové konstrukce

Tato část vás nejprve seznámí s prostředím JShell, které budu ve svém příkladu využívat k tomu, abychom získali okamžitou odpověď na zadané programové obraty. Budeme tak moci od začátku zkoušet probírané konstrukce, aniž bychom museli používat něco, co jsme ještě neprobrali. Poté postupně probereme algoritmické konstrukce, které vyšší programovací jazyky nabízely ještě před příchodem objektového paradigmatu, kterému bude věnována druhá část.

Kapitola 1
Prostředí JShell

Co se v kapitole naučíte

Tato kapitola vás seznámí s prostředím JShell, které bude v následujících kapitolách používáno pro demonstraci základních programových konstrukcí jazyka a jeho pravidel. V závěru pak ještě vysvětlí některá nejzákladnější syntaktická pravidla jazyka a seznámí vás s komentáři, kterými budou doprovázeny uložené výpisy programů.

Tato kapitola bude obsahovat jen velmi stručný úvod, jenž vás seznámí s klíčovými vlastnostmi prostředí JShell, které budu v následujícím výkladu používat. Jak už bylo řečeno v úvodu, podrobné informace o tomto prostředí včetně návodu na jeho začlenění do vlastního programu najdete v publikaci Java 9 – JShell.

1.1Charakteristika programu a prostředí JShell

Program JShell zařazujeme do kategorie nástrojů typu REPL, což je zkratka z anglického read-evaluate-print-loop (česky: cyklus přečtivyhodnoťvytiskni). Tyto nástroje se používají jako poskytovatelé prostředí (platformy) pro rychlou interakci s podkladovým prostředím, kterým může být jak operační systém, tak nějaký program. Uživatel platformy typu REPL může komunikovat s podkladovým prostředím v programovacím jazyce dané platformy bez potřeby překladu a samostatného spuštění.

1.2Příprava programu JShell a první spuštění

Zdánlivě nejjednodušší je otevřít okno konzoly (terminálu) a přesunout se v něm do podsložky bin složky, do které jste instalovali JDK. Tam najdete soubor jshell.exe, který můžete spustit příkazem

jshell -v

kde parametrem -v spouštěný program žádáme, aby nám o všech provedených činnostech referoval co nejpodrobněji.

Zabíhání do této složky však většinu uživatelů obtěžuje. Chcete-li proto program používat opravdu jednoduše, pak se nabízejí dvě cesty:

•Upravit systémovou proměnnou PATH definující seznam složek, které systém při hledání zadaného souboru prohledá.

•Definovat jednoduchý skript, který program JShell spustí v aktuální složce a případně mu i zadá potřebné parametry.

Pro tento kurz dám přednost druhé cestě. Jak znám uživatele systému Linux a jeho verzí (sem patří i MacOS), tak ti dávkové soubory hojně používají a žádný výklad nepotřebují. Proberu proto tvorbu dávkových souborů pouze pro Windows, jejichž uživatelé o této možnosti často ani nevědí.

Dávkové soubory pro Windows

Windows používají dva druhy dávkových souborů: z dob systému DOS převzaly soubory s příponou BAT (zkratka z anglického batch – dávka, skupina, …) a od verze Windows XP přidaly ještě soubory s příponou PS1 (PS je zkratka z názvu programu PowerShell, ale co tam dělá ta jednička, netuším).

Obě verze se spouští v konzolovém okně. Jeho velikost, umístění, použité písmo a barvy si můžete nastavit ve vlastnostech dosažitelných ze systémové nabídky okna[1]. My budeme používat první z nich, tj. soubor s příponou BAT. Postupujte následovně:

1.Otevřete složku, do které jste prostřednictvím generátoru doprovodných programů uložili soubor Start.jsh.

2.Ve svém oblíbeném textovém editoru[2] vytvořte prázdný textový soubor.

3.Do souboru napište příkaz

chcp 1250

který nastaví správnou kódovou stránku. Česká a slovenská Windows totiž implicitně používají stránku 852, ale spuštěnému programu tvrdí, že používají stránku 1250. Proto je třeba na tuto kódovou stránku nastavit i příkazový panel.

4.Na další řádek napište příkaz

<JDK>\bin\jshell -v

kde <JDK> zastupuje cestu ke složce, do které jste instalovali JDK Javy. Tím spustíte program JShell a jím definovanou platformu, kterou budeme v učebnici používat.

5.Na další řádek napište příkaz

pause

Ten zabezpečí, že po opuštění platformy JShell zůstane příkazový panel otevřen, abyste si mohli před jeho ukončením prohlédnout případné závěrečné informace.

6.Soubor uložte pod názvem J6_JShell.bat. Vlastní jméno souboru není důležité – doporučuji jej pouze proto, abych se na ně mohl v dalším textu odvolávat. Důležitá je přípona bat.

Řada začínajících programátorů ponechává nastavení Windows pro laické uživatele, které matou přípony souborů. Proto jsou přípony známých typů implicitně skryty. Necháváte-li ale operační systém, aby před vámi skrýval přípony, tak se stává, že vám sice průzkumník ukazuje, že se ve složce nachází soubor J9_JShell.bat, ale ve skutečnosti je tam uložen soubor J6_JShell.bat.txt. Přípona txt je pro operační systém známá, a proto ji nezobrazuje.

Po spuštění

Po spuštění programu se otevře konzolové okno podobné oknu na obrázku 1.1. Lišit se budou pouze v cestách k aktuální složce vypisovaných na počátku prvního a čtvrtého řádku a v cestě k programu jshell.exe ve čtvrtém řádku. Uživatelům systémů Linux a MacOS budou chybět první tři řádky (nastavení kódové stránky, oznámení nastavené stránky a oddělující prázdný řádek).

Pravda, já mám na svém počítači doplněnou systémovou proměnnou PATH o cestu k programu JShell[3], takže jsem ve čtvrtém řádku celou cestu k programu jshell.exe uvádět nemusel. Navíc se pak celý příkaz nevešel na řádek, takže pokračuje na dalším řádku okna, ale logicky je to stále jeden řádek. Chtěl jsem ale hlavně pro ty, kteří s konzolovým oknem ještě nemají velké zkušenosti, ukázat výpis kompletní.

Obrázek 1.1:

Konzolové okno otevřené po spuštění dávky J9_JShell.bat na mém počítači

V dalším textu již nebudu ukazovat výpisy z okna ve formě obrázků, ale ve formě klasických výpisů programů s číslovanými řádky, abych se mohl na čísla řádků snáze odvolávat. Obsah okna na obrázku 1.1 je ve výpisu 1.1.

Výpis 1.1: Obsah konzolového okna otevřeného po spuštění dávky J9_JShell.bat na mém počítači

1. D:\SVN_PGM\@B_Knihy\@B_57G_J9-Zaklady_jazyka\57_JSH>chcp 1250

2. Active code page: 1250

4. D:\SVN_PGM\@B_Knihy\@B_57G_J9-Zaklady_jazyka\57_JSH>c:\_PGM\Java\JDK_JRE\JDK_9_64 \bin\jshell -v

5. | Welcome to JShell -- Version 9

6. | For an introduction type: /help intro

8. jshell>

Na posledním řádku výpisu je již výzva programu/prostředí JShell. Za ní můžete začít psát své úryvky a příkazy.

Nelekněte se, když se program JShell nespustí hned, přesněji když hned nevypíše své přivítání. Je to proto, že se na počátku načítá startovní skript a podle něj se prostředí konfiguruje. Přivítání se vypisuje až poté, co se startovní skript načte a provede.

1.3Úryvky (snippets)

Výrazy (expressions), příkazy (statements), deklarace (declarations) a definice (definitions) jazyka Java, které za tuto výzvu napíšete, se hromadně označují jako úryvky (snippets). Kdykoliv napíšete nějaký úryvek, prostředí JShell jej ihned vyhodnotí a uloží výsledek. Ve výpisu 1.2 najdete zadání dále popsaných úryvků spolu s odpověďmi prostředí.

Zkuste napsat jednoduchý aritmetický výraz, např. 3+5 (řádek 1 výpisu) a potvrdit jej stiskem <Enter>. Jak už jsem řekl, prostředí JShell výraz spočítá a na dalším řádku oznámí jak výsledek, tak to, že jej uložilo do pomocné proměnné nazvané $1.

Úplným začátečníkům prozradím, že proměnná je místo v paměti, kam si můžeme uložit nějakou hodnotu pro budoucí použití. Proměnných může být v programu více, a proto má každá přidělené svoje jméno. Když pak později chceme uloženou hodnotu využít, odvoláme se na ni jménem příslušné proměnné.

Prostředí JShell nám navíc na řádku 3 přidalo informaci, že vytvořená pomocná proměnná je typu int, což je zkratka z anglického integer a prozrazuje to, že obsah oné proměnné bude v programu vždy interpretován jako celé číslo.

Úryvky se nemusejí nutně vejít na jeden řádek. Když prostředí vyhodnotí, že zadávání úryvku ještě neskončilo (ve výpisu 1.2 řádky 5 a 6), zahájí další řádek pokračovací výzvou. Vyhodnocení zadaného výrazu zahájí až v okamžiku, kdy je zadání zkompletováno, k čemuž dojde na řádku 7, takže se na řádcích 8 a 9 dozvíme výsledek.

Výpis 1.2: První tři pokusné úryvky

1. jshell> 6+5

2. $1 ==> 11

3. | created scratch variable $1 : int

5. jshell> 6 +

6. ...> 7+

7. ...> 9

8. $2 ==> 22

9. | created scratch variable $2 : int

11. jshell> $1+$2

12. $3 ==> 33

13. | created scratch variable $3 : int

15. jshell>

Použití proměnných

Jak jste si jistě všimli, na řádku 3 jsem místo čísel použil názvy dříve vytvořených proměnných. Jak už jsem řekl v poznámce, objeví-li se ve výrazu název proměnné, překladač danou proměnnou najde a na dané místo ve výrazu vloží hodnotu, která je v proměnné uložena.

Identifikace úryvků

JShell vytvořené úryvky postupně čísluje. Tato čísla se pak používají jako identifikátory úryvků. V dalším textu je budu označovat jako ID úryvků.

Obsahujeli zadaný úryvek výraz, JShell tento výraz vyhodnotí a pro výsledek vytvoří novou pomocnou proměnnou, kterou pojmenuje znakem $ (dolar) následovaným ID zadaného úryvku. O tom jste se mohli přesvědčit např. ve výpisu 1.2 na řádcích 3, 9 a 13.

Definujeme-li úryvek, který obsahuje nějaký pojmenovaný objekt (proměnnou, metodu, datový typ), tak se v příkazech pro prostředí JShell můžeme na tento objekt odvolávat jak jeho jménem, tak prostřednictvím ID jeho úryvku (až budeme probírat příkazy pro prostředí JShell, tak si to předvedeme).

Středník

Java převzala od jazyka C pravidlo, že každý příkaz musíme ukončit středníkem. Platí, že závěrečný středník dělá z výrazu příkaz, který je třeba provést.

Zapomenutý středník patří mezi „oblíbené“ chyby. Zadáme-li proto výraz bez ukončujícího středníku (prozatím tak byly zadány všechny doposud zadané výrazy), překladač ohlásí chybu. JShell se pak podívá, jestli by nepomohlo přidání středníku na konec řádku. Pokud je po přidání středníku překladač spokojen, JShell nás žádným chybovým hlášením neobtěžuje a prostě si daný úryvek zapamatuje i přidaným středníkem.

Více objektů na řádku, zavlečené chyby

Definujeme-li více pojmenovaných objektů na jednom řádku, JShell vytvoří pro každý z těchto objektů samostatný úryvek. Aby však poznal, kde jedna definice končí a jiná začíná, musíme všechny definice s výjimkou té poslední ukončit středníkem. Poslední definici středníkem ukončovat nemusíme (ale samozřejmě můžeme), protože, jak jsme si řekli před chvílí, závěrečný středník je JShell ochoten vložit na konec řádku za nás.

Ve výpisu 1.3 je na řádku 1 pokus vložit více úryvků, aniž bych první ukončil středníkem. Jak vidíte, JShell ohlásil na řádku 2 chybu, na řádku 3 vysvětlil, že mu chybí očekávaný středník a na řádku 5 dokonce ukázal, kde si myslí, že by se měl onen středník vložit do úryvku vypsaného na řádku 4.

Pak se sice pokusil vyhodnocovat dál, ale první chyba jej poněkud rozhodila, takže další chyby, na něž mne na následujících řádcích upozorňuje, jsou tzv. zavlečené chyby, což jsou chyby vzniklé v důsledku špatného pochopení programu zapříčiněného předchozí chybou.

Když jsem na řádku 24 poslechl radu z řádků 4 a 5 a doplnil středník, JShell upravené zadání akceptoval a vytvořil proměnné $4 a $5, do nichž uložil hodnoty výrazů v zadaných úryvcích.

Všimněte si, že proměnná $4 vznikla až při vyhodnocení prvního úryvku na daném řádku. Důležité však je, že v okamžiku, kdy se začal vyhodnocovat druhý úryvek na řádku, již byla vytvořena, takže ji druhý úryvek mohl použít.

Výpis 1.3: Více úryvků na jednom řádku

1. jshell> $1+$3 $1+$4

2. | Error:

3. | ‚;‘ expected

4. | $1+$3 $1+$4

5. | ^

6. | Error:

7. | not a statement

8. | $1+$3 $1+$4

9. | ^---^

10. | Error:

11. | cannot find symbol

12. | symbol: variable $4

13. | $1+$3 $1+$4

14. | ^^

15. | Error:

16. | unreachable statement

17. | $1+$3 $1+$4

18. | ^---^

19. | Error:

20. | missing return statement

21. | $1+$3 $1+$4

22. | ^----------^

24. jshell> $1+$3; $1+$4

25. $4 ==> 44

26. | created scratch variable $4 : int

27. $5 ==> 55

28. | created scratch variable $5 : int

30. jshell>

1.4Příkazy (commands)

Jednou za čas potřebujeme po prostředí i něco jiného než vyhodnocení zadaného úryvku. Potřebujete si připomenout, co už jsme zadali, uložit to do souboru nebo naopak ze souboru nějakou zapamatovanou skupinu úryvků načíst. Pak využijeme příkazy.

Žádný výraz ani příkaz programu v jazyce Java nemůže začínat lomítkem. Všechny příkazy prostředí JShell naopak lomítkem začínají. Prostředí tak snadno pozná, jestli se chystáme zadat další úryvek nebo příkaz. V této podkapitole se seznámíme pouze s několika základními příkazy, které se nám budou hodit v dalším výkladu.

Vyloučení úryvku: /drop

Občas se dostaneme do situace, kdy by bylo nejlepší nějaký úryvek odstranit, přesněji vyloučit ze seznamu aktivních (úplně odstranit nejde, JShell si pamatuje i ty vyloučené). K tomu slouží příkaz /drop, jemuž v parametru předáme identifikační číslo úryvku. Vytváří-li daný úryvek objekt s nějakým názvem, název, můžeme místo identifikačního čísla úryvku zadat název vytvořeného objektu.

Vážení čtenáři, právě jste dočetli ukázku z knihy Java 9.
Pokud se Vám líbila, celou knihu si můžete zakoupit v našem e-shopu.