11. hét Az objektum-orientált
paradigma
Tartalom:
11.1. Osztály és objektum, konstruktor
11.2. Üzenet, interfész, bezárás és láthatóság
11.3. Öröklődés és polimorfizmus
11.4. Osztály és objektum létrehozása
11.5.
Tesztkérdések
11.6. Feladatok
11.1. Osztály és objektum, konstruktor
A Java nyelv alapját az objektum-orientált paradigma (módszer, alapelv, elmélet) képezi. Ez azt jelenti, hogy a korábbi programozási nyelvek által használt strukturális, moduláris programozási módszert a Java nyelv esetében felváltotta egy új szemléletmód, a megoldandó problémák objektum-orientált módon való megközelítése. E módszer központi elemei az objektumok, amelyek segítségével a megoldandó problémát leírjuk, modellezzük. Egy Java program lényegét az objektumok egymás közötti együttműködése, kommunikációja alkotja.
Nézzük, mi is lehet objektum? Pl. egy autó vagy egy ember.
Minden ilyen objektum két fő jellemzővel rendelkezik:
tulajdonságokkal (attribútum, adattag, változó) - pl. az autó színe, aktuális sebességfokozata, vagy az ember neve, testmagassága, aktuális tevékenysége
viselkedési jellemzőkkel (metódus, módszer) - pl. az autó sebességet vált, fékez, ill. az ember beszél, dolgozik
A Java nyelv e két jellemzőt egységesen kezeli:

Az azonos adattagokkal és metódusokkal rendelkező objektumokat egy közös ún. osztályba soroljuk. Az objektumok mindig egy ilyen osztály tagjai, példányai. Pl. az Autók nevű osztály egy példánya lehet a HHT-376 frsz.-ú Opel Astra, vagy Kis István tanuló az Ember osztálynak. Egy objektum létrehozását példányosításnak is nevezzük, amelyhez a "tervrajzot" az osztály adja.
Egy objektumpéldány létrehozását (inicializálását) az adott osztály ún. konstruktora végzi el. Ennek során az újonnan létrejövő objektum adattagjai kezdőértéket kapnak. A konstruktort a new operátorral hívjuk meg, amely memóriaterületet foglal le az újonnan létrehozandó objektumpéldány számára.
Minden osztálynak van legalább egy konstruktora (neve ugyanaz, mint az osztályé), amelyet ha mégsem hozunk létre, akkor a Java rendszer megteszi ezt helyettünk. Ez a konstruktor viszont paraméter nélküli lesz, így a létrejövő objektumnak nem adhatunk közvetlenül kezdőértéket. Egy osztálynak több konstruktora is lehet, amelyek azonban a paramétereik száma ill. típusa alapján megkülönböztethetőknek kell lenniük.
Az adattagok (változók) és a metódusok is lehetnek osztály- vagy példányszintűek. Pl. az autók színe különbözik, tehát példányváltozókban tároljuk őket. De ha minden autó 5 sebességes, akkor ezt a jellemzőt elég osztályszinten definiálni. Ilyen speciális osztályszintű változó lehet az osztály éppen aktuális objektumpéldányainak száma is.
Azt, hogy egy objektumpéldány egy adott osztálynak tagja-e, az instanceof - logikai értéket adó - operátorral kérdezhetjük le:
|
(autó1 instanceof Autó) |
11.2. Üzenet, interfész, bezárás és láthatóság
Egy Java program objektumai üzenetküldéssel kommunikálnak egymással, amely során az egyik egy konkrét feladat elvégzésére kéri a másikat. Ez a megszólított objektum egy - a kezdeményező által látható, elérhető - metódusának meghívását jelenti. Egy objektum azon metódusainak összességét, amelyeken keresztül meghívható, az objektum interfészének nevezzük. Minden objektumnak van interfésze, egyébként nem lenne értelme a létezésének.
Az objektumok tervrajzát adó osztályok definíciójánál gondoskodhatunk arról, hogy a majdan létrejövő objektumpéldányok mely adattagjai legyenek láthatók, ill. mely metódusai és konstruktorai legyenek meghívhatók más objektumok által, valamint melyek legyenek csak az adott objektum által hozzáférhetők. Ezt az eszközrendszert nevezzük bezárásnak.
A Java nyelvben a bezárási szinteket ún. láthatósági módosítókkal állíthatjuk be. Fajtái:
publikus (public)
védett (protected)
privát (private)
módosító nélküli (alapértelmezett, csomagszintű láthatóság)
Az alábbi táblázat mutatja a módosítók hatását (● látható, ● nem látható)
|
Elérési szintek (láthatóság) |
||||
|
Módosító |
Osztály | Csomag | Leszármazott | Összes osztály |
| public | ● | ● | ● | ● |
| protected | ● | ● | ● | ● |
| módosító nélküli | ● | ● | ● | ● |
| private | ● | ● | ● | ● |
Az első oszlop (Osztály) azt mutatja, hogy maga az osztály elérheti-e az adott módosítóval megjelölt adattagjait metódusait. Természetesen minden esetben igen. A második oszlop azt jelzi, az eredeti osztállyal azonos csomagban lévő más osztályok (függetlenül a szülői kapcsolatoktól) elérhetik-e a tagokat. A harmadik oszlop mutatja, hogy az adott osztály leszármazottai (függetlenül attól, hogy mely csomagban vannak) látják-e tagokat. A negyedik oszlopban az összes többi osztály számára biztosított elérhetőség látható.
Az interfész és a bezárás eszközével biztosítható az objektumok integritása, vagyis adattagjaik ellenőrzött körülmények közötti megváltoztathatósága.
11.3. Öröklődés és polimorfizmus
Egy osztály legegyszerűbben adattagjainak és metódusainak felsorolásával hozható létre. Azonban az objektum-orientált paradigma lehetőséget ad egy másik, hatékonyabb módszerre is, az öröklődésre. Az öröklődés az újrafelhasználhatóságot szem előtt tartva arra ad lehetőséget, hogy már meglévő (szülő-, ős-) osztályból kiindulva hozzunk létre új (gyermek-, leszármazott-, al-) osztályt. Az öröklés két osztály között fennálló olyan kapcsolat, amely során a leszármazott osztály rendelkezik a szülő osztály összes tulajdonságával (adattagjait és metódusait sajátjaként kezeli), s ezeket újabbakkal egészítheti ki. Az így létrehozott osztály is lehet más osztályok őse, így ezek az osztályok egy öröklési hierarchiába szerveződnek. Attól függően, hogy egy osztálynak egy- vagy több őse van, beszélünk egyszeres- ill. többszörös öröklődésről. A Java az egyszeres öröklődést támogatja.
A Java-ban az osztályhierarchia legfelső eleme az Object osztály, amelyből minden más osztály (közvetve vagy közvetlenül) származik.
Egy alosztály az örökölt metódusokat újraimplementálhatja. Ilyenkor az adott metódus ugyanolyan néven, de más, módosított (alosztályra specifikált) tartalommal kerül megvalósításra. Az ilyen metódusokat polimorfnak nevezzük.
Polimorfizmusról beszélünk akkor is, amikor egy osztályon belül több, azonos nevű metódus létezik. Minden ilyen metódus implementációja különbözik egymástól, amelyet a paramétereik sorrendje vagy típusa biztosít. Ekkor beszélünk egy metódus többalakúságáról.
11.4. Osztály és objektum létrehozása
Definiáljunk egy egyszerű, általánosan elérhető Autó nevű osztályt, amelynek legyen három megfelelő típusú - minden más osztály elől rejtett - adattagja a rendszám, a teljesítmény és az automata váltó meglétének tárolására, valamint egy osztályszintű példányszámlálója:

Példánkban az osztály láthatóságának módosítója a
public kulcsszó, az adattagok elrejtését
pedig a private
biztosítja. A
static
minősítő állítja be a példányszám változót ún. osztályváltozónak.
Hozzunk létre egy olyan konstruktort, amely segítségével már az inicializáláskor kezdőértéket adhatunk az adattagoknak, ill. példányosításkor az automatikus számlálás is történjen meg! Ezt az osztálydeklaráció alábbi kiegészítésével érhetjük el:

Miután van egy "működőképes" osztályunk, példányosítsuk! Ezt az
Autó
osztály main
metódusában kezdeményezhetjük.

Az osztálydeklaráció részleteivel a következő fejezetekben
ismerkedünk meg.
11.5. Tesztkérdések
11.6.1. Hozzunk létre egy Dolgozó nevű osztályt a következő tulajdonságok reprezentálására:
név (szöveg típus)
születési_év (egész szám típus)
munkakör (szöveg típus)
fizetés (egész szám típus)
adójóváírás (logikai típus)
11.6.2. Hozzunk létre az osztályunkhoz egy olyan paraméteres konstruktort, amely segítségével a példányosítás során minden adattagnak kezdőértéket adhatunk!
11.6.3. Példányosítsuk az előző osztályunkat! Hozzuk létre az alábbi objektumokat, majd a megadott kódrészletet beszúrva írassuk ki őket a képernyőre!
Kovács Péter, 1966, igazgató, 500000, nem
Nagy Árpád, 1954, portás, 100000, igen
Kiss P. Eszter, 1980, főelőadó, 250000, nem
Beszúrandó kódrészlet:

11.6.4. Készítsünk a pályakezdő dolgozóknak olyan konstruktort, ahol a fizetés a minimálbérrel egyezik meg (2010-ben ez 73.500 Ft), és az adójóváírás alanyi jogon járjon! Ezt a konstruktort felhasználva hozzuk létre és írassuk ki a következő tulajdonságokkal rendelkező objektumot: Soós Elemér, 1990, gyakornok.