Java - dedičnosť

Z Kiwiki
Verzia z 23:38, 4. november 2010, ktorú vytvoril Juraj (diskusia | príspevky) (Vytvorená stránka „{{Navigacne menu - java}} Kľúčovým rysom objektovo orientovaného programovania sa týka schopnosti triedy zdediť existujúce triedy a rozšíriť jej schopnosti. ==De…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Skočit na navigaci Skočit na vyhledávání

Kľúčovým rysom objektovo orientovaného programovania sa týka schopnosti triedy zdediť existujúce triedy a rozšíriť jej schopnosti.

Definícia dedičnosti

Dedičnosť je schopnosť triedy používať vlastnosti a metódy inej triedy, a pridávanie vlastných funkcií. Triedy, ktoré sú v hierarchii tried na prvých pozíciách nazývame generické triedy. Taktiež ich označme ako základné alebo rodičovské triedy. Triedy, ktoré vzniknú dedením vlastností z týchto generických tried sa označujú ako triedy potomkov, alebo odvodené triedy. Koncept dedenia výrazne zvyšuje schopnosť opätovného použitia kódu.[1]

Definície dedičnosti v jazyku Java

Triede, ktorá je potomkom inej triedy sa pri definícii pridá pomocou kľúčového slova extends názov triedy, z ktorej dedí.

Príklad: Majme generickú triedu A:

public class A{
   public int a=1;   
}

Definujme odvodenú triedu B, ktorá je potomkom triedy A:

public class B extends A{
   public int b=2;   
}

Nasleduje použitie týchto tried:

    A x=new A(); // objekt triedy A
    B y=new B(); // objekt triedy B
    // objekt x obsahuje len vlastnost a:
    System.out.println(x.a);  //1
    // objekt y obsahuje tak ako vlastnost a aj vlastnost b
    System.out.println(y.a); //1
    System.out.println(y.b); //2

Pre lepšiu predstavu uveďme príklad: Definujme generickú triedu Zviera a odvodené triedy Cicavec, Vták a Plaz. Môžeme povedať, že nová ďalšia trieda Pes by bola odvodenou triedou od triedy Cicavec. Každá trieda obsahuje opis spoločných znakov celej skupiny.

Hierarchia zvieracích tried ako UML diagram

Trieda Zviera bude teda obsahovať položky spoločné pre všetky druhy zvierat. Môžeme povedať, že trieda Zviera bude obsahovať:

  • názov zvieraťa (lev, zajac, kobra,...) - každé zviera musí mať meno
  • priemerná váha dospelého jedinca

Pre triedu Zviera definujeme ešte metódy, teda všetky akcie, ktoré dokážu robiť všetky zvieratá:

  • prijímať potravu
  • rozmnožovať sa


Triedy Cicavec, Vták a Plaz budú odvodené od triedy Zviera. Znamená to, že zdedia všetky vlastnosti a metódy triedy Zviera. Znamená to že každý cicavec, vták a plaz má meno, má určitú hmotnosť, dokáže prijímať potravu a rozmnožovať sa. Naviac, pre triedu Cicavec definujme nové vlastnosti, špecifické len pre cicavcov (pre jednoduchosť uvažujme len suchozemské cicavce):

  • dĺžka gravidity
  • typ srsti

Medzi akcie špecifické pre vtáky môže patriť:

  • kojenie mláďat

Trieda Vták rozširuje triedu zviera o:

  • rozpätie krídel
  • priemerný počet vajec

Medzi akcie špecifické pre vtáky môže patriť:

  • vydávanie pískavých zvukov
  • lietanie (na akú vzdialenosť)


Uvažujeme z plazoch vo význame hady. Trieda Plaz je špecifickejšia od triedy Zviera o:

  • priemerná dĺžka
  • typ (jedovatý, nejedovatý, škrtiče, ...)

Medzi akcie špecifické pre hady môže patriť:

  • plaziť sa


Ďalej trieda Pes bude potomkom triedy Cicavec, to znamená že zdedí všetky vlastnosti a metódy z triedy Cicavec, ale aj z triedy zvera. V triede Pes budú nové atribúty, špecifické len pre psa:

  • typ psa (strážny, športový, salašnícky, ...)

Implementácia v Jave

Pre nízornosť uvádzame ako navrhnuté triedy implementujeme v jazyku Java

Súbor Zviera.java: Trieda Zviera obsahuje vlastnosti nazov a vaha. Konštruktor Zviera vytvorí novú inštanciu zvieraťa, ktoré bude mať (všeobecný) názov "zviera" a váha bude 0. Konštruktor Zviera(String nazov, int vaha) vytvorí objekt zviera s definovaným názvom a váhou.

public class Zviera {
    public String nazov;
    public int vaha;

    public Zviera()
    {
        this("Zviera",0);
    }
    public Zviera(String nazov, int vaha) {
        this.nazov = nazov;
        this.vaha = vaha;
    }
}

Súbor Cicavec.java: Trieda Cicavec je odvodená od triedy Zviera. Keďže je odvodená z triedy Zviera, zdedí všetky jej verejné vlastnosti a metódy. Pri vytváraní novej inštancie triedy Cicavac (hovoríme o konštruktore triedy Cicavec), je teda potrebné zavolať aj konštruktor nadradenej triedy, teda triedy Zviera. Ten zavoláme pomocou kľúčového slova super. Výraz super znamená zavolanie konštruktora priamo nadradenej triedy. Poznamenajme, že ak zavoláme super(), voláme konštruktor Zviera(). Teda, takýto konštruktor (bez parametrov) musí existovať. Podobne je to aj pri konštruktore Cicavec(nazov, vaha, dlzka_gravidity, typ_srsti), kde voláme metódu super(nazov, vaha); Teda vlastne voláme konštruktor nadradenej triedy : Zviera(nazov, vaha) - teda konštruktor s 2-mi parametrami. Aj takýto konštruktor musí v triede Zviera existovať.

Poznamenajme ešte, že konštruktor nadradenej triedy (super) musí byť zavolaný ako prvý.

public class Cicavec extends Zviera{
    public int dlzka_gravidity;
    public String typ_srsti;

    public Cicavec() {
        super("Cicavec",1);
        this.dlzka_gravidity = 7;
        this.typ_srsti = "";
    }

    public Cicavec(String nazov, int vaha, int dlzka_gravidity, String typ_srsti) {
        super(nazov, vaha);
        this.dlzka_gravidity = dlzka_gravidity;
        this.typ_srsti = typ_srsti;
    }
}

Súbor Plaz.java: Trieda Plaz je odvodená od triedy Zviera. Platí rovnaké vysvetlenie ako pri triede Zviera.

public class Plaz extends Zviera {

    public float dlzka;
    public String typ;

    public Plaz(String nazov, int vaha, float dlzka, String typ) {
        super(nazov, vaha);
        this.dlzka = dlzka;
        this.typ = typ;
    }

    public Plaz() {
        super("Plaz",2);
        this.dlzka = 10;
        this.typ = "";
    }
}

Súbor Vtak.java: Trieda Vtak je odvodená od triedy Zviera. Platí rovnaké vysvetlenie ako pri triede Zviera.

public class Vtak extends Zviera {
    public float rozpatie_kridel;
    public int pocet_vajec;

    public Vtak()
    {
        super("Vtak",3);
        this.rozpatie_kridel = 0;
        this.pocet_vajec = 8;
    }

    public Vtak(String nazov, int vaha, float rozpatie_kridel, int pocet_vajec) {
        super(nazov,vaha);
        this.rozpatie_kridel = rozpatie_kridel;
        this.pocet_vajec = pocet_vajec;
    }
}


Súbor Pes.java: Trieda Pes je odvodená od triedy Cicavec. Trieda Pes zdedila všetky verejné vlastnosti triedy Cicavec, ale aj triedy Zviera. Pre konštruktory platí rovnaké vysvetlenie.

public class Pes extends Cicavec {
    public String typPsa;

    public Pes(String nazov, int vaha, int dlzka_gravidity, String typ_srsti, String typPsa) {
        super(nazov,vaha,dlzka_gravidity,typ_srsti);
        this.typPsa = typPsa;
    }

    public Pes() {
        // Volam konstruktor triedy Cicavec(nazov,vaha, gravidita, typ_psa)
        // V triede Cicavec sa zavola konstruktor triedy Zviera 
        // nasledovne: super("Pes",5), kde "Pes" je nazov zvierata
        // a 5 je vaha zvierata
        super("Pes",5,6,""); 
        this.typPsa="salašnícky";
    }
}

Súbor TestZviera.java: V nasledujúcom kóde vidieť mechanizmus dedenia. Vypisujem názvy všetkých zvierat a špecifické vlastnosti patriace len danej triede: pre cicavca dĺžku gravidity, pre vtáka priemerný počet vajec, pre plaza jeho dĺžku a pre psa typ psa.

public class TestZviera{
    public static void main(String[] args) {
        Zviera a = new Zviera();
        Cicavec b = new Cicavec();
        Vtak c = new Vtak();
        Plaz d = new Plaz();
        Pes e = new Pes();

        System.out.println("Nazov: " + a.nazov);

        System.out.println("Nazov: " + b.nazov);
        System.out.println("Dlzka gravidity : " + b.dlzka_gravidity);

        System.out.println("Nazov: " + c.nazov);
        System.out.println("Pocet vajec: " + c.pocet_vajec);

        System.out.println("Nazov: " + d.nazov);
        System.out.println("Dlzha hada: " + d.dlzka);

        System.out.println("Nazov: " + e.vaha);
        System.out.println("Typ psa: " + e.typPsa);
    }
}

Výpis programu:

Nazov: Zviera
Nazov: Cicavec
Dlzka gravidity : 7
Nazov: Vtak
Pocet vajec: 8
Nazov: Plaz
Dlzha hada: 10.0
Nazov: 5
Typ psa: salašnícky

Zdroje a odkazy