8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním metodám a předávání argumentů metod. Doba nutná k nastudování 2 2,5 hodiny 8.1 Třídy, objekty V minulém bloku jsme si uvedli základní informace o třídách a objektech, v této kapitole si dosavadní znalosti rozšíříme o detailnější informace. Třída popisuje data (stavy), kterými disponuje objekt vytvořený na základě třídy a třída také popisuje chování objektů, které má každý objekt vytvořený na základě třídy. Každý objekt má unikátní hodnoty instančních proměnných, které vytváří jeho stav a každý objekt má v metodách popsánu logiku, pomocí níž dochází k vykonání činností. Při vytváření tříd je nutné mít na paměti, že by každá třída měla nést odpovědnost za řešení určitých vymezených kompetencí. I jednoduchý program používá objekty založené na mnoha jiných třídách vytvořených buď programátorem samotným, nebo z jiných zdrojů (např. Java API). Co se týká metod, tak každá metoda má mít odpovědnost za řešení jedné konkrétní (atomické) činnosti např. u matice se jedná o metody nactipocetradku(), nactipocetsloupcu(), nactiprvky(), vypisprvky() atd. Metody představují místa, kde je uchována logika programu metody obsahují algoritmy a dochází v nich ke zpracování dat. Instanční metody jsou volány na objektech viz příklad: studentnovak.nastavznamku(1) V jazyce Java platí pro vytváření tříd následující pravidla: ve zdrojovém souboru může být jen jedna třída s modifikátorem public KST/IZAPR - Základy programování blok 8, strana 1 (7) Michael Bažant
název třídy se musí shodovat s názvem souboru pokud je třída umístěna v balíčku, příkaz package musí být prvním řádkem v souboru s třídou pokud se používají jiné třídy, tak příkaz import musí být mezi příkazem package a definicí třídy (pokud se nepoužívají balíčky, tak příkaz import musí být prvním příkazem) soubor s třídou může obsahovat i více tříd, ale pouze jednu public Vztah mezi třídou a objekty můžeme znázornit i pomocí následujícího obrázku, kde jsou zobrazeny dva objekty (kruznice1 a kruznice2) vytvořené na základě jedné třídy (Kruznice). Obrázek 1: Vztah mezi objekty a třídou 8.2 Postup při vytváření objektů Nyní se blíže podíváme na kroky, které se vykonávají při vytváření objektů. Následující příkaz: new Student(); vykoná následující činnosti: alokaci paměti pro objekt, inicializaci hodnot atributů objektu pokud neuvedeme žádné standardní hodnoty u instančních proměnných, použijí se následující hodnoty dle datového typu proměnné: o referenční proměnné null KST/IZAPR - Základy programování blok 8, strana 2 (7) Michael Bažant
o byte, short, int, long 0 o float, double 0.0 o o boolean false char '\u0000' spuštění konstruktoru, návrat reference na objekt pomocí operátoru new. Příklad definice atributů v třídě si můžeme demonstrovat na následujícím příkladu třídy Obdelnik: public class Obdelnik { int delka; int sirka; boolean jezobrazen; String oznaceni; } 8.3 Metody V této kapitole se blíže podíváme na metody. Již jsme si uvedli, že metody představují místa, kde je uchována logika programu. Metody obsahují algoritmy a dochází v nich ke zpracování dat. Instanční metody jsou volány na objektech viz následující příklad: studentnovak.nastavznamku(1) Podle konvence by názvy metody měla být slovesa (název metody vždy začíná malým písmenem). Název metody je obvykle v rámci příslušné třídy jedinečný, metoda však může mát stejný název jako jiné metody díky přetěžování metod viz kapitola přetěžování metod. Základní syntaxe metody v jazyce Java má následující tvar: Obrázek 2: Základní syntaxe metody v jazyce Java KST/IZAPR - Základy programování blok 8, strana 3 (7) Michael Bažant
Z obrázku je zřejmé, že hlavička metody (její první řádek) se skládá z několika základních částí, na které se podíváme v dalších kapitolách podrobněji: modifikátor návratový typ formální parametry 8.3.1 Návratové hodnoty metod Metody mohou vracet a často také vrací hodnoty. Na obrázku (viz Obrázek 2) je tato část zapsána pomocí označení <navratovy_typ>. Pokud metody nevrací hodnotu, tak použijeme klíčové slovo void. Pokud metoda vrací hodnotu, tak musí být uvedeno klíčové slovo return a datový typ hodnoty (datový typ musí být kompatibilní s hodnotou), která je vracena. Lze vracet hodnoty jak primitivního datového typu, tak hodnoty referenčního datového typu (např. referenci na pole). Po provedení příkazu, který obsahuje slovo return metoda ihned skončí a je pokračováno dalším zpracováním programu. Příklady: 8.3.2 Parametry metod Deklarace metody obsahuje deklaraci určitého počtu a typu parametrů, které vstupují do metody. Tato vlastnost metod umožňuje psát obecné metody bez nutnosti definice konkrétních hodnot uvnitř metod viz následující příklad pro výpočet součinu dvou zadaných parametrů metody a, b: public double vypocitejsoucin(double a, double b) { return a * b; } Parametr metody vždy musí mít vždy definován datový typ a parametr se stává lokální proměnnou metody. KST/IZAPR - Základy programování blok 8, strana 4 (7) Michael Bažant
8.3.3 Volání metod Při volání metod neexistuje žádný limit týkající se počtu volaných metod. Volající a volaná metoda mohou být ve stejné třídě i ve třídách různých (způsob volání se odlišuje): volání metod v rámci jedné třídy bez uvádění referenční proměnné, volání metod z jiné třídy - musí být uvedena referenční proměnná. Na pořadí definice metod ve třídě nezáleží (vzhledem k pořadí jejich volání). Při volání metod musí vždy odpovídat počet a typ skutečných parametrů (někdy se také skutečné parametry označují pojmem argumenty) parametrům formálním. Pokud tato podmínka není splněna, kompilace nebude úspěšná. Pro předchozí příklad tedy volání metody vypocitejsoucin() bude vypadat následovně: vypocitejsoucin(2.5, 1.5); Pokud by byl uveden jiný počet nebo typ parametrů, kompilace neproběhne úspěšně. 8.3.4 Předávání argumentů metod V některých programovacích jazycích lze realizovat dva typy předávání argumentů (např. Pascal), přičemž při předávání hodnotou dochází ke kopírování hodnoty argumentu do parametru. Dalším mlžným přístupem při předávání argumentů je předávání odkazem, kdy dochází k propojení formálního parametru a skutečného argumentu. V jazyce Java se argumenty vždy předávají hodnotou (pass by value). Při předávání argumentů primitivního datového typu dochází ke kopírování bitů reprezentujících hodnotu do metody viz následující příklad. Dojde k vytvoření bitové kopie vkládané hodnoty (v našem případě pro hodnotu 10), tato kopie je použita v metodě a po ukončení metody se použije lokální proměnná metody main() s označením a. KST/IZAPR - Základy programování blok 8, strana 5 (7) Michael Bažant
Obrázek 3: Předávání argumentů primitivního datového typu Při předávání referenčních proměnných opět dochází k vytvoření bitové kopie referenční proměnné, což má za následek existenci dvou referenčních proměnných, které odkazují na jeden objekt (jedna proměnná ve volající metodě, jedna proměnná ve volané metodě) viz Obrázek 4. Obrázek 4: předávání argumentů referenčního datového typu KST/IZAPR - Základy programování blok 8, strana 6 (7) Michael Bažant
Příklad: Obrázek 5: Příklad na předávání argumentů referenčního typu 8.3.5 Metoda main Speciálním typem metod je metoda main(), kterou používáme pro spouštění programu. Programování pouze v metodě main() nelze považovat za správný způsob programování, standardně jsou všechny programy rozděleny do jednotlivých metod, přičemž každá metoda vykonává jednu elementární činnost. Otázky na procvičení 1. Kolik public tříd může být v jednom souboru.java? 2. Čím jsou specifické jednotlivé objekty vytvořené na základě jedné a té stejné třídy? 3. Jaký je rozdíl mezi třídou a objektem? 4. Jaký je postup při vytváření objektu v jazyce Java? 5. Z jakých částí se skládá definice metody v jazce Java? Odkazy a další studijní prameny 1. Java Tutorial - http://docs.oracle.com/javase/tutorial/ KST/IZAPR - Základy programování blok 8, strana 7 (7) Michael Bažant