OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN vizsgatételek 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Az objektumorientált programozás szemlélete, az objektum fogalma Az objektumorientált programozás alapelvei A Java nyelv története, alapvető tulajdonságai Mi kell egy Java program fejlesztéséhez, illetve kész program futtatásához? A Java program (alkalmazás), a Java applet és a JavaScript fogalma A Java alapelemei: karakterkészlet, azonosító, megjegyzés, egyszerű típusok A Java alapelemei: lokális változó, tömb, vezérlő utasítások Osztálydefiníció, adattag, metódus fogalma. Példányosítás Hivatkozás típusú változó (referencia) fogalma, az egyszerű típusú és az osztály típusú változók közötti különbség. Hivatkozás objektum elemeire. Hozzáférési kategóriák és jelentésük. Használatukra vonatkozó konvenciók. A this pszeudó változó és szerepe Metódusnév túlterhelés (overloading) Konstruktor fogalma, definíciójának és használatának szabályai. Az implicit konstruktor. Objektumok megszűnése. A szemétgyűjtő mechanizmus, A finalize metódus. Java csomagok és fordítási egységek. Minősített (teljes) hivatkozás. Az import direktíva. Osztályváltozó és osztálymetódus A final minősítésű adattag és metódusok Az öröklődés fogalma, szintaktikai szabályai. Statikus és dinamikus típus fogalma. Konstruktorok az öröklődés során Felüldefiniált metódusok: a definiálásra és a hívásra vonatkozó szabályok. Használatának célja. Absztrakt metódus és absztrakt osztály A Java interface fogalma, a definíció szintaktikája. Interface implementálása. A kivétel fogalma és a kivételkezelés utasításai a Java nyelvben. Kivétel keletkezése. Kivétel elkapása és lekezelése. A finally blokk szerepe Előre definiált és saját kivétel osztályok Az ellenőrzött és nem ellenőrzött kivétel fogalma. Kivételek specifikálása Beágyazott osztályok Az osztály interface fogalma és a jól tervezett osztály interface jellemzői Az általánosítás/pontosítás (is-a) és a tartalmazás (has-a) kapcsolat implementálási lehetőségei a Java nyelvi eszközökkel.
1. TÉTEL Az objektumorientált programozás szemlélete, az objektum fogalma OOP szemlélete: a programkészítés egy absztrakciós folyamat, amelyben a valós világban létező jelenséget valamilyen programozási eszköz absztrakciós szintjén képezünk le. A munka nehézsége függ: A leképezendő jelenség/folyamat bonyolultságától A valóság és a programozási eszköz absztrakciós szintjének különbözőségétől A programozás egy másik megközelítése a program, amely a valós világ egy szeletének működő modellje. Ebben a szemléletben a valós világ egy absztrakt modelljét kell leképezni egy programozási eszközre. Ezt a folyamatot megkönnyíti, ha az analízis modell elemei könnyen leképezhetők nyelvi elemekre. Az analízis modell elkészítése során a valóságot objektumok halmazaként tekintjük. Ezen objektumok egymással kapcsolatban vannak és együttműködnek. Az objektum: egyediséggel rendelkező diszkrét entitás. Jellemzők: Attribútum: objektum állapot, ennek időbeli változása az objektum viselkedése Műveletek: ezek modellezik az objektum viselkedését. Objektumtól objektumig 1. szint: Tanulmányozzuk a valós objektumokat és megkeressük azoknak a probléma megoldása szempontjából fontos adatait és viselkedésmintáit. Ezután megkeressük azon objektumcsoportokat, amelyek azonos adatokkal és viselkedésmintákkal rendelkeznek, és elnevezzük ezt a csoportot. 2. szint: Az előzőleg definiált fogalom leképezése egy programozási eszközre. Ez valójában egy minta a program működéséhez szükséges objektumok létrehozására. 3. szint: Akkor és annyi objektumot kell létrehozni a program futása során, amelyek együttműködve képesek a valóságot modellezni.
2. TÉTEL Az objektumorientált programozás alapelvei Az objektumorientált programozás alapelvei: 1. Osztály 2. Objektum 3. Egységbezárás 4. Információ rejtés 5. Üzenet 6. Öröklődés 7. Polimorfizmus Osztály: amelynek részei az adatok (az attribútumok modellezésére) és a módszerek (a műveletek modellezésére). Objektumok közös tulajdonságait definiálja. Programozás technika szempontból egy típus. Objektum: Egy osztály egy működőképes példánya. Egy adott osztályban definiált tulajdonságokkal tetszőleges számú objektum példányosítható. Minden objektum természeténél foga különbözik az összes többitől. Egy adott osztályból példányosított valamennyi objektumnak ugyanolyan lehetséges viselkedés módjai vannak, de saját állapotuk van. Egységbezárás: Az osztály az adatait és a módszereket egy egységgé teszi. Az adatok lokálisak, a módszerek hozzáférhetnek az adatokhoz. Információ rejtés: Egy objektum adatait a külvilág számára hozzáférhetetlenek. Egy objektum a külvilággal csak az interface-én keresztül tarthatja a kapcsolatot. (Interface: a külvilág számára elérhető módszerek együttese.) A módszerek implementációja rejtett. Üzenet: Az objektummal való kommunikáció módja. A módszerek aktivizálását jelenti. Öröklődés: Hierarchikus kapcsolat. A leszármazott osztály örökli az ősosztály adatait és módszereit. Az öröklött módszereket felüldefiniálhatja a maga számára. Új adatokat és módszereket definiálhat. Egy leszármazott osztály csak bővítheti, pontosíthatja az őst, de nem utasíthat el örökölt adatokat vagy módszereket. Polimorfizmus(többalakúság): Bizonyos elemek viselkedése attól a környezettől függ, amelyben alkalmazzuk. A gyakorlatban ez azt jelenti, hogy egy nyelvi elem attúl függően, hogy hol alkalmazzuk, más-más működést eredményezhet.
3. TÉTEL A Java nyelv története, alapvető tulajdonságai Történet: 1990-es évek eleje:A SUN belső projectje James Gosling vezetésével -> platform-független technológia szükségessége. Egyik akkora nyelv sem volt megfelelő, ezért terveztek egy újat. A projekt aztán lassan elhalt, 1990-es évek közepe: az Internet rohamos terjedése újra felvetette a platform-független technológia szükségességét. Újraéledt a project, de általánosabb célkitűzéssel. Eredménye a Java nyelv első verziója lett. 1995: Java 1 platform 1999: Java 2 platform Jelenleg J2SE 1.6 (Java 6 platform) A Java egyszerre programozási nyelv és platform. Alapvető tulajdonságok: Magas szintű programozási nyelv Platform-független Általános célú Teljesen objektumorientált Egyszerű Interpretált (de speciális módon) Elosztott Robosztus (nem okoz kárt figyelmetlenségi hiba esetén) Biztonságos Hordozható Többszálú A C++ ismeretében született, annak formalizmusát tekintette mintának A C++ hátrányait igyekezett kiküszöbölni
4. TÉTEL Mi kell egy Java program fejlesztéséhez, illetve kész program futtatásához? Valamennyi Java szabvány, és a SUN által implementált alapvető fejlesztőeszközök nyílt forrásúak és ingyenesek. Ezen kívül számtalan nyílt forrású, ingyenes; zárt forrású, de ingyenes; kereskedelmi termék kapható A minimális fejlesztőkörnyezet: J2SDk vagy újabban JDK(Java Development Kit) Tetszőleges szövegszerkesztő Kényelmesebb fejlesztő környezetek: NetBeans Eclipse Mindkét fejlesztőeszköz maga is Java-ban íródott, tehát sokféle platformon futtatható. JDK legfontosabb elemei: A Java API-t implementáló könyvtárak Ségedprogramok: Javac: java fordító Java: a JVM (futtatáshoz) Javadoc: automatikus dokumentáció generáláshoz a forrás szöveg és a benne található speciális kommentek alapján Jdb: debugger Minimális futtató környezet: JRE (Java Runtime Environment) Ha egy gépen csak JRE van, bármely más gépen fejlesztett Java program futtatható, ha ugyanolyan vagy korábbi verziójú JDK segítségével készült.
5. TÉTEL A Java program (alkalmazás), a Java applet és a JavaScript fogalma Java program: Java-fordítóval készült önálló alkalmazás. Az adott architektúrán futó JVm hajtja végre. Mindazon jogokkal rendelkezik, mint bármely más alkalmazás. A java program osztályok halmaza. Végrehajtható kód csak osztály metódusában fordulhat elő. Egy alkalmazás belépési pontja egy olyan osztály, amelyben van egy public static minősítésű main nevű metódus. Applet: HTML oldalból elérhető, végrehajtható bít kód, ami Java forrásból készült. A HTML kódba csak egy hivatkozás kerül, az applet maga bárhonnan letöltődhet. A HTML oldal ételmezője hajtja végre (a böngésző valósítja meg a JVM-et). Korlátozott jogokkal rendelkezik biztonsági okok miatt. JavaScript: Eredetileg LiveScript néven a Netscape-nél kifejlesztett script nyelv (tehát nem bináris kód). Célja weboldalak dinamikussá tétele. A (szöveges) kód része a HTML oldalnak. A Java-hoz hasonló C++ szintakszisához hasoló formalizmus. Nem objektumorientált, csak objektum alapú. Bár ezt is a böngésző értelmezi, semmi köze a Java-platformhoz.
6. TÉTEL A Java alapelemei: karakterkészlet, azonosító, megjegyzés, egyszerű típusok A Java az Unicode karakterkészletet használja, tehát akár ékezetes azonosítókat is használhatunk. Azonosító: betűvel kezdődő és betűvel vagy számmal folytatódó karaktersorozat Az _ és a $ is a betűk közé sorolandó A betűk bármely karakterkészletből származhatnak Az azonosító hossza tetszőleges A Java a kis- és nagybetű érzékeny Kulcsszavak, valamint a const, goto, null, true, false savak nem lehetnek azonosítók Megjegyzések: 1. Mint a C-ben: /* valami*/ 2. Egysoros: // sor végéig komment 3. Dokumentációs: /** tetszőleges szöveg*/ Egyszerű típusok: Hasonlóak, mint a C-ben, de pontosan definiált helyfoglalással és ábrázolási móddal. Nincs unsigned minősítő. Konstans változó final minősítővel deklarálható. típusnév Jelentés boolean Logikai típus (true vagy false értékkel) char 16 bites Unicode karakter byte 8 bites előjeles egész short 16 bites előjeles egész int 32 bites előjeles egész long 64 bites előjeles egész float 32 bites lebegőpontos szám (IEEE 754 szerint) double 64 bites lebegőpontos szám (IEEE 754 szerint) Konstansok (literálok): Logikai értékek: true vagy false A C-vel teljesen egyező módon használandók: Egész konstans Lebegőpontos konstans Karakter konstans Szöveg konstans A szöveg konstanst a fordító automatikusan String típusként kezeli.
7. TÉTEL A Java alapelemei: lokális változó, tömb, vezérlő utasítások Lokális változók: definíciója csak metóduson belül. Nincs globális változó! Formája mint a C-ben, beleértve a kezdő értékadást is. Egyszerű típusú lokális változó definíciója egyben helyfoglalást is jelent. Változó definíciója egy metóduson belül bárhol lehet. Természetesen a változó csak a definíció után használható. Egydimenziós tömb: Definíciója 1. Tömb típus deklarációja Típusnév azonosító[]; vagy típusnév[] azonosító; 2. Helyfoglalás a tömb elemeinek: Azonosító = new típusnév[elemek száma] A két lépés egy utasításban összevonva: Típusnév azonosító[] = new típusnév[elemek száma] Az elemekre való hivatkozás már ugyanaz, mint a C-ben. A Java-ban többdimenziós tömbök is definiálhatók, amelyek nem feltétlenül négyzetesek. Bár nincs előre definiált osztálya, de osztályhoz tartozóként kezeli a Java. Minden tömbhöz tartozik egy length konstans, amely az elemek számát adja meg. Használata: azonosító.length Operátorok A C majdnem minden operátorát ismeri a Java (kiv mutatókhoz kapcsolódó) Az operátorok jelentése az egyszerű típusokra ugyanaz. Különbségek: Négy új operátor (>>>, >>>=, instanceof, new) Nincs vessző operátor A kifejezések kiértékelési sorrendje meghatározott. Kifejezések kiértékelődési sorrendje: Zárójelezés Operandusok prioritása Azonos prioritás esetén balról-jobbra szabály, kivétel az értékadás, amely jobbrólbalra értékelődik ki. A kifejezésekben a metódushívások sorrendje is a kiértékelés sorrendét követi. Utasítás, blokk Utasítás lehet: kifejezés utasítás, deklarációs utasítás. Az utasításokat pontosvessző zárja. Kifejezés utasítás csak a következő lehet: Értékadás ++ és – operátorokkal képzett kifejezések Metódushívás Példányosítás A deklarációs és kifejezés utasítások tetszőleges sorrendben követhetik egymást. Az utasítások sorozata {} jelek közé zárva a blokk. Utasítás helyére mindig írható blokk. Vezérlő utasítások: Lényegében megegyeznek a C utasításaival. Különbségek: Az if, while, do utasításokban a feltétel csak logikai kifejezés lehet. A for utasításban a második kifejezés csak logikai kifejezés lehet A switch utasításban a szelektor csak egész kifejezés lehet Nincs goto utasítás
8. TÉTEL Osztálydefiníció, adattag, metódus fogalma. Példányosítás Osztálydefiníció: az Java program osztályok halmaza. Egy osztálydefiníció egyben egy teljes fordítási egység (de általában nem teljes program). Az osztály és a definícióját tartalmazó file neve meg kell egyezzen. Osztályok csomagokba rendezhetők, ezzel lehet modulokat képezni. Egy csomag tetszőleges számú osztályt tartalmazhat, de egy osztály csak egy csomagban lehet. Az osztálydefiníció fejlécből és a {} zárójelpárral határolt törzsből áll. A fejléc formája: [módosítók] class osztályneve [egyebek] Az osztály neve egy azonosító. A törzsben adattagok és metódusok és további elemek definíciói állhatnak. Adattagok: Definíciója: [módosítók] típusnév azonosítólista A típusnév valamelyik egyszerű típus, tömb típus, vagy osztálynév lehet. A névlista elemeit vesszővel választjuk el. Formájuk: azonosító[=inicializáló kifejezés]. Az inicializáló kifejezésben csak előtte már deklarált adattagok használhatók. Az inicializáló kifejezés minden példányosítás esetén kiértékelődik. Nem inicializált adattag az alábbi default értékkel inicializálódik: Boolean: false Char: ’\0000’ Minden egész típus: 0 Minden lebegőpontos típus: 0.0 Osztály típus: null Metódusok: Formája: [módosítók] típus név(paraméterlista) […] A metódus osztályon belül definiált függvény. Osztályon kívül definiált függvény nincs. Osztály hatáskör: Az egységbe zárás alapelvének implementálása: minden osztály saját hatáskörrel rendelkezik. Egy osztály minden eleme tehát lokális az osztályra nézve. Következmények: Különböző osztályokban használhatjuk ugyanazt az azonosítót eltérő értelemben Az osztályon belül az elemek egymásra nevükkel hivatkozhatnak A metódusok használhatják az adattagokat és a többi metódust. Példányosítás: az osztály objektumok létrehozásához használható mintaként tekinthető. A Java programban az osztálynév típusként használható. Az objektum létrehozásának folyamata a példányosítás. Egy osztályból tetszőleges számú objektum példányosítható. A legegyszerűbb mód egy osztály típusú változó definiálása: Formája: [módosítók] osztálynév azonosító = new osztálynév([paraméterek]) A () zárójelpár a paraméterek hiányában is kötelező A folyamat: Lefoglalódik az objektumnak szükséges hely Inicializálódik az objektum A lefoglalt memóriaterületre való hivatkozás kerül a változóba
9. TÉTEL Hivatkozás típusú változó (referencia) fogalma, az egyszerű típusú és az osztály típusú változók közötti különbség. Hivatkozás objektum elemeire. Hivatkozás: a Java-ban kulcsfontosságú fogalom. Osztály típusú változó mindig hivatkozás, nem objektum! Hivatkozás típusú változó: Értéke cím, amely egy objektumot címez meg, vagy null Használata indirekció nélkül magát az objektumot jelenti a kifejezésekben Az értéke a programozó számára hozzáférhetetlen Következmény: objektum csak futás közben, dinamikusan hozható létre. Hivatkozással végezhető műveletek: Definíció Értékének beállítása objektum létrehozásával Értékadás hivatkozások között Értékének beállítása a null konstansra Két hivatkozás összehasonlítása ( a == művelettel) Használható objektum elemére való hivatkozásban Egyszerű típusú változó: a deklarációja egyben definíció is, hely foglalódik a memóriában, és a továbbiakban a változó az ott tárolt értéket képviseli. Osztály típusú változó: deklarációja hatására csak egy cím számára foglalódik memória. Ezt a címet egy példányosított objektum címére kell beállítani. Ezután a változó az általa hivatkozott objektumot fogja képviselni Objektum elemeire való hivatkozás: Osztályon belül névvel. Minden más esetben az objektum nevével minősítve a . (pont) operátorral. Metódusra való hivatkozásnál aktuális paramétereket is kell adni, és a hivatkozás a metódus aktivizálását jelenti.
10. TÉTEL Hozzáférési kategóriák és jelentésük. Használatukra vonatkozó konvenciók. A [módosítók] szintaktikai elem egyik feladata a hozzáférési kategóriák megadása módosító Nincs public private protected
Hozzáférési kategória Félnyilvános: csak az azonos csomagban levő osztályok érthetik el Nyilvános, bármely csomagban lévő bármely osztályból elérhető Privát: más osztályból nem, de az adott osztály összes példánya számára elérhető A félnyilvános kategória kiterjesztése. 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á
Osztály csak nyilvános vagy félnyilvános lehet. Adattag és metódus bármelyik kategóriába tartozhat. Használata: az információrejtés alapelvének betartása érdekében minden elem kapja a lehető legszűkebb kategóriát. Szokásos konvenciók: Egy osztály csak akkor legyen public, ha általános használatra szántuk Az adattagok private (esetleg protected) minősítést kapjanak. Ha szükséges, metódusokon keresztül legyenek elérhetők. A public adattag hiba!!! A metódusok közül csak a „külvilág” számára szükségesek (az osztály interface-ét jelentők) legyenek public minősítésűek.
11. TÉTEL A this pszeudó változó és szerepe Minden objektumhoz: Saját adattag-készlet tartozik Az osztály összes objektumára közös a tagfüggvény-készlet. Hogyan tud a tagfüggvény az aktuális objektum adattagjaira hivatkozni? Megoldás: minden objektumhoz létezik az előredefiniált this pszeudó változó, amely az adott objektumra hivatkozik. Ezen keresztül éri el az adattagot a tagfüggvény. A this pszeudó változó explicite is használható.
12. TÉTEL Metódusnév túlterhelés (overloading) Egy osztályhoz több metódus is tartozhat azonos névvel, de különböző paraméterszignatúrával (a formális paraméterek száma és típus-sorrendje). A visszatérési érték típusa ebből a szempontból közömbös. A polimorfizmus egyik implementációs formája. A függvény hívásakor a fordítóprogram az aktuális paraméterek szignatúráját sorban egyezteti az összes azonos nevű definíció formális paramétereinek szignatúráival. Ennek az egyeztetésnek az alábbi eredményei lehetnek: Pontosan egy illeszkedőt talál: ilyenkor az ennek megfelelő függvény hívását fordítja le. Egetlen illeszkedőt sem talál: hibajelzést ad Több egyformán illeszkedőt talál: hibajelzést kap Korai kötés ??? Az egy osztályhoz több azonos nevű metódus is tartozhat pontosabb jelentése az alábbi: Egy osztályban definiálhatók azonos nevű metódusok Ezen felül ugyanilyen nevű metódusokat örökölhet is az osztály A saját és örökölt metódusok együttesére érvényes a metódus overloading szabályrendszere.
13. TÉTEL Konstruktor fogalma, definíciójának és használatának szabályai. Az implicit konstruktor. Konstruktor: egy objektum adattagjai a létrehozáskor a default értékkel inicializálódnak. Ez nem mindig felel meg a programozónak. Ezen lehet változtatni például egy metódussal, amellyel a létrejött objektum adattagjai a szükséges értékekre állíthatók be. Ez azonban nem mindig a legjobb. Problémák: Ha egy ilyen metódust elfelejtünk meghívni, az objektum nem a megfelelő kezdőállapotban kezdi az életciklusát. Egy objektum működésének kezdetén az adattagjai értékének inicializálásán kívól más tevékenységekre is szükség lehet. Ezeket a problémákat lehet megoldani egy automatikusan meghívódó kódrészlettel, a konstruktorral. A konstruktor majdnem olyan mint egy metódus, az alábbi korlátozásokkal: Neve egyezik az osztály nevével Nem lehet visszatérési értéke (még void sem) Legfeljebb „üres” return utasítást tartalmazhat Már létező objektumra nem hívható meg közvetlenül Nem öröklődik Módosító csak hozzáférést szabályozó kulcsszó lehet. A konstruktor legtöbbször public minősítésű. Példányosítás konstruktorral: Minden példányosítás esetén az alábbi folyamat zajlik le: Helyfoglalás az adattagoknak Az adattagok inicializálása (default értékkel, vagy az inicializáló kifejezésnek megfelelően) A konstruktor meghívódása a példányosításban megadott aktuális paraméterlistával A konstruktornak szóló paraméterek a példányosítás során az osztálynév után, () zárójelpárban, vesszővel elválasztva adhatók meg. A konstruktor felhasználhatja az osztályban deklarált valamennyi adattagot. Az adattagok kezdőértéke a konstruktor számára az előzetes inicializálásnak megfelelő lesz. A konstruktor az osztály bármely metódusát használhatja. A metódusnév túlterhelés szabályainak betartásával egy osztályban tetszőleges számú konstruktor definiálható. A példányosítás utáni első metódushívás feltételezheti, hogy valamelyik konstruktor már lefutott. Egy metódus nem tudja megállapítani, hogy melyik konstruktor inicializálta az objektumot. Egy konstruktor első utasítása lehet ugyanazon osztály vagy az ősosztály egy másik konstruktorának meghívása Másik konstruktor meghívása: This(aktuális paraméterlista) Ősosztály konstruktorának megívása: Super(aktuális paraméterlista) Implicit konstruktor: egy ősosztálynak mindig van legalább egy konstruktora. Ha a programozó definiál legalább egy konstruktort, akkor azok lesznek a konstruktorok. Ha a programozó egyet sem ír, akkor az osztályhoz a fordító hozzárendeli az impilict konstruktort. Ez public, paraméter nélküli és a törzse üres. Ha egy osztálynak nincs explicite definiált konstruktora, csak paraméter nélküli példányosítás lehetséges. Ha egy osztálynak van legalább egy explicit konstruktora, akkor paraméter nélküli példányosítás csak akkor lehetséges, ha a programozó definiált paraméter nélküli konstruktort. Az implicit konstruktor ilyenkor nem rendelődik hozzá az osztályhoz.
14. TÉTEL Objektumok megszűnése. A szemétgyűjtő mechanizmus, A finalize metódus. Objektum megszűnése: A C programozási nyelvben a futás közben dinamikusan lefoglalt memória területek helyes felszabadításáért a programozó a felelős. A Java-ban csak dinamikusan lehet objektumot létrehozni, de nem kell megszüntetni (nem is lehet). Az objektumok automatikus megszüntetése a szemétgyűjtő mechanizmus feladata. Szemétgyűjtő mechanizmus: számon tartja, hogy egy objektumra hány referencia hivatkozik. Ha már nincs érvényes referencia, az objektum haszontalanná válik. Egy külön szálban futó szemétgyűjtő felszabadítja a felesleges objektumhoz tartozó memória területet. Hogy ez pontosan mikor történik meg, nem tudjuk. Egy objektumra hivatkozó referencia megszűnik például, ha megszűnik maga a változó, megváltozik a változó értéke, a változónak a null értéket adjuk. Finalize metódus: minden osztályhoz definiálható egy Protected void finalize() throws Throwable metódus. A szemétgyűjtő hívja meg, még az objektum tárterületének megszüntetése előtt. Feladata minden olyan mellékhatás megszüntetése, amelyet az objektum az élete során okozott.
15. TÉTEL Java csomagok és fordítási egységek. Minősített (teljes) hivatkozás. Az import direktíva. A Java-ban a programok tagolásának eszköze a csomag (package). (összetartozó típusok egysége). Minden csomagnak saját névtere van. Elkerülhető az egyező típusnevekből adódó problémák. A csomagok a hozzáférési kategóriák használatának eszközei. A Java-ban a csomagokban lehetnek adatcsomagok, a csomagszerkezet fastruktúrát alkot. A csomag tartalmát a fordítási egységek adják meg. A fordítási egységekben találhatók a csomaghoz tartozó kódok, azaz típusok (osztályok és interface-ek) definíciói. A csomagokra hierarchikus szerkezetű azonosítóval hivatkozhatunk. Az A csomag B alcsomagjában lévő C alcsomag: A.B:C Az egyes csomagokban található típusokra teljesen analóg módon hivatkozhatunk. Például a fenti csomagban definiált T típus: A.B.C.T Csomagok és fordítási egységek összerendelése: leképzés az operációs rendszer filerendszerére vagy tárolás adatbázisban. A fordítási egységek file-ok .java kiterjesztéssel, a csomag-alcsomag nevek pedig katalógus nevek, amelyből útvonal generálódik. A fenti példában említett A.B.C csomag T típusának megkeresése a következőképpen történik: Egy előre kijelölt katalógus A alkatalógusának B alkatalógusában a Java fordító a T.java file-t keresi. A lefordított byte-kódot ugyanoda T.class néven helyezi el. A csomagszerkezetnek több kiinduló katalógusa is lehet. A fordító a CLASSPATH környezeti változó, vagy a –classpath kapcsoló alapján keresi meg a csomagok helyét a file rendszerben. A Java API előre definiált típusai is csomagokban találhatók. Egy fordítási egység az alábbi részekből áll Csomagdeklaráció Importdeklaráció Típusdeklarációk (osztály vagy interface deklarációk) Csomagdeklaráció: csomagnév megadása: package csomagnév A csomagnév teljes hivatkozás kell legyen. A fordítási egység elején szerepelhet és csak egy ilyen deklaráció lehet. Minden fordítási egység csak egy csomaghoz tartozhat. Ha elmarad, a fordítási egység egy névtelen csomaghoz fog tartozni. Egy csomag szabadon bővíthető. Import deklarációk: egy másik csomagban deklarált publikus típust a teljes azonosítójával kell megnevezni. Ezt rövidíthetjük az adott típus importálásával: import A.B.C.T Ezután a fordítási egységben elég a T típusnév megadása. A fordító mindig a teljes azonosítót használja a munkája során. Egy csomag valamennyi típusát is importálhatjuk az alábbi formában: import A.B.C.*. Minden fordítási egységbe automatikusan importálódik a java.lang csomag összes típusa. Szerepe nem azonos a C #include direktívájával, mert nem másolódik be hatására semmi, csak a hivatkozást egyszerűsíti. Csomagok és hozzáférési kategóriák: ebből a szempontból minden csomag egyenrangú. Az A csomag B alcsomagja az A csomag szempontjából ugyanolyan idegen, mint az összes többi.
16. TÉTEL Osztályváltozó és osztálymetódus Példányváltozó: az eddig megismert adattagokból minden objektumnak saját készlete van. Ezeket ezért szokás példányváltozónak is nevezni. Az adattagok deklarációja elé kitehető a static minősítő. Osztályváltozó: a statikus adattag az osztály valamennyi objektuma számára egy példányban létezik, azok osztottan használják. Miután az osztály egészére vonatkoznak, szokás osztályváltozóknak is hívni. Nem a this pszeudó változó segítségével történik az elérése. Az objektumok előtt kell létrejönnie. Inicializálása az osztály inicializálás során történik. (A JVM akkor inicializál egy osztályt, amikor először történik rá aktív hivatkozás.) Az osztályon belül a nevével hivatkozhatunk. Hivatkozhatunk rá bármely objektum példányával. Az osztály bármely metódusa használhatja. Mivel egyetlen példány létrehozása nélkül is létezik, a hivatkozásban osztálynevet is használhatunk. Osztálymetódus: bár az eddigi metódusok csak egy példányban léteznek minden példány számára, de működésükhöz egy aktuális példány szükséges. Ezeket hívhattuk volna példánymetódusoknak is. Metódus is kaphat static minősítést: osztálymetódus. Az ilyen metódus a példányváltozókhoz és a this pszeudó változóhoz nem férhet hozzá. Következmény: csak osztályváltozókat és más osztálymetódusokat használhat. Akkor is végrehajtható, ha az osztálynak nem léteznek példányai Hivatkozás: Osztályon belül nevével Minősített hivatkozásnál bármely példány vagy az osztály nevével Egy program indulásakor nincs, ami példányt hozzon létre, ezért a main metódusnak static minősítésűnek kell lennie.
17. TÉTEL A final minősítésű adattag és metódusok A final minősítő többféle célra is használható a Java nyelvben. Jelentése mindig „valami olyasmi, ami később nem változtatható meg”. Final adattagok: deklaráció: final típus azonosító=inicializáló kifejezés Az inicializáló kifejezés csak olyan elemeket tartalmazhat, amelyek az addigi deklarációk ismeretében feldolgozhatók. Miden példányosítás során végrehajtódik, tehát a változó értéke objektumként egyedi lehet. Egyetlen metódus sem változtathatja meg az értékét. Static final adattagok: deklaráció: static final típus azonosító=inicializáló kifejezés. Az inicializáló kifejezések csak konstansokat és olyan static adattagokat tartalmazhat, amelyek már deklaráltak. Csak egyszer, az osztály inicializálása során hajtódik végre, tehát a változó értéke az osztály miden példánya számára ugyanaz. Egyetlen metódus sem változtathatja meg az értékét. Az egyszerű típusú final adattagok egy konstans értéket képviselnek. Az osztálytípusú final adattagok egy konstans referenciát képviselnek: Nem változtatható meg az értéke, hogy egy másik példányra hivatkozzon Semmi sem akadályozza azonban azt, hogy a hivatkozott objektumot megváltoztassuk A Java-ban egy objektum nem deklarálható konstansnak Kezdőérték nélküli final adattag: másik elnevezése üres konstans. A deklarációból az inicializáló kifejezés elhagyható (az = jellel együtt). Az adattag az első használata előtt inicializálandó. Veszélyes lehet, ezért ne használjuk, vagy ha mégis, akkor minden konstruktor állítsa be az értékét. Final metódus: egy metódus kaphat final minősítést. A final minősítésű metódust nem definiálhatja felül egyetlen leszármazott osztály sem. Szerepe, hogy megakadályozza bizonyos viselkedés formák megváltoztatását, ha az veszélyezteti a helyes működését.
18. TÉTEL Az öröklődés fogalma, szintaktikai szabályai. Statikus és dinamikus típus fogalma. Egy osztály deklarálható valamely más 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. 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. Szintaktika: [módosító] class név extends ősosztály { // a saját tagok deklarációja } Hivatkozás a leszármazottra: mivel egy leszármazott az őse minden tulajdonságával rendelekzik, bármikor használható ős típusú objektumként is. 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. 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. 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.
19. TÉTEL Konstruktorok az öröklődés során A konstruktor nem öröklődik. 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 Végrehajtási sorrend: először mindig az ősosztály, majd a leszármazott osztály konstruktora hajtódik végre. A pontos sorrend: Az ős osztály adattagjainak inicializálása Az ős osztály konstruktorának végrehajtódása A gyermek osztály adattagjainak inicalizálása A gyermek osztály konstruktorának végrehajtódása Ő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. 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 szabályok megsértésénél hibajelzés.
20. TÉTEL Felüldefiniált metódusok: a definiálásra és a hívásra vonatkozó szabályok. Használatának célja. Metódusnév túlterhelés: a már ismert mechanizmus: egy osztályon belül azonos nevű függvények, eltérő paraméter szignatúrával. A saját és az örökölt függvények együttesen tekintendők. Korai kötés: a fordítóprogram az aktuális paraméterek statikus típusa alapján dönteni tud Polimorfizmus, mert a név nem egyedi, további információkat kell felhasználni. Metódus felüldefiniálás: Az előzőnél még hatékonyabb implementációs forma A leszármazott osztály az ős osztálytól örökölt metódust felüldefiniálhatja Egy ilyen metódus hívásánál dönteni kell, hogy az örökölt vagy a saját változat hívódjon meg – polimorfizmus A döntés alapja a hivatkozás dinamikus típusa Mivel a dinamikus típus fordítási időben nem ismert, a felüldefiniált metódusok közötti választást futásidőre kell halasztani – késői kötés. Egy ős osztálybeli metódus felüldefiniálásához a következő feltételeknek kell teljesülnie: A felüldefiniálandó metódus visszatérési típusának, nevének, és paraméter szignatúrájának meg kell egyeznie az ős osztálybeli metóduséval A felüldefiniálandó metódus hozzáférési kategóriája nem lehet szűkebb az eredeti metódusénál A felüldefiniálandó metódus csak olyan ellenőrzött kivételeket válthat ki, amilyeneket az eredeti is kiválthat Felüldefiniálandó metódus hívása: a hívásban szereplő valamennyi információ illik minden metódus változatra – ez alapján nem lehet dönteni. A döntés alapja a hivatkozás dinamikus típusa. A döntés csak futás időben történhet. A felüldefiniálandó metódus az ős osztály metódusát elérheti a super.metódusnév(…) formájú hivatkozással. Késői kötés használata: a leszármaztatás lehetőséget teremt, hogy viselkedésformákat örököljön egy osztály. Bizonyos esetekben a változatlanul öröklődő viselkedés nem felel meg a leszármazottnak. A felüldefiniálás lehetősége ezt a problémát tudja megoldani. A késői kötés automatizmusa a használatot kényelmessé teszi. Metódus felüldefiniálási további szabályok: nem kötelező a leszármazás minden szintjén felüldefiniálni a metódust. Egy osztály örökölheti a felüldefiniált metódust. Statikus metódus nem definiálható felül. Ugyanolyan nevű statikus metódus a leszármazott osztályban elfedi az ős osztály metódusát.
21. TÉTEL Absztrakt metódus és absztrakt osztály Gyakran előfordul a tervezés során, hogy egy osztály szintjén tudjuk, hogy valamilyen metódus szükséges lesz a leszármazottakban, de még nem lehet megadni az implementációját. Ezért a Java nyelv megengedi törzs nélküli metódus definiálását. Az ilyen metódust az abstract minősítővel kell ellátni. Ha az osztály tartalmaz absztrakt metódust, az osztályt is az abtract minősítővel kell ellátni. Formai szabályok: Absztrakt egy metódus, ha nincs törzse, megvalósítást, csak a felüldefiniálás során kap. Absztrakt metódusnak nem lehet azonosítója a private, final, static hiszen az ilyen metódusokat nem lehet felüldefiniálni. Absztrakt egy osztály, ha van legalább egy absztrakt metódusa Absztrakt osztályt nem lehet példányosítani Egy absztrakt osztály arra szolgál, hogy ős osztálya legyen további osztályoknak A leszármazott osztály(ok) feladata az absztrakt metódusok felüldefiniálása Absztrakt osztály gyermeke lehet absztrakt, ha nem minden absztrakt metódust valósít meg Az absztrakt osztály is használható referencia statikus típusaként Az absztrakt metódusok szerepe: rögzít egy tervezési döntést (szüksége metódusok halmaza), kényszeríti a leszármazott osztály(ok) programozóját meghatározott metódusok definálására. Hibalehetőségek: törzs nélküli metódus, abstract minősítő nélkül, absztrakt metódust tartalmazó osztály abstract minősítő nélkül.
22. TÉTEL A Java interface fogalma, a definíció szintaktikája. Interface implementálása. Egy osztály interfészén a nyilvános elemeinek összességét értjük, ami a használatához szükséges. Az információ rejtés elve miatt, általában csak metódusokból áll. Specifikáció, tervezés során készül. Kényszeríti az osztály késztőjét a megfelelő elemek implementálására. Protokollok az objektumok között. Interfészek a Java-ban: mivel nincs globális változó, konstans, ezért lehetnek adat részei is. Szintaktikája hasonló az osztályhoz, de a class kulcsszó helyett interface. Kiterjeszthet más interfészeket (extends), létezik többszörös interfész öröklés. Az interfész nem tartalmaz végrehajtható kódot, azt a megvalósító osztályban (implements) kell megadni. Megállapoidás, hogy „I”-vel kezdődik a neve. Szintaktika: [módosító] interface Iazonosító [extends Ios1[,Ios2]] { [elemek deklarációja] } Módosító lehet: public vagy abstract Interfészek kiterjesztése: minden interfész kiterjeszthet egy vagy több interfészt. Fontos, hogy önmagát nem terjesztheti ki sem közvetve, sem közvetlen. Nem alakulhat ki körkörös lánc. Interfészek láthatósága: Public: nyilvános: ebben az esetben az interfész azonos nevű fájlba kell írni, 1 interfész w fájl -: csomagszintű: ilyenkor csak abban a csomagban lehet használni, de több is lehet egy forrájsfájlban Interfész implementálása: [módosító] class osztálynév [extends ősosztály] [implements Iint1[,Iint2[,…]]] Szabályok: Ha egy osztály implementál egy interfészt, akkor köteles annak minden metódusát implementálni Az implementált elemeket nem módosíthatja Metódusok esetében a fejlécnek teljesen egyeznie kell Azonos nevű elemet az öröklődés során és az implementálás során nem kaphat meg Interfész használata: egy interfész új referencia típust vezet be -> mindenhol használható, ahol egy osztály. Változó deklarációban szerepelhet. Bármelyik osztállyal helyettesíthető, amely implementálja.
23. TÉTEL A kivétel fogalma és a kivételkezelés utasításai a Java nyelvben. Kivétel keletkezése. Kivételes helyzetek a jól megírt programokban is előfordulnak (pl: erőforrsáhiány, valamilyen funkció hibás vagy hiányos adatok miatt nem hajtható végre). Ezeket a szituációkat kezelni kell. A szükséges teendők elvégzése után általában a program folytatni tudja a munkát. Kivétel: futás idejű hiba, nem normális eset. Általában valamiyel hibához kötődik. Számos beépítést igényel. Saját kivétel definiálható. A Java szemléletében a kivétel egy objektum, ami a kivétel bekövetkezésekor jön létre. Saját kivétel kiváltása: throw objektum. A kivétel keletkezésekor szokásos teendők: Értesíteni a felhasználót, vagy naplózni Valamilyen plusz művlete után folytatni az alkalmazást, esetleg kilépni, súlyos hiba esetén. Ellenőrzött kilépés lehetséges A kivétel objektum tartalmazhat információkat a kivétel keletkezéséről, amelyet felhasználhatunk Kivételkezelés utasításai: try: védett kód kijelölése throw: kivétel dobása, generálása catch: kivétel elkapása, a blokkban definiált utasítások végrehajtása finally: végül, akár volt kivétel, akár nem, lefut. Try blokk: a védett kód try blokkban helyezzük el Try {utasítások} A blokkban keletkezett kivételt mi kezelhetjük le. A blokkok egymásba ágyazhatók. Érdemes minél kisebb blokkot definiálni. Kivétel keletkezik, ha a try blokkban egy throw utasításra fut a vezérlés. Formája: throw new kivételTípus(konstruktor paraméterek) A throw paramétere nem maradhat el Kivétel keletkezése: Implicit módon: a JAVA rendszerből indul ki, azaz valamely utasítás vagy API elem végrehajtása során keletkezik A programozó kódjában keletkezik, közvetlenül egy throw utasítás végrehajtásával Aszinkron kivétel, amely a program egy másik szálán lépett fel. A kivétel keletkezése esetén: Az első kivételt kiváltó utasítással befejeződik a try blokk végrehajtása. Kilép a blokkból a vezérlés, rendcsinálással, verem visszaállítása, lokális objektumok megszüntetése, védett változók megszüntetése Létrejön a throw utasításban megjelölt objektum egy példánya
24. TÉTEL Kivétel elkapása és lekezelése. A finally blokk szerepe Kivétel elkapása és lekezelése: a kivétel objektumot minden esetben a virtuális gép hozza létre. A kivétel lekezelését szolgáló utasítások catch blok(ok)ban helyezkednek el. Formája: catch(típus paraméterek) {utasítások}. A catch minden esetben a try blokkot követi, nem lehet közöttük más utasítás. Egy try blokkhoz tartozhat több catch is. A virtuális gép megkeresi a sorrendben első „illeszkedő” blokkot, és annak végrehajtásával folytatódik a program. Az illeszkedés feltétele: a kivétel objektum típusa megegyezik a catch blokk fejében megadott típussal, vagy annak leszármazottja. A kiválasztott blokk végrehajtása során a paramétere úgy használható, mint a függvények esetén a formális paraméter. Így lehet felhasználni a kivétel objektumban tárolt információkat. A futás az utolsó catch utáni sorral folytatódik. Minden ellenőrzött kivételt kezelni kell. Ha a catch blokk végrehajtása során újabb kivétel keletkezik, az eredeti kivétel kezelése megszakad, és az új kivétel lekezelése kezdődik el. Ha egyetlen catch blokk sem illeszkedik kivételre, a keresés a beágyazó try blokk catch blokkjaival folytatódik, amíg sikeres nem lesz. Ha a keresés belülről kifelé minden try blokkot megvizsgált, és nem talált egyezést, a program terminálódik, és kiíródik a kivétel stack (lekezeletlen kivétel). Finally blokk: nem kötelező. A catch(ek) után szerepelhet. Az utolsó catch blokk és a finally blokk között nem lehet más utasítás. Nem lehet paramétere. Minden esetben lefut. Ha kivétel keletkezett a try blokkban, egy catch blokk végrehajtása után. Ha nem volt kivétel, a try blokk uzolsó utasítása után. Alkalmas például fájlok, adatbázis kapcsolatok lezárására.
25. TÉTEL Előre definiált és saját kivétel osztályok Kivétel objektum: mivel objektum, valamely definiált osztály példánya kell legyen. Minden kivétel osztály a Java.lang.Throwable osztály leszármazottja kell legyen, de ez általában közvetve valósul meg. A Java.lang.Throwable osztálynak van számos előre definiált leszármazottja. Kivétel osztályok: az Error és a RunTimeException osztályú kivételek nem ellenőrzött kivételek. Az összes többi ellenőrzött kivétel. Ajánlott minden programozó által definiált kivétel az Exception osztályból származzon. Valamennyi ilyen kivétel ellenőrzött kivétel, kötelező lekezelni. Konvenció: minden kivételosztály neve: ValamiException legyen, ahol a valami a kivétel jellegére utal. Az Exception osztály: van egy String paraméterű konstruktora, amellyel egy leírás definiálható a kivételhez. Számos hasznos metódust definiál, amely öröklődik és szükség esetén felüldefiniálható: String toString(): visszaad egy sztringet, amely az osztály azonosítójából és a konstruktorban megadott sztringből áll String getMessage(): visszaadja a konstruktorban megadott sztringet printStack(): kiírja a keletkezett kivételeket, a keletkezésük sorrendjében és megadja a keletkezésük helyét (hasznos lehet hibakezeléshez, paraméter nélkül a standard hibacsatornára ír, de paraméterben megadható, hogy hova írjon) Saját kivétel osztály: az Exception osztály leszármazottja legyen. Fontos a névkonvenció. A konstruktorának a paraméterei között legyen egy String, amivel az ős osztály konstruktorát hívja meg. A további paraméterek a hibára jellemző adatokat fogadhatnak. A metódusai a catch blokkban használhatók a kivétel lekezelése során. A kivételek csoportosítására célszerű leszármazási hierarchiát létrehozni a saját kivételosztályok között is.
26. TÉTEL Az ellenőrzött és nem ellenőrzött kivétel fogalma. Kivételek specifikálása Nem ellenőrzött kivételek: az Error és a RunTimeException osztályból származó kivételek Error: rendszerszintű hiba a JVM működésében RunTimeException: a program számos pontján keletkezhetnek, ezért nem célszerű kötelezővé tenni a lekezelésüket. A programozó, ha akarja, lekezelheti. Lekezeletlen kivétel esetén a program terminálódik, és kiíródik a kivétel stack. Ellenőrzött kivételek: a fordítóprogram hibát jelez, ha nincs lekezelve. A kivétel keletkezésének módjai: A try blokk után valamelyik catch blokk elkapja, és teljes mértékben lekezeli. A metódus futása folytatódik a catch blokkok utáni első utasítással. A try blokk utána valamelyik catch blokk lekapja, és részben lekezeli. A lekezleés egy olyan throw utasítással fejeződik be, amely a paraméterül kapott kivétel objektumot tartalmazza. A metódus futása befejeződik. A metódus fejlécében ezt a kivételt specifikálni kell. A metódus nem kezeli le a kivételt, de specifikálja azt a fejlécében. A metódus futása befejeződik. Ez akkor szükséges, amikor az adott metódus nem, csak a hívó tudja értelmesen lekezelni a kivételt. A hívó is tovább adhatja a kivétele lekezelését, így a kivétel tetszőleges hívási mélységből is eljuthat oda, ahol lekezelhető. Kivételek specifikálása: ha egy metóduson belül kivétel keletkezhet, de nem tartalmaz catch utasításokat annak kezelésére. Ilyenkor a metódus hívójának kell azokat lekezelni. Erre számítani kell, ezért az ilyen kivételeket a metódus fejlécében specifikálni kell. Formája: metódusnév([paraméterlista]) [throws kivetelosztály1 [, kivetelosztaly2, …] ]
27. TÉTEL Beágyazott osztályok Osztálydefiníció a programon belül:a Java-ban egymás mellé rendelt osztály és interface definíciókon kívül lehetőség van definíciók beágyazására: Osztály hatáskörbe (tagosztályok) Utasításblokkba (lokális osztályok) Egy utasításba (névtelen osztályok) Tagosztály: osztálydefiníció egy osztály hatáskörében. A befoglaló és a tagosztály kölcsönösen hozzáférnek egymás tagjaihoz (a private tagokhoz is). A nevek minősítése nem szükséges. A tagosztályok is öröklődnek. A befoglaló osztályon kívüli hozzáférés a tagosztály hozzáférési kategóriájának megfelelően lehetséges. A tagosztály tagjaira való hivatkozáshoz a nevet minősíteni kell. Statikus tagosztály: static módosítóval. Emellett még public, protected, private módosítója lehet. A program csomagon belüli tagolásához: egy típus, amely a befoglaló osztály hatáskörében van. Használható a befoglaló osztályon belül típusként. Ha nem private, a programban ugyanúgy használható, mint bármely más osztály. Alkalmazási területei: Egy segédosztályt el akarunk rejteni a külvilág elől Egy osztály megvalósításakor egy olyan segédosztályra van szükség, amelynek hozzá kell férnie az osztály privát tagjaihoz Ki akarjuk fejezni, hogy egy osztály vagy interface egy másiknak logikai alárendeltje. Nem statikus tagosztály: a befoglaló és a tagosztály példányainak kapcsolatát implementálhatjuk vele. A tagosztály egy adott példányához a befoglaló osztály pontosan egy példánya tartozik. Ellenkező irányban: a befoglaló osztály egy példányához a tagosztály tetszőleges számú példánya tartozhat (nulla is). A fenti kapcsolat automatikusan rögzítődik és fennáll mindaddig, amíg a befoglaló osztály példánya él. Ha például egy külső osztály egy metódusa példányosít egy beágyazott típusú objektumot, az a befoglaló objektumhoz kapcsolódik, és túléli a metódust.
28. TÉTEL Az osztály interface fogalma és a jól tervezett osztály interface jellemzői Osztály interface: A public metódusok összessége: ezeket el kell ismernie az osztály használójának. Használatukhoz nem szükséges ismerni az osztály implementációs részleteit Protected metódusok és adattagok: kibővíti az interface-t a leszármazott osztályok számára. Használata veszélyeket rejt magában, mert implementációs függést hoz létre az ős és a leszármazott osztály között. Technika iszempontból az interface részét képezik az esetleges public minődítésű adattagok is, de használatuk nem ajánlott. Ellentmond az információrejtésnek. A jó osztály interface: Teljes: Minden funkciót tartalmaz, ami az osztálytól elvárható Nem az adott alkalmazás szempontjai határozzák meg Újrafelhasználható egységet alkot az osztály Minimális: Nem tartalmaz a felhasználó számára érdektelen elemeket Belső felhasználású funkciók private vagy prtoected minősítésűek A belső áttervezés nincs rá hatással Kezelhető méretű: Általában legfeljebb néhány metódus A sok funkció között nagyobb valószínűséggel lesznek hasonlóak A terjedelmes interface általában tervezési hibára utal: az interface része belső funkció is. Az osztály határait nem jól állapítottuk meg, és túl sok feladatot akarunk rábízni. A helyes architektúra kialakítása érdekében az eredetileg tervezett osztályt több osztályra kell bontani, és ezek között leszármaztatással vagy más mechanizmussal megteremteni a kapcsolatot Az osztály interface részei: Kezelő tagok és metódusok: konstruktorok, örökölt „kész” metódusok. Sokszor nem is a programozós, hanem a program implicite hívja meg Elérési függvények: az adattagok értékének elérésére vagy azok értékének módosítására Munkavégző függvények: az osztály lényegi funkcióit aktivizál függvények
29. TÉTEL Az általánosítás/pontosítás (is-a) és a tartalmazás (has-a) kapcsolat implementálási lehetőségei a Java nyelvi eszközökkel. Osztályok közötti kacsolatok: Általánosítás/pontosítás (is-a) Tartalmazás (has-a) Használat (use) Az általánodítás/pontosítás implementációja: Leszármaztatási mechanizmus (öröklődés) segítségével. A leszármazott osztály objektuma egyben ős objektum is Tartalmazás implementálása: Aggregáció: a rész az egészhez tartozik, de önállóan is létező entitás Kompozíció: a rész önmagában nem létezhet, csak valaminek a részeként. Aggregáció: A tag objektum referenciája a tartalmazó osztályban Ez adattag, tehát általában private Az egy –több kapcsolat megvalósítása különböző adatszerkezetekkel lehetséges (tömb, vektor stb.) A referenciák beállítása általában a befoglaló osztály konstruktorának feladata, már létező objektumok referenciáinak felhasználásával. Kompozíció: A tartalmazó osztályban osztálydefiníció a tartalmazott számára, private hozzáférési kategóriával A tartalmazó osztály konstruktorának vagy valamelyik metódusának a feladata a „rész” példányosítása (Kívülről nem lehet a private minősítés miatt) Öröklődés vagy tartalmazés? Mindkét esetben egy objektum más objektumot tartalmaz. Az öröklődés esetén ez implicit módon történik. Technikai különbségek: A leszármazott objektum pontosan egy ősobjektumot tartalmaz Tagobjektumok tetszőleges számú típussal, típusonként tetszőleges számmal definiálhatók Tervezési különbségek: Más logikai kapcsolatot fejeznek ki(is-a, has-a) Az öröklés az interface újrafelhasználása: a leszármazott osztály interface-ének része lesz az ősosztály interface-e. A private tag objektumnak az osztályának a funkcióit használjuk fel a befoglaló osztály implementációjához. A tagosztály interface.e nem képezi részét a befoglaló osztály interface-ének. A public tag objektummal a befoglaló osztály interface-ét kiegészítjük a tag objektumok osztályainak interface-eivel. Nem mindig szerencsés megoldás: rontja a program áttekinthetőségét. Erős függőséget hoz létre az osztályok között.
Készítette: Galán Mihály