4 Datový typ, proměnné, literály, konstanty, výrazy, operátory, příkazy Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude uvedena definice datového typu, uvedeny datové typy používané v programovacím jazyce Java, uvedeme si definici operátorů a operandů a příkazů. Pro všechny tyto základní prvky jazyka budou uvedeny příklady.
Doba nutná k nastudování
2 – 2,5 hodiny
4.1 Datový typ Nejprve si uvedeme obecnou definici pojmu datový typ a poté se zaměříme na dostupné datové typy v programovacím jazyce Java. Datový typ je množina hodnot a množina operací nad těmito hodnotami. Každá proměnná, konstanta a výraz jsou právě jednoho datového typu. Typ proměnné a konstanty je určen během deklarace proměnné nebo je typ výrazu dán použitými operátory a operandy (např. definice toho, jakého datového typu bude výsledek po dělení datového typu int a double) – v každém programovacím jazyce musí být definováno, jakého typu je výsledek. V programovacím jazyce Java lze datové typu rozdělit na dvě základní skupiny: Primitivní datové typy – jedná se o nejzákladnější formu dat v jazyce Java. Při deklaraci proměnné primitivního datového typu dochází k alokaci určitého počtu bitů v paměti. Velikost alokované paměti záleží na datovém typu – k dispozici je základních 8 datových typů, pod kterými si lze představit konkrétní hodnoty: o
celočíselné – jedná se o datové typy: byte (8 bitů), short (16 bitů), int (32 bitů), long (64 bitů)
o
reálné - double (32 bitů), float (64 bitů)
o
znaky – jedná se o datový typ char (16 bitů), použita znaková sada Unicode
o
logické hodnoty – jedná se o datový typ boolean. Velikost není pevně dána, záleží na Java Virtual Machine (JVM)
Referenční datové typy – referenční proměnné neobsahují žádné konkrétní hodnoty, ale odkazují na objekty v paměti. Jejich velikost není pevně dána. K detailnějšímu představení referenčního datového typu se dostaneme při výkladu tříd a objektů v další části kurzu.
KST/IZAPR - Základy programování
blok 4, strana 1 (7)
Michael Bažant
Obrázek 1: Primitivní datové typy pro práci s čísly a jejich rozsah
Příklady: byte x = 10; char znak = ‘A’; boolean souhlas = true; double cislo = 2563.5;
Obrázek 2: Referenční datový typ v jazyce Java
4.2 Přetypování Poměrně častou operací při programování je nutnost změny datového typu, tzv. přetypování. V některých případech je přetypování bezproblémové, neboť se vykoná automaticky. V takovém případě se jedná o implicitní přetypování, které se typicky realizuje při rozšiřující konverzi, např. z datového typu byte na datový typ int – viz následující příklad.
KST/IZAPR - Základy programování
blok 4, strana 2 (7)
Michael Bažant
Příklad: int a = 100; long b = a; Jiným případem je potom přetypování, které se automaticky nerealizuje a pakliže jej chceme vykonat, tak jej musíme zabezpečit sami. Ve většině případů se jedná o případy zúženi, tedy převodu většího datového typu do menšího. V takovém případě v jazyce Java zůstává příslušný počet bitů vpravo a zbytek zůstává nepoužit – viz následující příklad, kdy se pro explicitní přetypování používají kulaté závorky, v nichž se nachází název nového datového typu Příklad: float a = 100.001f; int b = (int) a; Příklad: double e = (double) (i / j); // vysledek 3.0 double d = (double) i / ( double) j; // vysl 3.5 double f = ((double) i ) / j; // vysledek 3.5
4.3 Proměnné Při programování potřebujeme uchovávat data (např. údaje zadané uživatelem, různé dočasné a pomocné hodnoty, výsledky výpočtů, údaje načtené ze souborů (textových, datových) apod.). Proměnné jsou pojmenovaná místa v paměti (paměťová místa), ve kterých uchováváme informace. Proměnná je vždy určitého typu, uchovávaná hodnota se může za běhu programu měnit. Proměnná vždy obsahuje jednu z množiny přípustných hodnot. Jazyk Java je silně typový jazyk, což znamená, že každá proměnná i výraz je určitého datového typu – splnění této podmínky kontroluje kompilátor. Po deklaraci proměnné již není možné měnit její typ, ale hodnotu je možné měnit (až na výjimky, které budou uvedeny v další části kurzu).
Deklarace (určení souvisejícího typu dat) a inicializace (přiřazení úvodní hodnoty do proměnné) proměnné v jazyce Java vypadá následovně: [modifikator] typ identifikator [= hodnota]; Pro tento formální zápis je použita EBNF (viz blok 1), nepovinné údaje jsou tedy uvedeny v hranatých závorkách. V příkladu 1 je uvedena možnost zápisu dekla-
KST/IZAPR - Základy programování
blok 4, strana 3 (7)
Michael Bažant
race se současnou inicializací proměnné, příkladu 2 potom samotná deklarace proměnné bez inicializace. Modifikátorů existuje (a reálně se používá) celá řada, příklad jednoho je uveden v následující kapitole o konstantách. Příklad 1: int pocet = 1;
Příklad 2: int pocet;
4.4 Literály (doslovné hodnoty) Literály představují pevně danou hodnotu vyjádřenou explicitně bez použití jiných prvků jazyka. Mezi literály tedy nepatří proměnné programu ani konstanty. Literály mohou být různých typů – řetězcové, číselné, logické a jiné. V této kapitole projdeme jednotlivé možnosti definice doslovných hodnot v programovacím jazyce Java. V jazyce Java jsou dostupné následující možnosti zadávání dostlovných hodnot pro jednotlivé datové typy: celočíselné typy (byte, short, int a long) vyjádřit pomocí desítkové, osmičkové nebo šestnáctkové číselné soustavy, což je demonstrováno na následujících příkladech. Příklady: Desítková soustava int a = 42; Osmičková soustava (číslice 0–7), prefix 0, max. 21 číslic bez úvodní nuly int sedm = 07; // desitkove 7 int osm = 010; // desitkove 8 int devet = 011; // desitkove 9 Šestnáctková soustava (znaky 0–f), prefix 0x nebo 0X, max. 16 znaků bez prefixu int x = 0X001; // x = 1 int y = 0x7fffff; // y = 8388607 int z = 0x7FFFFF; // y = 8388607 typy s plovoucí desetinnou čárkou (float, double) – u těchto datových typů je možné použít znak E nebo e u vědecké notace, znak f ne-
KST/IZAPR - Základy programování
blok 4, strana 4 (7)
Michael Bažant
bo F pro 32bitový literál s plovoucí desetinnou čárkou (je vyžadován) a znak d nebo D pro 64 bitový literál typu double (tato volba je výchozí a podle konvence se neuvádí). Příklady: float f = 653.2f; float g = 653.2F; double d = 1105.36D; // volitelne D nebo d logický typ (boolean) – u tohoto typu se používají výhradně hodnoty true nebo false, nelze používat jiné způsoby zápisu (v některých jazycích např. hodnoty 0, 1 apod.). Příklady: boolean t = true; boolean s = 0;
// chyba
literály typu char a String – mohou obsahovat libovolné znaky v kódování Unicode (UTF-16). Umožňuje-li to editor zdrojového kódu, je možné takové znaky zadávat přímo při psaní kódu. Pokud nikoliv, lze použít sekvenci „Unicode escape“ jako např. „\u0108“. Typ char je ve skutečnosti 16-bitové číslo, hodnoty lze zadávat i ve tvaru číselných hodnot. Literály typu char vždy zapisujeme do jednoduchých uvozovek a literály typu String do dvojitých uvozovek. Datový typ String představuje třídu a jednotlivé řetězce potom od této třídy odvozené objekty, k této problematice se ale dostaneme během dalšího výkladu. Příklady: char a = 'a'; char pismenoN = '\u004E'; //vyuziti Unicode char a = 0x892; // hexa char b = 982; // literal typu int char c = (char)70000; // prekroceni rozsahu char String s = "Retezec"; doslovné hodnoty pro pole – k této problematice se vrátíme o výkladu týkajícího se polí K dispozici je také speciální literál null, který lze použít jako hodnotu libovolného referenčního typu. Hodnotu null je možné přiřadit libovolné proměnné s výjimkou proměnných primitivního datového typu. S hodnotou null nelze provádět téměř žádné operace kromě testování její přítomnosti. Tato hodnota se proto často používá v programech jako značka, že určitý objekt není k dispozici.
KST/IZAPR - Základy programování
blok 4, strana 5 (7)
Michael Bažant
4.5 Konstanty Modifikátor final určuje, že se hodnota dané proměnné nemůže změnit. Následující deklarace proměnné definuje konstantu s názvem PI, jejíž hodnota představuje odhad čísla pí. final double PI = 3.14159265;
4.6 Výraz Nejprve se podíváme na obecnou definici výrazu, poté na prvky, z nichž se mohou výrazy skládat. Pod pojmem výraz rozumíme konstrukci jazyka, která má hodnotu nějakého datového typu. Výrazy (anglicky expressions) jsou konstrukce vytvořené z proměnných, operátorů a volání metod, které jsou sestaveny podle syntaxe jazyka. Výsledkem vyhodnocení výrazu je jediná hodnota. Příklady výrazů (jsou zvýrazněny tučně): int frekvence = 0; // vyraz ma hodnotu dat. typu int pole[0] = 100; int vysledek = 1 + 2; if (hodnota1 == hodnota2) {}
4.7 Operátory V předchozí kapitole o výrazech jsou u všech příkladů použity kromě proměnných také speciální symboly, na které se nyní zaměříme. Těmto symbolům říkáme operátory a nyní si uvedeme obecnou definici. Operátory jsou speciální symboly, které provádějí konkrétní operace s jedním, dvěma nebo třemi operandy a potom vrací výsledek. Operandy jsou části výrazu, na které je aplikován jeden z relevantních operátorů, přičemž každý operand má hodnotu konkrétního datového typu. Pro demonstraci pojmenování jednotlivých částí uvedených příkladů použijeme názorný obrázek (viz Obrázek 3).
KST/IZAPR - Základy programování
blok 4, strana 6 (7)
Michael Bažant
Obrázek 3: Prvky výrazu
V jazyce Java (stejně jako i v jiných jazycích) je k dispozici celá řada operátorů, se kterými se seznámíme v dalším bloku tohoto kurzu.
4.8 Příkaz Příkaz (anglicky statement) tvoří úplnou jednotku provádění programu. Následující typy výrazů lze změnit na příkaz, když příslušné výrazy ukončíme středníkem (tyto příkazy nazýváme výrazovými příkazy): výrazy přiřazení libovolné požití operátorů ++ nebo -volání metod výrazy vytvoření objektů Kromě výrazových příkazů také existují dva další typy příkazů: deklarační příkazy (těmi se deklaruje proměnná) a příkazy řízení toku, které regulují pořadí, ve kterém se provádějí jiné příkazy. S těmito příkazy se seznámíme v dalším bloku 6 tohoto kurzu.
Otázky na procvičení 1. 2. 3. 4. 5.
Jaké primitivní datové typy jsou k dispozici v jazyce Java? Co obsahuje referenční proměnná? Jaký je rozdíl mezi výrazem a příkazem? K čemu slouží konstanty? Jak definovujeme datový typ?
Odkazy a další studijní prameny 1. Java Tutorial - http://docs.oracle.com/javase/tutorial/
KST/IZAPR - Základy programování
blok 4, strana 7 (7)
Michael Bažant