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:

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:

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. Feladatok

11.6.1. Hozzunk létre egy Dolgozó nevű osztályt a következő tulajdonságok reprezentálására:

Megoldás

 

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!

Megoldás

 

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!

Beszúrandó kódrészlet:

Megoldás

 

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.

Megoldás