Professional Documents
Culture Documents
OOP vs struktúrálatlan
programozás
Az objektum-orientált programozás a klasszikus
struktúrált programozásnál jóval hatékonyabb
megoldást képes nyújtani a legtöbb problémára.
Az osztályok újrafelhasználásának támogatásával
nagymértékben tudja csökkenteni a szoftverek
fejlesztéséhez szükséges időt.
Az objektumorientált programozás abban különbözik
leginkább a struktúrálatlan programozási módszerektől,
hogy a programrészeket, hasonló feladatokat, de főleg
hasonló feladatokon dolgozó adatokat és az azokat
felhasználó metódusokat csokorba foglaljuk.
Az objektum-orientált programozás jobban igyekszik
közelíteni a világban lejátszódó valódi folyamatokhoz.
Az OOP alapfogalmai
Osztály
Objektum, példány, egyed
Osztálydefiníció
példányváltozók
osztályváltozók
metódusok
konstruktor
destruktor
inicializáló blokk
Hozzáférési jogok
Egységbezárás
Adatelrejtés
Osztály létrehozása
Egy egyed egy osztály megvalósítása, más
szóval példányosítása. Javaban ezt így érjük
el:
Object objektum = new Object()
Ilyenkor lefut az osztály konstruktora, ahol
meghatározhatjuk a kezdőértékeket,
inicializálhatjuk az objektumot.
Egy osztálynak lehetnek példányváltozói, illetve
osztályváltozói. Előbbiből minden egyes
példányosított egyedhez kerül egy-egy, míg
osztályváltozóból az összes azonos osztályból
példányosított egyedhez csak egy. Ugyanez
érvényes az eljárásokra is.
Java esetén egy osztály definíciója és
deklarációja, azaz az eljárások feje és
megvalósítása nem szétválasztható, mint
például C++-ban.
Példa - Autó
Valósítsunk meg egy Autó osztályt
Javaban!
package pelda002; // az osztályt tartalmazó csomag
public class Auto { //az osztály kezdete
// az osztály megvalósítása
} //az osztály vége
Autó
- benzinár: int
- tipus: String
- km_ora: double
- benzin: double
- ferohely: int
+Auto(tipus: String, fogyasztas: double,
ferohely: double)
+Auto(tipus: String, fogyasztas: double,
ferohely: double, km_ora: double)
+költség(km: double): double
+fuvar (km: double)
+tankol (l: double)
+toString(): String
Példa – Autó - változók
Ahogy C++-ban, úgy a Javában is felsorolhatunk
változókat, de a Java megengedi, hogy iniciáljuk is azokat.
Változó deklarációja:
[módosítók] típus változó [inicializáció]
Minden osztály példányosításakor lefut egy
konstruktor. Ennek neve – ahogy C++-ban is
– megegyezik az osztály nevével, és nincs
visszatérési értéke.
Minden osztálynak létezik konstruktora,
legfeljebb az üres, mégha nem is hozzuk
létre, lefut.
Konstruktorból lehet több is, túlterhelésükre
ugyanaz vonatkozik, mint a függvények
túlterhelésére.
Példa – Autó - Konstruktor
public Auto(String tipus, double fogyasztas, int ferohely){
this.tipus=tipus;
this.fogyasztas=fogyasztas;
this.km_ora=0;
this.benzin=0;
this.ferohely=ferohely;
}
public double benzin_ora(){
return benzin;
}
A Javában minden egyednek van egy függvénye,
ami szöveges információt hordoz a példányról,
ez a public String toString() függvény, amit ha
nem hozunk létre, az objektumunk örököl az
ősosztálytól (erről bővebben később).
public String toString(){
return tipus + ", benzin: " + benzin_ora() + ",
km: " + km_ora();
}
További osztály-elemek
(említés szintjén, a példába ne
foglaljuk őket):
inicializációs blokk (vagy blokkok), ami még a
konstruktor előtt lefut, és azokon a változókon
dolgozhat, amiket már előtte definiáltunk (mindez a az
osztály törzsében, metóduson kívül).
String s0;
{
s0 = new String("es-null"); // inic. blokkon kívül
ezt nem szabadna!
}
Javában a Garbage-collector elvégzi helyettünk a
memória tisztítását, de néha szükség lehet valamiféle
destruktor jellegű metódusra. Erre szolgál a Finalize,
illetve a classFinalize metódus:
protected void Finalize() throws Throwable {}
static void classFinalize() throws Throwable {}
Módosítók összessége
Osztály:
public: Az osztály bárki számára látható
final: Végleges, nem lehet tovább
bővíteni. Az öröklődésnél lesz róla szó
bővebben.
abstract: Az öröklődésnél lesz róla szó,
csak bővíteni lehet, példányosítani nem.
(Üres): Üres gyakorlatilag úgy
használható, mint a public, a csomagra
vonatkozóan
Módosítók összessége
Bővítsük ki az Autó osztályát, és rögtön írjuk
bele az új változóinkat!
Polimorfizmus:
/**
* Busz konstruktora
* @param tipus A busz márkája
* @param fogyasztas //A busz fogyasztása
* @param ferohely // Férőhelyek száma
* @param kmdij //A buszvezető bére kilométerenként
*/
public Busz(String tipus, double fogyasztas, int ferohely,
double kmdij){
super(tipus,fogyasztas, ferohely, kmdij);
}
Busz megvalósítás
/**
* A fuvar ára egy vonaljegy. Most csak egy embert viszunk
* csak hogy felul tudjuk irni a Taxi fuggvenyet
*/
public double fuvar(double km){
if(halad(km)==km){ //a halad(int km)-t nem irtuk felul.
penztarca+=jegyar – km_dij*km;
return km;
}
else return 0;
}
Busz megvalósítás
/**
* Fuvar több főre.
* @param km Megtett út
* @param fo Utasok száma
* @return Megtett kilométerek száma
*/
public double fuvar(double km, int fo){
if(halad(km)==km){
penztarca+=fo*jegyar - km*kmdij;
return km;
}
else return 0;
}
Busz megvalósítása
/**
* A fuvarozó cég összköltsége. Tegyük fel, hogy
* az utasok végig utazták az utat.
* @param km A megtett kilométerek száma
* @param fo Utasok száma
* @return Költség forintban
*/
public double Haszon(double km, int fo){
return fo*jegyar - koltseg(km);
}
/**
* Akárhányan is utazunk akármennyit, csak egy
vonaljegyet veszünk.
*/
public double koltseg_per_fo(double km, int fo){
return jegyar;
}
Általánosítás
A specializálással ellentétes fejlesztés az
általánosítás.
Tegyük fel, hogy létre akarok hozni egy kerékpár
típust. Szintén lenne néhány közös jellemzője az
autóval.
Hozzunk létre egy jármű osztályt, de úgy, hogy azt ne
lehessen példányosítani, azaz legyen abstract!
Ilyenkor amelyik függvényt abstract jelzővel illetjük,
azt az utódnak muszáj felülírnia. Ez esetben a halad(),
illetve a költség() metódus lehet ilyen.
Az autóból természetesen át kell tenni néhány
változót, azokat, amik a kerékpárral, illetve
általánosságban egy járművel egyeznek!
Valósítsuk meg a járművet!
public abstract class Jarmu {
protected String tipus;
protected double km_ora;
protected int ferohely;