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
2 Példa - Hengerprogram
3 Példa - Hengerprogram
4 Példa - Hengerprogram
Az objektumreferencia statikus és 5 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. Példa: Szintaktikailag helyes Szintaktikailag helytelen Hiba futáskor
Az istanceof operátor 7 Segítségével lekérdezhető a hivatkozott objektum osztálya: <objektum> instanceof <Osztaly> 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)... // true if (obj instanceof String)... // true if (obj instanceof Integer)... // false if ("Semmi" instanceof String)... // 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; // String Object //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:
Metódus felülírása, 13 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)
14 Példánymetódus dinamikus kötése
15 Példánymetódus dinamikus kötése
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:
17 Osztálymetódus statikus kötése
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 <OsztályAzonosító> { 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 <InterfészAzon> [extends <InterfészAzon,...>] { <konstansok, metódusfejek> } 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
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 Interfész - Példa
Belső osztály 35 Osztályon belül deklarált másik osztály: class <KulsoOsztályAzon>... {... class <BelsoOsztályAzon>... {... } } 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, )
37 Belső osztály - Példa
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 <ososztaly>(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.