Dr. Pál László, Sapientia EMTE, Csíkszereda JAVA PROGRAMOZÁS 2.ELŐADÁS 2014-2015 tavasz Tömbök, osztályok, objektumok, konstruktorok
Tömbök 2 Referencia típusú változó Elemtípus Primitív Referencia: osztály, tömb Deklarálás <elemtípus>[] <tömbazonosító>; vagy <elemtípus> <tömbazonosító>[]; Létrehozás: new <elemtípus> [<elemszám>] Indexelés <tömbazonosító> [index] Tömb hossza <tömbazonosító>.length
Tömbök - Példák 3 0. 1. 2. 3. 4. tomb1 0 10 20 30 40
Tömbök inicializálása 4 Inicializáló blokk: <elemtípus>[] <tömbazonosító> = {<érték1>, <érték2>,...} Példa: int[] iarray = {0,10,20,30,40}; char[] maganhangzok = {'a','e','i','o','u'}; boolean[] szep = {true,false}; Alapértelmezett kezdeti érték: Nullaszerű elemek
Tömbök értékadása 5 A t1=t2 értékadás megengedett, ha: Primitív elemtípus esetén t1 és t2 elemtípusa azonos Referencia elemtípus esetén t2 elemtípusa t1 elemtípusával azonos, vagy annak leszármazottja Példa: int[] iarray1 = {1,3,5,7}, iarray2 = {10,20}; Object[] oarray = null; String[] sarray = {"Get Back","Let It Be"}; Szintaktikailag helyes iarray1 = iarray2; oarray = sarray; Szintaktikailag helytelen sarray = iarray; sarray = oarray;
Kétdimenziós tömb 6 Deklarálás <elemtípus>[][] <tömbazonosító>; vagy <elemtípus> <tömbazonosító>[][]; Létrehozás: Indexelés new <elemtípus> [<méret1>][<méret2>] <tömbazonosító> [index1] [index1]
Kétdimenziós tömb - Példa 7 int[][] szamok = new int[3][5];
Kétdimenziós tömb - Példa 8 Ember[][] versenyzok = new Ember[4][3];
Osztályok 9 Osztály definíció: A módosítókkal (modifier) az osztály hozzáférhetőségét, leszármaztathatóságát szabályozhatjuk Módosítók: public, protected, private, final, static
A tagok módosítói 10 Hozzáférési módosítók: Félnyilvános (~): csak az azonos csomagban levő osztályok érhetik el Public (+): bármely csomagban levő bármely osztályból elérhető Protected (#): leszármazottban elérhető Private (-): más osztályból nem elérhető Megjegyzés: Az osztály csak nyilvános vagy félnyilvános lehet Legfeljebb egy publikus osztály lehet egy fordítási egységben
A tagok módosítói 11 Egyéb módosítók: final: ha egy osztály final (végleges), akkor azt nem lehet örökíteni abstract: egy absztrakt osztályt nem lehet példányosítani
Osztály tagok 12 Az osztály tagjai következők lehetnek konstruktorok inicializálók metódusok mezők osztályok, interfészek A konstruktorok kivételével minden tag lehet: Példányhoz tartozó (példány- ), vagy Osztályhoz tartozó(osztály-, statikus ). A konstruktorok mindig az osztályhoz tartoznak
13 Osztály deklarációi
Osztálytag, példánytag 14 Osztálytag vagy statikus tag az osztályhoz tartozik, és az osztály minden objektumára egyformán érvényes Osztályváltozó vagy statikus változó Osztálymetódus vagy statikus metódus Példánytag: Példányváltozó: minden példányban külön szerepel Példánymetódus: a megszólított példányon dolgozik
15 Osztály - Példa
16 Osztály - Példa
A this objektumreferencia 17 Példánymetódusok utolsó, rejtett paramétere A megszólított objektum referenciája Példa:
Konstruktorok 18 Beállítja az objektum kezdeti állapotát Adatok, kapcsolatok Hasonlít a metódushoz, de nincs visszatérési értéke Neve megegyezik az osztály nevével Csak a new operátorral hívható Csak a hozzáférési módosítók használhatók Túlterhelhető Nem öröklődik
Alapértelmezés szerinti konstruktor 19 Nincs (explicit) konstruktor egy alapértelmezés szerinti (implicit) konstruktor fut le paraméter nélküli adatok, kapcsolatok alapértelmezések nullaszerű kezdőértékek: false, \u0000, 0, null Van legalább 1 (explicit) konstruktor nincs alapértelmezés szerinti konstruktor
Konstruktorok - Példa 20 Alapértelmezett konstruktor:
Konstruktorok - Példa 21 Alapértelmezett konstruktor:
Konstruktorok túlterhelése 22 Konstruktorok ugyanúgy túlterhelhetők, mint más metódusok Példa:
Konstruktorok túlterhelése 23 Ha egy osztály több konstruktort definiál, akkor az egyikből meghívható egy másik konstruktor a this referencia segítségével. A this ekkor eljárásként hajtódik végre: this(paraméterek) Példa:
Túlterhelés vs. felüldefiniálás 24 A felüldefiniálás (overriding) során elfedjük a leszármazott osztályban az ősosztály azonos nevű metódusát, melynek azonos a paraméter-típuslistája és azonos a visszatérési értéke is. Ha ez a három kritérium egyszerre nem teljesül, akkor csupán bővítjük az ős osztályt egy újabb (túlterhelt (overloading)) metódussal.
Inicializáló blokk 25 Osztálydefiníción belül elhelyezett kódblokk Lehet statikus (osztály inicializátor), amely az osztályszintű konstruktort pótolja, és lehet példányszintű, amely példányosításkor a konstruktor hívása előtt hajtódik végre Előbb az osztálytagok aztán a példánytagok inicializáló blokkjai kerülnek végrehajtásra, a deklarálás sorrendjében
26 Inicializáló blokk - Példa
Objektum és memória modell 27 Heap: dinamikus memóriaterület Stack (verem): végrehajtási verem (execution stack) Amennyiben befejeződik egy metódus feldolgozása, úgy törlődik az aktivációs rekordja Mindig az a folyamat fejeződik be előbb, amit utoljára hívtunk meg
Objektum és memória modell 28 Az objektumok mindig a heap-ben tárolódnak Az objektum mezők is a heap-ben tárolódnak Metódusok lokális változói a veremben tárolódnak A veremben referencia is tárolódhat, amely a A veremben referencia is tárolódhat, amely a heap-ben található objektumra mutat
Objektum és memória modell 29 Példa:
Objektum és memória modell 30 Példa:
A static módosító 31 Statikus lehet változó metódus Példa:
A static módosító 32 Példa: System.gc(): explicit meghívja a garbage collector-t Ez hívja a finalize() metódust
A static módosító 33 Megszorítások: Statikus metódus nem használhat nem statikus adattagokat és nem hívhat nem statikus metódusokat this és super kulcsszavakat nem használhatják
A final módosító 34 Változó: nem adható új érték Metódus: nem definiálható felül Osztály: nem örökíthető Példa:
Öröklődés (Is-A kapcsolat) 35 Öröklődés(inheritance), kiterjesztés(extension) Egy meglévő osztály kiterjesztése, továbbfejlesztése Ősosztály, utódosztály Egyszeres / többszörös öröklés Az öröklés szabályai Egy osztályból több osztály is származtatható Az osztályhierarchia mélysége tetszőleges Az öröklés tranzitív A Javában minden osztály implicit őse az Object, és csak egyszeres öröklés van
36 Öröklődés - Példa
Öröklődés 37 Deklaráció: [módosítók] class <utódosztály_neve> extends <ısosztály_neve> [implements <interfészek_neve>]; Példa: public class Cylinder extends Circle{ } public class Point3D extends Point { }
38 Öröklődés - Példa
Metódusok felülírása 39 Ha egy leszármazott osztály metódusának ugyanaz a szignatúrája (azaz neve, paramétereinek száma és típusa), valamint visszatérési értéke, mint az ősosztály metódusának, akkor a leszármazott osztály felülírja (override) az ősosztály metódusát Ha egy leszármazott osztály egy osztálymetódust ugyanazzal az aláírással (szignatúrával) definiál, mint a felsőbb osztálybeli metódus, akkor a leszármazott osztály metódusa elrejti (elfedi) a szülőosztálybelit
Metódusok felülírása 40 Példa:
A super kulcsszó 41 Öröklődés során csak az adattagok és a metódusok kerülnek át a leszármazott osztályba, a konstruktorok nem A super kulcsszó lehetőséget ad a leszármazott osztály konstruktorából az ősosztály egy konstruktorát meghívni A super() egy hivatkozás az ősosztályra, működése hasonló a this() kulcsszóhoz Példa:
A super kulcsszó 42 Ha nem írunk konstruktort, akkor a fordító automatikusan beilleszt egy paraméter nélkülit, amelynek első sora a super() konstruktorhivatkozás Ezért ha az ősosztályunk nem rendelkezik paraméter nélküli konstruktorral, hibaüzenetet kapunk A super() utasítás mindig első utasítás, hiszen egyszer a szülőt kell létrehozni, majd csak utána leszármazottat
Az @override annotáció 43 A fordítót utasítja, hogy ellenőrizze létezik-e az ősosztályban hasonló nevű metódus Hasznos lehet elírások esetén Nem kötelező Példa:
Aggregáció( has-a kapcsolat ) 44 Osztályok felhasználásának egy másik módja Példa: A vonal két pontot összekötő szakasz
Aggregáció ( has-a kapcsolat ) 45 Példa:
46 Osztályok közötti kapcsolatok
Könyvészet 47 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.