OBJEKTINIS PROGRAMAVIMAS
Java polimorfizmas
Polimorfizmas reiškia „daug formų“. Jis leidžia skirtingų poklasių objektus naudoti per bendrą bazinį tipą, o tą patį metodo iškvietimą kiekvienam objektui atlikti skirtingai.
Paveldėjimas ir polimorfizmas
Paveldėjimas sukuria ryšį tarp bazinės klasės ir poklasių. Polimorfizmas pasinaudoja tuo ryšiu: bazinės klasės nuoroda gali rodyti į skirtingų poklasių objektus, o perrašytas metodas parenkamas pagal tikrąjį objektą.
Skirtinga to paties metodo elgsena
Knyga, žurnalas ir laikraštis yra leidiniai, tačiau kiekvienas save pristato skirtingai:
class Leidinys {
public void rodytiTipa() {
System.out.println("Tai yra leidinys");
}
}
class Knyga extends Leidinys {
@Override
public void rodytiTipa() {
System.out.println("Tai yra knyga");
}
}
class Zurnalas extends Leidinys {
@Override
public void rodytiTipa() {
System.out.println("Tai yra žurnalas");
}
}
class Laikrastis extends Leidinys {
@Override
public void rodytiTipa() {
System.out.println("Tai yra laikraštis");
}
}Leidinysyra bendra bazinė klasė su metodurodytiTipa().Knyga,ZurnalasirLaikrastispaveldi šią klasę.- Kiekvienas poklasis perrašo tą patį metodą ir pateikia savo rezultatą.
- Šiame bloke objektai dar nekuriami ir metodai nekviečiami, todėl konsolėje niekas nepasirodo.
Bazinės klasės tipo nuoroda
public class Main {
public static void main(String[] args) {
Leidinys pirmas = new Leidinys();
Leidinys antras = new Knyga();
Leidinys trecias = new Zurnalas();
pirmas.rodytiTipa();
antras.rodytiTipa();
trecias.rodytiTipa();
}
}Tai yra leidinys
Tai yra knyga
Tai yra žurnalas
- Visi trys kintamieji deklaruoti bendru tipu
Leidinys. - Tačiau
antrassaugo tikrąKnyga, otrecias–Zurnalasobjektą. - Java vykdymo metu pažvelgia į tikrąjį objektą ir parenka jo
rodytiTipa()versiją. - Todėl vienodai parašyti metodo iškvietimai pateikia skirtingus atsakymus.
Skirtingi objektai viename masyve
Bendras tipas leidžia vienoje kolekcijoje laikyti skirtingų poklasių objektus:
public class Main {
public static void main(String[] args) {
Leidinys[] leidiniai = {
new Knyga(),
new Zurnalas(),
new Laikrastis()
};
for (Leidinys leidinys : leidiniai) {
leidinys.rodytiTipa();
}
}
}Tai yra knyga
Tai yra žurnalas
Tai yra laikraštis
Leidinys[]masyve telpa visi objektai, kurie yraLeidinysarba jo poklasiai.for-eachciklas paima po vieną leidinį.- Ciklui nereikia tikrinti, ar elementas yra knyga, žurnalas, ar laikraštis.
- Kiekvienas objektas pats įvykdo savo perrašytą metodą.
Bendras metodo parametras
Metodas, priimantis bazinį tipą, gali dirbti su bet kuriuo jo poklasiu:
public class Main {
static void pristatyti(Leidinys leidinys) {
leidinys.rodytiTipa();
}
public static void main(String[] args) {
pristatyti(new Knyga());
pristatyti(new Laikrastis());
}
}Tai yra knyga
Tai yra laikraštis
- Metodas
pristatyti()priima bendrąLeidinystipo parametrą. - Jam galima perduoti ir
Knyga, irLaikrastisobjektą. - Pridėjus naują leidinio poklasį, metodo
pristatyti()dažniausiai keisti nereikės.
Nuorodos tipas ir objekto tipas
class Knyga extends Leidinys {
public void atverstiPuslapi() {
System.out.println("Puslapis atverstas");
}
}
public class Main {
public static void main(String[] args) {
Leidinys leidinys = new Knyga();
leidinys.rodytiTipa();
// leidinys.atverstiPuslapi(); // Kompiliavimo klaida
}
}Tai yra knyga
Objektas iš tiesų yra Knyga, todėl vykdoma perrašyta knygos metodo versija. Tačiau nuoroda deklaruota kaip Leidinys, todėl per ją negalima tiesiogiai iškviesti tik knygoje esančio metodo atverstiPuslapi().
| Tipas | Ką lemia? |
|---|---|
| Deklaruotas nuorodos tipas | Kokius narius leidžia pasiekti kompiliatorius |
| Tikrasis objekto tipas | Kuri perrašyto metodo realizacija vykdoma |
Atsargiai su tipų konvertavimu
Bazinės klasės nuorodą galima bandyti konvertuoti į poklasį, tačiau objektas turi būti būtent to tipo:
Leidinys leidinys = new Zurnalas();
// Klaida vykdymo metu: objektas nėra Knyga
Knyga knyga = (Knyga) leidinys;java.lang.ClassCastException: Zurnalas cannot be cast to Knyga
- Kintamasis
leidinysiš tikrųjų saugoZurnalasobjektą. - Tipo užrašymas skliaustuose nepaverčia žurnalo knyga.
- Programa sukompiliuojama, tačiau neteisinga prielaida aptinkama vykdymo metu.
- Gerai suprojektuotame polimorfiniame kode tokio konvertavimo dažnai visai nereikia.
Kodėl naudoti polimorfizmą?
- Vienas kodas gali apdoroti daug susijusių objektų tipų.
- Nauji poklasiai gali būti pridedami mažiau keičiant esamą kodą.
- Tipų tikrinimo ir ilgų
if...elsegrandinių dažnai nebereikia. - Kiekviena klasė pati atsako už savo metodo realizaciją.
- Paveldėta bendra sąsaja ir specializuota elgsena lieka aiškiai atskirtos.

