Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08.

Hasonló előadás


Az előadások a következő témára: "Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08."— Előadás másolata:

1 Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08

2 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 (): Objektumtípus, amely alapján példá- nyokat, azaz objektumokat hozhatunk létre.  Osztály ( class ): Objektumtípus, amely alapján példá- nyokat, azaz objektumokat hozhatunk létre.

3 OO nyelvek  Simula-67  Smalltalk (70’ eleje, XEROX)  Hibrid nyelvek: C++, Turbo Pascal  Java: ’91-96, SUN MicroSystem

4 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)

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

6  A nevű osztály publikus, más csomagokból is látni lehet.  A Hello nevű osztály publikus, más csomagokból is látni lehet.  A metódus a program belépési pontja.  A main metódus a program belépési pontja.  Publikus  A kulcsszó azt jelenti, hogy ez osztálymetódus  A static kulcsszó azt jelenti, hogy ez osztálymetódus  : nincs visszatérési értéke, azaz eljárás  void : nincs visszatérési értéke, azaz eljárás  : a parancssor paraméterek  String[] args : a parancssor paraméterek  A egy osztály, amelyben található egy out objektum, melynek a egy metódusa.  A System egy osztály, amelyben található egy out objektum, melynek a println egy metódusa. public class Hello{ public static void main(String[] args){ System.out.println("Hello World!"); } }

7 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

8 Kiírás, beolvasás  A Console osztály metódusai (függvényei): int readInt() int readInt(String str) Hasonlóan: Hasonlóan: readLong, readDouble, readChar, readLine  A és 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.  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.  Pl. print("a+b=" + a + b)  Pl.  Pl. print("a+b=" + (a + b))

9 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: ),  valós (pl: ),  logikai (),  logikai ( true, false ),  karakter (pl., ),  karakter (pl. '?', '\u1ac5' ),  szöveg (pl. ),  szöveg (pl. "valami" ), .  null. Vezérlő szekvenciák: Vezérlő szekvenciák: \n \t \" \' \\ pl. pl. println("Egy idézet: \"Talpra magyar!\"")

10 Java típusok  Primitív típusok: (numerikus vagy logikai)  byte1 b  short2 b  int4 b.kb -2* *10 9  long8 b.kb  float4 b.  double8 b.  char2 b.  boolean  Referencia típus: olyan mutató, mely egy objektum hivatkozását tartalmazza. Numerikus típusok

11 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;

12 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);

13 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 metódust tartalmazó egyetlen publikus osztály neve lesz.  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.

14 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){... }... }

15 Operátorok  Unáris postfix és prefix operátorok  tömbképző  [ ] tömbképző  minősítő . minősítő  metódus képző  ( ) metódus képző  ld. később  ~, ! ld. később  példányosító  new példányosító  típuskényszerítő  (típus)kifejezés típuskényszerítő  előjel  +, - 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.  ++, -- 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.

16 ++, -- int a = 0, b, c; b = ++a; a = 0; c = a++; c = ++b + a++; c = a+++++b;

17 Multiplikatív operátorok   *, /  maradékos osztás  % 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;

18  Additív operátorok +, -  Relációs operátorok, >=,==, !=  Logikai operátorok  nem  ! nem  és  &, && és  vagy  |, || vagy  kizáró vagy  ^ kizáró vagy  Bitenkénti operátorok  komplementálás  ~ komplementálás   &, |, ^  (léptetések)  ( >,>>> léptetések)

19  Feltételes operátorok pl. (feltétel) ? kifejezés1: kifejezés2 pl. kamat = (fiz>200000)?10:0;  Értékadó operátorok =, +=, -=, *=, /=, %= … Az összetett értékadás szintaktikája: változó operátor = kifejezés 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és szemantikája: változó = (típus) változó operátor kifejezés a = a + b ahol típus a változó típusa, amelyet rákényszerí- tünk a jobboldalra.

20 É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 ut.-al, mindkét oldal int megegyezik az a=a+5 ut.-al, mindkét oldal int a+=1.5; nem egyezik meg az ut.-al, mely szintaktikai hibás, hiszen a jobb oldal double 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:  Lehetséges a többszörös értékadás, pl: a=b=5;

21 Kiértékelés  Egy kifejezés kiértékelési sorrendjét meg- határozzák:  zárójel  prioritás  asszociativitás (balról – jobbra vagy jobbról – balra szabály)

22 Java utasítások  deklaráló; pl.  deklaráló; pl. int a;  értékadó; pl.  értékadó; pl. a = b * 2;  postfix és prefix növelő és csökkentő; pl.  postfix és prefix növelő és csökkentő; pl. a++;  metódushívás, pl.  metódushívás, pl. System.out.println("Hahó!");  példányosítás, pl.  példányosítás, pl. auto = new Auto("ABC123");  Programvezérlő, pl. elágazások, ciklusok  üres:  üres: ;

23 Java utasítások  Minden utasítást pontosvessző zár le.  Blokk (vagy összetett utasítás):  Blokk (vagy összetett utasítás): {... }

24 É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 vagy, a jobb oldal, és a fordító el tudja dönteni, hogy a jobboldal belefér a baloldalba, akkor implicit szűkítő konverzió. pl. (az egész literál automatikusan típusú).  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

25 É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.

26 Metódushívás  pl.  Osztály.metódus(paraméterek) pl. y=Math.sin(x);  pl.  Objektum.metódus(paraméterek) pl. hossz=szoveg.length();  Saját osztályból elég csak a metódus neve:  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. illetve Pl. float max(float a, float b) illetve int max(int a, int b)

27 A java.lang.Math osztály  Java API (Application Programming Interface): rengeteg csomag, osztály  Nem kell importálni.  Konstansok:  Konstansok: E, PI  Függvények:  Függvények: abs, asin, sin, cos, atan, tan, exp, log, max, min, pow, sqrt, toDegrees, toRadians, random, round…

28 Java API dokumentum részlet static int Returns the smaller of two int values. min(int a, int b) Returns the smaller of two int values. min static long Returns the smaller of two long values. min(long a, long b) Returns the smaller of two long values. static double Returns of value of the first argument raised to the power of the second argument. pow(double a, double b) Returns of value of the first argument raised to the power of the second argument. static double Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. random() Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0.

29 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

30 Szelekciók - utasítás Szelekciók - if utasítás if(feltétel) utasítás1; else utasítás2;  : logikai kifejezés  feltétel : logikai kifejezés  az ág elhagyható  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 if(a>b) c=a; else c=b;

31 Szelekciók - utasítá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  : byte, short, int vagy char  kifejezés : byte, short, int vagy char  a hatására a blokk végére kerül a vezérlés, e nélkül a következő ágra kerülne a vezérlés  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 kulcsszóhoz csak egy érték tartozhat  egy case kulcsszóhoz csak egy érték tartozhat

32 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"); } Szelekciók - utasítás Szelekciók - switch utasítás

33 Iterációk - utasítás 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. 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.

34 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< ){ penz*=1+KAMAT/100; //Ft-ra kerekít ev++; } System.out.println(ev+ " ev mulva leszunk milliomosok!"); } } Iterációk - utasítás Iterációk - while utasítás

35 Iterációk - do...while utasítás do utasí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. 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.

36 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< ); System.out.println(ev+ " ev mulva leszunk milliomosok!"); }

37 Iterációk - for utasítás for(inicializálás; feltétel; léptetés) utasítá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.  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.  : amíg igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép.  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.  : 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.  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.

38 Iterációk - for utasítás A ciklus egy speciális esetének tekinthető: 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 }

39 Iterációk - for utasítás pé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(); }

40 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<= ; d*=1.1) System.out.println(d);

41 Kiugrás a ciklusból  utasítás: az aktuális utasításblokk- ból (pl. ciklusból) való azonnali kiugrást eredményezi.  Break utasítás: az aktuális utasításblokk- ból (pl. ciklusból) való azonnali kiugrást eredményezi.  utasítás: hatására a vezérlés az utasításblokk (ciklus) végére kerül.  Continue utasítás: hatására a vezérlés az utasításblokk (ciklus) végére kerül.

42 Metódusok írása  A metódus fej szintaktikája:  A metódus fej szintaktikája: [módosítók] visszatérésitípus metó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:  : láthatóság  public, private, protected : láthatóság  : osztálymetódus  static : osztálymetódus  stb.

43 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, azaz üres típus, nem tér vissza értékkel  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 tól különböző típus, azaz igazi értékkel tér vissza  Függvény–szerű metódus: visszatérési értéké- nek típusa valamilyen void tó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ó.

44 Metódusok jellemzői  Túlterhelés (overloading): lehet két egyforma nevű, de különböző paraméterezésű metódus. pl. ill. vagy ill.  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 után kötelezően meg kell adnunk egy értéket.  Visszatérés a metódusból: függvény esetén return után kötelezően meg kell adnunk egy értéket.

45 Metódusok jellemzői  Az osztály metódusainak deklarálási sor- rendje tetszőleges. A -t elsőnek vagy utolsónak célszerű megadni.  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.

46 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; }

47 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= ; vonalhuz(); System.out.println(a+" abszolut erteke: "+abs(a)); vonalhuz(40); System.out.println(b+" jegyeinek szama: "+jegySzam(b)); vonalhuz(); } }

48 A osztály A String osztály A osztályú objektum olyan szöveg tárolására szolgál, amelynek értékét nem akarjuk megváltoztatni. 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, hanem a osztályt használ- juk, de ezzel nem foglalkozunk.) (Ha mégis szeretnénk, akkor ne a String, hanem a Stringbuffer osztályt használ- juk, de ezzel nem foglalkozunk.)

49 Objektum létrehozása a operátorral 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 mutatvagy Auto auto = new Auto("GHJ123”); Osztályazonosító objektum = new Osztályazonosító(paraméterlista);

50 objektum létrehozása String objektum létrehozása String szoveg; //csak referencia szoveg = new String(”Ez a tartalma”); String csak String esetén ez egyszerűsíthető: szoveg=”Ez a tartalma”;

51 A osztály metódusai A String osztály metódusai Az eredeti objektumot nem változtatják, függvények, sokszor új String objektumot hoznak létre. Néhány metódus: char charAt(int index) tetszőleges indexű karakterét adja vissza, az indexelés 0- val kezdődik int compareTo(String str) összehasonlítja, értéke 0, ha egyenlő; –, ha kisebb; +, ha nagyobb, mint a paraméter

52 boolean equals(Object anObject) igaz, ha az objektum String típusú, s karakterei ugyanazok int indexOf(String str) az adott sztring első előfordulásának pozíciója lesz az értéke, ha nincs benne, akkor érték –1 int indexOf(String str, int fromIndex) az adott sztring első előfordulásának pozíciója lesz az értéke, a keresést a második paraméterben megadott sorszámú karak- tertől kezdi, ha nincs benne, akkor az érték –1 int length() hosszát adja vissza

53 String replace(char oldChar, char newChar) kicseréli a megadott karaktereket, s visszaadja az új sztringet (maga a sztring objektum nem változik meg) String substring(int beginIndex) a paraméterben megadott pozíciótól a szöveg végéig kimásol String substring(int beginIndex, int endIndex) a kezdő pozíciótól a végpozícióig kimásol, endIndex nem tartozik bele a részláncba, így a visszaadott sztring hossza endIndex- beginIndex String toLowerCase() kisbetűsre alakítottan adja vissza String toUpperCase() nagybetűsre alakítottan adja vissza

54 String trim() levágja a fehér szóközöket (space, tab, sorvégejel) az elejéről és végéről, s visszaadja Stb. Ezek példánymetódusok, hívásuk: objektumnév.metódusnév([paraméterlista]) pl: int hossz = szoveg.length(); Sztringet bekérni a billentyűzetről az extra csomagbeli Console osztály readLine() metódusával lehet. pl: String nev = Console.readLine("A neved: ");

55 1. példa String s = Console.readLine(); for(int i=s.length()-1; i>=0; i--) System.out.print(s.charAt(i)); System.out.println(); System.out.println(s.toUpperCase()); System.out.println(s.toLowerCase()); if(s.length()>=9) System.out.println(s.substring(0,9)); if(s.length()>=3) System.out.println(s.substring(s.length()-3)); System.out.println(s.replace(' ','-'));

56 2. példa String s=Console.readLine(); String elso=s; while(!s.equals("*")){ if(s.compareTo(elso)<0) elso=s; s=Console.readLine(); } System.out.println(elso);

57 Osztály készítése

58 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 (): Objektumtípus, amely alapján példá- nyokat, azaz objektumokat hozhatunk létre.  Osztály ( class ): Objektumtípus, amely alapján példá- nyokat, azaz objektumokat hozhatunk létre.

59 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

60 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)

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

62 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

63 OO program fut vezérlő objektum objektum1 üzenet3 üzenet1 objektum2 objektum3 üzenet2üzenet1 Egy objektumorientált program egymással kommunikáló objektumok összessége, melyben minden objektumnak megvan a feladatköre

64 Példa - Ember osztály és példányai pozíció(x,y) iránySzög megy(táv) elmegy(x,y) fordul(szög) Ember kati andor zsófi

65 Az OOP fontosabb definícióinak összefoglalása  Példánydeklaráció (példánytag):  A példányonként (objektumonként) helyet foglaló változók a példányváltozók (példányadatok).  Azon metódusokat, melyek példányadatokon dolgoznak, példánymetódusoknak nevezzük.  Osztálydeklaráció (osztálytag) ()  Osztálydeklaráció (osztálytag) ( static )  Az osztályváltozó az osztály saját változója, az egyes példányokban nem szerepel, valamilyen közös adatot tárol.  Az osztálymetódus az osztály saját metódusa, amely csak osztályváltozókon dolgozik.

66 Láthatóság  Privát (): csak az osztály saját metódusai fér- hetnek hozzá.  Privát ( private ): csak az osztály saját metódusai fér- hetnek hozzá.  Nyilvános (): minden, az objektummal kapcsolat- ban álló kliens eléri, használhatja.  Nyilvános ( public ): minden, az objektummal kapcsolat- ban álló kliens eléri, használhatja.  Egy osztály adatai általában privát adatok.  Egy fordítási egység (java fájl) több osztályt is tartalmaz- hat, de közülük csak egy lehet nyilvános (). Ha valamelyik osztályban szerepel a metódus, akkor az nyilvános kell hogy legyen.  Egy fordítási egység (java fájl) több osztályt is tartalmaz- hat, de közülük csak egy lehet nyilvános ( public ). Ha valamelyik osztályban szerepel a main metódus, akkor az nyilvános kell hogy legyen.

67  Egy osztályban ugyanazon a néven dekla- rálható metódus és változó, sőt a metódu- sok túlterhelhetőek.  A deklarálás sorrendje általában:  változók  konstruktorok  metódusok  metódus, ha van.  main metódus, ha van.

68  A lokális változók eltakarják az ugyanolyan nevű osztály-, illetve példányváltozókat.  Ha az osztály deklarációjára szeretnénk hivat- kozni, akkor osztályváltozó esetén az osztály nevével, példányváltozó esetén pedig a this referenciával kell azt minősítenünk.  Változók alapértelmezés szerinti kezdeti értékei: osztályváltozó vagy példányváltozó esetén 0, lokális változó esetén határozatlan.

69 Konstruktorok  Feladata az objektum operátorral való létrehozásakor annak inicializálása.  Feladata az objektum new operátorral való létrehozásakor annak inicializálása.   Auto auto = new Auto("GHJ123”);  A konstruktor speciális metódus, a következő szabályok érvényesek rá:  Neve kötelezően megegyezik az osztály nevével.  Csak a operátorral hívható.  Csak a new operátorral hívható.  Túlterhelhető.  Nincs visszatérési értéke, és nem is void.  Ha az osztályban nem adunk meg explicit módon konstruktort, akkor az osztálynak lesz egy alapértelmezés szerinti (default), paraméter nélküli konstruktora.  Ha az osztályban létezik egy explicit konstruktor, akkor nem lesz implicit, alapértelmezés szerinti konstruktora.

70 Példa - Raktárprogam   Adott egy zöldségraktár, melyben pillanatnyilag egyetlen árut, paradicsomot raktározunk. A raktárba gyakran te- szünk be, illetve veszünk ki onnan paradicsomot. A para- dicsom pillanatnyi egységára 300 Ft, de ez változhat. Készítsünk olyan programot, mely segítségével rögzíteni tudjuk a megfelelő adatokat, és bármikor jelentést tudunk adni a paradicsom aktuális mennyiségéről, egységáráról és értékéről!   Végezzük el a következő akciókat: Tegyünk a raktárba 125 kg paradicsomot, aztán vegyünk ki 25 kg-ot, majd szállítsuk le a paradicsom egységárát 210 Ft-ra! Mindhárom akció után írjuk ki, mennyi paradicsom van raktáron és milyen értékben!

71 Osztálydiagram RaktarProgram -aru -nev: String -egysegar: double -menny: double Aru +Aru(aNev:String,aEgysegar:double) +getNev(): String +getEgysegar(): double +setEgysegar(aEgysegar:double) +getMenny(): double +getAr(): double +hozzatesz(aMenny:double) +elvesz(aMenny:double) +toString(): String +RaktarProgram() +akciok() +main(args)

72 Osztálydiagram RaktarProgram -aru -nev: String -egysegar: double -menny: double Aru +Aru(aNev:String,aEgysegar:double) +getNev(): String +getEgysegar(): double +setEgysegar(aEgysegar:double) +getMenny(): double +getAr(): double +hozzatesz(aMenny:double) +elvesz(aMenny:double) +toString(): String +RaktarProgram() +akciok() +main(args)

73 class Aru { private String nev; private double egysegar; private double menny; public Aru(String aNev, double aEgysegar) { nev = aNev; egysegar = aEgysegar; menny = 0; } public String getNev() { return nev; } Példányváltozók Konstruktor Osztálydiagram

74 public double getEgysegar() { return egysegar; } public void setEgysegar(double aEgysegar) { if (aEgysegar >= 0) egysegar = aEgysegar; } public double getMenny() { return menny; } public double getAr() { return menny*egysegar; } Osztálydiagram

75 public void hozzatesz(double aMenny) { if (aMenny>0) menny += aMenny; } public void elvesz(double aMenny) { if (aMenny>0 && aMenny<=menny) menny -= aMenny; } public String toString() { return nev+"\tEgysegar: "+egysegar+ "\tMenny: "+menny+"\tAr: "+getAr(); } } Osztálydiagram

76 public class RaktarProgram { private Aru aru; public RaktarProgram() { aru = new Aru("Paradicsom",300); } public void akciok() { aru.hozzatesz(125); System.out.println(aru); aru.elvesz(25); System.out.println(aru); aru.setEgysegar(210); System.out.println(aru); } public static void main(String[] args) { RaktarProgram program = new RaktarProgram(); program.akciok(); } } Osztálydiagram Kapcsolat Objektum létrehozása saját osztályából

77 Együttműködési diagram RaktarProgram aru:Aru program: RaktarProgram 2: RaktarProgram() 4: akciok() 3: Aru(aNev,aEgysegar) 5: hozzatesz(aMenny) 6: elvesz(aMenny) 7: setEgysegar(aEgysegar) 1: main(args)

78 Osztálydiagram Bank -szamla1 -szamla2 -utolsoSzamlaSzam: int -szamlaSzam: int -tulajdonos: String -egyenleg: int Szamla +Szamla(tulajdonos:String,egyenleg:int) +Szamla(tulajdonos:String) +getTulajdonos(): String +setTulajdonos(Tulajdonos:String) +befizet(osszeg:int) +kivesz(osszeg:int): int +toString(): String +Bank() +ugyfelKiszolgalas (szamla:Szamla) +menu() +main(args) Példa – Bankprogam Készítsünk egy banki programot, mely az ügyfelek számláit kezeli.

79 import extra.*; class Szamla{ private static int utolsoSzamlaSzam=0; private int szamlaSzam; private String tulajdonos; private int egyenleg; public Szamla(String tulajdonos, int egyenleg){ szamlaSzam=++utolsoSzamlaSzam; this.tulajdonos=tulajdonos; this.egyenleg=egyenleg; } public Szamla(String tulajdonos){ this(tulajdonos,0); } public String getTulajdonos(){ return tulajdonos; }

80 public void setTulajdonos(String tulajdonos){ this.tulajdonos=tulajdonos; } public void befizet(int osszeg){ if(osszeg>=0) egyenleg+=osszeg; } public int kivesz(int osszeg){ if(osszeg>=0 && osszeg<=egyenleg) egyenleg-=osszeg; return egyenleg; } public String toString() { return "Szamlaszam: "+szamlaSzam+" Tulajd.: "+tulajdonos+ " Egyenleg: "+egyenleg; } }//Számla osztály vége

81 public class Bank { private Szamla szamla1, szamla2; public Bank() { szamla1 = new Szamla("Kiss Istvan", ); szamla2 = new Szamla("Nagy Peter"); } public void ugyfelKiszolgalas(Szamla szamla) { char valasz; do{ valasz=Character.toUpperCase(Console.readChar("B(efizet)/K(ivesz)")); }while(valasz!='B' && valasz!='K'); if (valasz == 'B') szamla.befizet(Console.readInt("Mennyit fizet be? ")); else{ int egyenleg = szamla.kivesz(Console.readInt("Mennyit vesz ki? ")); System.out.println("Maradek egyenleg "+egyenleg+" Ft"); } }

82 public void menu() { char valasz; do{ System.out.println("\n\n"+szamla1); System.out.println(szamla2); System.out.println("\n1: 1. ugyfel kiszolgalasa"); System.out.println("2: 2. ugyfel kiszolgalasa"); System.out.print ("V: Vege "); valasz = Character.toUpperCase(Console.readChar()); switch (valasz) { case '1': ugyfelKiszolgalas(szamla1); break; case '2': ugyfelKiszolgalas(szamla2); break; } }while (valasz!='V'); } public static void main(String[] args) { Bank otp = new Bank(); otp.menu(); } }//Bank osztály vége

83 Tömbök  A tömb referencia típusú változó, melyet deklarál- nunk kell. Az elemtípus lehet akár primitív, akár referencia (osztály típusú vagy tömb típusú).  Deklarálás:   elemtípus [] tömbazonosító;vagy   elemtípus tömbazonosító [];  pl:  pl: int [] a; int b[];

84  Az így deklarált változó képes egy, a megadott elemtípusú tömbre mutatni. Még csak a referenciának (memóriacímnek) foglaltunk helyet, a tömböt külön létre kell hoznunk.  Létrehozás (futás közben):   new elemtípus [méret]  pl:  pl: a = new int[10]; b = new int[20];  Természetesen történhet rögtön a deklaráláskor is a létrehozás:   String[] sTomb = new String[50];

85 Minden tömbnek van egy length konstansa. Indexelés: 0.. length-1 int[] iArray=new int[10]; for(int i=0; i=0; i--) System.out.print(iArray[i]+" "); for(int i=0; i<10; i++)

86 Tömb inicializálása  Inicializáló blokk: deklaráláskor a tömb elemeinek kezdeti értékek adhatók, pl:  int[] iArray={2, 4, 6, 8, 10};  char[] szamjegyek={'0','1','2','3','4','5','6','7','8','9'}  Ekkor nem kell a tömböt a new operátorral létrehozni, a {} blokk képző operátor megteszi ezt helyettünk.  A tömb mérete pontosan akkora lesz, amennyi a felsorolt értékek száma.

87 Értékadás tömbök között  A tömb értékadás szerint kompatibilis a tömbbel (azaz megengedett), ha  A t2 tömb értékadás szerint kompatibilis a t1 tömbbel (azaz t1=t2 megengedett), ha  primitív elemtípus esetén és elemtípusa azonos;  primitív elemtípus esetén t1 és t2 elemtípusa azonos;  referencia elemtípus esetén elemtípusa elem- típusával azonos, vagy annak leszármazottja.  referencia elemtípus esetén t2 elemtípusa t1 elem- típusával azonos, vagy annak leszármazottja.  Értékadáskor a tömb referenciája kap értéket, nem pedig az elemei (a tömb nem másolódik, hanem átíródik a mutatója), így különböző hosz- szúságú tömbök is értékül adhatók egymásnak.

88 Kétdimenziós tömb  Deklarálás:  Deklarálás: elemtípus [][] tömbazonosító;  Teljes kétdimenziós tömb létrehozása:   new elemtípus [méret0] [méret1]  Pl:  Pl: int[][] matrix  Lépésenkénti (soronkénti) létrehozás. A sorok különböző méretűek lehetnek, pl:   double[][] atlagok = new double[4][];   atlagok[0] = new double[20];   atlagok[1] = new double[18];   atlagok[2] = new double[25];   atlagok[3] = new double[22];  Analóg a helyzet a többdimenziós tömbök esetén. = new int[3][4];

89 Tömb paraméter  Formális paraméterként egy tömbreferenciát kell deklarálnunk, amely fogadja az aktuális tömb referenciáját.  Az aktuális tömbnek értékadás szerint kompatíbi- lisnek kell lennie a formális tömbbel.  Példa: Írjunk osztályt, amelynek adata egy tömb. Az objektum létrehozásakor a konstruktor paraméterében adhassuk meg a tömb hosszát. Tartalmazzon egy, és egy nevű metódust!  Példa: Írjunk osztályt, amelynek adata egy int tömb. Az objektum létrehozásakor a konstruktor paraméterében adhassuk meg a tömb hosszát. Tartalmazzon egy bekér, kiir és egy osszeg nevű metódust!

90 import extra.*; class Tomb{ private int[]t; public Tomb(int hossz){ t = new int[hossz]; } public void beker(){ for(int i=0; i

91 public class Tombok{ public static void main(String[] args){ Tomb t1=new Tomb(5); Tomb t2=new Tomb(7); System.out.println("Adja meg az 1. tomb elemeit (5):"); t1.beker(); System.out.println("Adja meg a 2. tomb elemeit (7):"); t2.beker(); System.out.println("Az elso tomb:"); t1.kiir(); System.out.println("Az elemek osszege: "+ t1.osszeg()); System.out.println("A masodik tomb:"); t2.kiir(); } }

92 Konténerek  A konténer olyan objektum, amely objektumokat tárol, és alkalmas különböző karbantartási, keresési és bejárási funkciók megvalósítására.  A java.util csomagban helyet foglaló kollekció keretrendszer egy általános konténereket tartalmazó osztálygyűjtemény.  Általánosan jellemző rájuk: ha bármilyen objektumot beteszünk egy konténerbe, az „elveszti az osztálytudatát”.

93 Vector osztály  „Változtatható méretű tömb”, amely ren- delkezik a fenti funkciókkal.  Mérete az elemek hozzáadásával automa- tikusan bővül.  Elemei indexelhetőek.  Elemei rendezetlenek (a Collections osztállyal lehet rendezni).

94 void add(int index, Object element) Inserts the specified element at the specified position in this Vector. addObject boolean add(Object o) Appends the specified element to the end of this Vector. addObject void clear() Removes all of the elements from this Vector. clear boolean contains(Object elem) Tests if the specified object is a component in this vector.containsObject Object get(int index) Returns the element at the specified position in this Vector.get int indexOf(Object elem) Searches for the first occurence of the given argument, testing for equalityindexOfObject using the equals method. int indexOf(Object elem, int index) Searches for the first occurence of the given argument, beginning the searchindexOfObject at index, and testing for equality using the equals method. boolean isEmpty() Tests if this vector has no components.isEmpty ObjectObject remove(int index) Removes the element at the specified position in this Vector.remove

95 boolean remove(Object o) Removes the first occurrence of the specified element in this VectorremoveObject If the Vector does not contain the element, it is unchanged. ObjectObject set(int index, Object element) Replaces the element at the specified position in this Vector withsetObject the specified element. int size() Returns the number of components in this vector. size StringString toString() Returns a string representation of this Vector, containingtoString the String representation of each element.

96 TörpeProgram -nev: String -magassag: int Ember +Ember(String,int) +Ember(String) +getNev(): String +getMagassag():int +setMagassag(int) +equals(Object): boolean +toString(): String TorpeProgram TorpeProgram() bevitel() lista() kereses() +main() * torpek {Vector}

97 import extra.*; import java.util.*; class Ember{ private String nev; private int magassag; public Ember(String nev, int magassag){ this.nev = nev; this.magassag = magassag; } public Ember(String nev){ this(nev,0); } public String getNev(){ return nev; } public int getMagassag(){ return magassag; }

98 public void setMagassag(int mag){ if (mag>0) magassag = mag; } public boolean equals(Object obj){ return nev.equals(((Ember)obj).getNev()); } public String toString(){ return Format.left(nev,10) + Format.right(magassag,3); } }//Ember osztály vége

99 public class TorpeProgram { private Vector torpek = new Vector(); // A torpék bevitele: void bevitel(){ Ember torpe; String nev = Console.readLine("\nTorpe neve: "); while (!nev.equals("")){ torpe = new Ember(nev); torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); nev = Console.readLine("Torpe neve: "); } }

100 void bevitel(){ Ember torpe; String nev = Console.readLine("\nTorpe neve: "); while(!nev.equals("")){ if(torpek.contains(torpe = new Ember(nev))) System.out.println("Van mar ilyen torpe!"); else{ torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); } nev = Console.readLine("Torpe neve: "); } } torpe = new Ember(nev)); if(torpek.contains(torpe)) System.out.println("Van mar ilyen torpe!"); else{ torpe.setMagassag(Console.readInt("magassaga : ")); torpek.add(torpe); } nev = Console.readLine("Torpe neve: "); } }

101 // Egyszerű lista, beépített módon: void lista1(){ System.out.println("\nBeepitett lista:"); System.out.println(torpek); } // torpek listázása index szerint, toString()-gel: void lista2(){ System.out.println("\nLista index szerint:"); for(int i=0; i

102 // Egy törpe megkeresése: void kereses() { System.out.println("\nKereses:"); Ember keresettEmber = new Ember( Console.readLine("Torpe neve: ")); int poz = torpek.indexOf(keresettEmber); if (poz >= 0) System.out.println("Van, magassaga:"+ ((Ember)(torpek.get(poz))).getMagassag()); else System.out.println("Nincs ilyen"); } public static void main(String[] args) { TorpeProgram tp = new TorpeProgram(); tp.bevitel(); tp.lista1(); tp.lista2(); tp.lista3(); tp.kereses(); } }

103  Készítsen egy KaveAutomata osztályt, melynek adatai: kávémárka, ár (Ft/dl), a tartályban lévő mennyiség, a tartály kapacitása.  A konstruktor paramétereken keresztül inicializálja a fajtát, az árat és a kapacitást, a tartály legyen tele.  Készítse el az alábbi metódusokat:  - beállító és lekérdező metódusok az árra.  - vesz: paraméterként adhatjuk meg, hogy hány dl-t veszünk, visszatérési érték a fizetendő összeg. Ha nincs a venni kívánt mennyiség a tartályban, akkor -1 legyen a visszatérési érték.  - feltölt: tele tölti a tartályt, visszatérési értéke a betöltött mennyiség.  - toString: az összes adat kiírására.  A vezérlő KaveProgram osztályban hozzon létre egy KaveAutomata osztályú objektumot, majd szimulálja a működését.

104 import extra.*; class KaveAutomata{ private String marka; private double ar; private double mennyiseg; private double kapacitas; public KaveAutomata(String marka, double ar, double kapacitas){ this.marka = marka; this.ar = ar; this.kapacitas = kapacitas; mennyiseg = kapacitas; } public double getAr(){ return ar; } public void setAr(double ar){ this.ar = ar; }

105 public double vesz(double menny){ if (menny<=mennyiseg){ mennyiseg-=menny; return menny*ar; } else{ return -1; } } public double feltolt(){ double kell=kapacitas-mennyiseg; mennyiseg=kapacitas; return kell; } public String toString(){ return "Marka: "+marka+"Ar: "+ar+"Kapacitas: "+kapacitas+ " Mennyiseg: "+mennyiseg; } }

106 KaveAutomata automata = new KaveAutomata("Omnia",100,50); double m=Console.readDouble("Hany decit: "); fiz = automata.vesz(m); if (fiz!=-1) System.out.println(fiz+" Ft-ot kell fizetnie"); else System.out.println("Nincs annyi"); System.out.println(automata); System.out.println("Feltoltes "+automata.feltolt()+" dl");


Letölteni ppt "Programozási nyelvek II. Objektumorientált programozás a Java nyelv eszközeivel 2007/08."

Hasonló előadás


Google Hirdetések