1.06k likes | 1.17k Views
Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08. 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
E N D
Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08
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.
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őd-het. 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, • valós (pl: 2.3 2. .3), • 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
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;
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);
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ő • ~, ! ld. később • 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;
Additív operátorok +, - • Relációs operátorok <, <=, >, >=,==, != • Logikai operátorok • !nem • &, &&és • |, ||vagy • ^kizáró vagy • Bitenkénti operátorok • ~komplementálás • &, |, ^ • (<<,>>,>>>léptetések)
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): { ... }
Értékadó utasítás, típuskonverziók • 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
Értékadó utasítás, típuskonverziók int i;double d; d = i; //implicit bővítő konverzió i = d; //szintaktikai hiba i = (int)d; //explicit szűkítő konv.
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);
Kiugrás a ciklusból • Breakutasítás: az aktuális utasításblokk-ból (pl. ciklusból) való azonnali kiugrást eredményezi. • Continue utasítás: hatására a vezérlés az utasításblokk (ciklus) végére kerül.
Metódusok írása • A metódus fej szintaktikája:[módosítók] visszatérésitípusmetódusneve( [paraméterlista] ) • Néhány példa: • public static int min(int a, int b) • public void vonalhuz() • public void vonalhuz(int hossz) • long fakt(byte n)//csomag szintű láthatóság • Módosítók lehetnek: • public, private, protected: láthatóság • static: osztálymetódus • stb.
Függvény, eljárás • A metódusoknak két fajtáját különböztetjük meg: • Eljárás–szerű metódus: visszatérési értékének típusa void, azaz üres típus, nem tér vissza értékkel • Függvény–szerű metódus: visszatérési értéké-nek típusa valamilyen voidtól különböző típus, azaz igazi értékkel tér vissza • A függvény eljárásként is hívható.
Metódusok jellemzői • Túlterhelés (overloading): lehet két egyforma nevű, de különböző paraméterezésű metódus. pl. vonalhuz() ill. vonalhuz(int hossz) vagy min(int a, int b) ill. min(double a, double b) • Paraméterátadás: érték szerinti. Az aktuális paraméter típusának értékadás szerint kompatíbilisnek kell lennie a formális paraméterrel. • Visszatérés a metódusból: függvény esetén return után kötelezően meg kell adnunk egy értéket.
Metódusok jellemzői • Az osztály metódusainak deklarálási sor-rendje tetszőleges. A main-t elsőnek vagy utolsónak célszerű megadni. • A metódusok nem ágyazhatóak egymásba. • Lehet rekurzív metódusokat is definiálni. • A metódusban –mint egyébként is bármely blokkban– definiálhatunk lokális változót.
public class Metodusok{ public static void vonalhuz(int hossz){ for (int i=1; i<=hossz; i++) System.out.print("-"); System.out.println(); } public static void vonalhuz(){ vonalhuz(50); } public static int abs(int n){ if (n>=0) return n; else return -n; }
public static int jegySzam(int n){ int jszam=0; do{ n/=10; jszam++; }while(n!=0); return jszam; } public static void main(String[] args){ int a=-10; int b=12345678; vonalhuz(); System.out.println(a+" abszolut erteke: "+abs(a)); vonalhuz(40); System.out.println(b+" jegyeinek szama: "+jegySzam(b)); vonalhuz(); } }
A String osztály A String osztályú objektum olyan szöveg tárolására szolgál, amelynek értékét nem akarjuk megváltoztatni. (Ha mégis szeretnénk, akkor ne a String, hanem a Stringbuffer osztályt használ-juk, de ezzel nem foglalkozunk.)
Objektum létrehozása a new operátorral Auto auto; //csak referencia auto = new Auto("GHJ123”); //a konstruktor hívásával létrejön az objektum, //az auto referencia erre mutat vagy Auto auto = new Auto("GHJ123”); Osztályazonosító objektum = new Osztályazonosító(paraméterlista);
String objektum létrehozása String szoveg; //csak referencia szoveg = new String(”Ez a tartalma”); csak String esetén ez egyszerűsíthető: szoveg=”Ez a tartalma”;