Dr. Pál László, Sapientia EMTE, Csíkszereda
JAVA PROGRAMOZÁS 3.ELŐADÁS
2014-2015 tavasz
Polimorfizmus, absztrakt osztályok, interfészek
Példa - Hengerprogram 2
Példa - Hengerprogram 3
Példa - Hengerprogram 4
5
Az objektumreferencia statikus és dinamikus típusa
Statikus típus: deklarált osztály Dinamikus típus: mutatott objektum valódi osztálya Fontos, hogy a referencia statikus típusa a dinamikus típussal egyenlő, vagy annak egy őse legyen
Értékadási kompatibilitás 6
Objektumreferenciák értékadása esetén a jobb oldal értékadás szerint kompatibilis a bal oldallal, ha a bal oldali referencia osztálya a jobb oldali referencia osztállyal megegyezik, vagy annak egy őse. Szintaktikailag helytelen Példa: Szintaktikailag helyes
Hiba futáskor
Az istanceof operátor 7
Segítségével lekérdezhető a hivatkozott objektum osztálya:
instanceof
Az eredmény egy logikai érték: true, ha az objektum osztálya a megadott Osztaly vagy annak egy leszármazottja, különben false Példa: Object obj = new String("Valami"); if (obj instanceof Object) ... if (obj instanceof String) ... if (obj instanceof Integer) ... if ("Semmi" instanceof String) ...
// // // //
true true false true
Az istanceof operátor 8
Példa:
Típuskonverzió 9
Felfelé (upcasting) Utód
típusú referencia értékül adható egy ős típusú referenciának Ebben az esetben az utód referencia ős típusúvá konvertálódik
Példa: String str = "Kakukk"; System.out.println(str.toLowerCase());// OK Object obj = str; // StringObject //System.out.println(obj.toLowerCase()); Fordítási hiba! hengerek.add(new Rud(0.5,4)); hengerek.add(new Cso(5,5,0.5));
Típuskonverzió 10
Lefelé (downcasting) Ős
típusú referencia nem adható egyszerűen értékül egy utód típusú referenciának csak rákényszerítéssel Ebben az esetben csak olyan üzenet küldhető, amely benne van az objektum valódi osztályában
Példa:
Típuskonverzió 11
Példa: A
konténerből kikért objektum le van butítva Ha nem kényszerítjük rá a Henger-t, nem kérdezhetnénk meg tőle a térfogatát
Adatok takarása (árnyékolás) 12
Adatot nem lehet felülírni! Adat takarása = ugyanolyan nevű másik adat deklarálása Példa:
13
Metódus felülírása, dinamikus és statikus kötés
Példánymetódus felülírása (overriding) Egy
metódus az utódosztályban felülírható, ha az:
nem
private nem final nem static (példánymetódus)
Dinamikus kötés: Az
ostzályhierarchia bármely pontjáról is hívunk meg egy példánymetódust, minden esetben a megszólított objektum osztályában fog végrehajtódni Ez csak futáskor derülhet ki, a pontos címet futáskor határozza meg a rendszer -> futás alatti kötés vagy kései kötés (late binding)
Példánymetódus dinamikus kötése 14
Példánymetódus dinamikus kötése 15
Osztálymetódus statikus kötése 16
A fordító egyértelműen el tudja dönteni melyik osztály metódusát hajtsa végre A statikus metódust már a fordító megkeresi és a kódhoz köti Példa:
Osztálymetódus statikus kötése 17
Polimorfizmus 18
Polimorfizmus (polymorphism, többalakúság) Azt
jelenti, hogy ugyanarra az üzenetre különböző típusú objektumok különbözőképpen reagálnak – minden objektum a saját metódusával
Példa:
Polimorfizmus 19
Példa:
Absztrakt metódus, osztály 20
Absztrakt metódus: üres metódus, mely csak örökítési célt szolgál Absztrakt osztály: absztrakt metódust tartalmazó, nem példányosítható osztály Jelölés
UML: dőlt betűvel Java: abstract class { … abstract <metódusAz>(paraméterek); … }
Absztrakt metódus, osztály 21
Szabályok Javában: Absztrakt
metódusnak nincs blokkja Absztrakt osztályban akárhány absztrakt metódus lehet Absztrakt metódust tartalmazó osztály csak absztrakt lehet Ha az utódosztály nem absztrakt, akkor abban minden absztrakt metódust implementálni kell Absztrakt osztályból nem lehet példányt létrehozni Absztrakt osztály, illetve metódus nem lehet végleges
Absztrakt metódus, osztály 22
Példa:
Absztrakt metódus, osztály 23
Példa:
Absztrakt metódus, osztály 24
Példa:
Interfészek 25
Konstansokat és metódusfejeket definiál Implementáló osztály: a metódusokat implementálja Deklarációja: [public] interface [extends ] { }
Egy osztály több interfészt is megvalósíthat Egy interfészt több osztály is megvalósíthat
Interfész implementálása 26
Az interfészben minden tag implicit publikus, így az interfészt megvalósító osztályban mindig ki kell tenni a public módosítót
Interfész implementálása 27
Interfészekben definiálhatunk mezőket is, ezek public static final típusú konstansak
Az objektum statikus referenciája lehet interfész típusú
Interfész implementálása 28
Implementáló osztály: speciális utódja az interfésznek Nem abstract osztály összes metódust meg kell írni Abstract osztály az utódban befejezhető az implementálás Egy osztály akárhány interfészt implementálhat Az interfész egyes metódusait az implementáló osztály örökölheti is
Interfész - Példa 29
Interfész - Példa 30
Interfész - Példa 31
Interfész - Példa 32
Interfész - Példa 33
Interfész - Példa 34
Belső osztály 35
Osztályon belül deklarált másik osztály: class ... { ... class ... { ... } }
Csak az őt deklaráló külső osztály ismeri Példányosítás: külső osztály példánymetódusából
Szabályok 36
Példánya ismeri az őt létrehozó külső objektumot implicit
referencia hivatkozás takarásnál: KülsıOsztály.this
Nem lehetnek statikus deklarációi Nem kötelező azonosítani (névtelen belső osztály) Fordítóprogram különálló külső osztállyá alakítja: KülsıOsztályAzon$BelsıOsztályAzon.class KülsıOsztályAzon$n.class (n=1,2,…)
Belső osztály - Példa 37
Névtelen osztály 38
Nincs neve Máshol nem lehet rá hivatkozni Egyszer példányosítható Az objektum létrehozásával egyidőben deklaráljuk Névtelen osztályú objektum létrehozása Osztály
kiterjesztésével Interfész implementálásával
Nincs konstruktora Deklaráció: New (parameterlista){ névtelen osztály blokkja }
Példányosítás osztály kiterjesztéssel 39
Nincs neve Máshol nem lehet rá hivatkozni Egyszer példányosítható Az objektum létrehozásával egyidőben deklaráljuk Névtelen osztályú objektum létrehozása Osztály
kiterjesztésével Interfész implementálásával
Nincs konstruktora
Példányosítás osztály kiterjesztéssel 40
Példa:
Mi a kimenet?
Könyvészet 41
Angster Erzsébet, Objektumorientált tervezés és programozás. Java I-II. (Bazele programării orientate pe obiecte), Ed. 4 Kör Bt., Budapesta, 2002. Kathy Sierra, Bert Bates: Agyhullám: Java, Kiskapú, 2011.