Programovací techniky - Cvičení č. 3


Autor: Miroslav Beneš
Organizace: Katedra informatiky FEI VŠB-TU Ostrava
Popis: Cílem tohoto cvičení je základní seznámení s třídami a objekty.

Úkoly

  1. Vytvoření a inicializace objektu. Prostudujte řešený příklad č. 1. Obsahuje definici třídy Zlomek reprezentující číslo ve tvaru zlomku, a třídu Priklad1 obsahující hlavní program - metodu main.

    Třída Zlomek obsahuje dvě instanční proměnné, citatel a jmenovatel. Tyto proměnné jsou označeny klíčovým slovem private, takže jsou přístupné pouze uvnitř třídy Zlomek. Ostatní třídy mohou volat veřejné metody getCitatel() a getJmenovatel() pro čtení obou promenných, jejich hodnotu však měnit nemohou (pojmenování těchto přístupových metod je dáno jistou konvencí, takže se musíme smířit s jinak nevhodnou kombinací angličtiny a češtiny). Můžeme se tedy spolehnout na to, že je hodnota zlomku vždy normalizovaná, neboť toto pravidlo metody třídy Zlomek dodržují a nikdo jiný nemůže s privátními proměnnými manipulovat.

    Operace nad zlomky jsou zastoupeny sčítáním a násobením. Tyto operace jsou ale implementovány různě. Operace krat(z) je metodou instance třídy Zlomek; musí se tedy volat na konkétní zlomek, který je předán jako hodnota proměnné this. Ve volání z1.krat(z2) tedy proměnná z1 představuje hodnotu this a proměnná z2 je přiřazena parametru z. Pokud nemůže dojít ke konfliktu se jmény parametrů nebo lokálních proměnných, nemusíme uvnitř instanční metody this uvádět, jak ukazuje třeba metoda normalizuj() nebo toString(). Metoda krat() nevrací žádný výsledek (je typu void), protože pouze modifikuje obsah zlomku reprezentovaného proměnnou this.

    Naproti tomu statická metoda plus(z1, z2) dostane jako parametry dva objekty typu Zlomek a vrátí nový objekt typu Zlomek reprezentující součet obou zlomků. Tato metoda je statická, tj. jedná se o metodu třídy, se kterou není sdružena žádná proměnná this. Taková metoda může používat pouze statické členy třídy Zlomek, neboť není svázána s žádnou její instancí.

    Metoda toString() je standardní metodou, kterou každá třída dědí ze společné bázové třídy java.lang.Object. Tato metoda realizuje převod objektu na textovou reprezentaci, která je pak užitečná např. ve volání metody print nebo println standardního výstupního souboru System.out, případně při spojování řetězců s objekty operátorem +. V těchto případech totiž dochází k internímu převodu objektu na řetězec, tedy právě k volání metody toString(). Standardní implementace této metody pouze vypíše jméno třídy a šestnáctkové číslo, které nám o konkrétním objektu příliš mnoho neřekne. Zkuste celou metodu toString() zakomentovat a uvidíte, jak se výstup změní.

    Jako domácí úkol můžete rozšířit třídu Zlomek o další operace a implementovat je buď jako instanční metody nebo jako statické metody třídy. V rámci cvičení se ale nejprve pusťte do následujícího příkladu.

  2. Implementace třídy Complex. Vytvořte třídu Complex reprezentující komplexní čísla s reálnou a imaginární složkou typu double. Tato třída bude poskytovat implicitní konstruktor bezx paramětrů vytvářející komplexní číslo s nulovou hodnotou, konstruktor s jedním parametrem vytvářející komplexní číslo se zadanou reálnou složkou a nulovou imaginární složkou a konstruktor se dvěma parametry představujícími reálnou a imaginární složku čísla. Dále bude poskytovat metody pro základní operace add, sub, mul, div a metodu abs, která vypočte absolutní hodnotu reálného čísla. Uvažujte realizaci pomocí instančních metod i statických metod třídy. Doplňte také metodu toString, která převede komplexní číslo na textovou reprezentaci.
    Uvedené tři varianty konstruktoru představují příklad přetížené operace, která se liší pouze počtem nebo typy parametrů. Jiným příkladem přetěžování jsou operace print() nebo println() standardního výstupního souboru System.out. Odpovídá jim řada metod rozlišených typem parametru, jehož hodnota se má vypsat. Navíc existuje i metoda println() bez parametrů, která pouze odřádkuje.