JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL...

41
JAVA PROGRAMOZÁS 3.ELŐADÁS Dr. Pál László, Sapientia EMTE, Csíkszereda 3.ELŐADÁS Polimorfizmus, absztrakt osztályok, interfészek 2014-2015 tavasz

Transcript of JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL...

Page 1: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 2: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példa - Hengerprogram2

Page 3: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példa - Hengerprogram3

Page 4: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példa - Hengerprogram4

Page 5: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 6: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

É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

Page 7: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 8: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Az istanceof operátor8

� Példa:

Page 9: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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));

Page 10: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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:

Page 11: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 12: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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:

Page 13: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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)

Page 14: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példánymetódus dinamikus kötése14

Page 15: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példánymetódus dinamikus kötése15

Page 16: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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:

Page 17: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Osztálymetódus statikus kötése17

Page 18: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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:

Page 19: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Polimorfizmus19

� Példa:

Page 20: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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);…

}

Page 21: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 22: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Absztrakt metódus, osztály22

� Példa:

Page 23: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Absztrakt metódus, osztály23

� Példa:

Page 24: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Absztrakt metódus, osztály24

� Példa:

Page 25: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 26: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 27: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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ú

Page 28: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 29: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa29

Page 30: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa30

Page 31: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa31

Page 32: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa32

Page 33: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa33

Page 34: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Interfész - Példa34

Page 35: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 36: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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,…)

Page 37: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Belső osztály - Példa37

Page 38: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

}

Page 39: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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

Page 40: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

Példányosítás osztály kiterjesztéssel40

� Példa:

� Mi a kimenet?

Page 41: JAVA PROGRAMOZÁS - emte.siculorum.ropallaszlo/java/eloadas/3.Eloadas.pdf · JAVA PROGRAMOZÁS 3.EL ŐAD ÁS Dr. PálLászló, SapientiaEMTE, Csíkszereda 2014-2015 Polimorfizmus,

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.