1.71k likes | 1.89k Views
Előadó: dr. Nagy Mihály PHD, főiskolai tanár. Programozási technológiák. 2007/2008. 1. Az Objektumorientált programozás (OOP) főbb jellemzői. Objektum, osztály.
E N D
Előadó: dr. Nagy Mihály PHD, főiskolai tanár Programozási technológiák 2007/2008
Objektum, osztály • Objektum: Információkat tárol, és kérésre feladatokat hajt végre. Logikailag összetartozó adatok és rajtuk dolgozó algoritmusok összessége: • adatok • metódusok • Az objektumot üzenetek (kérelmek) által lehet megkérni a feladatok elvégzésére. (Ez egy metódus végrehajtását jelenti.) • Osztály (class): Objektumtípus, amely alapján példá-nyokat, azaz objektumokat hozhatunk létre.
Előnyök, célok • A szoftverfejlesztés során az együtt változó részek elkülöníthetők • Projektek közötti újrahasznosíthatóság növelése
Konstruktor, példánytag, osztálytag • Az objektumot létre kell hozni, és inicializálni kell. Az inicializálást végző metódust konstruktornak nevezzük. • További fogalmak: • példányváltozó, • példánymetódus, • osztályváltozó (közös változó), • osztálymetódus (objektum létrehozása nélkül is tud dolgozni, csak az osztályváltozókat manipulálhatja)
OOP jellemzők • Bezárás, az információ elrejtése: az adatokat csak interfészeken (metódusok) keresztül lehet elérni. • Öröklődés: az utód osztály örökli az ős adatait, metódusait, valamint tartalmazhat újakat, és felülírhat régi metódusokat. • Polimorfizmus – többalakúság: ugyanarra az üzenetre (kérelemre), azaz metódus hívásra, különböző objektumok különbözőképpen reagál-hatnak.
Láthatóság • Az osztály deklarálásakor megadhatjuk, hogy mely adatokat lehet az objektumon kívülről elérni • Nyilvános (public): kívülről elérhető • Védett (protected): hozzáférés csak saját és az örökös metódusok számára • Privát (private): hozzáférés csak saját metó-dusok számára
OO nyelvek • Simula-67 • Smalltalk (70’ eleje, XEROX) • Hibrid nyelvek: C++, Turbo Pascal • Java: ’91-96, SUN MicroSystem
A Java főbb jellemzői • C++-- kevesebb nyelvi eszköz, szigorúbb, kötöttebb, kevesebb hibalehetőség • Hordozható kód: egy virtuális gépen (JVM, Java Virtual Machine) futó ún. bájtkód. Nincsenek implementációfüggő elemek. • Rohamos fejlődés kulcsa a JVM beépítése a Web böngészőkbe. • Fejleszthető: • Alkalmazás (application) • Applet • Servlet • JSP (Java Server Pages)
JDK (Java Development Kit) • Fejlesztői és futtató környezet (java.sun.com) Részei: • API (Application Programming Interface) – osztály-könyvtár (a Java egyik ereje a rengeteg kész osztály) • Fordító • Értelmező • Appletnéző • Help, stb • Újabb neve: pl. J2SE (Java 2 Platform, Standard Edition) • Csomag: logikailag összetartozó osztályok. Csomag struktúra – könyvtár struktúra.
public class Hello{ public static void main(String[] args){ System.out.println("Hello World!"); }} • A Hello nevű osztály publikus, más csomagokból is látni lehet. • A main metódus a program belépési pontja. • Publikus • A static kulcsszó azt jelenti, hogy ez osztálymetódus • void: nincs visszatérési értéke, azaz eljárás • String[] args: a parancssor paraméterek • A System egy osztály, amelyben található egy out objektum, melynek a println egy metódusa.
Kiírás, beolvasás import extra.*; //importálni kell azon osztályokat, csomagokat, //amelyekre hivatkozunk ... int egysegar, mennyiseg, ar; //4 b. egész típus egysegar=Console.readInt("Egységár: "); mennyiseg=Console.readInt("Mennyiség: "); ar=egysegar*mennyiseg; System.out.println("Ön " + mennyiseg + " l benzint tankolt összesen " + ar + "Ft értékben"); //a System osztály a java.lang csomagban van //benne, amit nem kell importálnunk
Kiírás, beolvasás • A Console osztály metódusai (függvényei): int readInt() int readInt(String str) Hasonlóan: readLong, readDouble, readChar, readLine • A print és println metódusoknak egyetlen paramé-terük lehet, de az többféle típusú. Ha egyszerre több dolgot is ki szeretnénk íratni, akkor ezeket össze kell adnunk. A Java automatikusan szöveggé konvertál. • Pl. print("a+b=" + a + b) • Pl. print("a+b=" + (a + b))
A program alkotóelemei • Azonosítóban betűk, számjegyek, a _ jel és a valuta szimbólumok szerepelhetnek. Számjeggyel nem kezdődhet. Akár ékezetes betűt is tartalmazhat (unikód), de ezt inkább kerüljük. • Kulcsszó • Literál: állandó, amely beépül a program kódjába. Lehet: • egész (automatikusan int típusú, lehet hexad., decimális, oktális), • valós (pl: 2.3 2. .3 6e23), • logikai (true, false), • karakter (pl. '?', '\u1ac5' ), • szöveg (pl. "valami"), • null. Vezérlő szekvenciák: \n \t \" \' \\ pl. println("Egy idézet: \"Talpra magyar!\"")
Java típusok • Primitív típusok: (numerikus vagy logikai) • byte 1 b. -128 .. 127 • short 2 b. -32768 .. 32767 • int 4 b. kb -2*109 .. 2*109 • long 8 b. kb. -1019 .. 1019 • float 4 b. • double 8 b. • char 2 b. • boolean • Referencia típus: olyan mutató, mely egy objektum hivatkozását tartalmazza. Numerikus típusok
A char is numerikus típus char c; int a; c=65; System.out.println(c); c='A'+1; System.out.println(c); a=c+1; System.out.println(a);
float • 4 bájt • Kb. 1.4E-45 … 3.4E+38 • 6-7 jegy pontosság • double • 8 bájt • Kb. 5E-324 … 1.8E+308 • 14-15 jegy pontosság
Változó deklarálás • Deklaráló utasítás • Adható kezdőérték is (inicializálás). • Pl: int a, b; double x, y = 2.4;
Forrásprogram szerkezete • A forrásállomány (fordítási egység) egy vagy több osztályból állhat. • A forrásállomány neve a main metódust tartalmazó egyetlen publikus osztály neve lesz. • Fordításkor több class kiterjesztésű állo-mány keletkezhet.
import java.utils.*; import extra.*; //Egy vagy több osztály deklarálása, a sorrend mindegy class C1{ ... } class C2{ ... } ... public class Prog{ ... public static void main(String[] args){ ... } ... }
Operátorok • Unáris postfix és prefix operátorok • [ ] tömbképző • . minősítő • ( ) metódus képző • ~, ! bitenkénti, ill. logikai tagadás00 • new példányosító • (típus)kifejezés típuskényszerítő • +, - előjel • ++, -- léptető, pl. i++ vagy ++i mindkettő növeli i értékét, de az első értéke i eredeti, míg a második i megnövelt értéke lesz.
++, -- int a = 0, b, c; b = ++a; a = 0; c = a++; c = ++b + a++; c = a+++++b; c = a++ + ++b;
Multiplikatív operátorok • *, / • % maradékos osztás • Ha az operandusok egészek, akkor az eredmény is egész, ha legalább az egyik operandus valós, akkor az eredmény is valós. • Pl.int ossz = 2 + 3; double atlag = ossz / 2; • Megj. A maradékképzés valós számokra is alkalmazható
Additív operátorok +, - • Relációs operátorok (az eredmény boolean típusú lesz) <, <=, >, >=,==, != • Logikai operátorok • !nem • &, &&és(teljes, ill. rövid kiértékelésű) • |, ||vagy • ^kizáró vagy • Bitenkénti operátorok • ~komplementálás • &, |, ^ • <<,>>,>>>léptetések (>>>: minden esetben 0 lép be)
Feltételes operátorok (feltétel) ? kifejezés1: kifejezés2pl. kamat = (fiz>200000)?10:0; • Értékadó operátorok =, +=, -=, *=, /=, %= … Az összetett értékadás szintaktikája: változóoperátor = kifejezés a += b szemantikája: változó = (típus) változóoperátor kifejezésa = a + b ahol típus a változó típusa, amelyet rákényszerí-tünk a jobboldalra.
Értékadó operátorok • Vigyázzunk az összetett ill. a „hagyományos értékadó utasítások nem minden esetben teljesen egyformák! int a=10; a+=5; megegyezik az a=a+5 ut.-al, mindkét oldal int a+=1.5; nem egyezik meg az a=a+1.5 ut.-al, mely szintaktikai hibás, hiszen a jobb oldal double • Lehetséges a többszörös értékadás, pl: a=b=5;
Kiértékelés • Egy kifejezés kiértékelési sorrendjétmeg-határozzák: • zárójel • prioritás • asszociativitás (balról – jobbra vagy jobbról – balra szabály)
Java utasítások • deklaráló; pl. int a; • értékadó; pl. a = b * 2; • postfix és prefix növelő és csökkentő; pl. a++; • metódushívás, pl. System.out.println("Hahó!"); • példányosítás, pl. auto = new Auto("ABC123"); • Programvezérlő, pl. elágazások, ciklusok • üres: ;
Java utasítások • Minden utasítást pontosvessző zár le. • Blokk (vagy összetett utasítás): { ... }
Típuskonverziók • A Java erősen típusos nyelv • Típuskonverzió lehet • automatikus (implicit) • kényszerített (explicit): (típus)kifejezéstype cast illetve • szűkítő • bővítő
Primitív típusok esetén egy szűkebb adattípus értéke konvertálható egy bővebb adattípus értékébe információ-vesztés nélkül. Ez általában automatikus. int i;double d;byte b;short s; b + s //implicit bővítő konverzió (int) d = i; //implicit bővítő konverzió i = d; //szintaktikai hiba i = (int)d; //explicit szűkítő konv.
Numerikus operátorok típuskonverziói • Automatikus konverziók a következő szabályok szerint: • Unáris operátorok: ha az operandus int-nél szűkebb, akkor int-é konvertál, egyébként nem konvertál • Bináris operátorok: mindkét operandust a kettő közül bővebb, de minimum int-é konvertálja (Az egész literál automatikusan int, a valós literál automatikusan double)
Értékadó utasítás • változó = kifejezés; • A kifejezés típusának értékadás szerint kompatíbilisnek kell lenni a változó típusával: • azonos típusok • a jobb oldal szűkebb, akkor implicit bővítő konverzió • a bal oldal byte, short vagy char, a jobb oldal int, és a fordító el tudja dönteni, hogy a jobboldal belefér a baloldalba, akkor implicit szűkítő konverzió. pl. byte b = 100; (az egész literál automatikusan int típusú). • minden más esetben fordítási hiba keletkezik
Metódushívás • Osztály.metódus(paraméterek) pl. y=Math.sin(x); • Objektum.metódus(paraméterek)pl. hossz=szoveg.length(); • Saját osztályból elég csak a metódus neve: metódus(paraméterek) • Egy metódus lehet eljárás- vagy függvényszerű. • Túlterhelés (overloading): lehet több azonos nevű metódus, melyek a paraméterezésben és/vagy a visszatérési érték típusában térhetnek el egymástól. Pl. float max(float a, float b) illetve int max(int a, int b)
A java.lang.Math osztály • Java API (Application Programming Interface): rengeteg csomag, osztály • Nem kell importálni. • Konstansok: E, PI • Függvények: abs, asin, sin, cos, atan, tan, exp, log, max, min, pow, sqrt, toDegrees, toRadians, random, round…
min • public static int min(int a, int b) • Returns the smaller of two int values. That is, the result the argument closer to the value of Integer.MIN_VALUE. If the arguments have the same value, the result is that same value. • Parameters: • a - an argument. • b - another argument. • Returns: • the smaller of a and b. • See Also: • Long.MIN_VALUE
Szelekciók - if utasítás if(a>b) c=a;else c=b; if(feltétel)utasítás1;elseutasítás2; • feltétel: logikai kifejezés • az else ág elhagyható • a feltétel után nincs pontosvessző • az utasítás esetén viszont van pontosvessző • minden feltétel zárójelben • egy ágban több utasítás: blokk {...} • egymásba ágyazás
Szelekciók - switch utasítás switch(kifejezés){ case érték1: utasítások; break; case érték2: utasítások; break; ... default: utasítások;} • akkor alkalmazható, ha egy kifejezés jól meghatározott, különálló értékeire szeretnénk bizonyos utasításokat végrehajtani • kifejezés: byte, short, int vagy char • a break hatására a switch blokk végére kerül a vezérlés, e nélkül a következő case ágra kerülne a vezérlés • egy case kulcsszóhoz csak egy érték tartozhat
Szelekciók - switch utasítás switch(pont){ case 1: case 2: case 3: System.out.println("Elégtelen"); System.out.println("Készüljön tovább!"); break; case 4: System.out.println("Elégséges"); break; case 5: System.out.println("Közepes"); break; case 6: System.out.println("Jó"); break; default: System.out.println("Jeles"); }
Iterációk - while utasítás while(feltétel)utasítás; • Amíg a feltétel igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. • Több utasítás esetén: blokk { ... } Példa: Bankba tesszük a pénzünket kamatozni, és addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet kell várnunk.
Iterációk - while utasítás import extra.*; public class Milliomos1{ public static void main(String[]args){ final double KAMAT=8.5; //konstans int ev=0; int penz=Console.readInt("Összeg: "); while(penz<1000000){ penz*=1+KAMAT/100; //Ft-ra kerekít ev++; } System.out.println(ev+ " ev mulva leszunk milliomosok!"); } }
Iterációk - do...while utasítás doutasítás;while(feltétel) • Amíg a feltétel igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. • Több utasítás esetén: blokk { ... } Példa: Bankba tesszük a pénzünket kamatozni, és addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet kell várnunk.
Iterációk - do...while utasítás import extra.*; public class Milliomos2{ public static void main(String[]args){ final double KAMAT=8.5; //konstans int ev=0; int penz=Console.readInt("Összeg: "); do{ penz*=1+KAMAT/100; //Ft-ra kerekít ev++; }while(penz<1000000); System.out.println(ev+ " ev mulva leszunk milliomosok!"); } }
Iterációk - for utasítás for(inicializálás; feltétel; léptetés)utasítás; • inicializálás: egy vagy több utasítás vesszővel elválasztva, mely(ek) egyszer hajtódik végre a ciklusmagba való első belépés előtt. Pl. ciklusváltozó deklarálása, inicializálása. A ciklusváltozó típusa tetszőleges. • feltétel: amíg igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép. • léptetés: egy vagy több utasítás vesszővel elválasztva, mely(ek) a ciklusmag minden egyes lefutása után automatikusan végrehajtódik. Általában a ciklusváltozót szokás itt növelni vagy csökkenteni.
Iterációk - for utasítás A while ciklus egy speciális esetének tekinthető: for(inicializálás; feltétel; léptetés)utasítás; inicializálás;while(feltétel){utasítás;léptetés}
Iterációk - for utasításpéldák for(int i=1; i<=10; i++) System.out.print("*"); for(int i=1; i<=10; i++){ for(int j=1; j<=10; j++) System.out.print("*"); System.out.println();}
for(char c='A'; c<='Z'; c++) System.out.print(c+" "); //(c+' ') esetén a kódokat írja ki for(char n='A',k='a'; n<='Z'; n++,k++) System.out.print(n+" "+k+" "); for(double d=500000; d<=1000000; d*=1.1) System.out.println(d);