Java - polymorfizmus

Z Kiwiki
Verzia z 09:32, 15. november 2010, ktorú vytvoril Juraj (diskusia | príspevky)
Skočit na navigaci Skočit na vyhledávání
Imbox draft.png
Toto je projekt, na ktorom sa ešte stále pracuje!!

Aj keď sú v tomto dokumente použiteľné informácie, ešte nie je dokončený. Svoje návrhy môžete vyjadriť v diskusii o tejto stránke.

Definícia polymorfizmu

Polymorfizmus (viacznačnosť) je schopnosť objektu nadobúdať viacero foriem. Najčastejšie použitie polymorfizmu je vtedy, keď v referencii na triedu rodiča používame odkaz na objekty triedy potomka.

Je dôležité vedieť, že jediný možný spôsob prístupu k objektu je cez referenčnú premennú. Referenčná premenná môže byť len z jedného typu. už definovanému objektu nemožno zmeniť typ.

Referenčná premenná môže byť znovu viackrát priradená iným objektom. Typ referenčnej premennej určuje aké metódy môžeme v rámci objektu volať. Referenčná premenná môže odkazovať ľubovoľný objekt, ktorý má rovnaký typ ako je typ referencie alebo podtypu referencie.[1]

Ilustračný príklad

   public interface Vegetarian{}
   public class Zviera{}
   public class Jelen extends Zviera implements Vegetarian{}

O triede Jelen môžeme tvrdiť:

  • Jeleň je zviera (Zviera)
  • Jeleň je vegetaríán (Vegetarian)
  • Jeleň je Jelen
  • Jeleň je objekt (Object)

Vidieť, že na triedu Jelen sa môžeme pozerať viacerými spôsobmi.

Uvažujme nasledujúce deklarácie:

   Jelen j = new Jelen();
   Zviera z = j;
   Vegetarian v = j;
   Object o = j;

Všetky referenčné premenné (j,z,v,o) odkazujú na jeden objekt - inštanciu triedy Jelen.

Virtuálne metódy

V tejto časti ukážeme ako využiť preťažovanie metód v súvislosti s polymorfizmom.

V predchádzajúcej časti sme hovorili o preťažovaní metód. Virtuálna metóda je vlastne preťažaná metóda z rodičovskej triedy. Rozdiel je však v možnosti použitia takejto metódy.

Opäť si zoberme triedy Zviera, Cicavec a Pes. Do týchto doplňme virtuálne metódy toString, ktoré vrátia textovú reprezentáciu daného objektu:

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

    //konstruktory sa oproti munulému príklady nezmenili

    public String toString()
    {
        return "Zviera: "+this.nazov+", Vaha: "+this.vaha;
    }
}

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

    //konstruktory sa oproti munulému príklady nezmenili

    public String toString()
    {
        String g= super.toString();
        return g+", Gravidita: "+this.dlzka_gravidity+", Srst: "+this.typ_srsti;
    }
}

public class Pes extends Cicavec {
    public String typPsa;

    //konstruktory sa oproti munulému príklady nezmenili

    public String toString()
    {
        String g= super.toString();
        return g+", Typ psa: "+this.typPsa;
    }   
}

Teraz ukážeme použitie viruálnej metódy toString. Princíp je ten, že nebudeme vytvárať referenciu na triedu Cicavec alebo Pes, ale vždy na triedu Zviera:

public class program {

    public static void main(String[] args) {
        Zviera a = new Zviera("Krokodíl", 200);
        Zviera b = new Cicavec("Jelen", 120, 14, "kratka");
        Zviera c = new Pes("Vlkolak", 60, 15, "kratka", "divý");

        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}

Výstupom bude:

Zviera: krokodíl, Vaha: 200
Zviera: Jelen, Vaha: 120, Gravidita: 14, Srst: kratka
Zviera: Vlkolak, Vaha: 60, Gravidita: 15, Srst: kratka, Typ psa: divý

Ešte raz poznamenajme, že a, b, c sú referencie na triedu Zviera. Avšak pre tiero referencie používame odkaz na potomka (len pri b, c). O tom, ktorá verzia metódy sa spustí sa rozhodne až pri zavolaní metódy v bežiacom programe. Teda nie pri kompilácii ale pri behu programu.

Zdroje a odkazy

  1. tutorialspoint.com - Java Polymorphism http://www.tutorialspoint.com/java/java_polymorphism.htm