III. OOP (objektumok, osztályok)



Hasonló dokumentumok
Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Osztályok. 4. gyakorlat

JAVA PROGRAMOZÁS 2.ELŐADÁS

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java programozási nyelv 5. rész Osztályok III.

Java programozási nyelv 4. rész Osztályok II.

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Bevezetés a Python programozási nyelvbe

Objektumorientált programozás C# nyelven

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Programozási alapismeretek 4.

OOP. Alapelvek Elek Tibor

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Interfészek. PPT 2007/2008 tavasz.

Már megismert fogalmak áttekintése

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Programozási nyelvek Java

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

C++ programozási nyelv

OOP: Java 8.Gy: Abstract osztályok, interfészek

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Öröklés és Polimorfizmus

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Az élet szép, környezetünk tele van fákkal, virágokkal, repdeső madarakkal, vidáman futkározó állatokkal.

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Java Programozás 3. Ea: Java osztályok. OOP alapalapok

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Objektum-orientált programozás

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

OOP #14 (referencia-elv)

C++ programozási nyelv Konstruktorok-destruktorok

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Java III. I I. Osztálydefiníció (Bevezetés)

Java III. I I. Osztálydefiníció (Bevezetés)

Bánsághi Anna 2014 Bánsághi Anna 1 of 31

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Objektumorientált paradigma és programfejlesztés Bevezető

Objektumorientált programozás C# nyelven

Objektumorientált szoftverfejlesztés alapjai

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java és web programozás

C++ programozási nyelv

Abstract osztályok és interface-ek. 7-dik gyakorlat

Objektumorientált programozás C# nyelven

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Programozási nyelvek Java

Programozási nyelvek II.: JAVA

Pénzügyi algoritmusok

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

JAVA PROGRAMOZÁS 3.ELŐADÁS

Objektumorientált paradigma és a programfejlesztés

Objektumorientált programozás IX. Osztályok, objektumok

Adatstruktúrák, algoritmusok, objektumok

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Virtuális függvények (late binding)

I. Objektumorientált programozás

Elemi Alkalmazások Fejlesztése II.

Előzmények

Web-technológia PHP-vel

Programozási nyelvek Java

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Objektum orientált kiterjesztés A+ programozási nyelvhez

Programozási technológia

Java és web programozás

Programozás III. - NGB_IN001_3

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

C++ programozási nyelv Struktúrák a C++ nyelvben

Interfészek. Programozás II. előadás. Szénási Sándor.

Bevezetés, a C++ osztályok. Pere László

3. gyakorlat. Objektumorientált programozás

Programozási nyelvek II.: JAVA

Java programozási nyelv 6. rész Java a gyakorlatban

Objektum orientált programozás (Object Oriented Programming = OOP)

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Java és web programozás

Programozási nyelvek II.: JAVA, 3. gyakorlat

OOP és UML Áttekintés

Programozás I. Első ZH segédlet

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Programozási nyelvek Java

BME MOGI Gépészeti informatika 8.

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Osztályok, objektumok

Programozás III A JAVA TECHNOLÓGIA LÉNYEGE. Többlépcsős fordítás JAVA PLATFORM. Platformfüggetlenség

Átírás:

III. OOP (objektumok, osztályok) 1. Természetes emberi gondolkozás Az Objektumorientált paradigma alapelvei nagyon hasonlítanak az emberi gondolkozásra. Érdemes ezért elsőként az emberi gondolkozás elveit megismernünk. Az embert a gondolkozás során a következő gondolatok vezérlik: Absztrakció A világot leegyszerűsítjük, mert annak minden részletét túlságosan bonyolult lenne feldolgozni. Osztályozás A dolgokat tulajdonságaik, viselkedésük alapján kategóriákba soroljuk. Megkülönböztetés A dolgok különböznek egymástól. Nincs két egyforma objektum. Általánosítás/Specializáció Az objektumok között keressük a hasonlóságot és a különbözőséget Kapcsolatok Az objektumokat megpróbáljuk kapcsolni egymáshoz pl.: sütemény alkotóelemei o Ismertségi kapcsolat - az objektumok függetlenek egymástól (pl.:kutya-ház) o Egész-rész kapcsolat - az objektumok függenek egymástól (pl.: kutya és a 4 lába) 2. OOP Az Objektum-orientált programozás (Object Oriented Programming) nem új dolog. Már az 1960-as években foglalkoztak az elveivel. Elterjedése mégis csak a 70-es években történt a XEROX cégnek köszönhetően. Definíció: Egy OOP egymással kommunikáló objektumok összessége. 3. Objektum Az objektum információ tárolásával foglalkozik, és kérésre feladatot hajt végre. Leegyszerűsítve azt is mondhatnánk, hogy egy objektum adatok és metódusok összessége. Ha párhuzamot szeretnénk vonni a valós élet és az objektumorientáltság között, akkor azt mondhatnánk, hogy minden dolog, amit a PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 1

környezetünkben tapasztalunk (és maga a környezet is) objektum. A természetes gondolkozás elveinek megfelelően minden objektum egyedi. Azonban az azonos tulajdonságokkal rendelkező objektumokat osztályokba soroljuk. A Java nyelvben is először osztályokat fogunk definiálni, és az osztályok példányosításával fogjuk létrehozni az egyedi objektumokat. 4. Osztályok Tehát az objektumokat osztályokba soroljuk. Valójában az osztályokban fogjuk definiálni a tulajdonságokat (adatokat) és a viselkedést (metódusokat), amik a példányosítás révén fognak az objektumok egyedi jellemzőivé válni. Példa az osztályozásra: Állat o Háziállat Macska Kutya o Vadállat Oroszlán A fenti ábráról eszünkbe juthat, hogy a szemantikus hálóknál is hasonló dolgokról tanultunk. Példányosításnak hívjuk azt a folyamatot, amelynek során egy osztályból létrehozunk egy objektumot, amit a későbbiekben már példánynak fogunk hívni. Dolgozni csak a példányokkal fogunk tudni. A könnyebb érthetőség kedvéért nézzünk meg egy példát a valós életből. Példa: Tekintsük a fákat. Mindenki tudja, hogy a fáknak milyen tulajdonságaik vannak: van levelük, törzsük, tudjuk az életkorukat stb. Tudjuk, hogy a fák nőnek, kivágják őket stb. A fák egy osztály, ami két dologból áll: tulajsondágokból: o fajta o életkor o magasság stb viselkedésből (metódusokból) o növekedés() o lombhullatás() o kivágás() stb. PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 2

Ezek a tulajdonságok és metódusok nagyjából minden fára igazak. Azonban dolgozni mindig csak egy-egy konkrét fával tudunk. Tehát az osztályok csak a fák elméleti leírását végzik, de amikor pl.: a tölgyfát vesszük figyelembe a kertünkben, akkor az fizikai valóságában létezik, konkrét magassága van, ősszel tapasztaljuk, hogy hullatja a leveleit stb. Ugye mindenki érzi, hogy utóbbi esetben nem osztályról, hanem egy konkrét objektumról, az osztály egy példányáról van szó. Így működik ez a Java nyelvben is. Amikor programot írunk, akkor osztályokat hozunk létre és azokat használjuk fel. Mint azt az elmúlt órán is láttuk egy osztályt biztosan létre kell hoznunk, amelyből lehetőségünk lesz más osztályokat is használni. Az UML (Unified Modelling Language) az objektumorientált modellezés alapnyelvévé vált. Az UML jelölésrendszerben a Fák osztály a következőképpen néz ki: Fak eletkor : String fajta : String levelekszama : int +lobmhullatas(); +kivagas(); Az osztály neve Az osztály tulajdonságai Az osztály metódusai A nyelvben az elnevezési konvenciók a következők: Az osztály nevét nagy kezdőbetűvel kezdjük. Összetett szó esetén a részeket is nagybetűvel írjuk Az objektumok nevét kis kezdőbetűvel írjuk. Összetett szó esetén a részeket nagybetűvel írjuk, továbbá az objektumok nevét aláhúzzuk. Az objektum és az osztály közötti kapcsolatot a következőképpen jelöljük: Fak eletkor : String fajta : String levelekszama : int lobmhullatas() kivagas() egytolgy: Fak eletkor=50 fajta=tolgy levelekszáma=99999 PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 3

Az ábrán láthatunk egy Fák osztályt és egy egytölgy nevű objektumot. A szaggatott vonal jelzi, hogy utóbbi a Fák osztály egy példánya. Azok kedvéért akiknek a fás példa nem szimpatikus, álljon itt még egy példa: Ha körbenézünk a világban, rengeteg embert látunk körülöttünk. Nagyon jól tudjuk, hogy az ismert mondás teljesen igaz, miszerint Nincs két egyforma ember. Ha most az a feladatunk, hogy állítsunk össze egy osztályt, akkor mindenkinek eszébe jut, hogy készítsünk egy Ember osztályt. Egy ember tulajdonságai közé tartozhat (a fához hasonlóan) az életkora, de nevet is rendelhetünk egy emberhez. Ha azt akarjuk megállapítani, hogy milyen metódusok rendelhetők az emberhez, akkor olyan igét kell keresnünk, ami az emberrel kapcsolatos. Ilyen viselkedés például az, hogy képesek vagyunk járni, és táplálkozni. Az osztálydiagram tehát a következők szerint írható fel: Ember eletkor : int nev : String labakszama : int +megy() +eszik() jancsika : Ember eletkor=11 nev=kiss János labakszama=4 kittike : Ember eletkor=23 nev=rapp Kitti labakszama=4 Természetesen egy osztálynak több példánya is lehet. PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 4

5. Az UML jelölési rendszer A tantárgynak nem célja a teljes, szabványos UML jelölési rendszer bemutatása. Az UML-el részletesen foglalkozik az Információs rendszerek fejlesztése című tantárgy. A következőkben csak néhány fontosabb jelölési elemet foglalunk össze annak érdekében, hogy a feladatok megoldása során jó kiindulópont legyen egy UML diagram: Az osztályt nagy kezdőbetűvel jelöljük. Az objektumot kis kezdőbetűvel jelöljük, és aláhúzzuk (esetenként kettősponttal elválasztva megadjuk az osztály nevét is. Pl.: egyfa : Fak ) Osztályváltozókat és osztálymetódusokat (statikus tagokat) aláhúzással jelöljük Hozzáférési módosítók jelölése: o public: + o private: - o protected: # Szokás még kettősponttal elválasztva megadni a változók típusát Metódusok esetében a paraméterlista is megadható 6. Osztályok használata a Java-ban Az osztálydefiníció két részből áll: Változók deklarálása Metódusok leírása A változók lehetnek példányváltozók és osztályváltozók. Példányváltozók esetén a változó értéke a példányosítás során inicializálódnak, értékük példányonként más és más lehet. Az osztályváltozók nem a példányokhoz tartoznak, hanem az osztályhoz. Az osztályváltozó értéke az összes példány számára ugyanaz. Az osztályváltozókat a static kulcsszóval lehet megkülönböztetni, UML-ben pedig aláhúzással jelöljük a fent említett módon. Például egy Család osztályban a keresztnév példányváltozó, mert minden egyes családtagra nézve más és más (lehet) az értéke, de a családnevet érdemes osztályváltozóként definiálni, mert az mindenkinél ugyanazt az értéket jelenti. A változók és függvények deklarációja előtt tehát módosítók állhatnak: Hozzáférési módosítók o public: mindenki hozzáférhet a változóhoz (+) o private: az adott osztályon kívül nem férhet hozzá senki (-) o protected: kizárólag ebből az osztályból és az osztály utódaiból lehet elérni (#) Egyéb módosítók o static: osztálytag (statikus tag) o final: végleges, nem módosítható PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 5

o abstract: üres metódus, ezt majd egy utódosztályban kell kifejteni Az osztálydefiníció: Osztályokat a class kulcsszóval tudunk definiálni: modosito class Osztálynév { // osztály törzs } A class kulcsszó előtt is szerepelhetnek módosítók: public: az adott osztály hozzáférhető más csomagokból is abstract: ezek az osztályok nem példányosíthatók final: nem terjeszthető ki A különböző osztályokat célszerű külön fordítási egységben rögzíteni, és a fájl nevének kötelező az osztály nevét adni! Ha egy fordítási egységbe szeretnénk több osztályt definiálni, akkor figyelnünk kell arra, hogy csak egyetlen publikus osztály lehet (ez tartalmazza a main() osztálymetódust) és a fájl nevének meg kell egyeznie ezen publikus osztály nevével. 7. Objektumok használata a Java-ban A korábbiakban láthattuk, hogy az objektumokat az osztályok példányosításával lehet létrehozni. A példányosítás menete a következő: Diak jancsika; Jancsika = new Diak(); Ilyenkor a new operátor lefoglalja az objektum használatához szükséges tárterületet. A példányokon keresztül nyílik lehetőség az osztály változóinak és metódusainak eléréséhez a pont operátor használatával: Példa: String nev; nev = jancsika.nev; jancsika.megy(x,y); PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 6

8. Konstruktorok használata a Java-ban A gyakorlaton bemutatott példákon tapasztalhattuk, hogy a példány változóit magunknak kellett inicializálni. Kívánatos lenne, ha már a példányosítás során lehetőségünk lenne a változók inicializálására. Ezt hivatott megoldani a konstruktor. A konstruktor olyan programkód, amely a példányosításkor automatikusan végrehajtódik. Itt lesz lehetőségünk az objektum változóit beállítani illetve kedvünk szerint indíthatunk akár metódusokat is. A konstruktor nevének meg kell egyeznie az osztály nevével. A konstruktor a példányosítás során az osztály nevében átadott adatokat kapja paraméterül. Felhívom a figyelmet, hogy lehetőségünk van többféle szignatúrájú (paraméterezésű) konstruktor előállítására is. Konstruktor készítése: public class Diak { String diaknev; int diakeletkor; public Diak(String nev, int eletkor) { az egyik konstruktor this.diaknev = nev; this.diakeletkor = eletkor; } public Diak(String nev) { a másik konstruktor this.diaknev = nev; this.eletkor = 20; } } PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 7

A fenti kódrészlethez tartozó példányosítás a következőképpen működik: Diak jancsika, pistike; jancsika = new Diak( Kiss János, 18); // példányosítás az első konstruktor használatával pistike = new Diak ( Nagy Pisti ); // példányosítás a második konstruktor használatával Biztosan sokakban felmerül a kérdés, hogy mi történt azokban a példákban, amikor még nem írtunk konstruktorokat. Abban az esetben automatikusan létrejött egy paraméterek nélküli konstruktor, ami a változóknak beállítja az alapértelmezés szerinti értéket. Miután létrehoztunk egy új konstruktort, a rendszer már nem foja létrehozni az automatikusat. Megjegyzés: A this kulcsszó egy objektumreferencia, ami az aktuális osztályra hivatkozik. (Az ősosztályra a super kulcsszóval hivatkozhatunk) PTE-PMMK oktatási segédanyag Készítette: Gyurák Gábor (info@gyurak.hu) 8