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.

Přehled aktivních úryvků: /list

Zadáním příkazu /list požádáte prostředí o vypsání všech aktivních úryvků. Úryvky, při jejichž zadávání jste udělali chybu, ani úryvky, které jste vyloučili nebo nahradili novější verzí, se nevypisují.

Při výpisu úryvků se dodržuje formátování, v jakém jste úryvky zadali. Když jsem proto druhý úryvek zadal rozprostřený do tří řádků s různým oddělením čísel a operátoru + mezerami, tak se tak také vypíše – viz výpis 1.4, řádky 4 až 6. Stejně tak u úryvku 5 zobrazeného na řádku 9 vidíte, že do něj JShell zahrnul všechny znaky následující za středníkem ukončujícím předchozí úryvek včetně úvodní mezery (zadání viz řádek 24 ve výpisu 1.3).

Když jsem však druhý úryvek vyloučil z aktivních (řádky 11 a 12), tak ho příkaz /list již nevypsal (řádky 16 až 19),

Přehled aktivních úryvků: /list -all

O vypsání všech úryvků včetně těch chybných a těch vyloučených požádáte zadáním příkazu /list -all (stačí /list -a). Ten vypíše všechny zadané úryvky včetně úryvků startovního skriptu (jejich ID začíná písmenem s) spouštěného při spuštění programu JShell. Za ním následuje seznam všech zadaných úryvků včetně těch neaktivních, tj. těch, při jejichž zadávání jste udělali chybu, nebo které jste nahradili novější verzí – viz výpis 1.5.

Výpis 1.4: Výpisy úryvků příkazem /list

1. jshell> /list

3. 1 : 6+5

4. 2 : 6 +

5. 7+

6. 9

7. 3 : $1+$2

8. 4 : $1+$3;

9. 5 : $1+$4

11. jshell> /drop 2

12. | dropped variable $2

14. jshell> /list

16. 1 : 6+5

17. 3 : $1+$2

18. 4 : $1+$3;

19. 5 : $1+$4

21. jshell>

Výpis 1.5: Výpisy úryvků příkazem /list -all

1. jshell> /list -all

3. s1 : import java.io.*;

4. s2 : import java.math.*;

5. s3 : import java.net.*;

6. s4 : import java.nio.file.*;

7. s5 : import java.util.*;

8. s6 : import java.util.concurrent.*;

9. s7 : import java.util.function.*;

10. s8 : import java.util.prefs.*;

11. s9 : import java.util.regex.*;

12. s10 : import java.util.stream.*;

13. 1 : 6+5

14. 2 : 6 +

15. 7+

16. 9

17. 3 : $1+$2

18. e1 : $1+$3 $1+$4

19. 4 : $1+$3;

20. 5 : $1+$4

22. jshell>

Chybně zadané úryvky poznáte ve výpisu podle toho, že jejich ID začíná písmenem e (první písmeno slova error = chyba). Já jsem prozatím zadal jediný chybný úryvek, a to, když jsem zadával dva výrazy na jednom řádku a neukončil první středníkem. Tento úryvek dostal ID e1 a ve výpisu 1.5 je na řádku 18.

Bohužel, úryvky vyloučené z aktivních (např. úryvek s ID=2) nejsou ve výpisu nijak označeny, takže je musíte odhalit porovnáním se seznamem aktivních úryvků.

Přehled objektů daného druhu

Někdy nás nezajímají ani tak vlastní úryvky, ale spíše objekty, které jsme zadáním úryvku vytvořili, resp. stav, který je právě nastaven.

Už jsme se setkali s tím, že jsme vytvořili proměnnou. V dalším textu se naučíte vytvářet (= definovat) i metody a datové typy a zadávat různé importy. Pro každý z těchto druhů objektů existuje příkaz pro zobrazení objektů daného typu.

•Příkaz /vars, resp. /vars -allzobrazí aktivní, resp. všechny proměnné. S proměnnými se seznámíte v kapitole 3 Proměnné.

•Příkaz /methods, resp. /methods -all zobrazí aktivní, resp. všechny definované metody. Definovat metody se naučíte v kapitole 5 Definice metod.

•Příkaz /types, resp. /types -all zobrazí aktivní, resp. všechny datové typy definované uživatelem. Definovat vlastní datové typy se začnete učit v kapitole 11 Třídy a jejich členy.

•Příkaz /imports zobrazí zadané importy. O importování různých částí programu si povíme v kapitole 13 Balíčky a knihovny.

Definice metod, datových typů ani importů jsme doposud neprobírali, takže si na použití odpovídajících příkazů musíte počkat[4]. Můžete si ale vyzkoušet výpis všech aktivních proměnných. Výsledek zobrazuje výpis 1.6. Všimněte si, že zadáteli argument –all, bude příkaz /vars -all vypisovat i ty neaktivní.

Uložení aktivních úryvků: /save <file>

I při práci s prostředím JShell potřebujeme občas odběhnout a práci na tuto dobu uložit. K uložení práce slouží příkaz /save, který je schopen uložit všechny aktivní úryvky. Jako parametr příkazu se zadává cesta k cílovému souboru, přičemž relativní cesta se odvozuje od složky, v níž jste program spustili. Chcete-li soubor uložit do aktuálního adresáře, stačí napsat pouze jeho název.

Uložené soubory jsou vnímány jako skripty a používá se pro ně přípona jsh jako zkratka z názvu JShell. Je to sice jenom konvence, ale doporučuji vám ji používat.

Výpis 1.6: Výpis aktivních proměnných a všech proměnných

1. jshell> /vars

2. | int $1 = 11

3. | int $3 = 33

4. | int $4 = 44

5. | int $5 = 55

7. jshell> /vars -all

8. | int $1 = 11

9. | int $2 = (not-active)

10. | int $3 = 33

11. | int $4 = 44

12. | int $5 = 55

14. jshell>

Zadávat můžete jak absolutní, tak relativní cestu. Zadáte-li pouze název souboru, uloží se do složky, z níž jste program JShell spustili. Zadáte-li název souboru i s celou cestou, uloží se tam, kam jste si objednali.

Uložení všech zadaných úryvků: /save -all <file>

Zadáním příkazu /save -all uložíte všechny zadané úryvky včetně těch neaktivních (chybových nebo přepsaných). To se může hodit např. tehdy, chcete-li se o svých chybách s někým poradit.

Uložení dosavadního průběhu seance: /save -history <file>

Zadáním příkazu /save -history uložíte vše, co jste v průběhu seance zadali; nejenom úryvky, ale i příkazy. Zadáte-li příkaz /reset nebo /reload (budou vysvětleny za chvíli), uloží se i ten. Načtením skriptu uloženého tímto příkazem můžete zopakovat kompletní historii seance od spuštění programu JShell až do chvíle uložení historie. Tímto příkazem proto budu ukládat průběh jednotlivých kapitol.

Načtení skriptu: /open <file>

Uložený skript můžete znovu načíst. K tomu slouží příkaz /open, jehož jediným parametrem je cesta k načítanému souboru. Opět můžete zadávat absolutní i relativní cestu k souboru. Nejvýhodnější proto je mít načítané soubory uloženy tamtéž, co dávkový soubor, s jehož pomocí jste JShell spustili.

V některých kapitolách vám v poznámce o použitém projektu občas doporučím, abyste načetli nějaký soubor, v němž je připraven užitečný kód, který v dané kapitole použiju. Budete-li chtít zkoušet vše přesně tak, jak to ve výpisech zadávám, budete tento kód potřebovat.

Ukončení seance: /exit

Příkaz ukončí běh programu JShell. Nicméně JShell si mezi seancemi pamatuje dříve zadané příkazy, takže při následující seanci můžete pomocí šipek aktivovat příkazy z minulé seance, aniž byste je museli znovu celé vypisovat.

Restart: /reset

Občas se dostaneme do situace, v níž bychom nejraději vše zapomněli a začali zcela znovu. Po příkazu /reset JShell všechny zapamatované úryvky smaže, restartuje virtuální stroj a znovu načte startovní skript.

Znovuzavedení: /reload -restore

Příkaz /reload -restore použijete ve chvíli, kdy potřebujete počítač vypnout a po čase se k rozdělané práci vrátit. Zadáte-li po opětovném spuštění programu jako první příkaz /reload -restore, načtou se znovu všechny úryvky, které byly při ukončení předchozí seance aktivní.

Natavení startovního skriptu: /set -start <file>

Po spuštění programu JShell a po každém resetu se nejprve načte startovní skript. Jeho úryvky se ale příkazem /list nezobrazí. Zobrazit byste je mohli pouze příkazem /list -all nebo /list -start. V tomto skriptu si můžete připravit sadu definic úryvků, které pak budete v průběhu seance používat.

Startovní skript můžete kdykoliv změnit. Nově nastavený se začne načítat od příštího příkazu /reset nebo /reload a bude platit až do konce seance. Startovní skript nastavíte zadáním příkazu

/set -start <file>

kde <file> zastupuje soubor či skupinu souborů, které se při startu načtou.

V některých kapitolách vám bude na počátku doporučeno, abyste nastavili zadaný startovní skript, resp. startovní skripty. Jsou v nich připraveny úryvky, které budu v průběhu dané kapitoly využívat.

Nápověda: /?

Nápovědu můžeme vyvolat dvěma příkazy: výše uvedeným příkazem /?, anebo příkazem /help. Za příkaz /help můžeme dát parametr s názvem objektu, o kterém se chceme dozvědět něco podrobněji.

Nápovědu můžete získat i tak, že rozepíšete úryvek nebo příkaz a stisknete klávesu <TAB>. Prostředí se „zamyslí“, jestli vám může radit. Pokud ano, tak doplní zadávaný příkaz a/nebo vypíše pod něj seznam možných pokračování.

Napovídací schopnosti prostředí umožní nezadávat příkazy v plném znění. Stačí napsat dostatečný počet znaků, aby prostředí zadávaný příkaz poznalo, a zadat jej.

1.5Základní syntaktická pravidla

Na závěr představování programu JShell bych vás rád seznámil se dvěma základními součástmi kódu, které pomohou zpřehlednit skripty se záznamem průběhu jednotlivých kapitol.

Jak jistě víte, kód je správně zapsaná posloupnost znaků, přičemž ono „správně“ znamená, že je zapsaná podle syntaktických pravidel daného jazyka. V této pasáží vám představím ta hlavní pravidla, v dalším textu se pak budeme postupně seznamovat s dalšími.

Bílé znaky

Kód programu je tvořen posloupností symbolů, mezi něž patří identifikátory, operátory (např. + — =) a oddělovače (např. , ; : – čárka, středník, dvojtečka).

Mezi tyto symboly je možno vkládat libovolný počet bílých znaků, přičemž definice jazyka specifikuje bílý znak jako jeden ze znaků:

•mezera (‚\u0020‘),

•vodorovný tabulátor (‚\u000C‘),

•konec stránky – zde jsou tři možnosti:

•znak LF = ‚\u000A‘,

•znak CR = ‚\u000D‘,

•dvojice znaků CRLF = „\u000D\u000A“).

Libovolný počet je i nula. Pokud by se však v případě, kdy mezi dva symboly nevložíte žádný bílý znak, tyto dva symboly slily a definovaly tak symbol jiný, je třeba mezi ně bílý znak vložit.

Když např. napíšete a+b, nemusíte znak + od okolních identifikátorů oddělovat, protože tento znak nemůže být součástí identifikátoru, takže je zcela zřejmé, kde jeden symbol končí a druhý začíná.

Když ale budete potřebovat napsat int i (za chvíli to použijeme), tak mezi tyto dva identifikátory bílý znak vložit musíte, protože inti by překladač považoval za identifikátor jediný.

Komentáře

Komentář je část programu, kterou překladač ignoruje a která slouží pouze k tomu, aby čtenář získal o programu nějaké informace, které by mu při čtení kódu nemusely dojít. Komentář můžeme v programu napsat všude tam, kam můžeme napsat mezeru. Překladači je pak jedno, jestli na dané místo napíšeme komentář nebo mezeru – můžeme se na jeho práci dívat tak, že před vlastním překladem nahradí všechny komentáře mezerami.

Java definuje dva druhy komentářů: blokové, které mohou zabírat více řádků, a řádkové, které jsou na jediném řádku.

Řádkový komentář začíná dvojicí lomítek (//) a končí s koncem řádku. Potřebujeme-li pokračovat s informací i na dalším řádku, musíme před pokračovací text znovu vložit dvojici lomítek.

Blokový komentář začíná „otevírací komentářovou závorkou“ tvořenou znaky /* (lomítko následované hvězdičkou) a končí „zavírací komentářovou závorkou“ tvořenou znaky */ (hvězdička následovaná lomítkem). Uvnitř komentáře mohou být libovolné znaky (včetně přechodu na nový řádek) s výjimkou posloupnosti znaků tvořících zavírací komentářovou závorku. Z toho vyplývá, že blokové komentáře nemůžeme vnořovat. Vložíme-li do blokového komentáře posloupnost / *, bude to mít stejný vliv, jako kdybychom tam vložili cokoliv jiného s výjimkou zavírací komentářové závorky.

Speciálním případem blokového komentáře je dokumentační komentář, což je blokový komentář začínající trojicí znaků / **. Dokumentační komentáře slouží (jak název napovídá) k dokumentaci označeného kódu. Podrobněji vás s nimi seznámím, až bude jejich použití smysluplné, konkrétně v podkapitole 14.1 Dokumentační komentáře a API.

Komentáře můžete začlenit jako součást úryvku. Hodí se to např. tehdy, když si budete chtít seanci uložit a uložený skript později prohlížet. Komentář vám může připomenout, co jste zadáním daného úryvku sledovali či předat jinou informaci, kterou byste mohli zapomenout.

Ukázky řádkového i blokového komentáře si můžete prohlédnout ve výpisu 1.7. Dokumentační komentář jsem nepředváděl – později se mu budeme věnovat podrobněji. Na řádku ٧ je předvedeno, jak lze komentář použít jako součást úryvku.

Ve výpisu si všimněte, že řádky obsahující pouze komentáře příkaz /list nevypisuje. Když je ale komentář součástí nějakého úryvku, příkaz /list jej vypíše jako součást daného úryvku – viz řádek 17.

K úryvkům obsahujícím pouze komentáře se JShell chová obdobně jako k příkazům (ty také začínají lomítkem). Nezobrazuje ani příkaz /list -all, ale pouze příkaz /list -history, který vypíše celou konverzaci včetně případných řádků obsahujících pouze komentáře.

Výpis 1.7: Ukázky použití komentářů

1. jshell> //Řádkový komentář

3. jshell> /* Několikařádkový blokový komentář

4. ...>  /* Vložení nové otevírací závorky neodstartuje vnořený komentář

5. ...>  vše se ukončí zapsáním zavírací závorky. */

7. jshell> $1 + $5  //Komentář jako součást úryvku

8. $6 ==> 66

9. | created scratch variable $6 : int

11. jshell> /list

13. 1 : 6+5

14. 3 : $1+$2

15. 4 : $1+$3;

16. 5 : $1+$4

17. 6 : $1 + $5  //Komentář jako součást úryvku

19. jshell>

1.6Ovládání

Při editaci úryvků a příkazů používáme nejčastěji editační šipky: šipkami doprava a doleva se přesouváme po aktuálně zadávaném textu, šipkou nahoru a dolů procházíme seznam doposud zadaných úryvků a příkazů.

Prostředí JShell sice nabízí řadu dalších klávesových zkratek, ale domnívám se, že byste je stejně nepoužívali. Koho zajímají, ten je najde v již několikrát zmíněné příručce Java 9 – JShell.

Použití editoru

Začnete-li používat JShell intenzivněji, budete chtít definovat složitější úryvky než ty prostoduché, které jsme definovali doposud. Pro takovéto případy nabízí JShell jednoduchý zabudovaný editor, v němž můžete vytvářet a upravovat složitější definice. Editor aktivujete zadáním příkazu

/edit <ID>

kde parametr <ID> může zastupovat jako identifikační číslo úryvku, tak název definovaného objektu.

Můžete dokonce uvést několik názvů či ID za sebou oddělených mezerami, přičemž můžete uvést jak aktivní úryvky, tak ty vyloučené. Editor pak otevře všechny jmenované. Na obrázku 1.2 je okno editoru otevřené po zadání příkazu

/edit 1 $2 4

Příkaz můžete zadat i bez parametru. Pak se v editoru otevřou všechny aktivní úryvky, ale to by byl v současné situaci pouze úryvek 1.

Obrázek 1.2:

Okno zabudovaného editoru otevřené po zadání příkazu /edit 1 $2 4

Okno se ovládá tak, že si v něm prohlédnete zobrazený kód a v případě potřeby jej upravíte. Význam tlačítek je následující:

•Tlačítko Cancel použijete tehdy, když si svoji úpravu rozmyslíte nebo když jste si chtěli definice jen prohlédnout. Okno editoru se zavře a vy můžete pokračovat v práci v konzolovém okně, aniž by se zaměnil původní stav.

•Tlačítko Exit stisknete tehdy, budete-li chtít své úpravy potvrdit. I po jeho stisku se okno editoru zavře, ale před zavřením se zadaný text předá k vyhodnocení.

Je ale dobré vědět, že pokud v editačním okně nic nezměníte (anebo něco sice změníte, ale pak vrátíte text do původního stavu), nic se po stisku tohoto tlačítka nezadá.

•Tlačítko Accept, které na obrázku 1.2 stiskává myš, použijete ve chvíli, kdy si nejste jisti tím, že vaše zadání je bezchybné a chcete ho nejprve prověřit. Vaše zadání se pak předá k vyhodnocení, vy si v konzolovém okně můžete prohlédnout výsledek a pokračovat v editaci.

I zde platí, že shoduje-li se výsledný text s výchozím, tak se platformě nic nezadává.

Když jsem ale upravil podobu druhého (tj. vyloučeného) úryvku podle obrázku 1.3, JShell jej akceptoval a uložil upravenou verzi jako úryvek s ID=7 – viz výpis 1.8.

Ve výpisu 1.8 bych vás chtěl upozornit na několik drobností. Jak naznačuje komentář v okně editoru, JShell akceptuje text obdržený z editoru obdobně, jako bychom ho celý zadali v jediném řádku. Z toho vyplývají následující vlastnosti:

•JShell si pamatuje podobu zobrazovaného textu a zpracovává pouze tu část, která se změnila – v našem případě pouze prostřední dva řádky definující nový úryvek.

Obrázek 1.3:

Okno zabudovaného editoru otevřené po zadání příkazu /edit 1 $2 4

Výpis 1.8: Příkaz editace a výpis úryvků po editaci v okně na obrázku 1.3

1. jshell> /edit 1 $2 4

2. $7 ==> 77

3. | created scratch variable $7 : int

5. jshell> /list

7. 1 : 6+5

8. 3 : $1+$2

9. 4 : $1+$3;

10. 5 : $1+$4

11. 6 : $1 + $5 //Komentář jako součást úryvku

12. 7 : //Při zadání z editoru je zadaný text vnímán jako řádek

13. $3 + $4;

15. jshell>

•Středník si můžete odpustit pouze na posledním řádku. Pokud by nebyl některý z úryvků zadaných na předchozích řádcích ukončen středníkem, JShell by ohlásil chybu (nebo celou sérii chyb). Stejně jako tomu bylo ve výpisu 1.3.

•Chcete-li, aby se komentář stal součástí úryvku, musíte jej zadat před daným úryvkem. Napíšete-li jej za úryvek (přesněji za ukončující středník), bude jej JShell zpracovávat jako součást následujícího úryvku.

Vyzkoušejte si, jaká bude reakce prostředí, pokud byste v editoru smazali středník ukončující první úryvek a jaká bude reakce prostředí, přidáteli vysvětlující komentář na konec druhého úryvku za jeho ukončující středník.

Nastavení vlastního editoru

Připadá-li vám zabudovaný editor příliš jednoduchý a prostý, můžete použít svůj vlastní. Ten zadáte použitím příkazu

/set editor -retain -wait <command>

V tomto příkazu parametr -retain zadává, že si vaše nastavení bude JShell pamatovat a při příštím spuštění bude tento editor již přednastaven. Nechcete-li zadávat editor jako trvalý, ale budete-li jej zadávat pouze pro danou seanci, můžete parametr -retain vynechat.

Zadáním parametru -wait upravíte reakci prostředí JShell tak, že nebude čekat na zavření zavolaného editoru, ale na to, až opět aktivujete okno, v němž běží JShell (pravděpodobně konzolové okno). Poté stisknete dvakrát klávesu ENTER. Pomocný soubor určený k editaci přitom může zůstat v osloveném editoru nadále otevřený.

Parametr <command> reprezentuje příkaz operačního systému, kterým se daný editor spouští. JShell za tento příkaz doplní název souboru s editovaným textem.

Kdybyste měli s nastavením svého oblíbeného editoru nějaké problémy, zkuste si sehnat knihu Java 9 – JShell, v níž je tato problematika poměrně podrobně rozebrána.

1.7Záznamy lekcí

Z lekcí, v nichž bude probíraná látka demonstrována na úryvcích programu JShell, budu vytvářet záznamy jako skripty obsahující všechny zadané úryvky a příkazy. Oproti skriptům, které bychom získali zadáním příkazu /save –history, budou tyto skripty obsahovat navíc komentáře, které budou naznačovat, v jakém výpisu budou zobrazeny jednotlivé úryvky zadávané v dané kapitole.

1.8Shrnutí

Skript uchovávající naše akce z této kapitoly spolu s výše uvedenými informačními komentáři je uložen v souboru 01S_c_JShell_Intro.jsh.

1 Systémovou nabídku aktivujete klepnutím na ikonu na levém okraji titulkové lišty okna.

2 Já používám program PAPad, který můžete stáhnout z adresy http://pspad.com v některé z osmi lokalizací. Dáváte-li ale přesnost jinému, nebudu vám bránit.

3 Návod, jak se to dělá, určený pro ty, kteří nemají s nastavováním této proměnné žádné zkušenosti, je v příloze výše zmíněné příručky Java 9 – JShell.

4 Myslel jsem tím smysluplné použití. Použít je můžete hned, ale JShell vám v odpovědi zobrazí pouze prázdný seznam.

Kapitola 2

Základní datové typy a jejich literály

Co se v kapitole naučíte

Tato kapitola vás seznámí se základními datovými typy, konkrétně s primitivními datovými typy a s typy Object a String. Současně vás naučí, jak v programu zadávat konstanty těchto typů – tzv. literály.

V této kapitole odstartujeme novou seanci. Nicméně pokud máte program JShell spuštěný, nemusíte jej ukončovat – stačí, když zadáte příkaz /reset.

2.1Datové 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. Datový typ (nebo zkráceně jen typ) je označení pro trojici charakteristik specifikujících vlastnosti hodnot, které budeme označovat za data daného typu. Svůj typ mají veškerá data, se kterými program pracuje. Datový typ specifikuje:

•množinu přípustných hodnot, resp. stavů,

•způsob uložení těchto hodnot (stavů) v paměti (o ten se zatím nebudeme zajímat a zpracování této informace přenecháme virtuálnímu stroji),

•operace, které lze s instancemi daného typu provádět.

Jinými slovy: datový typ prozrazuje, co můžeme od hodnot daného typu očekávat a co s nimi můžeme dělat. Tím se na jednu stranu zvyšuje efektivita práce programu, ale především se tím snižuje počet chyb. K této otázce se v budoucnu ještě několikrát vrátím.

Java (a spolu s ní řada další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.

Dělení datových typů

Jak jistě víte, Java se řadí mezi jazyky podporující objektově orientované programování – OOP. V čistém OOP jsou všechny datové typy objektové. Tvůrci Javy ale chtěli, aby výsledné programy pracovaly co nejrychleji i na jednoduchých procesorech zabudovaných v nejrůznějších zařízeních, a proto rozdělili datové typy do tří skupin:

•Speciální jednoprvkovou skupinu představuje degenerovaný typ-netyp void, který se používá pouze k tomu, aby programátor mohl veřejně vyhlásit, že nějaká metoda nic nevrací (co to znamená, si vysvětlíme v kapitole 5 Definice metod). Nikde jinde se použít nedá.

•Osm datových typů, které mají přímou podporu v instrukčních souborech většiny mikroprocesorů, označili jako primitivní datové typy. (Hodnoty těchto typů budeme občas označovat jako primitivní hodnoty.) Práci s nimi převádí virtuální stroj přímo na příslušné instrukce daného procesoru. Hodnoty primitivních typů se často označují souhrnným názvem primitiva.

Práce s hodnotami primitivních datových typů je sice mnohem jednodušší a rychlejší než práce s objekty, ale tato jednoduchost je vykoupena nemožností dále je rozšiřovat a upravovat jejich vlastnosti a schopnosti.

•Všechny ostatní datové typy zařadili mezi objektové datové typy. S nimi se pracuje jinak. Objektových typů bývá v programu definováno většinou mnohem víc. Jenom ve standardní knihovně Javy 9 je definováno 5938 veřejně použitelných datových typů a několikanásobně více těch soukromých určených pro interní použití v rámci knihovny.

Objektové datové typy 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ů.

Knihovnou označujeme sadu datových typů, které tvoří nějaký ucelený soubor a které můžeme ve svém programu používat. Standardní knihovna je součástí instalace Javy. Ostatní je třeba nějak získat a začlenit do programu.

Objektových datových typů je několik druhů. Nejpoužívanější z nich jsou třídy. Setkáte-li se v dalším výkladu s termínem třída, takž vězte, že to je jeden z možných druhů objektových datových typů.

Primitivní datové typy

Primitivní datové typy bychom mohli rozdělit do dvou skupin: na ty poměrně často využívané a na ty, s nimiž se setkáte spíše výjimečně. Mezi ty často používané patří datové typy:

booleanDefinuje 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. Na jeho počest se práce s logickými výrazy označuje jako Booleova algebra.

charZnaky (zkratka z anglického character = znak) respektující kódování podle normy Unicode. Vedle číslic a písmen všech abeced včetně čínských, japonských a korejských znaků, egyptských hieroglyfů apod. sem patří i další znaky jako noty, kartografické značky, emotikony a další.

doubleOznačuje datový typ pro reprezentaci reálných čísel. Čísla typu double se v Javě ukládají s přesností na 15 platných číslic a v rozsahu přibližně 10±308 (číslo s 308 nulami před, resp. za desetinnou čárkou). 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.

intOznačuje typ celých čísel, jejichž hodnoty se mohou pohybovat v rozsahu ±2 miliardy (přesně od 2 147 483 648 do +2 147 483 647, tj. od 2^31 do +2^31-1). Název typu je zkratkou ze slova integer (= celé číslo). Je to nejpoužívanější datový typ.

longVelká celá čísla v rozsahu přibližně ±9×10^18 (chcete-li to přesně, tak je to od –9 223 372 036 854 775 808 do +9 223 372 036 854 775 807, tj. od 2^63 do +2^63-1.

Zbylé primitivní datové typy se příliš nepoužívají a uvádím je pouze pro úplnost:

byteCelá čísla od -128 do +127, tj. od 2^7 do +2^7-1.

shortCelá čísla v rozsahu od -32 768 do +32 767, tj. od 2^15 do +2^15-1.

floatReálná čísla v rozsahu asi 10±38 uchovávaná s přesností přibližně 6 platných čísel.

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 12300 nemá žádné desetinné místo a může mít tři až pět platných číslic podle toho, jsouli závěrečné nuly přesné, anebo vznikly zaokrouhlením.

Objektové datové typy

Jak jsem již řekl, objektových datových typů je nepřeberné množství[5] a sami můžete vytvářet další. Podrobněji se jim budu věnovat v druhé části učebnice. Prozatím vás seznámím jenom se třemi nejdůležitějšími, přičemž všechny patří mezi třídy:

ObjectSpolečný rodič všech datových typů. Mohli bychom jej (s jistou nadsázkou) považovat za programovou realizaci základní teze, že všechno je objekt (ještě se k ní vrátíme).

StringDatový typ reprezentující textové řetězce, tj. posloupnosti znaků. Kdykoliv budeme chtít pracovat s textovým řetězcem (budeme jej chtít někam vložit, zapsat, poslat, …), budeme pracovat s objektem typu String. V programátorském slangu jsou proto textové řetězce označovány jako stringy. V dalším výkladu proto občas tento termín v zájmu zjednodušení použiji.

ClassDatový typ, jehož hodnoty reprezentují jiné datové typy. Podrobněji se s ním seznámíte až v druhé části knihy.

null-typeSpeciální typ, který je potomkem všech ostatních datových typů (o tom, co je to předek a potomek, se rozpovídám v podkapitole 10.13  Dědění). Tento datový typ je oficiálně bezejmenný, ale v dokumentaci je označovaný jako null type. Jeho jedinou hodnotu je totiž konstanta null reprezentující tzv. prázdný odkaz.

V objektovém programování se objekty daného datového typu často označují jako instance daného datového typu. Vedle objektů, které jsou instancemi nějakého typu, totiž existují i objekty, které nejsou instancemi žádného typu. To vše si ale podrobně probereme až ve druhé části.

Odkazy na objekty

V Javě jsou data všech objektů uložena ve speciální oblasti paměti nazývané halda (anglicky heap). Program nikdy nepracuje přímo s těmito daty, ale vždy pouze s odkazem na ně. Hovoříme-li proto o tom, že v proměnné je uložena hodnota objektového typu, znamená to, že v proměnné je uložen odkaz na místo na haldě, kde jsou uložena data reprezentující daný objekt.

K tomuto tématu se ještě vrátím v druhé části, až budeme probírat konstrukce podporující objektově orientované programování.

2.2Literály

Literály jsou vlastně konstanty nazvané svojí hodnotou. Když někam napíšete např. číslo 3.14 nebo textový řetězec „Dobrý den“, použili jste literál. Pojďme se nyní podívat, jak se správně zapisují literály jednotlivých datových typů.

Literály typu boolean

Potřebujete-li někam uložit hodnotu informující o tom, zda něco je či není pravda, zadáváte hodnotu true, resp. false – viz výpis 2.1.

Výpis 2.1: Literály typu boolean

1. jshell> false //NE, neplatí, nepravda, ...

2. $1 ==> false

3. | created scratch variable $1 : boolean

5. jshell> true //ANO, platí, pravda, ...

6. $2 ==> true

7. | created scratch variable $2 : boolean

9. jshell>

Literály typu int

U celých čísel je to složitější, mimo jiné proto, že jejich hodnoty je možno zapisovat ve čtyřech číselných soustavách: ve dvojkové, osmičkové, desítkové nebo šestnáctkové soustavě. Zápisy v jednotlivých soustavách se liší předponou (prefixem) a použitelnými číslicemi. V následujícím přehledu je vždy uveden základ číselné soustavy následovaný pravidly pro zápis v této soustavě.

2Číslo zapisované ve dvojkové soustavě má jako předponu dvojici znaků 0b nebo 0B. Povolené jsou pouze číslice 0 a 1.

8Číslo zapisované v osmičkové soustavě musí začínat číslicí 0 (to je jeho prefix). Povolené jsou pouze číslice 0 až 7.

10Číslo zapisované v desítkové soustavě nemá žádný prefix a NESMÍ začínat číslicí 0 (pak by bylo považováno za zapsané v osmičkové soustavě). Uvnitř čísla jsou povolené číslice 0 až 9.

16Číslo zapisované v šestnáctkové (hexadecimální) soustavě má jako prefix dvojicí znaků 0x nebo 0X. Povolené jsou číslice 0 až 9 a znaky A až F, resp. a až f reprezentující číslice s hodnotami 10 až 15.

Historická vsuvka – číselné soustavy

Osmičková (můžete se také setkat s termínem oktalová) číselná soustava se v současné době již příliš nepoužívá. Její podpora je převzata z jazyka C, na nějž Java nepřímo navazuje. Jazyk C byl vyvinut v sedmdesátých letech pro operační systém UNIX, jenž byl původně vyvinut pro počítače PDP. Na nich se často používala osmičková soustava. Ostatně délka slova těchto počítačů byla zpočátku vždy dělitelná třemi – jejich slova měla 12, 18, 24 nebo 36 bitů, takže se jejich obsah dal výhodně zapsat několika osmičkovými číslicemi (osmičková číslice je ekvivalentem tří dvojkových číslic – tří bitů).

Délka slov, která je mocninou čísla 2 (4, 8, 16, 32, 64 či 128 bitů) se ustálila později. Spolu s ní se prosadilo i používání šestnáctkové soustavy, protože jedna šestnáctková číslice je ekvivalentem čtyř číslic dvojkových, takže obsah slova je výhodně definován příslušným počtem šestnáctkových číslic.

Šestnáctková (můžete se také setkat s termínem hexadecimální*) číselná soustava používá k zápisu čísla šestnáct číslic představující hodnoty nula až patnáct. Pro šestnáctkové číslice větší než 9 se používají písmena z počátku abecedy: A=10, B=11, C=12, D=13, E=14, F=15. Přitom nezáleží na tom, používají-li se písmena malá či velká.

* Nepleťte si termín hexadecimální, tj. šestnáctková, s termínem hexagesimální (někdy se používá i termín sexagesimální), tj. šedesátková. Šedesátkovou číselnou soustavu používali staří Sumerové. Dnes se používá při měření času (minuty, sekundy) a při měření úhlů.

Aby se zpřehlednil zápis dlouhých čísel, je povoleno vkládat do prostoru mezi první a poslední číslicí znaky podtržení. Syntaktický diagram pravidel pro zápis čísla je vidět na obrázku 2.1. V levé části jsou vyjmenovány povolené prefixy a v pravé je pak vlastní definice zápisu čísla.

V desítkové soustavě nesmí být první číslicí nula, v ostatních soustavách může být první číslicí libovolná číslice platná v dané soustavě.

Obrázek 2.1:

Syntaktický diagram zápisu čísla v různých číselných soustavách

Názvy skupin bitů

V souvislosti s ukládáním do paměti a bitovými operacemi bych připomenul základní termíny:

BitDvojková číslice 0/1

NibbleČtveřice dvojkových číslic umožňující původně reprezentovat jednu desítkovou číslici. Později se termín ustálil jako označení pro paměťový prostor pro právě jednu šestnáctkovou číslici.

BajtAnglicky byte, původně překládáno do češtiny jako slabika, ale nyní už výhradně jako bajt. Bajt měl na různých počítačích různý počet bitů, ale posléze se prosadila velikost 8 bitů, která je také standardizována v ISO/IEC 2382-1 a následně v IEC 80000-13.

SlovoAnglicky word představuje základní paměťovou jednotku počítače. Současné počítače používají většinou 32 nebo 64bitová slova.

Slovo bývá nejmenší jednotka, kterou umí procesor načíst. Má-li pracovat s menšími jednotkami, načte slovo a požadovanou menší jednotku (např. bajt) z něj extrahuje.

Ve výpisu 2.2 jsou příklady různých zadání čísel ve všech vyjmenovaných číselných soustavách.

Na řádku 1 je ve dvojkové soustavě zadáno 23 (= 1×16 + 0×8 + 1×4 + 1×2 + 1×1) Znak podtržení je vložen tak, aby se usnadnil převod do šestnáctkové soustavy.

Na řádku 5 je zapsáno totéž číslo v téže soustavě, ale tentokrát je znak podtržení vložen tak, aby se usnadnil převod do osmičkové soustavy.

Na řádku 9 je toto číslo v osmičkové soustavě (2×8 + 7×1) a na řádku 13 v šestnáctkové soustavě (1×16 + 7×1).

Na řádku 17 ukazuji, že napíšete-li v čísle začínajícím nulou číslici větší než 7, překladač se vzbouří a ohlásí syntaktickou chybu. Takové číslice totiž v osmičkové soustavě nejsou.

Na řádku 21 je další „oblíbená“: při pokusu o zápis čísla 0x17 je místo počáteční nuly zapsáno písmeno O. Posloupnost znaků Ox17 pak překladač logiky chápe jako identifikátor (název), a protože takto pojmenovaný objekt nezná, ohlásí chybu.

Toto je častá chyba, kterou začátečníci špatně odhalují, protože ten rozdíl mezi znaky nevidí. Proto byste měli při programování používat písma, která jasné odlišují nulu od O a jedničku od l (malé L) a I. Na řádku 26 je již číslo zapsáno správně.

Výpis 2.2: Literály typu int v různých číselných soustavách

1. jshell> 0b1_0111 //23 = 1×16 + 0×8 + 1×4 + 1×2 + 1×1 = 0x17

2. $3 ==> 23

3. | created scratch variable $3 : int

5. jshell> 0B10_111 //027 - Stejné číslo upravené pro snazší převod na osmičkové

6. $4 ==> 23

7. | created scratch variable $4 : int

9. jshell> 027 //Stejné číslo zapsané v osmičkové soustavě

10. $5 ==> 23

11. | created scratch variable $5 : int

13. jshell> 0x17 //Stejné číslo zapsané v šestnáctkové soustavě

14. $6 ==> 23

15. | created scratch variable $6 : int

17. jshell> 08 //Začíná nulou, ale obsahuje příliš velkou číslici

18. | Error:

19. | integer number too large: 08

20. | 08 //Začíná nulou, ale obsahuje příliš velkou číslici

21. | ^

23. jshell> Ox17 //Začíná písmenem O => není to číslo, ale identifikátor

24. | Error:

25. | cannot find symbol

26. | symbol: variable Ox17

27. | Ox17 //Začíná písmenem O => není to číslo, ale identifikátor

28. | ^--^

30. jshell>

Literály typu long

Literály typu long se od literálů typu int liší pouze příponou (sufixem) l nebo L, přičemž se vřele nedoporučuje používat malé l, které se dá velmi snadno splést s jedničkou. U zadávání hodnot typu long se musí přípona uvádět vždy.

Výpis 2.3 ukazuje, že u malých čísel v rozsahu čísel typu int ovlivníte příponou typ proměnné, kterou pro vaši hodnotu překladač vyhradí. Pro nulu zadanou na řádku 1 vyhradil proměnnou typu long, kdežto pro mnohem větší číslo na řádku 5 zadané bez přípony vyhradil pouze proměnnou typu int, protože se do ní vešlo.

Na řádku 9 jsem zadal číslo přesahující rozsah čísel typu int. Protože jsem však nezadal příponu, překladač ohlásil syntaktickou chybu. Stačilo ale zadat příponu (viz řádek 15) a vše prošlo naprosto hladce.

Výpis 2.3: Literály typu long

1. jshell> 0L //Nula typu long

2. $7 ==> 0

3. | created scratch variable $7 : long

5. jshell> 1_234_567_890 //Vejde se do typu int

6. $8 ==> 1234567890

7. | created scratch variable $8 : int

9. jshell> 9_876_543_210 //Chyba: Nemá příponu a na int moc velké

10. | Error:

11. | integer number too large: 9876543210

12. | 9_876_543_210 //Chyba: Nemá příponu a na int moc velké,

13. | ^

15. jshell> 9_876_543_210L //Správně zapsané číslo typu long

16. $9 ==> 9876543210

17. | created scratch variable $9 : long

19. jshell>

Literály typu byte a short

Datové typy byte a short nemají žádné své literály. Jak se s nimi pracuje, si proto ukážeme, až probereme operátor přetypování.

Literály typu double

Reálná čísla jde zapsat v desítkové nebo šestnáctkové soustavě. Druhý způsob se ale používá pouze ve výjimečných situacích, takže jej tu nebudu rozebírat. I tak je to s nimi složitější, protože je můžeme zapsat třemi způsoby: buď jako obyčejné desetinné číslo, např. 3.1415926, nebo v tzv. semilogaritmickém tvaru, anebo jako celé číslo, kterému přidáme vhodnou příponu. Pojďme se na jednotlivé možnosti podívat podrobněji.

Celé číslo s příponou

Tento případ je nejjednodušší. Stačí za celé číslo přidat příponu d nebo D, a překladač je převede na číslo typu double. Ve výpisu 2.4 je tato možnost použita na řádcích 1 a 5.

Obyčejné desetinné číslo

Zapíšete-li zadané číslo jako desetinné číslo, nemusíte (ale můžete) doplňovat příponu, protože překladač si ji domyslí. Při zápisu se uplatní následující pravidla:

•Je-li desetinné číslo zadáno bez přípony, je zpracováno jako číslo typu double.

•Oproti našim zvyklostem se v Javě (stejně jako v ostatních programovacích jazycích) nepoužívá desetinná čárka, ale desetinná tečka.

•Oproti celým číslům mohou desetinná čísla začínat i nulou.

•Lenoši ocení, že nemáli číslo celou část, nemusejí před desetinnou tečku psát nic – např. číslo 0,123 můžeme zapsat .123. Nicméně zápis 0.123 je také správný.

Číslo v semilogaritmickém tvaru

Semilogaritmický tvar (někdo tomuto tvaru říká „vědecký tvar“) sestává ze tří částí: mantisy, oddělovače exponentu a vlastního exponentu.

•Mantisa je obyčejné desetinné číslo.

•Jako oddělovač exponentu slouží písmeno e nebo E.

•Exponent je celé číslo se znaménkem.

Při použití semilogaritmického tvaru můžete číslo zapsat mnoha způsoby. Několik možných podob zápisu čísla 123,45 uvádí následující tabulka. U každé podoby je přitom uveden její ekvivalent, jak by jej zapsal matematik.

Java

Matematik

0.012345e+4

0,012345.10 4

1.2345e2

1,2345.10 2

123.45E0

123,45.10 0

12345E-2

12345.10 -2

.12345e+03

0,12345.10 3

12.345E01

12,345.10 1

1234.5e-1

1234,5.10 -1

123450e-3

123450.10 -3

I zde platí, že zadáte-li číslo bez přípony, je zpracováváno jako číslo typu double.

Ve výpisu 2.4 si můžete prohlédnout několik dalších ukázek zadání. Na řádku 1 je zadáno stejné číslo, které jsme zadávali v předchozím výpisu jako hodnotu typu long. Změna přípony změní vnímání tohoto čísla překladačem. Stejně je tomu i u nuly zadané na řádku 5.

Na řádcích 9 a 13 je dvakrát zadáno stejné číslo – jednou v běžném a podruhé v semilogaritmickém tvaru. Všimněte si, že programu je jedno, jak jsme číslo zadali, a jeho hodnotu vypisuje vždy v základním tvaru. Nicméně když je číslo opravdu veliké jako např. číslo na řádku 17, dá přednost zápisu v semilogaritmickém tvaru. Postupnými úpravami exponentu si můžete vyzkoušet, kdy počítač mezi těmito dvěma tvary přepíná.

Výpis 2.4: Různé způsoby zadání literálů typu double

1. jshell> 9_876_543_210D //Totéž číslo jako minule, ale nyní typu double

2. $10 ==> 9.87654321E9

3. | created scratch variable $10 : double

5. jshell> 0D //Nula typu double

6. $11 ==> 0.0

7. | created scratch variable $11 : double

9. jshell> 0.012345 //Zápis s pevnou řádovou (desetinnou) tečkou

10. $12 ==> 0.012345

11. | created scratch variable $12 : double

13. jshell> 12345e-6 //Totéž číslo zapsané v semilogaritmickém tvaru

14. $13 ==> 0.012345

15. | created scratch variable $13 : double

17. jshell> 123.45e67 //Trochu větší číslo

18. $14 ==> 1.2345E69

19. | created scratch variable $14 : double

21. jshell>

Syntaktický diagram zápisu čísla typu double je na obrázku 2.2.

Literály typu float

Literály typu float se od literálů typu double liší pouze příponou (sufixem) f nebo F. Oproti literálům typu double však musíte příponu psát vždy, protože jinak se překladač bude snažit zadávané číslo interpretovat jako číslo typu double.

Ve výpisu 2.5 jsou zadána dvě čísla. Protože mají zadánu příponu F, resp. f, prostředí pro ně vyhradilo proměnnou typu float.

Obrázek 2.2:

Syntaktický diagram zápisu čísla typu double

Výpis 2.5: Literály typu float

1. jshell> 123.45e6F //Číslo typu float

2. $15 ==> 1.2345E8

3. | created scratch variable $15 : float

5. jshell> 0f //Nula typu float

6. $16 ==> 0.0

7. | created scratch variable $16 : float

9. jshell>

Literály typu char

Jak už jsem řekl, hodnoty typy char reprezentují znaky kódované podle normy Unicode. Původní verze normy, která se narodila na konci 80. let minulého století, počítala s kódováním do dvou bajtů nabízejících prostor pro 65 536 kódů. Do něj se vešly všechny znakové abecedy i základní sady čínských, japonských a korejských znaků.

S příchodem verze 2.0 v roce 1995 však bylo rozhodnuto, že se tento prostor rozšíří tak, aby se do něj bezpečně vešly všechny znaky všech abeced spolu s dalšími používanými znaky. Nově definovaná norma umožňuje definovat přes milión kódů. V současné době je jich však definováno jen necelých 140 000, takže je zřejmé, že místa je dost.

Nevýhodou je to, že se pak některé znaky musejí kódovat prostřednictvím dvojice hodnot typu char, anebo prostřednictvím čísla typu int. Standardní knihovna poskytuje metody pro oba způsoby zadávání těchto znaků. My však takovéto exotické znaky v našem kurzu používat nebudeme, takže se v dalším textu soustředím pouze na definici znaků, které vystačí s jedinou hodnotou typu char. Chtěl jsem ale, abyste věděli, že se v některých situacích můžete setkat se znakem, který bude „náročnější“. Pokud se s nimi ve své praxi někdo setká, najde základní informace v knize [5], kterou si můžete zdarma stáhnout u mne na webu.

Pojďme ale k definici. Znakové literály uzavírají reprezentovaný znak mezi dvojici apostrofů – např. ‚a‘ nebo ‚%‘. Takto zadávají znaky snadno dosažitelné z klávesnice. Často však daný znak na klávesnici není a nám nezbývá než jej zadat jeho kódem. Pro tento účel byly zavedeny tzv. „únikové posloupnosti znaků“, pro které programátoři používají mnohem častěji z angličtiny převzatý termín escape sekvence. Ten budu v dalším textu používat i já.

Escapesekvence je plnohodnotnou náhradou znaku a můžeme ji zapsat kdekoliv, kde můžeme zapsat znak. Základní tvar sestává ze zpětného lomítka následovaného malým u symbolizujícím, že se jedná o znakovou sadu Unicode. Za ním pak následují právě čtyři hexadecimální číslice. Kdybychom tedy chtěli do kódu vložit znak usměváčka, najdeme si, že má kód 9786, hexadecimálně 263A, a zadáme ‚\u263A‘ nebo ‚\u263a‘.

Pro některé často používané znaky, které nejde jednoduše zadat z klávesnice, zavádí Java zkrácené escapesekvence. Konkrétně se jedná o následující znaky (uvádím pouze definované posloupnosti bez ohraničujících apostrofů):

\b \u0008Znak smazání předchozího znaku a posunu o pozici zpět, backspace, BS,

\t \u0009Horizontální tabulátor ‚anglicky horizontal tab, zkratka HT.

\n \u000APřechod na nový řádek (anglicky linefeed, zkratka LF).

\f \u000CPřechod na novou stránku (anglicky form feed, FF.

\r \u000DPřechod na počátek řádku (anglicky carriage return, zkratka CR).

\“ \u0022Uvozovky (anglicky double quote) mají svoji escapesekvenci proto, aby je bylo možno zadávat i uprostřed textových řetězců (podrobněji viz pasáž Literály typu String).

\‘ \u0027Znak apostrofu, aby bylo možno zadávat apostrof také jako znak. Znak apostrof tedy můžeme zadat jako posloupnost ‚\‘‘ (anglicky single quote).

\\ \u005CZpětné lomítko – aby bylo tento znak možno zadat bez nutnosti zadávat kód (anglicky backslash).

V programu se pro přechod na nový řádek nesmí používat zápis \u000A, resp. \u000a. Místo toho používejte vždy zápis \n. Při překladu se totiž posloupnosti začínající \u vyhodnocují velmi záhy (mimo jiné proto, abyste je mohli použít v identifikátorech). Do zdrojového kódu by se vložil přechod na nový řádek, a tím pádem i syntaktická chyba. Obdobně není korektní používat místo \r zápis \u000D, resp. \u000d.

Java navíc umožňuje, v zájmu zachování kompatibility s jazykem C, zadávat prvních 256 znaků (tj. znaků, jejichž kód se vejde do jednoho bajtu) prostřednictvím zpětného lomítka bezprostředně následovaným kódem daného znaku zapsaným v osmičkové soustavě. Nevýhodou zadání osmičkového kódu znaku za zpětné lomítko je, že překladač akceptuje zadání jedné číslice, dvou číslic i tří číslic. Jedná-li se o zadání jednoho samostatného znaku, nemusí to vadit. Zadáváte-li však tímto způsobem znak jako součást textu a následují-li za zadávaným znakem nějaké číslice, určitě používejte variantu se třemi číslicemi, protože jinak by mohl překladač zařadit do výpočtu i onu následující číslici.

Pojďme si zadávání znakových literálů vyzkoušet. Zadávat obyčejné znaky je nuda – zadáme proto nějaké „exotické“, na druhou stranu jenom trochu exotické, protože zadáme-li před chvílí zmíněný znak usměváčka (řádek 1 ve výpisu 2.6), můžeme zjistit, že jej okno konzoly neumí zobrazit (viz řádek 2 zobrazující reakci konzolového okna Windows). „Rozumně uprostřed“ jsou např. francouzské uvozovky « a », které mají kód \u00AB a \u00BB. Ve výpisu 2.6 si můžete prohlédnout reakci na jejich zadání na řádcích 5 a 9, přičemž na řádku 9 jsem se snažil ukázat, že na velikosti znaků A až F nezáleží.

Řádek 13 předvádí zadání téhož znaku (tj. otevíracích francouzských uvozovek[6]) prostřednictvím jeho kódu v osmičkové soustavě.

Mezi zápisem v osmičkové a v šestnáctkové soustavě se nejlépe převádí tak, že číslo nejprve převedete do dvojkové soustavy a v ní pak nahradíte čtveřice číslic reprezentujících číslo v šestnáctkové soustavě (16=2^4) trojicemi reprezentujícími číslo v osmičkové soustavě (8=2^3):

0xAB = 0b1010_1011 = 0b10_101_011 = 0253

Uvedený výsledek začíná nulou, protože tak se osmičková čísla zapisují v kódu. Při zadávání znaků ale překladač ví, že za zpětným lomítkem následují osmičkové číslice, takže nulou začínat nemusíme. Otevírací francouzské uvozovky tak zadáme ‚\253‘.

Výpis 2.6: Literály typu char

1. jshell> ‚\u263A‘ //Znak „usměváček“ -

2. $17 ==> ‚?‘

3. | created scratch variable $17 : char

5. jshell> ‚\u00AB‘ //Znak ‚«‚ - 0xAB = 0b1010_1011 = 0b10_101_011 = 0253

6. $18 ==> ‚«‚

7. | created scratch variable $18 : char

9. jshell> ‚\u00bB‘ //Znak ‚»‘ - ukázka, že nezáleží na velikosti písmen

10. $19 ==> ‚»‘

11. | created scratch variable $19 : char

13. jshell> ‚\253‘ //Znak ‚«‚ zapsaný v osmičkové soustavě

14. $20 ==> ‚«‚

15. | created scratch variable $20 : char

17. jshell> ‚“‘ //Znak uvozovek zadaný přímo

18. $21 ==> ‚“‘

19. | created scratch variable $21 : char

21. jshell> ‚\“‘ //Znak uvozovek zadaný přes escape sekvenci

22. $22 ==> ‚“‘

23. | created scratch variable $22 : char

25. jshell>

Na řádcích 17 a 21 jsem vám chtěl ukázat, že zadáváte-li znak „ (uvozovky), nemusíte (ale můžete) používat escapesekvenci – její použití je nutné pouze uvnitř textových řetězců, o nichž budeme hovořit za chvíli. Jak je vidět ve výpisu, nezávisle na způsobu zadání znaku jej JShell zobrazí vždy stejně. (Obdobně je to i s francouzskými uvozovkami – i ty můžete zadat přímo, víteli jak[7].)

Prázdný odkaz null

V pasáži Objektové datové typy jsme si řekli, že mezi objektovými datovými typy existuje speciální typ, který je potomkem všech ostatních datových typů. Tento typ je oficiálně bezejmenný, ale v dokumentaci je označovaný jako null type. Jeho jedinou hodnotu je totiž konstanta null reprezentující tzv. prázdný odkaz neboli odkaz nikam.

Je-li v nějaké proměnné objektového typu hodnota null, znamená to, že proměnná ještě neodkazuje na žádný objekt. Tato skutečnost je příčinou jedné z nejčastějších programátorských chyb, kdy programátor chce oslovit nějaký objekt, ale ve skutečnosti oslovuje prázdno a virtuální stroj ohlásí chybu.

Je proto doporučováno se používání této hodnoty maximálně vyhýbat, ale z historických důvodů to není ve většině rozšířených jazyků (mezi nimi i v Javě) dost dobře možné.

Literály typu String

Datový typ String a typ Class jsou v Javě jediné datové typy, pro nějž je v Javě definován způsob zadávání jejich literálů (vynechávám před chvílí zmíněný jednohodnotový null type). Zapisujeme je tak, že reprezentovanou posloupnost znaků zapíšeme mezi uvozovky.

V této posloupnosti ale nesmí být znaky „ (uvozovky) a \ (zpětné lomítko). Uvozovky tam nesmí být proto, že by překladač nepoznal, kde string končí. Zpětné lomítko tam nesmí být proto, že označuje počátek escapesekvence. Jak ale již víte, oba tyto znaky mají svoje escapesekvence, prostřednictvím nichž je můžete do dané posloupnosti vložit.

Zápis textového řetězce musí být vždy celý na jednom řádku. Do textového řetězce můžete vložit znaky přechodu na nový řádek (\n), ale samotný řetězec musí být zapsán na jednom řádku. Vytváříte-li textový řetězec, který má více znaků, než kolik jste ochotni umístit na jeden řádek (bývá dobrým zvykem omezovat délku řádku na 80 znaků), můžete jej zadat jako součet několika kratších textových řetězců.

Ve výpisu 2.7 najdete několik ukázek psaní textových řetězců. Pojďme si ho opět projít příkaz za příkazem.

Na řádku 1 ukazuji, jak se do zadávaného textu začleňují escapesekvence. Jak už jsme si řekli u znakových literálů, aby překladač snadno poznal, kde řetězec začíná a končí, nesmí se v nich vyskytovat znak „. Můžeme jej ale zadat prostřednictvím escapesekvence.

Současně zde předvádím, že apostrofy je možno zadávat přímo, protože tu s ničím nekolidují. První z apostrofů jsem zadal ještě pomocí escapesekvence, ale JShell ji při zobrazování zadaného textu na řádku 2 převedl na čistý apostrof, protože věděl, že ten s ničím nekoliduje.

Když JShell na řádku 2 informoval o vytvořené pomocné proměnné a o její počáteční hodnotě, použil zápis, jaký budete používat v programu. Abyste poznali, jak by daný řetězec vypadal vytištěný, žádám na řádku 5 o vytištění obsahu právě vytvořené proměnné, tj. o vtištění zadaného textu. (Proč vypadá žádost právě takto, si vysvětlíme v pasáži Literály typu char.) Na řádku 6 je text vytištěn, a jak vidíte, uvozovky jsou již zobrazeny správně.

Na řádku 8 zadávám textový řetězec obsahující tři řádky, přičemž přechod na nový řádek zadávám vložením znaku \n. Jak vidíte na řádku 6, systém jej opět ukládá v té podobě, v jakém jsem jej zadal. Když ale na řádku 12 žádám o vytištění obsahu proměnné $25, tiskne se text správně rozdělený do příslušných řádků.

Na řádcích 17 až 19 předvádím, jak zadat dlouhý řetězec – je zadán jako součet několika řetězců kratších. Všimněte si, že každý řádek ukončuji znakem + (plus), aby překladač věděl, že ještě bude něco následovat, a zadávání hodnoty neukončil dříve, než se mi to bude hodit.

Výpis 2.7: Literály typu String

1. jshell> „Text v \“uvozovkách\“ a \‘apostrofech‘“

2. $23 ==> „Text v \“uvozovkách\“ a ‚apostrofech‘“

3. | created scratch variable $23 : String

5. jshell> System.out.println($23)

6. Text v „uvozovkách“ a ‚apostrofech‘

8. jshell> „První řádek\nDruhý řádek\nTřetí řádek“

9. $25 ==> „První řádek\nDruhý řádek\nTřetí řádek“

10. | created scratch variable $25 : String

12. jshell> System.out.println($25)

13. První řádek

14. Druhý řádek

15. Třetí řádek

17. jshell> „První část dlouhého textu rozděleného do více částí“ +

18. ...> „\nDruhá část onoho dlouhého textu“ +

19. ...> „ - a třetí část“

20. $27 ==> „První část dlouhého textu rozděleného do více částí\nDruhá část onoho dlouhého textu - a třetí část“

21. | created scratch variable $27 : String

23. jshell> System.out.println($27)

24. První část dlouhého textu rozděleného do více částí

25. Druhá část onoho dlouhého textu - a třetí část

27. jshell> „Textový řetězec, který na daném řádku nekončí

28. | Error:

29. | unclosed string literal

30. | „Textový řetězec, který na daném řádku nekončí

31. | ^

32. | Error:

33. | reached end of file while parsing

34. | „Textový řetězec, který na daném řádku nekončí

35. | ^

37. jshell>

Při čtení programů se často setkáte s tím, že znak + je zapsán jako první znak následujícího řádku. V programech ale překladač čte zadávaný text, dokud nenarazí na středník. Jak už jsem řekl, autoři programu JShell vás chtěli ušetřit povinnosti psát na konci každého příkazu středník. JShell tento středník za vás doplní pokaždé, když příkaz může na daném řádku končit. Chcete-li proto pokračovat na dalším řádku, musíte mu to dát zřetelně najevo – např. právě tím, že na konce řádku napíšete znak +, aby poznal, že bude ještě něco následovat.

Když JShell na řádku 20 zobrazuje řetězec, kterým inicializoval proměnnou $27, zobrazuje jej celý na jednom řádku (ve výpisu 2.7 je sice na dvou řádcích, ale podle čísla řádku jistě odhadnete, že kdyby byl výpis dostatečně široký, text by se zobrazil na řádku jediném).

Na řádku 23 jsem proto požádal o jeho vytištění a na řádcích 24 a 25 je tento text vytištěn. Můžete se zde přesvědčit, že jeho rozdělení do řádků není dáno rozdělením zadávaného řetězce, ale umístěním znaků \n realizujících přechod na nový řádek.

Na závěr na řádku 27 předvádím, že Java (a s ní i JShell) trvá na tom, že textový řetězec zapsaný v programu musí končit na tom řádku, na němž začal. V opačném případě překladač ohlásí chybu.

Literály typu Class

Objekty typu Class jsou označovány jako classobjekty jimi reprezentovaného datového typu (podrobněji o nich začneme hovořit v podkapitole 10.6 Třída jako objekt). Literály typu Class se zadávají tak, že napíšete jméno datového typu následované tečkou a klíčovým slovem class. Své classobjekty mají primitivní i objektové datové typy. Zadáteli proto String.class, dostanete datový objekt reprezentující typ String, zadáteli int.class, dostanete objekt reprezentující datový typ int.

2.3Ještě trocha terminologie

•Mezi celočíselné typy bývá zařazován i datový typ char, protože jeho hodnota představuje kód znaku, takže číslo.

•Celočíselné datové typy (v jazyce Java typy byte, short, int, long a char) se v anglické literatuře často označují jako integral types.

•Datové typy float a double se v anglických příručkách označují jako floatingpoint types – typy s plovoucí desetinnou tečkou. Protože tento název je nepříjemně dlouhý, začalo se jim v české odborné literatuře říkat reálné typy, protože reprezentují reálná čísla. Tento termín budu občas ve výkladu používat i já.

2.4Nestandardní hodnoty reálných typů

Proměnné reálných datových typů, tj. proměnné typu double a float, mohou nabývat některých hodnot, které laického uživatele překvapí. Pojďme se s nimi seznámit. Ukázky najdete ve výpisu 2.8.

Jsou např. „duševně připraveny“ na to, že během iterace klesne hodnota pod nejmenší možnou hodnotu, resp. stoupne nad nejvyšší možnou hodnotu. Oba tyto datové typy mají proto definována svá nekončena (kladné a záporné) a pro případ ještě větší nouze mají definovánu svoji konstantu pro nesmyslnou hodnotu pojmenovanou NaN jako zkratka z anglického Not a Number – není číslo.

Hodnoty zastupující kladné, resp. záporné nekonečno získáte dělením kladné, resp. záporné nenulové hodnoty nulou. Obecně je však získáte, když budete dělit nějakou velkou hodnotu hodnotou dostatečně malou na to, aby výsledek byl mimo rozsah hodnot daného typu. „Hodnotu“ reprezentující nesmysl získáte dělením nuly nulou. Ve všech případech se přitom zachovává datový typ. Pokud byste však nulou dělili celé číslo, ohlásí překladač chybu.

U reálných datových typů najdete ještě jednu zvláštnost: definují kladnou a zápornou nulu. Naštěstí ale považují hodnoty obou nul za shodné.

2.5Shrnutí

Skript uchovávající naše akce z této kapitoly (historii seance) včetně všech chybných zadání a doplňujících komentářů je uložen v souboru 02S_c_Literals.jsh.

Výpis 2.8: Nestandardní hodnoty reálných typů

1. jshell> 1.0 / 0 //Kladné nekonečno typu double

2. $29 ==> Infinity

3. | created scratch variable $29 : double

5. jshell> -1D / 0 //Záporné nekonečno typu double

6. $30 ==> -Infinity

7. | created scratch variable $30 : double

9. jshell> 0D / 0 //Neexistující hodnota (Not a Number) typu double

10. $31 ==> NaN

11. | created scratch variable $31 : double

13. jshell> 1F / 0 //Kladné nekonečno typu float

14. $32 ==> Infinity

15. | created scratch variable $32 : float

17. jshell> -1F / 0 //Záporné nekonečno typu float

18. $33 ==> -Infinity

19. | created scratch variable $33 : float

21. jshell> 0F / 0 //Neexistující hodnota (Not a Number) typu float

22. $34 ==> NaN

23. | created scratch variable $34 : float

25. jshell> 0 / 0 //U celých čísel způsobí dělení nulou chybu (vyhodí výjimku)

26. | java.lang.ArithmeticException thrown: / by zero

27. | at (#35:1)

29. jshell> 1e30F/1e-30f //Stačí dělit velké číslo číslem dostatečně malým

30. $36 ==> Infinity

31. | created scratch variable $36 : float

33. jshell> 1e300/1e-300 //U hodnot typu double je ono „dostatečně“ trochu větší

34. $37 ==> Infinity

35. | created scratch variable $37 : double

37. jshell> 0 / 1.0 //Kladná nula

38. $38 ==> 0.0

39. | created scratch variable $38 : double

41. jshell> 0 / -1D //Záporná nula

42. $39 ==> -0.0

43. | created scratch variable $39 : double

45. jshell> 0 / -1 //Celá čísla mají pouze jednu nulu

46. $40 ==> 0

47. | created scratch variable $40 : int

49. jshell>

5 Jen ve standardní knihovně je 5938 veřejně dostupných objektových datových typů a nepočítaně typů interních.

6 Oficiálně se jmenují „boční uvozovky“ – viz např. [11].

7 Kdybyste někdy potřebovali vložit francouzské uvozovky z klávesnice, tak vám prozradím, že ve Windows má otevírací znak («) kód 0171 a zavírací znak (») má kód 0187. Znaje kód, můžete znak zadat z numerické klávesnice, nezapomeňte ale po stisku ALT začít úvodní nulou.

Kapitola 3

Proměnné

Co se vkapitole naučíte

Vtéto kapitole odstartujeme novou seanci, která nebude navazovat na ty minulé.

3.1Pravidla pro tvorbu identifikátorů

•Nesmějí začínat číslicí.

abstract

assert

boolean

break

byte

case

catch

class

const

do

if

Používání znaku $

Konvence pro velikost písmen

3.2Druhy typování

Statické × dynamické typování

Definice × odvození datového typu

Silné (přísné) × slabé typování

Shrnutí

3.3Definice × deklarace

3.4Deklarace proměnných

1. jshell> boolean _boolean

2. _boolean ==> false

3. | created variable _boolean : boolean

5. jshell> byte _byte

6. _byte ==> 0

7. | created variable _byte : byte

9. jshell> short _short

10. _short ==> 0

11. | created variable _short : short

13. jshell> int _int

14. _int ==> 0

15. | created variable _int : int

17. jshell> long _long

18. _long ==> 0

19. | created variable _long : long

21. jshell> float _float

22. _float ==> 0.0

23. | created variable _float : float

25. jshell> double _double

26. _double ==> 0.0

27. | created variable _double : double

29. jshell> char _char

30. _char ==> ‚‘

31. | created variable _char : char

33. jshell> String _String

34. _String ==> null

35. | created variable _String : String

37. jshell> Object _Object

38. _Object ==> null

39. | created variable _Object : Object

41. jshell>

3.5Středníky

1. jshell> /vars

2. | boolean _boolean = false

3. | byte _byte = 0

4. | short _short = 0

5. | int _int = 0

6. | long _long = 0

7. | float _float = 0.0

8. | double _double = 0.0

9. | char _char = ‚\000‘

10. | String _String = null

11. | Object _Object = null

13. jshell>

3.6Současná deklarace více proměnných

Reakce prostředí JShell

1. jshell> int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

2. i==> 0

3. | created variable i: int

4. j ==> 0

5. | created variable j : int

6. k==> 0

7. | created variable k: int

9. jshell> /list

11. 1 : boolean _boolean;

12. 2 : byte _byte;

13. 3 : short _short;

14. 4 : int _int;

15. 5 : long _long;

16. 6 : float _float;

17. 7 : double _double;

18. 8 : char _char;

19. 9 : String _String;

20. 10 : Object _Object;

21. 11 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

22. 12 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

23. 13 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

25. jshell> /vars

26. | boolean _boolean = false

27. | byte _byte = 0

28. | short _short = 0

29. | int _int = 0

30. | long _long = 0

31. | float _float = 0.0

32. | double _double = 0.0

33. | char _char = ‚\000‘

34. | String _String = null

35. | Object _Object = null

36. | int i= 0

37. | int j = 0

38. | int k= 0

40. jshell> /vars 12

41. | int j = 0

43. jshell> /list _int ij k

45. 4 : int _int;

46. 11 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

47. 12 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

48. 13 : int i, j, k; //Současná deklarace tří proměnných uloží tři stejné úryvky

50. jshell>

3.7Redeklarace proměnných vJShell

3.8Deklarace spřiřazením počáteční hodnoty

1. jshell> String i; //Proměnná původně deklarovaná stypem int

2. i==> null

3. | replaced variable i: String

4. | update overwrote variable i: int

6. jshell> /vars -all

7. | boolean _boolean = false

8. | byte _byte = 0

9. | short _short = 0

10. | int _int = 0

11. | long _long = 0

12. | float _float = 0.0

13. | double _double = 0.0

14. | char _char = ‚\000‘

15. | String _String = null

16. | Object _Object = null

17. | int i= (not-active)

18. | int j = 0

19. | int k= 0

20. | String i= null

22. jshell>

Pozor na velikost znaků

1. jshell> String _string = „String“;

2. _string ==> „String“

3. | created variable _string : String

5. jshell> /drop _string

6. | dropped variable _string

8. jshell> String _String = „String“;

9. _String ==> „String“

10. | modified variable _String : String

11. | update overwrote variable _String : String

13. jshell> int i=10, j, k= i+ i; //iopět deklarováno stypem int

14. i==> 10

15. | replaced variable i: int

16. | update overwrote variable i: String

17. j ==> 0

18. | modified variable j : int

19. | update overwrote variable j : int

20. k==> 20

21. | modified variable k: int

22. | update overwrote variable k: int

24. jshell> /vars _string _String ij k

25. | String _string = (not-active)

26. | String _String = „String“

27. | int i= 10

28. | int j = 0

29. | int k= 20

31. jshell>

Zpět kdeklaraci spřiřazením počáteční hodnoty

3.9Syntaktický diagram

3.10Shrnutí

Table of Contents

Úvod

Komu je kniha určena

Koncepce výkladu

Rozdělení textu

Terminologie

Použité nástroje

Vývojová sada JDK 9

Vývojové prostředí JShell

Samostatné vývojové prostředí

Doprovodné programy

Problémy s klávesnicí

Syntaktické definice a diagramy

Použité typografické konvence

Zpětná vazba

Část I: Neobjektové konstrukce

Kapitola 1 Prostředí JShell

1.1 Charakteristika programu a prostředí JShell

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

Dávkové soubory pro Windows

Po spuštění

1.3 Úryvky (snippets)

Použití proměnných

Identifikace úryvků

Středník

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

1.4 Příkazy (commands)

Vyloučení úryvku: /drop

Přehled aktivních úryvků: /list

Přehled aktivních úryvků: /list -all

Přehled objektů daného druhu

Uložení aktivních úryvků: /save <file>

Uložení všech zadaných úryvků: /save -all <file>

Uložení dosavadního průběhu seance: /save -history <file>

Načtení skriptu: /open <file>

Ukončení seance: /exit

Restart: /reset

Znovuzavedení: /reload -restore

Natavení startovního skriptu: /set -start <file>

Nápověda: /?

1.5 Základní syntaktická pravidla

Bílé znaky

Komentáře

1.6 Ovládání

Použití editoru

Nastavení vlastního editoru

1.7 Záznamy lekcí

1.8 Shrnutí

Kapitola 2 Základní datové typy a jejich literály

2.1 Datové typy

Dělení datových typů

Primitivní datové typy

Objektové datové typy

Odkazy na objekty

2.2 Literály

Literály typu boolean

Literály typu int

Literály typu long

Literály typu byte a short

Literály typu double

Celé číslo s příponou

Obyčejné desetinné číslo

Číslo v semilogaritmickém tvaru

Literály typu float

Literály typu char

Prázdný odkaz null

Literály typu String

Literály typu Class

2.3 Ještě trocha terminologie

2.4 Nestandardní hodnoty reálných typů

2.5 Shrnutí

Kapitola 3 Proměnné

3.1 Pravidla pro tvorbu identifikátorů

Používání znaku $

Konvence pro velikost písmen

3.2 Druhy typování

Statické × dynamické typování

Definice × odvození datového typu

Silné (přísné) × slabé typování

Shrnutí

3.3 Definice × deklarace

3.4 Deklarace proměnných

3.5 Středníky

3.6 Současná deklarace více proměnných

Reakce prostředí JShell

3.7 Redeklarace proměnných v JShell

3.8 Deklarace s přiřazením počáteční hodnoty

Pozor na velikost znaků

Zpět k deklaraci s přiřazením počáteční hodnoty

3.9 Syntaktický diagram

3.10 Shrnutí