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



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

Származtatási mechanizmus a C++ nyelvben

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

Osztály és objektum fogalma

JAVA PROGRAMOZÁS 3.ELŐADÁS

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

C++ programozási nyelv

Java VII. Polimorfizmus a Java nyelvben

Java VII. Polimorfizmus a Java nyelvben

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

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

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

Osztályok. 4. gyakorlat

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

Programozás 1. 2.gyakorlat

és az instanceof operátor

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

Objektumorientált programozás C# nyelven

PHP5 Új generáció (2. rész)

Előzmények

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

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

Programozási nyelvek Java

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

C# osztályok. Krizsán Zoltán

Java és web programozás

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

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

strings.xml res/values/strings.xml fájlban hozzuk létre a hiányzó string adatforrásainkat A jelenlegi helyett ez álljon: <resources> <string

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

A SZOFTVERTECHNOLÓGIA ALAPJAI

Objektumorientált programozás C# nyelven

Magas szintű programozási nyelvek 2 Előadás jegyzet

Programozás II gyakorlat. 4. Öröklődés

Programozási nyelvek Java

Programozás II. labor

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

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?

Öröklés és Polimorfizmus

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

Objektumok inicializálása

3. Gyakorlat Ismerkedés a Java nyelvvel

Java és web programozás

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Tartalomjegyzék. Bevezetés...2

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Gyakorlás

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

Bánsághi Anna

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozás C++ -ban 2007/4

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

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

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

Bánsághi Anna 1 of 67

Java és web programozás

Java IX. telkezelés a Java-ban

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

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

Szervlet-JSP együttműködés

Java IX. telkezelés a Java-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.

Objektumorientált programozás C# nyelven III.

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

Programozás I. Első ZH segédlet

Események C#-ban Krizsán Zoltán iit

Bevezetés a C++ programozási nyelvbe

15. Programok fordítása és végrehajtása


7. K: JAVA alapok Konzultáció

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

Programozási Paradigmák és Technikák

Java programozási nyelv 6. rész Java a gyakorlatban

117. AA Megoldó Alfréd AA 117.

Objektumorientált programozás C# nyelven

INFORMATIKAI ALAPISMERETEK

Adatbázis rendszerek I

Bánsághi Anna

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

OOP #14 (referencia-elv)

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

Entity Framework alapú adatbáziselérés

Algoritmusok és adatszerkezetek II.

Kalapácsvetés 2016 szöveges

DEBRECENI EGYETEM INFORMATIKAI KAR. Az UML gyakorlati alkalmazásának bemutatása az AutoWorld rendszer tervezésén keresztül

III. OOP (objektumok, osztályok)

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

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

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

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

Borkereskedő. Dokumentáció a Programozási módszertan elmélete című tárgy beadandó programjához. Magyar Attila mattila@inf.elte.hu

Objektumorientált programozás C# nyelven

BME MOGI Gépészeti informatika 8.

4. Öröklődés. Programozás II

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

Á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 Osztály diagram Típus 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, A B hozzáférhet csak a nevével B C B vagy D típusú minősítéssel. Nem férhet hozzá C típusú minősítéssel D Java VI.: Öröklődés JAVA6 / 16 Egyszerű példa: jarmu osztály 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 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 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 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.) A jarmu 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. A gepkocsi 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 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.) 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.) 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.) 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 A final 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