Image
21.6.2016 0 Comments

Java pod lupou I. /2.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Na úvod tejto časti by som rád poznamenal, že je prakticky nemožné takú rozsiahlu tému, akou Java a jej špecifikácia nepochybne je, opísať a vysvetliť lineárne. S trochou zjednodušenia sa dá povedať, že v nej všetko so všetkým súvisí. To vedie k nepríjemnému rozhodovaniu medzi snahou o výklad smerom od absolútnych teoretických základov k prakticky použiteľným informáciám, bohužiaľ, aspoň spočiatku na úkor užitočnosti, a medzi pokusmi podávať informácie v podobe komentárov k praktickým príkladom, čo zase pôsobí menej prehľadne a menej exaktne.

Nový seriál bude inklinovať skôr k prvému spôsobu výkladu, i keď je veľmi pravdepodobné, že sa nájde čitateľ, ktorý by radšej volil druhú cestu. K môjmu rozhodnutiu vo veľkej miere prispeli prevažne kladné ohlasy na seriál C++ pod lupou, v ktorého štýle by som rád pokračoval. Jedinou významnejšou výnimkou bude začiatok tohto pokračovania, pretože na úplnom začiatku jednoducho treba vytvoriť aspoň minimálnu bázu vedomostí.

Láskavý čitateľ mi hádam prepáči tento vzletný úvod, ktorý je v skutočnosti len chabým pokusom o ospravedlnenie sa za prípadné chybné vyriešenie klasického problému, „ako začať“. Plne si uvedomujem veľké časové rozpätie medzi jednotlivými časťami seriálu na pokračovanie a budem sa snažiť do nich zahrnúť maximum použiteľných a hlavne konzistentných informácií. Ale dosť bolo rečí, prejdime konečne k Jave.

Trieda – základ života

Prevažne teoretickú prvú časť seriálu Java pod lupou zakončil jednoduchý program „Hello, world“, ktorý po spustení vypísal na obrazovku (správnejšie na štandardný výstup) tradičný text. Na osvieženie pamäti je tu jeho zdrojový text:

public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.println("Hello, world!");
    }
}

Pozorný čitateľ si iste spomenie, že zdrojový text tohto programu treba pre úspešné preloženie zapísať do súboru s názvom HelloWorld.java. Prečo je to tak, to si hneď povieme.

Java je výrazne objektový jazyk. Nie síce v takom rozsahu ako napríklad v Smalltalku, ale je v tomto smere oveľa dôslednejšia ako C++. Jedným z najdôležitejších rozdielov oproti C++ je fakt, že všetok kód v programe je organizovaný výlučne do tried. Triedy sú v Jave syntaktickými konštrukciami a predstavujú šablóny na tvorbu objektov. Vieme, že objekty sú charakterizované svojím stavom a zoznamom správ, na ktoré dokážu reagovať. Stav objektu v Jave je uložený v členských premenných jeho triedy, zasielanie správ sa realizuje volaním príslušných metód triedy. Každá trieda, resp. jej zdrojový kód preto obsahuje jednak deklaráciu členských premenných, jednak deklaráciu metód. Metódy sú v terminológii C++ členské funkcie tejto triedy.

A propos, termín deklarácia v programovaní znamená v podstate to isté, čo v reálnom živote. Deklarácia je vždy spojená s konkrétnym menom a predstavuje vyhlásenie, ako má prekladač ďalší výskyt tohto mena chápať. Deklarácia členskej premennej x tak oznamuje prekladaču, že každý výskyt identifikátora x v príslušnej oblasti programu znamená odkaz na túto členskú premennú a na nič iné. Podobne pre deklaráciu metód alebo tried.

Povinná organizácia kódu do tried znamená predovšetkým to, že v Jave neexistujú globálne premenné a nečlenské funkcie. Táto vlastnosť logicky vyplýva z objektovej orientácie Javy a prispieva okrem iného k zníženiu percenta programových chýb spôsobených neočakávanou a nekonzistentnou manipuláciou s premennými z rôznych miest kódu.

Triedy sú v Jave organizované do vyšších celkov, nazvaných balíky. O balíkoch zatiaľ nebudeme hovoriť, dôležité je pre začiatok len to, že triedy, ktoré majú byť viditeľné (a použiteľné) aj mimo svojho balíka, musia byť deklarované ako verejné. A tu sa okľukou dostávame k spomínanému obmedzeniu – v Jave platí pravidlo, že v jednom zdrojovom súbore sa môže nachádzať deklarácia len jedinej verejnej triedy, ktorej meno musí byť navyše totožné s menom súboru bez prípony .java.

Neľakajte sa, že zatiaľ nerozumiete, o čom je reč. Zo začiatku budú ukážkové príklady zapísané pomocou jedinej verejnej triedy, uloženej v jedinom zdrojovom súbore. Názov tohto súboru preto nebude z  dôvodov úspory miesta odteraz uvádzaný explicitne.

Vráťme sa k pôvodnému programu. Ten pozostáva z jedinej triedy s názvom HelloWorld. Ako vidieť, deklarácia tejto triedy sa začína kľúčovým slovom public, ktoré udáva, že pôjde o  verejnú triedu. Nad detailmi jeho použitia si zatiaľ netreba lámať hlavu, v zásade bude program fungovať aj bez neho (ale len zatiaľ!). Druhé kľúčové slovo class určuje, že ide o deklaráciu triedy. Za ním nasleduje názov deklarovanej triedy, pre ktorý platia rovnaké pravidlá ako pre pomenovávanie identifikátorov v mnohých programovacích jazykoch: prvým znakom musí byť písmeno, ďalšie znaky môžu byť aj číslice. Za písmeno sa v tomto kontexte považuje aj znak _ (podčiarknutie).

Deklarácia členov triedy (premenných i metód) je povinne uzavretá do zložených zátvoriek ({ a }). Ako uvidíme neskôr, takéto zátvorky sa v Jave používajú aj v iných prípadoch; vo všeobecnosti slúžia na ohraničenie bloku deklarácií, príkazov a pod. Čitateľ znalý C++ si isto všimol, že za uzatváracou zátvorkou sa v Jave nepíše bodkočiarka (nikdy).

Trieda HelloWorld obsahuje jediný člen: metódu main(). Tento stav nie je ničím výnimočný – triedy môžu obsahovať len členské premenné, len metódy alebo oboje. Dokonca je možné deklarovať triedu, ktorá nebude obsahovať nijaké členy. Praktická použiteľnosť takej triedy je síce obmedzená, ale nájde sa prípad, keď prázdna trieda postačí.

Deklaráciu metód zatiaľ nebudeme podrobne rozoberať. Ako vidieť z príkladu, jej súčasťou môže byť niekoľko kvalifikátorov, z ktorých hneď prvý (public) naznačuje, že metóda main() bude nejakým spôsobom verejná. Kľúčové slovo static v tomto kontexte určuje, že metódu main() bude možné zavolať aj v prípade, že dosiaľ nebude existovať žiadna inštancia triedy HelloWorld. (Inštancia triedy je objekt vytvorený na základe tejto triedy; v Jave je to jednoducho premenná typu tejto triedy.) Metódy tohto typu sa nazývajú metódy triedy (class methods), na rozdiel od metód inštancií (instance methods).

Metódy sú v podstate funkciami. Funkcie môžu mať v programovacích jazykoch (rovnako ako v matematike) argumenty a typicky vracajú návratovú hodnotu. Jediným miestom, kde možno určiť počet a typ argumentov a typ návratovej hodnoty metód, je ich deklarácia. Metóda main() v uvedenom príklade napríklad pri svojom volaní akceptuje jeden argument pomenovaný args, ktorého typ je „pole reťazcov“ (String[]). Po skončení táto metóda nevracia nijakú hodnotu, čo vyjadruje kľúčové slovo void.

Kód, ktorý tvorí metódu, sa nazýva telo metódy. Toto telo musí byť uzavreté do známych zložených zátvoriek. V tele funkcie sa typicky nachádzajú deklarácie lokálnych premenných a príkazy, ktoré realizujú požadovanú funkčnosť. V príklade HelloWorld metóda main() akýmsi – zatiaľ záhadným – spôsobom zabezpečí výstup požadovaného textu na obrazovku. Bez nároku na vysvetlenie prosím čitateľa o zapamätanie si tohto spôsobu, pretože ho nájde v mnohých ukážkových príkladoch.

Je potrebné spomenúť, že metóda main() má v Jave podobné výsadné postavenie ako v C++. Predovšetkým jej deklaráciu (presnejšie jej prototyp – teda názov, počet a typ argumentov a typ návratovej hodnoty a dokonca aj oba kvalifikátory public a static) treba vždy zapísať tak ako v uvedenom príklade. Dôvod je prozaický: interpret Javy túto metódu musí vedieť nájsť, pretože práve ňou začína vykonávanie každej klasickej javovskej aplikácie (pozor, pri appletoch či servletoch je to ináč). Preto je ostatne táto metóda deklarovaná ako statická (static) – v dobe spustenia programu neexistuje nijaký objekt, nad ktorým by mohla byť zavolaná.

Do poľa reťazcov args, ktoré má metóda main() dostať ako argument, vloží interpret Javy argumenty programu, zadané na príkazovom riadku. I keď tu dochádza k drobnej kolízii termínov argument funkcie a argument programu, verím, že čitateľ nebude zmätený.

Na záver stručného opisu, ako vyzerá deklarácia tried a ich obsahu, je tu krátky program, ktorý možno nájsť v mnohých učebniciach Javy. Pozostáva z jedinej triedy Echo a po spustení vypíše jednotlivé argumenty príkazového riadka, oddelené medzerou:

public class Echo
{
    public static void main(String[] args)
    {
        for (int i = 0; i < args.length; i++)
            System.out.print(args[i] + " ");
        System.out.println();
    }
}

Kto dával pozor, vie, že zdrojový kód tohto programu treba uložiť do súboru Echo.java. Spôsob prekladu a spustenia programu bol opísaný v predchádzajúcej časti seriálu, ale tu je pre istotu ešte raz: program preložíme pomocou nástroja javac, ktorého argumentom musí byť názov prekladaného súboru, takže na príkazový riadok zapíšeme javac Echo.java. Výstupom prekladu bude súbor s binárnym obrazom triedy, Echo.class. Vykonanie programu má na starosti nástroj java. Jeho argumentom je vždy názov triedy obsahujúcej metódu main(), ale pozor: bez prípony .class! Program Echo preto spustíme zadaním java Echo a požadovaných argumentov. Ukážka je na obr. 1. Povšimnite si, prosím, že argumenty príkazového riadka sú definované ako súvislé úseky textu, oddelené bielymi medzerami. Ak chceme ako argument odovzdať reťazec obsahujúci medzery, musíme ho uzavrieť do úvodzoviek.

Lexikálna štruktúra Javy

Po praktickom začiatku prejdeme teraz k oveľa teoretickejším informáciám. Názov tohto odseku naznačuje, že sa v ňom bude hovoriť o Jave z hľadiska lexikálnej analýzy. Lexikálnu analýzu vykonáva prekladač akéhokoľvek jazyka pri preklade programu ako úplne prvú a jej cieľom je transformácia pôvodne neštruktúrovanej postupnosti znakov, uloženej v zdrojovom súbore a tvoriacej text programu, na postupnosť symbolov (lexikálnych jednotiek), ktorým prekladač rozumie. Súčasťou tejto transformácie je, samozrejme, kontrola správnosti programu z hľadiska „pravopisu“ (to keď omylom napíšeme napríklad publyc). Po lexikálnej analýze nasleduje syntaktická analýza, ktorá kontroluje dodržiavanie gramatiky jazyka a zabraňuje zápisu neplatných konštrukcií.

Java je veľmi mladý jazyk, a preto nikoho neprekvapí, že podporuje štandard Unicode. Čitateľ, ktorému je tento pojem neznámy, nájde bližšie informácie na http://www.unicode.org. V skratke možno povedať, že ide o štandard pre jednotné šestnásťbitové kódovanie znakov de facto všetkých existujúcich svetových jazykov, resp. ich abecied. Unicode je štandardizovaný organizáciou ISO, takže sa s ním možno stretnúť aj pod názvom ISO 10646. V praxi Unicode predstavuje náhradu ASCII a znamená koniec rôznym proprietárnym kódovaniam národných znakov a večným problémom s diakritikou. Na ďalších riadkoch čitateľ nájde zmienku o unikódoch niekoľkých špecifických znakov. Nemusí sa však ľakať, prvých 256 znakov Unicode je totožných s kódom ASCII (pravdepodobne ISO 8859-1).

Podpora Unicode v Jave je podľa špecifikácie veľmi dôsledná. Kdekoľvek v programe je dovolené používať unikódové znaky – dokonca aj v názvoch premenných, metód či samotných tried. V praxi táto podpora silne závisí od konkrétnej implementácie, pretože nie každé runtime prostredie si s unikódovými znakmi dokáže poradiť stopercentne. O tom je ostatne možné presvedčiť sa pokusom vypísať v ukážkovom príklade HelloWorld reťazec obsahujúci neanglické unikódové znaky. Po spustení programu v konzolovom okne (resp. DOS boxe) dostaneme namiesto vytúženého textu s diakritikou akési čudné znaky, sťaby výsledok nepochopiteľného prevodu do historickej kódovej stránky CP 852 (testované vo Windows 2000 s nastavením slovenčiny ako systémového jazyka). Preklad zdrojového textu triedy s ľubozvučným slovenským názvom Líščí sa síce podaril, ale pokus o jej spustenie sa skončil v prípade použitia JDK výnimkou oznamujúcou, že požadovaná trieda sa nenašla. Microsoftovská implementácia Java VM je na tom lepšie, tej sa triedu Líščí podarilo úspešne nájsť, ale výstup unikódového textu na konzolu dopadol rovnako neslávne (obr. 2).

Čo z toho vyplýva? Unikódovým znakom v názvoch premenných, metód či tried sa treba radšej vyhnúť. Ostatne je pomerne rozšíreným zvykom používať pri ich pomenovávaní angličtinu, ktorá sa bez diakritiky našťastie zaobíde. S nesprávnym výstupom na konzolu si netreba ktovieako lámať hlavu, dnes mávajú programy v prevažnej väčšine grafické používateľské rozhranie. O podpore slovenských znakov v komponentoch GUI si určite ešte povieme, lebo ani tam situácia nie je ktovieaká ružová, ale dá sa aspoň čiastočne ovplyvniť.

Vráťme sa k lexikálnej analýze. Ako vyplýva z doteraz povedaného, zdrojový text programu je reprezentovaný postupnosťou unikódových znakov. Jej transformácia na postupnosť lexikálnych symbolov sa realizuje v troch krokoch.

Prvým krokom je preklad unikódových escape sekvencií na zodpovedajúce unikódové znaky. Unikódové escape sekvencie slúžia na zápis znakov pomocou explicitného určenia ich kódu a vo všeobecnosti vyzerajú takto: \uhhhh, kde hhhh je hexadecimálna hodnota znaku. Ako vidieť, sú podobné escape sekvenciám z jazyka C++ (ktoré v Jave tiež nájdeme), líšia sa však v mimoriadne dôležitej vlastnosti: možno ich použiť kdekoľvek v programe, nielen v rámci textových reťazcov. Ak v ľubovoľnom mieste programu použijeme unikódovú escape sekvenciu, výsledný efekt bude rovnaký, ako keby sme namiesto nej zapísali priamo príslušný znak. Príklad: predpokladajme, že silou-mocou chceme nazvať nejakú premennú gréckym písmenom α (alfa). V prípade, že dokážeme zapísať znak α z klávesnice, napíšeme jednoducho do programu niečo ako α = 1. Ak grécku klávesnicu nemáme k dispozícii, budeme si musieť vypomôcť escape sekvenciou: \u03B1 = 1 (znak α má v unikóde hodnotu 03B1). Oba zápisy sú úplne ekvivalentné a v skutočnosti sa počas prekladu v prvom kroku lexikálnej analýzy transformuje šesť znakov \, u, 0, 3, B a 1 pôvodného zdrojového textu na jediný znak α. Táto transformácia je, samozrejme, z hľadiska programátora úplne transparentná. Treba však podotknúť, že raz transformované znaky nepodliehajú ďalšej transformácii, a preto sa zápis \u005Cu03B1 transformuje na šesť znakov \, u, 0, 3, B, 1 (005C je kód znaku \), ktoré sa už ďalej nenahradzujú a v tejto podobe vstupujú do ďalšieho kroku lexikálnej analýzy.

V tomto druhom kroku sa postupnosť unikódových znakov rozdelí na jednotlivé riadky. Java je v tomto smere pomerne nezávislá od platformy a úspešne sa vie vyrovnať s oddeľovačmi riadkov platforiem DOS/Windows (kombinácia CR+LF), Unix/Linux (LF) i Macintosh (CR). Pre úplnosť: znak CR (carriage return) má v Unicode hexadecimálny kód 000D, znak LF (line feed) kód 000A.

Tretím a posledným krokom je rozloženie jednotlivých riadkov na lexikálne symboly. Aby toho bol prekladač schopný, musia byť tieto symboly niečím oddelené. To niečo sú buď tzv. biele medzery, alebo komentáre.

Termín biela medzera sa používa v mnohých programovacích jazykoch a za svoj názov vďačí faktu, že pri tlačenom výstupe zdrojového textu na biely papier biele medzery vyzerajú iba ako biele miesta. V Jave sa za bielu medzeru považujú znaky medzera (SP, unikód 0032), horizontálny tabulátor (HT, unikód 0009), znak „posun strany“ (form feed, FF, unikód 000C) a takisto všetky oddeľovače riadkov.

Komentáre sú v Jave prakticky totožné s komentármi C++. Povolené sú dva typy: prvý sa začína dvojicou znakov /* a končí sa znakmi */. Všetko, čo je medzi týmito znakmi, prekladač ignoruje. Tento typ nie je povolené vnárať do seba – prvý výskyt znakov */ ukončuje celý komentár. Druhý typ je vhodný na kratšie, jednoriadkové komentáre, začína sa dvojicou znakov // a za komentár sa považujú všetky nasledujúce znaky až po prvý výskyt oddeľovača riadkov. Znaky // nemajú nijaký význam vnútri komentára začínajúceho sa na /*.

V mnohých učebniciach Javy možno nájsť zmienku o treťom type komentára, tzv. dokumentačnom komentári, začínajúcom sa znakmi /**. V skutočnosti špecifikácia Javy ako jazyka nič také nepozná a prekladač nerozlišuje medzi komentármi začínajúcimi sa na /* a na /**. Dokumentačný komentár je pomôcka na automatizované vytváranie dokumentácie k jednotlivým triedam, ich premenným a metódam, spracovať ho však dokáže iba samostatný nástroj javadoc (k dispozícii v rámci JDK). K tomuto nástroju sa ešte v priebehu seriálu vrátime.

Mnoho programátorov význam komentárov podceňuje. Je možné písať kód samodokumentujúcim spôsobom, keď sa používajú skutočne zmysluplné názvy premenných či funkcií a zdrojový text je formátovaný tak, aby bol maximálne prehľadný. To však nič nemení na skutočnosti, že človek je tvor nedokonalý a detaily implementácie projektu, na ktorom pracuje, dokáže po jeho skončení veľmi rýchlo zabudnúť. Problém nastáva, ak sa treba k starému kódu vrátiť, nedajbože ho ešte prepracovať.

Malo by byť jednou z najdôležitejších zásad programátora, že kód, ktorý tvorí, dostatočne okomentuje. V takej Jave to minimálne znamená opísať, na čo je ktorá trieda určená, aké sú vstupy a výstupy jednotlivých metód a na čo slúžia jednotlivé premenné. Programové konštrukcie je vhodné komentovať v prípade, že môže v budúcnosti dôjsť k nejasnostiam; úplne nevyhovujúcim je z tohto hľadiska komentár typu „x priraď hodnotu 1“ – takúto informáciu dokážeme zistiť aj zo samotného kódu. Komentáre majú vždy predstavovať pridanú hodnotu, v tomto prípade informačnú hodnotu.

Program HelloWorld s doplnenými komentármi by teda mohol vyzerať napríklad takto:

/*
 * HelloWorld
 *
 * Ukážkový príklad výstupu textu na konzolu
 */
public class HelloWorld
{
    //--------------------------------------------
    // main()
    //
    // vstup:  args – argumenty príkazového riadka
    // výstup: žiaden
    //--------------------------------------------
    public static void main(String[] args)
    {
        System.out.println("Hello, world!");
    }
}

Lexikálne symboly

Výstupom lexikálnej analýzy pri preklade programu je postupnosť lexikálnych symbolov jazyka. Tieto symboly možno v Jave rozdeliť na päť druhov: kľúčové slová, identifikátory, literály, operátory a oddeľovače.

Kľúčové slová sú reťazce znakov, ktoré majú v Jave rezervovaný význam a nemožno ich použiť inak, napríklad ako názov premennej. S niekoľkými kľúčovými slovami sme sa už stretli: public, void, class.

Identifikátory sú svojím spôsobom vlastne mená. Mená tried, rozhraní, premenných či metód. Každá údajová či kódová entita v Jave musí mať svoje pomenovanie, anonymné objekty (ako napríklad anonymné uniony v C++) nie sú povolené. Pravidlo pre vytváranie platných identifikátorov sme už v tomto článku uviedli, teda pre zopakovanie: identifikátorom môže byť ľubovoľná postupnosť písmen alebo číslic, prvý znak však povinne musí byť písmeno. Jazyk Java rozlišuje medzi veľkými a malými písmenami (a to nielen v identifikátoroch, ale aj v kľúčových slovách), podobne ako C++. Pod termín písmeno v rámci identifikátorov patria aj znaky _ (podčiarknutie, unikód 005C) a $ (unikód 0024).

Ako sme už spomenuli, v názve identifikátorov je možné použiť ľubovoľné písmená, ktoré sú zahrnuté v štandarde Unicode. Tu si však treba dávať pozor: Unicode obsahuje znaky, ktoré vyzerajú rovnako, ale kód majú odlišný. Príkladom môže byť napríklad veľké latinkové písmeno A (unikód 0041) a veľké grécke písmeno A (čítané ako alfa, unikód 0391). Z pohľadu prekladača Javy ide o dva rozdielne znaky.

Operátory sú postupnosti špeciálnych znakov, určené na vyjadrenie matematických, logických či iných operácií. Zatiaľ sme sa so žiadnym z nich nestretli, ako príklad možno uviesť notoricky známy operátor priradenia =.

Oddeľovače sú znaky, ktoré v súlade so svojím názvom oddeľujú úseky kódu. Ich paralelou v reálnych jazykoch sú interpunkčné znamienka. V Jave sú oddeľovačmi všetky druhy zátvoriek (obyčajné (), hranaté [], zložené {}) a znaky bodka (.), čiarka (,) a bodkočiarka (;).

Literály

Literály možno iným slovom nazvať konštanty. Ide o konkrétne hodnoty údajových typov, priamo zapísané do programu. Ak napríklad máme niekde v kóde reťazec a = 1, potom a je identifikátor premennej a 1 je literál, konštanta celočíselného typu.

Každý literál v Jave má jednoznačne priradený svoj typ. Na základe tohto typu môžeme literály rozdeliť na celočíselné, s plávajúcou čiarkou, boolovské, znakové, reťazcové a špeciálny literál null.

Celočíselné literály reprezentujú hodnoty z oboru celých čísel. Java, podobne ako C++ podporuje zápis celočíselných konštánt v desiatkovej, šestnástkovej i osmičkovej sústave. Desiatkový literál je jednoducho postupnosť desiatkových číslic 0 až 9, ktorá sa však nesmie začínať nulou. Jedinou výnimkou je samostatný literál 0.

Šestnástkový literál sa začína dvojicou znakov 0x, resp. 0X a pokračuje postupnosťou šestnástkových číslic 0 až 9 a A až F, resp. a až f. Osmičkový literál sa začína znakom 0 a pokračuje postupnosťou osmičkových číslic 0 až 7. Literály 0, 0x0 a 00 sú v princípe odlišné, hoci všetky reprezentujú tú istú hodnotu.

Celočíselné literály sú v zásade dvoch typov: int a long (zatiaľ ešte nehovoríme o typoch premenných, hoci názvy typov sú totožné). Literály typu int majú rozsah 32 bitov. Najväčší desiatkový literál typu int je teda 2147483648 (231 – 1). Všimnite si, že o záporných hodnotách sa tu nehovorí, na zmenu znamienka slúži totiž unárny operátor -, ktorý nie je súčasťou literálu. Najväčší kladný šestnástkový literál je 0x7FFFFFFF, osmičkový 017777777777, najväčší záporný šestnástkový je 0x80000000, osmičkový potom 020000000000. Pri iných ako desiatkových literáloch je „zápornosť“ vzhľadom na použitý znamienkový bit ich súčasťou. Rozsah týchto literálov je, pochopiteľne, –231 ÷ 231 – 1.

Literály typu long majú rozsah 64 bitov. Keďže v prípade hodnôt menších ako 231 nie je možné jednoznačne určiť ich typ, musia sa takéto literály typu long končiť znakom l alebo L. Čo sa týka maximálnych hodnôt, platí v podstate to isté, čo pri type int, len namiesto hranice 231 treba uvažovať hranicu 263. Rozsah literálov typu long je –263 ÷ 263 – 1.

Príklady celočíselných literálov: 0, 123, 0xCAFEBABE, 0377 (pre typ int), 0L, 2000L, 0xFF00L, 0177777L (pre typ long).

Ďalším typom sú literály s plávajúcou čiarkou (tzv. floating-point literály). Tieto literály slúžia na zápis neceločíselných, desatinných hodnôt. Ich zápis sa vo všeobecnosti skladá z celej časti, desatinnej bodky (znak .), desatinnej časti a exponentu. Celá aj desatinná časť je postupnosťou desiatkových číslic 0 až 9, exponent sa skladá z písmena E alebo e, nasledovaného číslom s prípadným znamienkom. Zo zápisu je možné vynechať celú časť alebo desatinnú časť, ale nie obe naraz. Exponent je nepovinný, ak je však prítomný, možno vynechať desatinnú časť aj desatinnú bodku.

Reprezentácia hodnôt s plávajúcou čiarkou sa riadi štandardom IEEE 754. Zápis s použitím exponentu sa nazýva aj vedeckou notáciou a umožňuje samostatné vyjadrenie mantisy, pozostávajúcej z platných číslic daného čísla, a exponentu, určujúceho polohu desatinnej čiarky. Tvar 1.2345E11 tak predstavuje číslo 1.2345 × 1011.

Aj literály s plávajúcou čiarkou sa delia na dva typy: float a double. Typ float má šírku 32 bitov a rozsah hodnôt 1,4 × 10–45 ÷ 3,4 × 1038 v kladnej oblasti (v zápornej oblasti je rozsah rovnaký, len s opačným znamienkom). Typ double má šírku 64 bitov a rozsah hodnôt 4,9 × 10–324 ÷ 1,8 × 10308 v kladnej oblasti. Na explicitné rozlíšenie hodnôt oboch typov slúžia prípony f, F (float) a d, D (double). V prípade, že príponu neuvedieme, implicitne sa berie typ double. Výhodou použitia explicitnej prípony je možnosť vynechať desatinnú bodku, desatinnú časť i exponent súčasne.

Príklady literálov s plávajúcou čiarkou: 0.0F, .78F, 3e-9F (typ float), 2.99e8, 99D (typ double).

Boolovské literály sú iba dva, true a false. Predstavujú logické hodnoty používané v dvojstavovej boolovskej logike. Literál true reprezentuje logickú jednotku, literál false logickú nulu.

Znakové literály reprezentujú znaky štandardu Unicode. Každý znakový literál musí pozostávať z jediného znaku uzavretého v apostrofoch. Jeho šírka je 16 bitov. Na vyjadrenie špeciálnych znakov slúžia escape sekvencie. (Pozor, nejde o unikódové escape sekvencie, ktoré sú ekvivalentným spôsobom zápisu ľubovoľného znaku zdrojového textu programu.) Zoznam escape sekvencií je v tab. 1. Sekvencia v poslednom riadku tabuľky slúži na explicitné vyjadrenie kódu znaku pomocou osmičkovej hodnoty. Jej rozsah je však obmedzený na prvých 256 znakov Unicode, preto sa na tieto účely odporúča použiť unikódové escape sekvencie.

Súčasťou znakového literálu nesmie byť nijaký oddeľovač riadka. Je preto chybou uviesť do programu literál '\u000A', pretože vnorená escape sekvencia sa nahradí znakom LF ešte počas lexikálnej analýzy a výsledný efekt bude rovnaký, ako keby na danom mieste bol vložený klasický prechod na nový riadok. Na tieto účely slúžia práve štandardné escape sekvencie, takže správny zápis je '\n'.

Príklady znakových literálov: 'z', '#', '\t', '\177', '\u0427', 'Σ'.

Reťazcové literály sú postupnosti unikódových znakov, uzavreté v úvodzovkách. V rámci reťazcových literálov je povolené používať tie isté escape sekvencie ako v znakových literáloch. Ani v reťazcových literáloch nie je povolené používať oddeľovače riadkov.

Príklady reťazcových literálov: "", "hello", "Prvý riadok\nDruhý riadok".

Konečne posledným typom literálu je samostatný literál null. Tento literál v zásade nereprezentuje nijakú reálnu hodnotu a používa sa pri referenčných premenných objektového typu na vyjadrenie skutočnosti, že daná premenná neodkazuje na nijaký existujúci objekt, namiesto toho ukazuje „nikam“.

Zhrnutie

Úspešne sme sa prepracovali na záver druhej časti seriálu Java pod lupou, ktorá bola aspoň spolovice výrazne teoretická. V nasledujúcej časti prídu na rad okrem iného premenné a ich typy. Dovtedy dovidenia!

 

Sekvencia Unikód Význam
\b \u0008 backspace (BS)
\t \u0009 horiz. tabulátor (HT)
\n \u000A nový riadok (LF)
\f \u000C nová strana (FF)
\r \u000D návrat vozíka (CR)
\" \u0022 úvodzovky
\' \u0027 apostrof
\\ \u005C spätná lomka
\ooo \u0000÷\u00FF  

Tab. 1 – Escape sekvencie

 

 


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Ako zbaviť fotky hmly

08.12.2016 11:59

Hmla alebo dym sú často veľmi kreatívne nástroje. No všetkého veľa škodí. Fotka potom stráca kontrast a v podstate na nej nič nevidieť. Hmlu môžete neraz následnými úpravami odstrániť alebo zredukovať ...

Ako na to

Užitočné SW nástroje

08.12.2016 11:53

AllDup v4.0.3 Určenie: program na vyhľadávanie a odstraňovanie duplicitných súborov Vlastnosti: duplicitné súbory sa vyhľadávajú len na zvolených diskových jednotkách alebo len v rámci vybraných ...

Ako na to

Fotografovanie s bleskom

08.12.2016 11:47

Ak máte moderný fotoaparát so vstavaným alebo externým bleskom, zdá sa vám téma článku triviálna. Jednoducho nastavíte vhodný režim, vyberiete najlepšiu kompozíciu záberu, exponujete a o zvyšok sa už ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá