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>[]
; vagy <elemtípus> [];
Létrehozás: new <elemtípus> [<elemszám>]
Indexelés [index]
Tömb hossza .length
Tömbök - Példák 3
tomb1
0.
1.
2.
3.
4.
0
10
20
30
40
Tömbök inicializálása 4
Inicializáló blokk: <elemtípus>[] = {<é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
Szintaktikailag helytelen
iArray1 = iArray2;
sArray = iArray;
oArray = sArray;
sArray = oArray;
Kétdimenziós tömb 6
Deklarálás <elemtípus>[][] ; vagy <elemtípus> [][];
Létrehozás: new <elemtípus> [<méret1>][<méret2>]
Indexelés [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
Osztály deklarációi 13
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
Osztály - Példa 15
Osztály - Példa 16
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
Inicializáló blokk - Példa 26
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 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
Öröklődés - Példa 36
Öröklődés 37
Deklaráció: [módosítók] class extends <ısosztály_neve> [implements ];
Példa: public class Cylinder extends Circle{…} public class Point3D extends Point {…}
Öröklődés - Példa 38
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:
Osztályok közötti kapcsolatok 46
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.