Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Hasonló dokumentumok
Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Származtatási mechanizmus a C++ nyelvben

Java programozási nyelv 5. rész Osztályok III.

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

és az instanceof operátor

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Java VII. Polimorfizmus a Java nyelvben

Java programozási nyelv 4. rész Osztályok II.

Java VII. Polimorfizmus a Java nyelvben

Osztályok. 4. gyakorlat

OOP: Java 8.Gy: Abstract osztályok, interfészek

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozási nyelvek Java

Java III. I I. Osztálydefiníció (Bevezetés)

Öröklés és Polimorfizmus

Java III. I I. Osztálydefiníció (Bevezetés)

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Interfészek. PPT 2007/2008 tavasz.

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Objektumok inicializálása

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Objektumorientált programozás C# nyelven

Osztály és objektum fogalma

Virtuális függvények (late binding)

Java II. I A Java programozási nyelv alapelemei

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

OOP #14 (referencia-elv)

Már megismert fogalmak áttekintése

Java IX. telkezelés a Java-ban

JAVA PROGRAMOZÁS 3.ELŐADÁS

III. OOP (objektumok, osztályok)

Java IX. telkezelés a Java-ban

Programozás I. Első ZH segédlet

Programozási nyelvek Java

C++ programozási nyelv

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Web-technológia PHP-vel

Java Programozás 3. Ea: Java osztályok. OOP alapalapok

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozás módszertan p.1/46

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

OOP és UML Áttekintés

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java Programozás 5. Ea: OOP alapok. Abstract Javaságok

Java II. I A Java programozási nyelv alapelemei

Bevezetés a Python programozási nyelvbe

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

OOP. Alapelvek Elek Tibor

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C++ programozási nyelv

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

Objektumorientált programozás C# nyelven

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

C++ programozási nyelv Struktúrák a C++ nyelvben

Java és web programozás

Java és web programozás

Bánsághi Anna 2014 Bánsághi Anna 1 of 31

C++ programozási nyelv Konstruktorok-destruktorok

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozási alapismeretek 4.

OOP: Java 5.Gy: Osztály, referencia, konstruktor

Programozási nyelvek II.: JAVA, 11. gyakorlat

Osztály öröklődés. Öröklődés és polimorfizmus. Programozás II. előadás. Szénási Sándor.

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Osztályok, objektumok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Alkalmazott modul: Programozás 11. előadás. Objektumorientált programozás: öröklődés

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Java és web programozás

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP: Java 7.Gy: Öröklődés, referenciák

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

3. gyakorlat. Objektumorientált programozás

OOP: Java 8.Gy: Gyakorlás

C++ programozási nyelv

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

OOP: Java 4.Gy: Java osztályok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozás 1. 2.gyakorlat

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Globális operátor overloading

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Interfészek. Programozás II. előadás. Szénási Sándor.

Programozási nyelvek Java

Programozási nyelvek Java

BME MOGI Gépészeti informatika 8.

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Átírás:

Java VI. Öröklődés Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2006. 03. 07. Java VI.: Öröklődés JAVA6 / 1

Egy kis kitérő: az UML UML: Unified Modelling Language Grafikus eszköz objektum orientált modellek készítésére Osztálydiagram: osztályok és kapcsolataik ábrázolására Az UML további diagramm típusokat is definiál Java VI.: Öröklődés JAVA6 / 2

Osztály szimbóluma Adattag neve Típus Osztály diagram Window - size : Area = (100,100) - visibility : Boolean + display() + hide() + attachxwindow() + create() Láthatóság Osztály neve Adattagok Metódusok A láthatóság jelölése: + public # protected -private Java VI.: Öröklődés JAVA6 / 3

Osztályok közös jellemzőkkel Gyakran előfordul, hogy egy program különböző osztályai azonos adattagokkal és metódusokkal rendelkeznek Példa: Neptun felhasználók Hallgató - nev - neptunkod - jelszo - szak Oktató - nev - neptunkod - jelszo - tanszek Adminisztrátor - nev - neptunkod - jelszo - kar + bejelentkezik() + bejelentkezik() + bejelentkezik() + kurzustfelvesz() + vizsgaztat() + oktatotfelvesz() Java VI.: Öröklődés JAVA6 / 4

Osztályok közös jellemzőkkel (folyt.) Az előző példában minden osztályban szerepel három azonos adat nev neptunkod jelszo Minden osztályban szerepel a bejelentkezik() metódus Az osztályok ezen kívül rendelkeznek csak rájuk jellemző adattagokkal és metódusokkal is. Java VI.: Öröklődés JAVA6 / 5

Osztályok közös jellemzőkkel (folyt.) Az adattagok és metódusok ismétlődése problémákat okozhat: pazarlás metódusoknál biztosítani kell az azonos működést a módosításokat több helyen át kell vezetni. A megoldás: öröklődés Java VI.: Öröklődés JAVA6 / 6

Az öröklődés fogalma Egy osztály deklarálható valamely más osztály (ős osztály vagy szülő osztály) leszármazottjaként. A leszármazott osztály rendelkezik a szülő osztály tagjaival a saját tagjaival. Az ős osztály elemeinek az elérése a leszármazott osztályból nem feltétlenül garantált. Az öröklődési hierarchia tetszőleges lehet. Egyetlen korlátozás: egy osztály még közvetett módon sem lehet saját maga őse. Java VI.: Öröklődés JAVA6 / 7

Az öröklődés fogalma (folyt.) Az ős osztály továbbra is használható önmagában is. Ha egy Java osztálynak nincs megadva őse, automatikusan az Object osztály leszármazottja lesz. Minden osztálynak van tehát egy közös őse. Angol kifejezések öröklődés: inheritance ősosztály: base class leszármazott osztály: derived class Java VI.: Öröklődés JAVA6 / 8

Szintaktika [módosító] class név extends ősosztály { // itt jön a saját tagok // deklarációja } Java VI.: Öröklődés JAVA6 / 9

A példa örökléssel A közös adatok és metódusok egy ős osztályba gyűjthetők. Ennek neve legyen NeptunFelhasznalo Az egyes felhasználó osztályok ezek leszármazottjaiként deklarálhatók. A leszármazottak öröklik a közös tagokat. Ezzel kód megosztás jön létre: a leszármazottak használhatják a szülő osztály metódusait. Java VI.: Öröklődés JAVA6 / 10

A példa örökléssel (folyt.) NeptunFelhasznalo - nev - neptunkod - jelszo + bejelentkezik() Öröklődé s jele Hallgató - szak + kurzustfelves z() Oktató Adminisztrátor - tanszek - kar + vizsgaztat() + oktatotfelvesz Java VI.: Öröklődés JAVA6 / 11

Hivatkozás a leszármazottra Mivel egy leszármazott az őse minden tulajdonságával rendelkezik, bármikor használható ős típusú objektumként is. (Fordítva általában nem igaz!) Ezért egy ős típusú hivatkozás használható leszármazott típusú objektumhoz is. Következmény: bármely objektumra hivatkozhatunk Object típusú hivatkozással. Egy változónak van statikus és dinamikus típusa. Java VI.: Öröklődés JAVA6 / 12

Statikus és dinamikus típus Egy változó statikus típusa az, amelyet a deklarációjában megadtunk. Ez a változó teljes élete alatt változatlan. Egy változó dinamikus típusa az általa éppen hivatkozott objektum tényleges típusa. Ez a program futása során bármikor változhat. A változó dinamikus típusa csak a statikus típus vagy annak leszármazottja lehet. A későbbikben ennek fontos szerepe lesz! Java VI.: Öröklődés JAVA6 / 13

Hozzáférés a leszármazottból A leszármazott osztály az ős osztályból örökölt tagokra hozzáférés szempontjából ugyanolyan jogokkal rendelkezik, mint bármely más osztály. Például az örökölt private adattagot nem érheti el közvetlenül. Mivel azonban az örökölt adattagok a részét képezik, az örökölt public metóduson keresztül használhatják. A leszármazottra vonatkozó speciális minősítő a protected. Java VI.: Öröklődés JAVA6 / 14

A protected hozzáférési kategória A félnyilvános kategória kiterjesztése A protected minősítésű taghoz hozzáférhetnek: az azonos csomagban levő osztályok, egy másik csomagban definiált leszármazott osztály, ha minősítés nélkül hivatkozik rá vagy saját, vagy leszármazottja típusának megfelelő minősítéssel hivatkozik rá. Java VI.: Öröklődés JAVA6 / 15

A protected hozzáférés (példa) Legyen az alábbi osztály hierarchia, minden osztály külön csomagban: Ha A-nak van egy p protected tagja, B hozzáférhet B D A C csak a nevével B vagy D típusú minősítéssel. Nem férhet hozzá C típusú minősítéssel Java VI.: Öröklődés JAVA6 / 16

Egyszerű példa: jarmu osztály package jarmu1; public class jarmu { private int kerekek; private double suly; public void kezdoertek(int k, double s) {kerekek = k; suly = s;} public int kerekszam (){ return kerekek;} public double kerekterheles() {return suly / kerekek; }; public double sulya() {return suly;} } Java VI.: Öröklődés JAVA6 / 17

Egyszerű példa: gepkocsi osztály package jarmu1; public class gepkocsi extends jarmu { private int szemelyek; public void kezdoertek(int k, double s, int szem) {szemelyek = szem; kezdoertek(k, s); } // Ez a jarmu // osztalyból } // örökölt Java VI.: Öröklődés JAVA6 / 18

Egyszerű példa: teherauto osztály package jarmu1; public class teherauto extends jarmu { private int szemelyek; private double raksuly; public void teher_kezdoertek (int szem,double rs) {szemelyek = szem; raksuly = rs; } public double kerekterheles() {return (sulya() + raksuly + szemelyek*60.) / kerekszam(); } // suly + hibas lenne, mert suly // nem elérhető!!! } Java VI.: Öröklődés JAVA6 / 19

Egyszerű példa: bicikli objektum package jarmu1; public class proba { public static void main(string[] args) { jarmu bicikli = new jarmu(); bicikli.kezdoertek(2,15.0); System.out.print("Bicikli kerekeinek szama:"); System.out.println(bicikli.kerekszam()); System.out.print("Bicikli kerekterhelese: "); System.out.println(bicikli.kerekterheles()); Java VI.: Öröklődés JAVA6 / 20

A bicikli objektum felépítése Az objektum típusa jarmu kerekek suly class jarmu Java VI.: Öröklődés JAVA6 / 21

Egyszerű példa: trabant objektum gepkocsi trabant = new gepkocsi(); trabant.kezdoertek (4, 600.0, 4); System.out.print("Trabant kerekeinek szama: "); System.out.println(trabant.kerekszam()); Java VI.: Öröklődés JAVA6 / 22

A trabant objektum felépítése Az objektum gepkocsi típusú kerekek suly szemelyek class jarmu Gepkocsi sajat adattagja class gepkocsi Java VI.: Öröklődés JAVA6 / 23

Egyszerű példa: ifa objektum teherauto ifa = new teherauto(); ifa.kezdoertek(6, 1200.0); ifa.teher_kezdoertek(2,2500.0); System.out.print("Max. kerekterheles: "); System.out.println(ifa.kerekterheles()); } // main() vege } // class proba vege Java VI.: Öröklődés JAVA6 / 24

Egyszerű példa: eredmény // Futas eredmenye: // Bicikli kerekeinek szama: 2 // Bicikli kerekterhelese: 7.5 // Trabant kerekeinek szama: 4 // Max. kerekterheles: 636.6666666666666 Java VI.: Öröklődés JAVA6 / 25

Egyszerű példa: megjegyzések A leszármazott osztály definiálhat ugyanolyan nevű példánymetódust, mint amit örökölt. Az eredmény lehet: Metódusnév túlterhelés, ha a paraméter szignatúra különböző. Ilyenkor egy hatáskörben van az örökölt és a saját változat. Metódus felüldefiniálás, amelyre további szabályok vonatkoznak (lásd később). A példában metódusnév túlterhelést alkalmaztunk. Java VI.: Öröklődés JAVA6 / 26

Egyszerű példa: megjegyzések (folyt.) Ajarmu osztály tartalmaz suly adattagot. Az adatag private, tehát nem lehet rá közvetlenül hivatkozni az osztályon kívül. (A leszármazottban sem!) A sulya() metódus public, ezt használhatja a teherauto osztály. Ezzel közvetve az örökölt suly adattag saját példányát éri el. Java VI.: Öröklődés JAVA6 / 27

Egyszerű példa: megjegyzések (folyt.) Az osztályok csak implicit konstruktort tartalmaznak. (Nem definiáltunk konstruktort.) A main metódusban használt mindhárom változó statikus és dinamikus típusa megegyezik. Java VI.: Öröklődés JAVA6 / 28

Egyszerű példa: megjegyzések (folyt.) A mintapélda számos tervezési hibával terhelt! Konstruktorok helyett kezdőérték függvény - lehetővé teszi rosszul inicializált objektumok létrehozását. Agepkocsi osztály örökli a kerekterheles függvényt, amely azonban hibás eredményt ad, mert nem veszi figyelembe a személyek súlyát. A teherautó osztály inicializálása csak két metódus hívással teljes, ami lehetővé teszi részlegesen inicializált objektumok létrehozását. Java VI.: Öröklődés JAVA6 / 29

Konstruktorok öröklődés esetén A konstruktor nem öröklődik (nem metódus). Mind az ős osztály, mind a leszármazott osztály rendelkezhet konstruktorral (akár többel is). Egy leszármazott objektum példányosításánál tisztázni kell: a konstruktorok végrehajtási sorrendjét, azt, hogy hogyan választhatjuk ki az ősosztály konstruktorai közül a végrehajtandót. Java VI.: Öröklődés JAVA6 / 30

Konstruktorok végrehajtási sorrendje Először mindig az ős osztály, majd a leszármazott osztály konstruktora hajtódik végre. A pontos sorrend: az ős osztály adattagjainak inicializálása (az inicializátor kifejezések kiértékelésével), az ős osztály konstruktorának végrehajtódása, a gyermek osztály adattagjainak inicializálása, a gyermek osztály konstruktorának végrehajtódása. Java VI.: Öröklődés JAVA6 / 31

Ős osztály konstruktorának kijelölése A gyermek osztály első sorában szerepelhet egy super(paraméterek) konstruktorhívás. A paraméterlistának az ős osztály valamelyik konstruktorára illeszkednie kell. Ha ilyen hívás nem szerepel a gyermek osztály konstruktorában, akkor egy implicit super() hívással kezdődik a konstruktor végrehajtása. Java VI.: Öröklődés JAVA6 / 32

Ős osztály konstruktorának kijelölése (2.) Következmények: Ha a gyermek osztálynak van olyan konstruktora, amelyben nincs explicit ős konstruktor hívás, a szülő osztálynak kell legyen paraméter nélküli konstruktora. Ha a gyermek osztálynak csak implicit konstruktora van, az is az ős osztály paraméter nélküli konstruktorát hívja meg. A fenti szabályok megsértését a fordító hibajelzéssel honorálja! Java VI.: Öröklődés JAVA6 / 33

Egyszerű példa konstruktorral package jarmu1; public class jarmu { private int kerekek; private double suly; public jarmu(int k, double s) {kerekek = k; suly = s;} public int kerekszam (){return kerekek;} public double kerekterheles() {return suly / kerekek; }; public double sulya() {return suly;} } Java VI.: Öröklődés JAVA6 / 34

Egyszerű példa konstruktorral (folyt.) package jarmu1; public class gepkocsi extends jarmu { private int szemelyek; public gepkocsi(int k, double s, int szem){ super(k, s); szemelyek = szem; } } Java VI.: Öröklődés JAVA6 / 35

Egyszerű példa konstruktorral (folyt.) package jarmu1; public class teherauto extends jarmu { private int szemelyek; private double raksuly; public teherauto (int k, double s, int szem,double rs) { super(k,s); szemelyek = szem; raksuly = rs; } public double kerekterheles() {return (sulya() + raksuly + szemelyek*60.) / kerekszam(); } } Java VI.: Öröklődés JAVA6 / 36

Egyszerű példa konstruktorral (folyt.) package jarmu1; public class proba { public static void main(string[] args) { jarmu bicikli = new jarmu(2, 15.0); System.out.print("Bicikli kerekeinek szama: "); System.out.println(bicikli.kerekszam()); System.out.print("Bicikli kerekterhelese: "); System.out.println(bicikli.kerekterheles()); Java VI.: Öröklődés JAVA6 / 37

Egyszerű példa konstruktorral (folyt.) gepkocsi trabant = new gepkocsi(4, 600.0, 4); System.out.print("Trabant kerekeinek szama: "); System.out.println(trabant.kerekszam()); teherauto ifa = new teherauto(6, 1200.0, 2,2500.0); System.out.print("Max. kerekterheles: "); System.out.println(ifa.kerekterheles()); } Java VI.: Öröklődés JAVA6 / 38

Az Object osztály Ha egy osztálydefinícióban nincs megadva ős osztály, akkor automatikusan az Object osztály lesz az ős. Minden osztály automatikusan örököl bizonyos metódusokat. Az örökölt metódusok egy része felüldefiniálható. Java VI.: Öröklődés JAVA6 / 39

final osztályok Afinal módosítóval megjelölt osztályoknak nem lehet leszármazottja. Az ilyen osztály működése nem változtatható meg az öröklődési mechanizmussal. A módosítót a hozzáférési kategória módosítója után írjuk. Például: public final class System { } Java VI.: Öröklődés JAVA6 / 40