JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL...
Transcript of JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL...
JAVA PROGRAMOZÁS3.ELŐADÁS
Dr. Pál László, Sapientia EMTE, Csíkszereda
3.ELŐADÁS
Polimorfizmus, absztrakt osztályok, interfészek2014-2015 tavasz
Példa - Hengerprogram2
Példa - Hengerprogram3
Példa - Hengerprogram4
Az objektumreferencia statikus és dinamikus típusa
5
� 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 legyentípussal egyenlő, vagy annak egy őse legyen
Értékadási kompatibilitás6
� 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.őse.
� Példa:Szintaktikailag helyes
Szintaktikailag helytelen
Hiba futáskor
Az istanceof operátor7
� 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 vagy annak egy 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átor8
� 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ódikkonvertá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, dinamikus és statikus kötés
13
� 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)� 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ése14
Példánymetódus dinamikus kötése15
Osztálymetódus statikus kötése16
� 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ötikódhoz köti
� Példa:
Osztálymetódus statikus kötése17
Polimorfizmus18
� 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:
Polimorfizmus19
� Példa:
Absztrakt metódus, osztály20
� 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� Jelölés� UML: dőlt betűvel
� Java:
abstract class <OsztályAzonosító> {…abstract
<metódusAz>(paraméterek);…
}
Absztrakt metódus, osztály21
� 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 � 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ály22
� Példa:
Absztrakt metódus, osztály23
� Példa:
Absztrakt metódus, osztály24
� Példa:
Interfészek25
� Konstansokat és metódusfejeket definiál
� Implementáló osztály: a metódusokat implementálja
� Deklarációja:[public] interface <InterfészAzon> [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ása26
� 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ása27
� Interfészekben definiálhatunk mezőket is, ezek publicstatic final típusú konstansak
� Az objektum statikus referenciája lehet interfész típusú
Interfész implementálása28
� Implementáló osztály: speciális utódja az interfésznek
� Nem abstract osztály � összes metódust meg kell írniAbstract osztály � az utódban befejezhető az implementálás
Egy osztály akárhány interfészt implementálhat� 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élda29
Interfész - Példa30
Interfész - Példa31
Interfész - Példa32
Interfész - Példa33
Interfész - Példa34
Belső osztály35
� 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ályok36
� 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 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élda37
Névtelen osztály38
� 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éssel39
� 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� 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éssel40
� Példa:
� Mi a kimenet?
Könyvészet41
� 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.2011.