171
Programozási Programozási technológiák technológiák 2007/08 2007/08

Programozási technológiák

  • Upload
    lucky

  • View
    24

  • Download
    0

Embed Size (px)

DESCRIPTION

Programozási technológiák. 2007/08. 1. Az OOP főbb jellemzői. 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 - PowerPoint PPT Presentation

Citation preview

Page 1: Programozási technológiák

Programozási technológiákProgramozási technológiák

2007/082007/08

Page 2: Programozási technológiák

1. Az OOP főbb jellemzői1. Az OOP főbb jellemzői

Page 3: Programozási technológiák

Objektum, osztályObjektum, osztály

ObjektumObjektum: Információkat tárol, és kérésre : Információkat tárol, és kérésre feladatokat hajt végre. Logikailag összetartozó feladatokat hajt végre. Logikailag összetartozó adatok és rajtuk dolgozó algoritmusok adatok és rajtuk dolgozó algoritmusok összessége:összessége: adatokadatok metódusokmetódusok

Az objektumot üzenetek (kérelmek) által lehet Az objektumot üzenetek (kérelmek) által lehet megkérni a feladatok elvégzésére. (Ez egy megkérni a feladatok elvégzésére. (Ez egy metódus végrehajtását jelenti.)metódus végrehajtását jelenti.)

Osztály (Osztály (class): ): Objektumtípus, amely alapján Objektumtípus, amely alapján példá-nyokat, azaz objektumokat hozhatunk létre.példá-nyokat, azaz objektumokat hozhatunk létre.

Page 4: Programozási technológiák

Előnyök, célokElőnyök, célok

A szoftverfejlesztés során az együtt A szoftverfejlesztés során az együtt változó részek elkülöníthetőkváltozó részek elkülöníthetők

Projektek közötti Projektek közötti újrahasznosíthatóság növeléseújrahasznosíthatóság növelése

Page 5: Programozási technológiák

Konstruktor, példánytag, Konstruktor, példánytag, osztálytagosztálytag

Az objektumot létre kell hozni, és inicializálni Az objektumot létre kell hozni, és inicializálni kell. Az inicializálást végző metódust kell. Az inicializálást végző metódust konstruktornakkonstruktornak nevezzük. nevezzük.

További fogalmak: További fogalmak: példányváltozópéldányváltozó, , példánymetóduspéldánymetódus, , osztályváltozóosztályváltozó (közös változó), (közös változó), osztálymetódusosztálymetódus (objektum létrehozása nélkül is (objektum létrehozása nélkül is

tud dolgozni, csak az osztályváltozókat tud dolgozni, csak az osztályváltozókat manipulálhatja)manipulálhatja)

Page 6: Programozási technológiák

OOP jellemzőkOOP jellemzők

BezárásBezárás, az információ elrejtése: az , az információ elrejtése: az adatokat csak interfészeken (metódusok) adatokat csak interfészeken (metódusok) keresztül lehet elérni.keresztül lehet elérni.

ÖröklődésÖröklődés: az utód osztály örökli az ős : az utód osztály örökli az ős adatait, metódusait, valamint tartalmazhat adatait, metódusait, valamint tartalmazhat újakat, és felülírhat régi metódusokat.újakat, és felülírhat régi metódusokat.

Polimorfizmus Polimorfizmus – többalakúság: ugyanarra – többalakúság: ugyanarra az üzenetre (kérelemre), azaz metódus az üzenetre (kérelemre), azaz metódus hívásra, különböző objektumok hívásra, különböző objektumok különbözőképpen reagál-hatnak.különbözőképpen reagál-hatnak.

Page 7: Programozási technológiák

LáthatóságLáthatóság

Az osztály deklarálásakor Az osztály deklarálásakor megadhatjuk, hogy mely adatokat megadhatjuk, hogy mely adatokat lehet az objektumon kívülről elérnilehet az objektumon kívülről elérni Nyilvános (Nyilvános (publicpublic): kívülről elérhető): kívülről elérhető Védett (Védett (protectedprotected): hozzáférés csak ): hozzáférés csak

saját és az örökös metódusok számárasaját és az örökös metódusok számára Privát (Privát (privateprivate): hozzáférés csak saját ): hozzáférés csak saját

metó-dusok számárametó-dusok számára

Page 8: Programozási technológiák

2. A Java nyelv 2. A Java nyelv

Page 9: Programozási technológiák

OO nyelvekOO nyelvek

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

Page 10: Programozási technológiák

A Java főbb jellemzői A Java főbb jellemzői

C++-- kevesebb nyelvi eszköz, szigorúbb, C++-- kevesebb nyelvi eszköz, szigorúbb, kötöttebb, kevesebb hibalehetőségkötöttebb, kevesebb hibalehetőség

Hordozható kód: egy virtuális gépen (JVM, Hordozható kód: egy virtuális gépen (JVM, Java Virtual Machine) futó ún. bájtkód. Java Virtual Machine) futó ún. bájtkód. Nincsenek implementációfüggő elemek. Nincsenek implementációfüggő elemek.

Rohamos fejlődés kulcsa a JVM beépítése a Rohamos fejlődés kulcsa a JVM beépítése a Web böngészőkbe.Web böngészőkbe.

Fejleszthető: Fejleszthető: Alkalmazás (application)Alkalmazás (application) AppletApplet ServletServlet JSP (Java Server Pages)JSP (Java Server Pages)

Page 11: Programozási technológiák

JDK (Java Development Kit) JDK (Java Development Kit) Fejlesztői és futtató környezet Fejlesztői és futtató környezet

(java.sun.com) Részei:(java.sun.com) Részei: API (Application Programming Interface) – API (Application Programming Interface) –

osztály-könyvtár (a Java egyik ereje a rengeteg osztály-könyvtár (a Java egyik ereje a rengeteg kész osztály)kész osztály)

FordítóFordító ÉrtelmezőÉrtelmező AppletnézőAppletnéző Help, stbHelp, stb

Újabb neve: pl. J2SE (Java 2 Platform, Újabb neve: pl. J2SE (Java 2 Platform, Standard Edition)Standard Edition)

Csomag: logikailag összetartozó osztályok. Csomag: logikailag összetartozó osztályok. Csomag struktúra – könyvtár struktúra.Csomag struktúra – könyvtár struktúra.

Page 12: Programozási technológiák

A A Hello nevű osztály publikus, más nevű osztály publikus, más csomagokból is látni lehet.csomagokból is látni lehet.

A A main metódus a program belépési pontja. metódus a program belépési pontja. PublikusPublikus A A static kulcsszó azt jelenti, hogy ez kulcsszó azt jelenti, hogy ez

osztálymetódusosztálymetódus void: nincs visszatérési értéke, azaz eljárás: nincs visszatérési értéke, azaz eljárás String[] args: a parancssor paraméterek: a parancssor paraméterek

A A System egy osztály, amelyben található egy egy osztály, amelyben található egy outout objektum, melynek a objektum, melynek a println egy egy metódusa.metódusa.

public class Hello{ public static void main(String[] args){ System.out.println("Hello World!"); }}

Page 13: Programozási technológiák

Kiírás, beolvasásKiírás, beolvasásimport extra.*;//importálni kell azon osztályokat, csomagokat, //amelyekre hivatkozunk...int egysegar, mennyiseg, ar; //4 b. egész típusegysegar=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

Page 14: Programozási technológiák

Kiírás, beolvasásKiírás, beolvasás

A Console osztály metódusai (függvényei):A Console osztály metódusai (függvényei): int readInt() int readInt(String str) Hasonlóan: Hasonlóan: readLong, readDouble, readChar, readLine

A A print és és println metódusoknak egyetlen metódusoknak egyetlen paramé-terük lehet, de az többféle típusú. Ha paramé-terük lehet, de az többféle típusú. Ha egyszerre több dolgot is ki szeretnénk íratni, egyszerre több dolgot is ki szeretnénk íratni, akkor ezeket össze kell adnunk. A Java akkor ezeket össze kell adnunk. A Java automatikusan szöveggé konvertál. automatikusan szöveggé konvertál.

Pl. Pl. print("a+b=" + a + b) Pl. Pl. print("a+b=" + (a + b))

Page 15: Programozási technológiák

A program alkotóelemeiA program alkotóelemei AzonosítóbanAzonosítóban betűk, számjegyek, a _ jel és a valuta betűk, számjegyek, a _ jel és a valuta

szimbólumok szerepelhetnek. Számjeggyel nem kezdődhet. szimbólumok szerepelhetnek. Számjeggyel nem kezdődhet. Akár ékezetes betűt is tartalmazhat (unikód), de ezt inkább Akár ékezetes betűt is tartalmazhat (unikód), de ezt inkább kerüljük.kerüljük.

KulcsszóKulcsszó LiterálLiterál: állandó, amely beépül a program kódjába. Lehet:: állandó, amely beépül a program kódjába. Lehet:

egész (automatikusan int típusú, lehet hexad., decimális, egész (automatikusan int típusú, lehet hexad., decimális, oktális), oktális),

valós (pl: valós (pl: 2.3 2. .3 6e23), ), logikai (logikai (true, false), ), karakter (pl. karakter (pl. '?', , '\u1ac5' ), ), szöveg (pl. szöveg (pl. "valami"), ), null..

Vezérlő szekvenciákVezérlő szekvenciák: : \n \t \" \' \\pl. pl. println("Egy idézet: \"Talpra magyar!\"")

Page 16: Programozási technológiák

Java típusokJava típusok

Primitív típusok: (numerikus vagy logikai)Primitív típusok: (numerikus vagy logikai) bytebyte 1 b.1 b. -128 .. 127-128 .. 127 shortshort 2 b.2 b. -32768 .. 32767-32768 .. 32767 intint 4 b.4 b. kb -2*10kb -2*1099 .. 2*10 .. 2*1099

longlong 8 b.8 b. kb. -10kb. -101919 .. 10 .. 101919

floatfloat 4 b.4 b. doubledouble 8 b.8 b. charchar 2 b.2 b. booleanboolean

Referencia típus: olyan mutató, mely egy Referencia típus: olyan mutató, mely egy objektum hivatkozását tartalmazza.objektum hivatkozását tartalmazza.

Numerikus típusok

Page 17: Programozási technológiák

A char is numerikus típusA 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);

Page 18: Programozási technológiák

floatfloat 4 bájt4 bájt Kb. Kb. 1.4E-45 … 3.4E+381.4E-45 … 3.4E+38 6-7 jegy pontosság6-7 jegy pontosság

doubledouble 8 bájt8 bájt Kb. Kb. 5E-324 … 1.8E+3085E-324 … 1.8E+308 14-15 jegy pontosság14-15 jegy pontosság

Page 19: Programozási technológiák

Változó deklarálás Változó deklarálás

Deklaráló utasításDeklaráló utasítás Adható kezdőérték is (inicializálás). Adható kezdőérték is (inicializálás). Pl:Pl: int a, b;

double x, y = 2.4;

Page 20: Programozási technológiák

Forrásprogram szerkezeteForrásprogram szerkezete

A forrásállomány (fordítási egység) A forrásállomány (fordítási egység) egy vagy több osztályból állhat. egy vagy több osztályból állhat.

A forrásállomány neve a A forrásállomány neve a main metódust tartalmazó egyetlen metódust tartalmazó egyetlen publikus osztály neve lesz.publikus osztály neve lesz.

Fordításkor több class kiterjesztésű Fordításkor több class kiterjesztésű állo-mány keletkezhet.állo-mány keletkezhet.

Page 21: Programozási technológiák

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

Page 22: Programozási technológiák

OperátorokOperátorok

Unáris postfix és prefix operátorokUná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ő ~, ! bitenkénti, ill. logikai bitenkénti, ill. logikai

tagadás00tagadás00 new példányosítópéldányosító (típus)kifejezés típuskényszerítőtípuskényszerítő +, - előjelelőjel ++, -- léptető, pl. i++ vagy ++i léptető, pl. i++ vagy ++i

mindkettő növeli i értékét, de az első értéke 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.eredeti, míg a második i megnövelt értéke lesz.

Page 23: Programozási technológiák

++, --++, --

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

c = ++b + a++;c = a+++++b;c = a++ + ++b;

Page 24: Programozási technológiák

Multiplikatív operátorokMultiplikatív operátorok

*, / % maradékos osztás maradékos osztás Ha az operandusok egészek, akkor az Ha az operandusok egészek, akkor az

eredmény is egész, ha legalább az egyik eredmény is egész, ha legalább az egyik operandus valós, akkor az eredmény is operandus valós, akkor az eredmény is valós.valós.

Pl.Pl. int ossz = 2 + 3;double atlag = ossz / 2;

Megj. A maradékképzés valós számokra is alkalmazható

Page 25: Programozási technológiák

Additív operátorokAdditív operátorok+, -

Relációs operátorok (az eredmény boolean típusú Relációs operátorok (az eredmény boolean típusú lesz)lesz)<, <=, >, >=,==, !=

Logikai operátorokLogikai operátorok ! nemnem &, && ésés (teljes, ill. rövid kiértékelésű) |, || vagyvagy ^ kizáró vagykizáró vagy

Bitenkénti operátorokBitenkénti operátorok ~ komplementáláskomplementálás &, |, ^ <<,>>,>>> léptetések (léptetések (>>>>>>: minden esetben 0 lép be): minden esetben 0 lép be)

Page 26: Programozási technológiák

Feltételes operátorokFeltételes operátorok(feltétel) ? kifejezés1: kifejezés2 pl. pl. kamat = (fiz>200000)?10:0;

Értékadó operátorokÉrtékadó operátorok=, +=, -=, *=, /=, %= …

Az összetett értékadás szintaktikája: Az összetett értékadás szintaktikája: változóváltozó operátor operátor = = kifejezés kifejezés a += b szemantikája: szemantikája: változóváltozó = ( = (típustípus) ) változóváltozó operátor kifejezésoperátor kifejezés a = a + bahol ahol típustípus a változó típusa, amelyet a változó típusa, amelyet rákényszerí-tünk a jobboldalra.rákényszerí-tünk a jobboldalra.

Page 27: Programozási technológiák

Értékadó operátorokÉrtékadó operátorok

Vigyázzunk az összetett ill. a „hagyományos Vigyázzunk az összetett ill. a „hagyományos értékadó utasítások nem minden esetben értékadó utasítások nem minden esetben teljesen egyformák!teljesen egyformák!int a=10;a+=5;megegyezik az megegyezik az a=a+5 ut.-al, mindkét oldal int ut.-al, mindkét oldal inta+=1.5;nem egyezik meg az nem egyezik meg az a=a+1.5 ut.-al, mely ut.-al, mely szintaktikai hibás, hiszen a jobb oldal doubleszintaktikai 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;

Page 28: Programozási technológiák

KiértékelésKiértékelés

Egy kifejezés kiértékelési sorrendjétEgy kifejezés kiértékelési sorrendjét meg-határozzák:meg-határozzák: zárójelzárójel prioritásprioritás asszociativitás (balról – jobbra vagy asszociativitás (balról – jobbra vagy

jobbról – balra szabály)jobbról – balra szabály)

Page 29: Programozási technológiák
Page 30: Programozási technológiák

Java utasításokJava 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, ciklusokProgramvezérlő, pl. elágazások, ciklusok üres: üres: ;

Page 31: Programozási technológiák

Java utasításokJava utasítások

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

Page 32: Programozási technológiák

TípuskonverziókTípuskonverziók

A Java erősen típusos nyelvA Java erősen típusos nyelv Típuskonverzió lehetTípuskonverzió lehet

automatikus (implicit)automatikus (implicit) kényszerített (explicit): kényszerített (explicit): ((típustípus))kifejezéskifejezéstype casttype cast

illetveilletve szűkítőszűkítő bővítőbővítő

Page 33: Programozási technológiák

Primitív típusok esetén egy szűkebb adattípus Primitív típusok esetén egy szűkebb adattípus értéke konvertálható egy bővebb adattípus értékébe értéke konvertálható egy bővebb adattípus értékébe információ-vesztés nélkül. információ-vesztés nélkül.

Ez általában automatikus.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.

Page 34: Programozási technológiák

Numerikus operátorok Numerikus operátorok típuskonverzióitípuskonverziói

Automatikus konverziók a következő Automatikus konverziók a következő szabályok szerint:szabályok szerint: Unáris operátorok: ha az operandus Unáris operátorok: ha az operandus intint-nél -nél

szűkebb, akkor szűkebb, akkor intint-é konvertál, egyébként -é konvertál, egyébként nem konvertálnem konvertál

Bináris operátorok: mindkét operandust a kettő Bináris operátorok: mindkét operandust a kettő közül bővebb, de minimum közül bővebb, de minimum intint-é konvertálja-é konvertálja

(Az egész literál automatikusan int, a valós literál (Az egész literál automatikusan int, a valós literál automatikusan double)automatikusan double)

Page 35: Programozási technológiák

Értékadó utasításÉrtékadó utasítás

változó = kifejezés; A kifejezés típusának értékadás szerint A kifejezés típusának értékadás szerint

kompatíbilisnek kell lenni a változó típusával:kompatíbilisnek kell lenni a változó típusával: azonos típusokazonos típusok a jobb oldal szűkebb, akkor implicit bővítő a jobb oldal szűkebb, akkor implicit bővítő

konverziókonverzió a bal oldal a bal oldal byte, short vagy vagy char, a jobb oldal , a jobb oldal int, és a fordító el tudja dönteni, hogy a jobboldal , és a fordító el tudja dönteni, hogy a jobboldal belefér a baloldalba, akkor implicit szűkítő belefér a baloldalba, akkor implicit szűkítő konverzió. konverzió. pl. pl. byte b = 100; (az egész literál automatikusan (az egész literál automatikusan int típusú). típusú).

minden más esetben fordítási hiba keletkezikminden más esetben fordítási hiba keletkezik

Page 36: Programozási technológiák

MetódushívásMetódushívás Osztály.metódus(paraméterek)

pl. pl. y=Math.sin(x); Objektum.metódus(paraméterek)

pl. 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ű. Egy metódus lehet eljárás- vagy függvényszerű. Túlterhelés (overloading): lehet több azonos nevű Túlterhelés (overloading): lehet több azonos nevű

metódus, melyek a paraméterezésben és/vagy a metódus, melyek a paraméterezésben és/vagy a visszatérési érték típusában térhetnek el visszatérési érték típusában térhetnek el egymástól.egymástól.

Pl. Pl. float max(float a, float b) illetve illetve int max(int a, int b)

Page 37: Programozási technológiák

A java.lang.Math osztályA java.lang.Math osztály

Java API (Application Programming Java API (Application Programming Interface): rengeteg csomag, osztályInterface): rengeteg csomag, osztály

Nem kell importálni.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…

Page 38: Programozási technológiák

Java API dokumentum Java API dokumentum részletrészlet

static int static int min(int a, int b)           Returns the smaller of two int values.           Returns the smaller of two int values.

static longstatic long min(long a, long b)           Returns the smaller of two long           Returns the smaller of two long values. values.

static doublestatic double pow(double a, double b)           Returns of value of the first argument           Returns of value of the first argument raised to the power of the second argument. raised to the power of the second argument.

static doublestatic double random()           Returns a double value with a positive           Returns a double value with a positive sign, greater than or equal to 0.0 and less sign, greater than or equal to 0.0 and less than 1.0. than 1.0.

Page 39: Programozási technológiák

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

Page 40: Programozási technológiák

Szelekciók - Szelekciók - if utasítás utasítás if(feltétel) utasítás1;else utasítás2;

feltétel: logikai kifejezés: logikai kifejezés az az else ág elhagyható ág elhagyható a feltétel után nincs pontosvesszőa feltétel után nincs pontosvessző az utasítás esetén viszont van pontosvesszőaz utasítás esetén viszont van pontosvessző minden feltétel zárójelbenminden feltétel zárójelben egy ágban több utasítás: blokk {...}egy ágban több utasítás: blokk {...} egymásba ágyazásegymásba ágyazás

if(a>b) c=a;else c=b;

Page 41: Programozási technológiák

Szelekciók - Szelekciók - switch utasítás 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 akkor alkalmazható, ha egy kifejezés jól meghatározott, különálló értékeire szeretnénk meghatározott, különálló értékeire szeretnénk bizonyos utasításokat végrehajtanibizonyos utasításokat végrehajtani

kifejezés: byte, short, int vagy char: byte, short, int vagy char a a break hatására a hatására a switch blokk végére kerül a blokk végére kerül a

vezérlés, e nélkül a következő vezérlés, e nélkül a következő case ágra kerülne ágra kerülne a vezérlésa vezérlés

egy egy case kulcsszóhoz csak egy érték tartozhat kulcsszóhoz csak egy érték tartozhat

Page 42: Programozási technológiák

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 - Szelekciók - switch utasítás utasítás

Page 43: Programozási technológiák

Iterációk - Iterációk - while utasítás utasítás

while(feltétel) utasítás;

Amíg a feltétel igaz, újból végrehajtja az utasítást, 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.ha hamis, akkor a ciklust követő utasításra lép.

Több utasítás esetén: blokk { ... }Több utasítás esetén: blokk { ... }

Példa:Példa: Bankba tesszük a pénzünket kamatozni, és Bankba tesszük a pénzünket kamatozni, és

addig tartjuk bent, amíg milliomosok nem addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet leszünk. A program számolja ki, hogy hány évet kell várnunk.kell várnunk.

Page 44: Programozási technológiák

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

Page 45: Programozási technológiák

Iterációk - do...while Iterációk - do...while utasításutasítás

do utasítás; while(feltétel)

Amíg a feltétel igaz, újból végrehajtja az utasítást, Amíg a feltétel igaz, újból végrehajtja az utasítást, haha hamis, akkor a ciklust követő utasításra lép. hamis, akkor a ciklust követő utasításra lép. Több utasítás esetén: blokk { ... }Több utasítás esetén: blokk { ... }

Példa:Példa: Bankba tesszük a pénzünket kamatozni, és Bankba tesszük a pénzünket kamatozni, és addig tartjuk bent, amíg milliomosok nem leszünk. A addig tartjuk bent, amíg milliomosok nem leszünk. A program számolja ki, hogy hány évet kell várnunk.program számolja ki, hogy hány évet kell várnunk.

Page 46: Programozási technológiák

Iterációk - do...while Iterációk - do...while utasításutasí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!"); }}

Page 47: Programozási technológiák

Iterációk - for utasítás 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 : egy vagy több utasítás vesszővel elválasztva, mely(ek) egyszer hajtódik végre a elválasztva, mely(ek) egyszer hajtódik végre a ciklusmagba való első belépés előtt. Pl. ciklusmagba való első belépés előtt. Pl. ciklusváltozó deklarálása, inicializálása. A ciklusváltozó deklarálása, inicializálása. A ciklusváltozó típusa tetszőleges.ciklusváltozó típusa tetszőleges.

feltétel: amíg igaz, újból végrehajtja az utasítást, : amíg igaz, újból végrehajtja az utasítást, ha hamis, akkor a ciklust követő utasításra lép.ha hamis, akkor a ciklust követő utasításra lép.

léptetés: egy vagy több utasítás vesszővel : egy vagy több utasítás vesszővel elválasztva, mely(ek) a ciklusmag minden egyes elválasztva, mely(ek) a ciklusmag minden egyes lefutása után automatikusan végrehajtódik. lefutása után automatikusan végrehajtódik. Általában a ciklusváltozót szokás itt növelni vagy Általában a ciklusváltozót szokás itt növelni vagy csökkenteni.csökkenteni.

Page 48: Programozási technológiák

Iterációk - for utasításIterációk - for utasítás

A A while ciklus egy speciális esetének tekinthető: 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}

Page 49: Programozási technológiák

Iterációk - for utasításIterációk - for utasításpéldákpé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();}

Page 50: Programozási technológiák

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

Page 51: Programozási technológiák

Kiugrás a ciklusbólKiugrás a ciklusból

Break utasítás: az aktuális utasítás: az aktuális utasításblokk-ból (pl. ciklusból) való utasításblokk-ból (pl. ciklusból) való azonnali kiugrást eredményezi.azonnali kiugrást eredményezi.

Continue utasítás: hatására a utasítás: hatására a vezérlés az utasításblokk (ciklus) vezérlés az utasításblokk (ciklus) végére kerül.végére kerül.

Page 52: Programozási technológiák

Metódusok írásaMetó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: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: Módosítók lehetnek: public, private, protected: láthatóság: láthatóság static: osztálymetódus: osztálymetódus stb.stb.

Page 53: Programozási technológiák

Függvény, eljárásFüggvény, eljárás

A metódusoknak két fajtáját A metódusoknak két fajtáját különböztetjük meg:különböztetjük meg: Eljárás–szerű metódus: visszatérési Eljárás–szerű metódus: visszatérési

értékének típusa értékének típusa void, azaz üres típus, , azaz üres típus, nem tér vissza értékkelnem tér vissza értékkel

Függvény–szerű metódus: visszatérési Függvény–szerű metódus: visszatérési értéké-nek típusa valamilyen értéké-nek típusa valamilyen voidtól tól különböző típus, azaz igazi értékkel tér különböző típus, azaz igazi értékkel tér visszavissza

A függvény eljárásként is hívható.A függvény eljárásként is hívható.

Page 54: Programozási technológiák

Metódusok jellemzőiMetódusok jellemzői

TúlterhelésTúlterhelés (overloading): lehet két egyforma (overloading): lehet két egyforma nevű, de különböző paraméterezésű metódus. nevű, de különböző paraméterezésű metódus. pl. pl. vonalhuz() ill. ill. vonalhuz(int hossz) vagy vagy min(int a, int b) ill. ill. min(double a, double b)

ParaméterátadásParaméterátadás: érték szerinti. Az aktuális : érték szerinti. Az aktuális paraméter típusának értékadás szerint paraméter típusának értékadás szerint kompatíbilisnek kell lennie a formális kompatíbilisnek kell lennie a formális paraméterrel.paraméterrel.

Visszatérés a metódusból: függvény esetén Visszatérés a metódusból: függvény esetén return után kötelezően meg kell adnunk egy után kötelezően meg kell adnunk egy értéket.értéket.

Page 55: Programozási technológiák

Metódusok jellemzőiMetódusok jellemzői

Az osztály metódusainak deklarálási sor-Az osztály metódusainak deklarálási sor-rendje tetszőleges. A rendje tetszőleges. A main-t elsőnek vagy -t elsőnek vagy utolsónak célszerű megadni. utolsónak célszerű megadni.

A metódusok nem ágyazhatóak egymásba.A metódusok nem ágyazhatóak egymásba. Lehet rekurzív metódusokat is definiálni.Lehet rekurzív metódusokat is definiálni. A metódusban –mint egyébként is bármely A metódusban –mint egyébként is bármely

blokkban– definiálhatunk lokális változót.blokkban– definiálhatunk lokális változót.

Page 56: Programozási technológiák

public class Metodusok{

static void vonalhuz(int hossz){ for (int i=1; i<=hossz; i++) System.out.print("-"); System.out.println(); } static void vonalhuz(){ vonalhuz(50); } static int abs(int n){ if (n>=0) return n; else return -n; }

Page 57: Programozási technológiák

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(); } }

Page 58: Programozási technológiák

Osztály készítéseOsztály készítése

Page 59: Programozási technológiák

OO programOO 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

Page 60: Programozási technológiák

Példa - Ember osztály és példányaiPé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

katiandor

zsófi

Page 61: Programozási technológiák

Az OOP fontosabb Az OOP fontosabb definícióinak összefoglalásadefinícióinak összefoglalása Példánydeklaráció (példánytag): Példánydeklaráció (példánytag):

A példányonként (objektumonként) helyet foglaló A példányonként (objektumonként) helyet foglaló változók a változók a példányváltozókpéldányváltozók (példányadatok). (példányadatok).

Azon metódusokat, melyek példányadatokon Azon metódusokat, melyek példányadatokon dolgoznak, dolgoznak, példánymetódusoknakpéldánymetódusoknak nevezzük. nevezzük.

Osztálydeklaráció (osztálytag) (Osztálydeklaráció (osztálytag) (static) ) Az Az osztályváltozóosztályváltozó az osztály saját változója, az az osztály saját változója, az

egyes példányokban nem szerepel, valamilyen egyes példányokban nem szerepel, valamilyen közös adatot tárol. közös adatot tárol.

Az Az osztálymetódusosztálymetódus az osztály saját metódusa, az osztály saját metódusa, amely csak osztályváltozókon dolgozik.amely csak osztályváltozókon dolgozik.

Page 62: Programozási technológiák

LáthatóságLáthatóság

PrivátPrivát ( (private): csak az osztály saját metódusai ): csak az osztály saját metódusai férfér--hetnek hozzá.hetnek hozzá.

NyilvánosNyilvános ( (public): minden, az objektummal ): minden, az objektummal kapcsolatkapcsolat--ban álló kliens eléri, használhatja.ban álló kliens eléri, használhatja.

Egy osztály adatai általában privát adatok.Egy osztály adatai általában privát adatok.

Egy fordítási egység (java fájl) több osztályt is Egy fordítási egység (java fájl) több osztályt is tartalmaztartalmaz--hat, de közülük csak egy lehet nyilvános hat, de közülük csak egy lehet nyilvános ((public). Ha valamelyik osztályban szerepel a ). Ha valamelyik osztályban szerepel a main metódus, akkor az nyilvános kell hogy legyen. metódus, akkor az nyilvános kell hogy legyen.

Page 63: Programozási technológiák

Egy osztályban ugyanazon a néven Egy osztályban ugyanazon a néven dekla-rálható metódus és változó, sdekla-rálható metódus és változó, sőőt t a metódu-sok túlterhelheta metódu-sok túlterhelhetőőek. ek.

A deklarálás sorrendje általában:A deklarálás sorrendje általában: változókváltozók konstruktorokkonstruktorok metódusokmetódusok main metódus, ha van. metódus, ha van.

Page 64: Programozási technológiák

A lokális változók A lokális változók eltakarjákeltakarják az ugyanolyan az ugyanolyan nevnevűű osztály-, illetve példányváltozókat. osztály-, illetve példányváltozókat.

Ha az osztály deklarációjára szeretnénk Ha az osztály deklarációjára szeretnénk hivathivat--kozni, akkor osztályváltozó esetén az kozni, akkor osztályváltozó esetén az osztály nevével, példányváltozó esetén osztály nevével, példányváltozó esetén pedig a pedig a this this referenciával kell azt referenciával kell azt minminőősítenünk.sítenünk.

Változók alapértelmezés szerinti kezdeti Változók alapértelmezés szerinti kezdeti értékei: osztályváltozó vagy példányváltozó értékei: osztályváltozó vagy példányváltozó esetén 0, lokális változó esetén esetén 0, lokális változó esetén határozatlan.határozatlan.

Page 65: Programozási technológiák

KonstruktorokKonstruktorok Feladata az objektum Feladata az objektum new operátorral való létrehozásakor operátorral való létrehozásakor

annak inicializálása.annak inicializálása. Auto auto = new Auto("GHJ123”); A konstruktor speciális metódus, a következő szabályok A konstruktor speciális metódus, a következő szabályok

érvényesek rá:érvényesek rá: Neve kötelezően megegyezik az osztály nevével.Neve kötelezően megegyezik az osztály nevével. Csak a Csak a new operátorral hívható. operátorral hívható. Túlterhelhető.Túlterhelhető. Nincs visszatérési értéke, és nem is void.Nincs visszatérési értéke, és nem is void.

Ha az osztályban nem adunk meg explicit módon Ha az osztályban nem adunk meg explicit módon konstruktort, akkor az osztálynak lesz egy alapértelmezés konstruktort, akkor az osztálynak lesz egy alapértelmezés szerinti (default), paraméter nélküli konstruktora. szerinti (default), paraméter nélküli konstruktora.

Ha az osztályban létezik egy explicit konstruktor, akkor Ha az osztályban létezik egy explicit konstruktor, akkor nem lesz implicit, alapértelmezés szerinti konstruktora. nem lesz implicit, alapértelmezés szerinti konstruktora.

Page 66: Programozási technológiák

Példa - RaktárprogamPé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!

Page 67: Programozási technológiák

OsztálydiagramOsztá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)

Page 68: Programozási technológiák

OsztálydiagramOsztá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)

Page 69: Programozási technológiák

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

Page 70: Programozási technológiák

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

Page 71: Programozási technológiák

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

Page 72: Programozási technológiák

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

Page 73: Programozási technológiák

Együttműködési diagramEgyüttműködési diagram

RaktarProgram aru:Aruprogram:

RaktarProgram

2: RaktarProgram()4: akciok()

3: Aru(aNev,aEgysegar)5: hozzatesz(aMenny)

6: elvesz(aMenny)7: setEgysegar(aEgysegar)

1: main(args)

Page 74: Programozási technológiák

OsztálydiagramOsztá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 – BankprogamPélda – BankprogamKészítsünk egy banki programot, mely az ügyfelek számláit kezeli.Készítsünk egy banki programot, mely az ügyfelek számláit kezeli.

Page 75: Programozási technológiák

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

Page 76: Programozási technológiák

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

Page 77: Programozási technológiák

public class Bank { private Szamla szamla1, szamla2; public Bank() { szamla1 = new Szamla("Kiss Istvan", 1000000); 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"); } }

Page 78: Programozási technológiák

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

Page 79: Programozási technológiák

InicializálókInicializálók

class Tanulo {class Tanulo { static int alapTandij;static int alapTandij; double atlag;double atlag; int tandij;int tandij; static { static { alapTandij = 2000;alapTandij = 2000; }} {{ atlag = Console.readDouble("Atlag: ");atlag = Console.readDouble("Atlag: ");

tandij = alapTandij + (int)Math.round(3000*(5-tandij = alapTandij + (int)Math.round(3000*(5-atlag));atlag));

}}

// … // …

}}

= = 20002000;; = Console.readDouble("Atlag: ");= Console.readDouble("Atlag: ");

Page 80: Programozási technológiák

Az inicializálás sorrendjeAz inicializálás sorrendje Osztályadatok (osztály betöltésekor)Osztályadatok (osztály betöltésekor)

alapértelmezés szerinti értékekalapértelmezés szerinti értékek osztályinicializáló kifejezésekosztályinicializáló kifejezések osztályinicializáló blokkokosztályinicializáló blokkok

Objektum adatai (objektum születésekor)Objektum adatai (objektum születésekor) alapértelmezés szerinti értékekalapértelmezés szerinti értékek példányinicializáló kifejezésekpéldányinicializáló kifejezések példányinicializáló blokkokpéldányinicializáló blokkok konstruktor(ok)konstruktor(ok)

Page 81: Programozási technológiák

Az Object osztályAz Object osztály

Minden osztály közös őseMinden osztály közös őse

A Java minden objektumára jellemző A Java minden objektumára jellemző

metódusokat tartalmaz. Például:metódusokat tartalmaz. Például: boolean equals(Object obj)boolean equals(Object obj)

String toString()String toString()

Class getClass()Class getClass()

Page 82: Programozási technológiák

Objektumok egyenlőségvizsgálataObjektumok egyenlőségvizsgálata

String s1 = String s1 = new String(new String("Hello""Hello")), s2 = , s2 = new String(new String( "Hello" "Hello"));;

System.out.println(s1==s2);System.out.println(s1==s2);

System.out.println(s1.System.out.println(s1.equalsequals(s2));(s2));

falsetrue

Page 83: Programozási technológiák

KarakterláncKarakterlánc

A A String osztályú objektum olyan szöveg osztályú objektum olyan szöveg tárolására szolgál, amelynek értékét nem tárolására szolgál, amelynek értékét nem akarjuk megváltoztatni. akarjuk megváltoztatni.

A A StringBufferStringBuffer osztályt akkor használjuk, osztályt akkor használjuk, ha a szövegen szeretnénk változtatni.ha a szövegen szeretnénk változtatni.

A A StringBuilderStringBuilder osztályt a JDK 5.0-tól osztályt a JDK 5.0-tól vezették be, ami gyorsabb, mint a vezették be, ami gyorsabb, mint a StringBufferStringBuffer, de csak egy szálon , de csak egy szálon használható biztonságosan.használható biztonságosan.

Page 84: Programozási technológiák

Objektum létrehozása a Objektum létrehozása a new operátorral operátorral

Auto auto; //csak referenciaauto = new Auto("GHJ123”);//a konstruktor hívásával létrejön az objektum, //az auto referencia erre mutat

vagy vagy

Auto auto = new Auto("GHJ123”);

OsztályazonosítóOsztályazonosító objektum = new objektum = new OsztályazonosítóOsztályazonosító((paraméterlistaparaméterlista););

Page 85: Programozási technológiák

String objektum objektum létrehozása létrehozása

String szoveg; //csak referencia

szoveg = new String(”Ez a tartalma”);

csak StringString esetén ez egyszerűsíthető:

szoveg=”Ez a tartalma”;

Page 86: Programozási technológiák

A A String osztály metódusai osztály metódusai

Az eredeti objektumot Az eredeti objektumot nem változtatjáknem változtatják, , függvények, sokszor új String objektumot hoznak függvények, sokszor új String objektumot hoznak létre.létre.

Néhány metódus:Néhány metódus:

char charAt(int index)tetszőleges indexű karakterét adja vissza, az tetszőleges indexű karakterét adja vissza, az indexelés 0-val kezdődikindexelés 0-val kezdődik

int compareTo(String str)összehasonlítja, értéke 0, ha egyenlő; –, ha kisebb; összehasonlítja, értéke 0, ha egyenlő; –, ha kisebb; +, ha nagyobb, mint a paraméter+, ha nagyobb, mint a paraméter

Page 87: Programozási technológiák

boolean equals(Object anObject)igaz, ha az objektum String típusú, s karakterei ugyanazok

int indexOf(String str) //hasonlóan lastIndexOfaz 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

Page 88: Programozási technológiák

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

Page 89: Programozási technológiák

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: ");

Page 90: Programozási technológiák

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(' ','-'));

Page 91: Programozási technológiák

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

Page 92: Programozási technológiák

StringBuffer osztályStringBuffer osztály KonstruktorokKonstruktorok

StringBuffer()StringBuffer() StringBuffer(int length)StringBuffer(int length) StringBuffer(String str)StringBuffer(String str)

Kapacitás, hossz, indexKapacitás, hossz, index capacity():intcapacity():int length():intlength():int ensureCapacity(int minimumCapacity)ensureCapacity(int minimumCapacity) setLength(int newLength)setLength(int newLength) charAt(int index): charcharAt(int index): char

Manipulálható szöveg

Page 93: Programozási technológiák

StringBuffer osztály (folyt.)StringBuffer osztály (folyt.) BővítésBővítés

append (append (<<Type> value): StringBufferType> value): StringBuffer append (append (<t<type> value): StringBufferype> value): StringBuffer insert (int offset, insert (int offset, <<Type> value): StringBufferType> value): StringBuffer insert (int offset, insert (int offset, <t<type> value): StringBufferype> value): StringBuffer

TörlésTörlés deleteCharAt(int index): StringBufferdeleteCharAt(int index): StringBuffer delete(int start, int end): StringBufferdelete(int start, int end): StringBuffer

Page 94: Programozási technológiák

StringBuffer osztály (folyt.)StringBuffer osztály (folyt.) EgyébEgyéb

setCharAt(int index, char ch)setCharAt(int index, char ch) replace(int start, int end, String str): replace(int start, int end, String str):

StringBufferStringBuffer reverse(): StringBufferreverse(): StringBuffer substring(int start): Stringsubstring(int start): String substring(int start, int end): Stringsubstring(int start, int end): String toString(): StringtoString(): String

Page 95: Programozási technológiák

StringBuffer hegy1 = new StringBuffer("Machu");StringBuffer hegy1 = new StringBuffer("Machu"); //1//1

StringBuffer hegy2 = hegy1.append(" Picchu");StringBuffer hegy2 = hegy1.append(" Picchu"); //2//2

hegy2.insert(0,"Ez is ");hegy2.insert(0,"Ez is "); //3//3

hegy1:StringBuffer

"Machu"

//1 hegy1

hegy2

:StringBuffer

"Machu Picchu"

//2

hegy1

hegy2

:StringBuffer

"Ez is Machu Picchu"

//3

Page 96: Programozási technológiák

Feladat – CsereOlvassunk be egy szöveget, majd cseréljük ki az összes & jelet az and szóra!

import extra.*;import extra.*;

public class Csere {public class Csere {

public static void main(String[] args) {public static void main(String[] args) {

// következő dián// következő dián

}}

}}

Page 97: Programozási technológiák

StringBuffer szoveg = StringBuffer szoveg =

new StringBuffer(Console.readLine("Szoveg: "));new StringBuffer(Console.readLine("Szoveg: ")); //1//1

int poz = szoveg.toString().indexOf('&');int poz = szoveg.toString().indexOf('&'); //2 //2

while (poz!=-1) {while (poz!=-1) {

szoveg.replace(poz,poz+1,"and");szoveg.replace(poz,poz+1,"and"); //3//3

poz = szoveg.toString().indexOf('&');poz = szoveg.toString().indexOf('&'); //4//4

}}

System.out.println(szoveg);System.out.println(szoveg); //5//5

Page 98: Programozási technológiák

Objektum átadása Objektum átadása paraméterkéntparaméterként

Feladat – Objektum paraméterÍrjunk egy olyan eljárást, amely a paraméterként megkapott szöveget széthúzza, vagyis minden karaktere után beszúr egy szóközt!

import extra.*;import extra.*;

public class ObjektumParameter {public class ObjektumParameter {

//következő dián//következő dián

}}

Page 99: Programozási technológiák

static void szethuz(StringBuffer str) {static void szethuz(StringBuffer str) {

for (int i=str.length()-1; i>0; i--)for (int i=str.length()-1; i>0; i--)

str.insert(i,' ');str.insert(i,' ');

str = null;str = null; // csak demonstrációs célú // csak demonstrációs célú utasításutasítás

}}

public static void main(String[] args) {public static void main(String[] args) {

StringBuffer sb = new StringBuffer("Peace");StringBuffer sb = new StringBuffer("Peace");

szethuz(sb); szethuz(sb);

System.out.println("*"+sb+"*");System.out.println("*"+sb+"*"); // // "*P e a c "*P e a c e*"e*"

}}

Értékadás szerintikompatibilitás!

Csak a referencia másolódik át!

Page 100: Programozási technológiák

:StringBuffer

"Peace"

str

sb

:StringBuffer

"P e a c e"

str

sb

null

A metódusba való belépéskor:

A metódusból való kilépés előtt:

A metódus csak a mutatott objektumot

változtathatja meg, a referenciát nem!

Page 101: Programozási technológiák

TömbökTömbök A tömb referencia típusú változó, melyet A tömb referencia típusú változó, melyet

deklarál-nunk kell. Az elemtípus lehet akár deklarál-nunk kell. Az elemtípus lehet akár primitív, akár referencia (osztály típusú vagy primitív, akár referencia (osztály típusú vagy tömb típusú).tömb típusú).

DeklarálásDeklarálás::

elemtípus [] tömbazonosító; vagyvagy elemtípus tömbazonosító [];

pl:pl: int [] a; //inkább ez ajánlott int b[];

Page 102: Programozási technológiák

Az így deklarált változó képes egy, a Az így deklarált változó képes egy, a megadott elemtípusú tömbre mutatni. Még megadott elemtípusú tömbre mutatni. Még csak a referenciának (memóriacímnek) csak a referenciának (memóriacímnek) foglaltunk helyet, a tömböt külön létre kell foglaltunk helyet, a tömböt külön létre kell hoznunk.hoznunk.

Létrehozás Létrehozás (futás közben): (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 Természetesen történhet rögtön a

deklaráláskor is a létrehozás: deklaráláskor is a létrehozás: String[] sTomb = new String[50];

Page 103: Programozási technológiák

Minden tömbnek van egy length konstansa. Indexelés: 0 .. length-1

int[] iArray=new int[10];

for(int i=0; i<iArray.length; i++) iArray[i]=Console.readInt(i+1+". szam: ");

System.out.println("Az elemek visszafele:");for(int i=iArray.length-1; i>=0; i--) System.out.print(iArray[i]+" ");

for(int i=0; i<10; i++)

Page 104: Programozási technológiák

Tömb inicializálásaTömb inicializálása

Inicializáló blokkInicializáló blokk: deklaráláskor a tömb : deklaráláskor a tömb elemeinek kezdeti értékek adhatók, pl:elemeinek kezdeti értékek adhatók, pl: int[] iArray={2, 4, 6, 8, 10};int[] iArray={2, 4, 6, 8, 10}; char[] char[]

szamjegyek={'0','1','2','3','4','5','6','7','8','9'}szamjegyek={'0','1','2','3','4','5','6','7','8','9'}

Ekkor nem kell a tömböt a Ekkor nem kell a tömböt a new new operátorral létrehozni, a operátorral létrehozni, a {}{} blokk képző blokk képző operátor megteszi ezt helyettünk. operátor megteszi ezt helyettünk.

A tömb mérete pontosan akkora lesz, A tömb mérete pontosan akkora lesz, amennyi a felsorolt értékek száma.amennyi a felsorolt értékek száma.

Page 105: Programozási technológiák

Értékadás tömbök közöttÉrtékadás tömbök között

A A t2 tömb tömb értékadásértékadás szerint kompatibilis a szerint kompatibilis a t1 tömbbel (azaz tömbbel (azaz t1=t2 megengedett), ha megengedett), ha primitív elemtípus esetén primitív elemtípus esetén t1 és és t2 elemtípusa elemtípusa

azonos;azonos; referencia elemtípus esetén referencia elemtípus esetén t2 elemtípusa elemtípusa t1 elem- elem-

típusával azonos, vagy annak leszármazottja.típusával azonos, vagy annak leszármazottja. Értékadáskor a tömb referenciája kap értéket, Értékadáskor a tömb referenciája kap értéket,

nem pedig az elemei (a tömb nem másolódik, nem pedig az elemei (a tömb nem másolódik, hanem átíródik a mutatója), így különböző hosz-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.szúságú tömbök is értékül adhatók egymásnak.

Page 106: Programozási technológiák

Kétdimenziós tömbKétdimenziós tömb

Deklarálás: Deklarálás: elemtípus [][] tömbazonosító; Teljes kétdimenziós tömb létrehozása: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 Lépésenkénti (soronkénti) létrehozás. A sorok különböző méretűek lehetnek, pl: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.Analóg a helyzet a többdimenziós tömbök esetén.

= new int[3][4];

Page 107: Programozási technológiák

Tömb paraméter Tömb paraméter

Formális paraméterként egy tömbreferenciát Formális paraméterként egy tömbreferenciát kell deklarálnunk, amely fogadja az aktuális kell deklarálnunk, amely fogadja az aktuális tömb referenciáját.tömb referenciáját.

Az aktuális tömbnek értékadás szerint Az aktuális tömbnek értékadás szerint kompatíbi-lisnek kell lennie a formális kompatíbi-lisnek kell lennie a formális tömbbel.tömbbel.

PéldaPélda: Írjunk osztályt, amelynek adata egy : Írjunk osztályt, amelynek adata egy int tömb. Az objektum létrehozásakor a tömb. Az objektum létrehozásakor a konstruktor paraméterében adhassuk meg a konstruktor paraméterében adhassuk meg a tömb hosszát. Tartalmazzon egy tömb hosszát. Tartalmazzon egy bekér, , kiir és egy és egy osszeg nevű metódust! nevű metódust!

Page 108: Programozási technológiák

import extra.*;class Tomb{ private int[]t; public Tomb(int hossz){ t = new int[hossz]; } public void beker(){ for(int i=0; i<t.length; i++) t[i] = Console.readInt(i+1+". szam: "); } public void kiir(){ for(int i=0;i<t.length;i++) System.out.print(t[i]+" "); System.out.println(); } public int osszeg(){ int s=0; for(int i=0;i<t.length;i++) s+=t[i]; return s; }}//Tomb

Page 109: Programozási technológiák

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(); }}

Page 110: Programozási technológiák

ÖröklődésÖröklődés

Page 111: Programozási technológiák

Öröklődés (inheritance) más néven Öröklődés (inheritance) más néven kiterjesztés (extension): Egy már meglévő kiterjesztés (extension): Egy már meglévő osztály továbbfejlesztése.osztály továbbfejlesztése. Újabb tulajdonságokat és metódusokat Újabb tulajdonságokat és metódusokat

adhatunk hozzáadhatunk hozzá Meglévő metódusait átírhatjukMeglévő metódusait átírhatjuk

Cél: Cél: Specializáció: egy objektum leírásához egyedi Specializáció: egy objektum leírásához egyedi

jellemzőket adunk hozzá.jellemzőket adunk hozzá. Általánosítás: több objektum leírásából Általánosítás: több objektum leírásából

kiemeljük a közös jellemzőket.kiemeljük a közös jellemzőket. Java: Java: class Auto extends Jarmu{class Auto extends Jarmu{ ... ...}}

Page 112: Programozási technológiák

SzabályokSzabályok Egy osztályból több osztály is Egy osztályból több osztály is

származtathatószármaztatható Egy osztályhierarchia mélysége Egy osztályhierarchia mélysége

elvileg tetszőleges lehetelvileg tetszőleges lehet Az öröklés tranzitívAz öröklés tranzitív Jávában: Jávában:

Egy osztálynak csak egy közvetlen őse Egy osztálynak csak egy közvetlen őse lehet (nincs többszörös öröklés)lehet (nincs többszörös öröklés)

Minden osztálynak őse az objectMinden osztálynak őse az object

Page 113: Programozási technológiák

MintafeladatMintafeladat Különböző hengereket szeretnénk Különböző hengereket szeretnénk

nyilvántartani:nyilvántartani: Csupán mértani testek, sugaruk és Csupán mértani testek, sugaruk és

magasságuk vanmagasságuk van Tömör hengerek, súlyuk is vanTömör hengerek, súlyuk is van CsövekCsövek

Page 114: Programozási technológiák

Henger

-sugar, magassag:double

+Henger(sugar, magassag:double)+getSugar():double+getMagassag():double+terfogat():double+toString():String

TomorHenger

-fajsuly:double

+TomorHenger(sugar, magassag, fajsuly:double)+getFajsuly():double+suly():double+toString():String

Cso

-falVastagsag:double

+Cso(sugar, magassag, fajsuly, falVastagsag:double)+getFalVastagsag():double+terfogat():double+toString():String

Page 115: Programozási technológiák

Megjegyzések a példaprogramhozMegjegyzések a példaprogramhoz

Az Az Object Object osztály osztály getClass()getClass() metódusa egy metódusa egy ClassClass osztályú objektumot ad vissza, melynek osztályú objektumot ad vissza, melynek getName()getName() metódusát használtuk ( metódusát használtuk (HengerHenger: 22. : 22. sor)sor)

thisthis: az objektum referenciája: az objektum referenciájasupersuper: az objektum referenciája, de közvetlen : az objektum referenciája, de közvetlen ősosztály típusúősosztály típusú

A A hengerekhengerek tömb elemei tömb elemei HengerHenger osztályú osztályú referenciák, melyek azonosíthatnak referenciák, melyek azonosíthatnak leszármaztatott osztályú objektumokat is.leszármaztatott osztályú objektumokat is.Henger h; TomorHenger th;Henger h; TomorHenger th;h=th; //jóh=th; //jóth=h; //típushibath=h; //típushibath=(TomorHenger)h //típuskényszerítésth=(TomorHenger)h //típuskényszerítés

A lista és az átlagtérfogat műveleteknél az A lista és az átlagtérfogat műveleteknél az objektumok valódi típusa határozza meg, hogy objektumok valódi típusa határozza meg, hogy melyik melyik toString()toString(), ill , ill terfogat()terfogat() metódus fog metódus fog végrehajtódni: végrehajtódni: polimorfizmuspolimorfizmus ( (ld. 6. diald. 6. dia))

Page 116: Programozási technológiák

instanceofinstanceof operátor operátor::<objektum> instanceof <osztály><objektum> instanceof <osztály>Eredménye egy Eredménye egy booleanboolean típusú érték, mely típusú érték, mely truetrue, ha az , ha az objektumobjektum osztálya a megadott osztálya a megadott osztályosztály vagy annak leszármazottja. vagy annak leszármazottja.

Statikus típusStatikus típus: amit a referencia : amit a referencia deklaráláskor kapdeklaráláskor kapDinamikus típusDinamikus típus: amilyen osztályú : amilyen osztályú objektumot valójában azonosítobjektumot valójában azonosíthengerek[3]=new Cso(2,10,2,1);hengerek[3]=new Cso(2,10,2,1);hengerek[3]hengerek[3] statikus típusa statikus típusa HengerHenger, , dinamikus típusa dinamikus típusa CsoCso..

Egy utódosztály akkor is örökli az ősosztály Egy utódosztály akkor is örökli az ősosztály adatait, ha nem látja azokat (mert private adatait, ha nem látja azokat (mert private elérhetőségűek)elérhetőségűek)

Page 117: Programozási technológiák

Metódusok felülírásaMetódusok felülírása Akkor van szó felülírásról, ha a metódusok Akkor van szó felülírásról, ha a metódusok

szignatúrái megegyeznek (egyébként túlterhelés)szignatúrái megegyeznek (egyébként túlterhelés) Csak példánymetódust lehet felülírniCsak példánymetódust lehet felülírni Nem lehet felülírni, ha Nem lehet felülírni, ha finalfinal Dinamikus kötés (futás alatti kötés, késői kötés):Dinamikus kötés (futás alatti kötés, késői kötés):

Az osztályhierarchia bármely pontjáról is hívunk Az osztályhierarchia bármely pontjáról is hívunk meg egy példánymetódust, minden esetben a meg egy példánymetódust, minden esetben a megszólított objektum osztályában (vagy ha ott megszólított objektum osztályában (vagy ha ott nincs, akkor a legközelebbi ősben) deklarált nincs, akkor a legközelebbi ősben) deklarált metódus fog végrehajtódni.metódus fog végrehajtódni.A pontos címet a rendszer futáskor határozza A pontos címet a rendszer futáskor határozza meg.meg.(Pl. (Pl. TomorHengerTomorHenger, ill. , ill. CsoCso osztályú objektumok osztályú objektumok esetén a esetén a sulysuly metódus meghívásakor más-más metódus meghívásakor más-más terfogatterfogat metódus hajtódik végre.) metódus hajtódik végre.)

Page 118: Programozási technológiák

KonstruktorokKonstruktorok

Nem öröklődik, nem lehet felülírniNem öröklődik, nem lehet felülírni Osztályon belül az egyik konstruktorból a másik Osztályon belül az egyik konstruktorból a másik

így hívható:így hívható:this(paraméterek)this(paraméterek)

Egy konstruktorból a közvetlen ős konstruktor így Egy konstruktorból a közvetlen ős konstruktor így hívható:hívható:super(paraméterek)super(paraméterek)

Minden konstruktornak tartalmaznia kell Minden konstruktornak tartalmaznia kell pontosan egy pontosan egy this()this() vagy vagy super()super() hívást legelső hívást legelső utasításként. Ha egyik sem szerepel, akkor a utasításként. Ha egyik sem szerepel, akkor a fordító betesz egy alapértelmezett paraméter fordító betesz egy alapértelmezett paraméter nélküli nélküli super()super() hívást. Ekkor viszont lennie kell a hívást. Ekkor viszont lennie kell a közvetlen ősosztályban paraméter nélküli közvetlen ősosztályban paraméter nélküli konstruktor. konstruktor.

Elv: minden konstruktor a saját osztálya adatait Elv: minden konstruktor a saját osztálya adatait inicializáljainicializálja

Page 119: Programozási technológiák

Absztrakt metódus, absztrakt osztályAbsztrakt metódus, absztrakt osztály

Az osztály egyes metódusait nem Az osztály egyes metódusait nem implementáljuk, csak a fejlécét adjuk implementáljuk, csak a fejlécét adjuk meg.meg.

Az ilyen osztály absztrakt, a nyitva Az ilyen osztály absztrakt, a nyitva hagyott, absztrakt metódusokat hagyott, absztrakt metódusokat tartalmaztartalmaz

Örökítési célokat szolgál, nem Örökítési célokat szolgál, nem példányosíthatópéldányosítható

Absztrakt metódust tartalmazó osztály Absztrakt metódust tartalmazó osztály csak absztrakt lehetcsak absztrakt lehet

Page 120: Programozási technológiák

Idom{abstract}

-fajsuly:double=0.8

+terfogat():double+suly():double

Gomb

-sugar:double

+Gomb(sugar:double)+terfogat():double+toString():String

Hasab

-a,b,magassag:double

+Hasab(a,b,magassag:double)+terfogat():double+toString():String

Page 121: Programozási technológiák

InterfészInterfész Az interfész olyan viselkedéseket definiál, Az interfész olyan viselkedéseket definiál,

amelyet az osztályhierarchia tetszőleges amelyet az osztályhierarchia tetszőleges osztályával megvalósíthatunk.osztályával megvalósíthatunk.

Az interfész (Az interfész (interfaceinterface) metódusfejeket definiál ) metódusfejeket definiál abból a célból, hogy valamely osztály azt a abból a célból, hogy valamely osztály azt a későbbiekben implementálja, megvalósítsa.későbbiekben implementálja, megvalósítsa.

Definiálhat konstansokat (Definiálhat konstansokat (public static finalpublic static final)) Az objektum elérésének, használatának egy Az objektum elérésének, használatának egy

lehetséges módját határozza meg.lehetséges módját határozza meg. Egy interfészből nem lehet példányt létrehozniEgy interfészből nem lehet példányt létrehozni Az interfészek örökíthetőkAz interfészek örökíthetők Egy konkrét osztály megvalósítja az interfészt, ha Egy konkrét osztály megvalósítja az interfészt, ha

az összes metódusát megvalósítja (UML az összes metódusát megvalósítja (UML szaggatott nyíl, java kulcsszó: szaggatott nyíl, java kulcsszó: implementsimplements))

Konvenció: az Konvenció: az implementsimplements záradék az záradék az extendsextends záradékot követi, ha mindkettő van.záradékot követi, ha mindkettő van.

Page 122: Programozási technológiák

Egy osztály több interfészt is implementálhatEgy osztály több interfészt is implementálhat Az értékadás kompatibilitás hasonló, mint az Az értékadás kompatibilitás hasonló, mint az

öröklődés eseténöröklődés esetén Mivel az interfész a megvalósítás nélküli, vagyis Mivel az interfész a megvalósítás nélküli, vagyis

absztrakt metódusok listája, alig különbözik az absztrakt metódusok listája, alig különbözik az absztrakt osztálytól. A különbségek:absztrakt osztálytól. A különbségek: Az interfész egyetlen metódust sem implementálhat, az Az interfész egyetlen metódust sem implementálhat, az

absztrakt osztály igen.absztrakt osztály igen. Az osztály megvalósíthat több interfészt, de csak egy Az osztály megvalósíthat több interfészt, de csak egy

ősosztálya lehet.ősosztálya lehet. Az interfész nem része az osztályhierarchiának. Az interfész nem része az osztályhierarchiának.

Egymástól "független" osztályok is megvalósíthatják Egymástól "független" osztályok is megvalósíthatják ugyanazt az interfészt.ugyanazt az interfészt.

Amikor egy osztály megvalósít egy interfészt, Amikor egy osztály megvalósít egy interfészt, akkor alapvetően aláír egy szerződést. Az akkor alapvetően aláír egy szerződést. Az osztálynak implementálni kell az interfészben és osztálynak implementálni kell az interfészben és szülőinterfészeiben deklarált összes metódust, szülőinterfészeiben deklarált összes metódust, vagy az osztályt absztraktként kell deklarálni.vagy az osztályt absztraktként kell deklarálni.

Page 123: Programozási technológiák

Az interfészek hasznosak a következő Az interfészek hasznosak a következő esetekben:esetekben: Hasonlóságok megfogalmazása anélkül, hogy Hasonlóságok megfogalmazása anélkül, hogy

mesterkélt osztályhierarchiát építenénk felmesterkélt osztályhierarchiát építenénk fel(For instance, a human and a parrot can both (For instance, a human and a parrot can both whistle, however it would not make sense to whistle, however it would not make sense to represent Humans and Parrots as subclasses of represent Humans and Parrots as subclasses of a Whistler class, rather they would most likely a Whistler class, rather they would most likely be subclasses of an Animal class (likely with be subclasses of an Animal class (likely with intermediate classes), but would both intermediate classes), but would both implement the Whistler interface.)implement the Whistler interface.)

Olyan metódusok definiálása, amelyeket több Olyan metódusok definiálása, amelyeket több osztályban meg kell valósítaniosztályban meg kell valósítani

Többszörös öröklődés modellezéseTöbbszörös öröklődés modellezése

Page 124: Programozási technológiák

public interface Predator { public interface Predator { public boolean chasePrey(Prey p); public boolean chasePrey(Prey p); public void eatPrey(Prey p); public void eatPrey(Prey p); } }

public class Cat implements Predator { public class Cat implements Predator { public boolean chasePrey(Prey p) { public boolean chasePrey(Prey p) { // programming to chase prey p // programming to chase prey p } }

public void eatPrey (Prey p) { public void eatPrey (Prey p) { // programming to eat prey p // programming to eat prey p } } } }

Page 125: Programozási technológiák

Another use of interfaces is being able Another use of interfaces is being able to use an object without knowing its to use an object without knowing its type of class, but rather only that it type of class, but rather only that it implements a certain interface. implements a certain interface. (For example, a sorting algorithm may (For example, a sorting algorithm may expect an object of type Comparable. expect an object of type Comparable. Thus, it knows that the object's type can Thus, it knows that the object's type can somehow be sorted, but it is irrelevant somehow be sorted, but it is irrelevant what the type of the object is.)what the type of the object is.)

Page 126: Programozási technológiák

Comparable interfészComparable interfész

Object

«interfész»Comparable

+compareTo(Object obj): int

String

+compareTo(Object obj): int...

A String hasonlíthatóA String hasonlítható

Page 127: Programozási technológiák

class Henger implements Comparable<Henger>{ private double sugar, magassag; ... public int compareTo(Henger obj){ if(terfogat()<obj.terfogat()) return -1; if (terfogat()>obj.terfogat()) return 1; return 0; }}

Page 128: Programozási technológiák

import java.util.*;

public class HengerProgram { public static void main(String[] args) { Henger[] hengerek=new Henger[4]; ... //Max térfogat int max=0; for(int i=0;i<hengerek.length;i++) if(hengerek[i].compareTo(hengerek[max])>0) max=i; System.out.println("A legnagyobb térfogat: " +hengerek[max].terfogat()); //Rendezés Arrays.sort(hengerek); //Lista System.out.println("\nRendezve:"); for(int i=0;i<hengerek.length;i++) System.out.println(hengerek[i]); }}

Page 129: Programozási technológiák

A kollekció keretrendszer –A kollekció keretrendszer –Java Collections Framework Java Collections Framework

(JCF)(JCF) A kollekciók (konténerek) olyan objektumok, A kollekciók (konténerek) olyan objektumok,

melyek célja egy vagy több típusba tartozó melyek célja egy vagy több típusba tartozó objektumok memóriában történő összefoglaló objektumok memóriában történő összefoglaló jellegű tárolása, manipulálása és lekérdezése.jellegű tárolása, manipulálása és lekérdezése.

A kollekció keretrendszer egy egységes A kollekció keretrendszer egy egységes architektúra, ami a kollekciók megvalósítására, architektúra, ami a kollekciók megvalósítására, kezelésére szolgál.kezelésére szolgál.

Elemei:Elemei: Interfészek: absztrakt adattípusok, amelyek a kollekciókat Interfészek: absztrakt adattípusok, amelyek a kollekciókat

reprezentálják. Lehetővé teszik a kollekciók reprezentálják. Lehetővé teszik a kollekciók implementáció független kezelését.implementáció független kezelését.

Implementációk: a kollekció interfészek konkrét Implementációk: a kollekció interfészek konkrét implementációi. implementációi.

algoritmusok: azok a metódusok, amelyek hasznos algoritmusok: azok a metódusok, amelyek hasznos műveleteket valósítanak meg, mint például keresés, műveleteket valósítanak meg, mint például keresés, rendezés különböző kollekciókon.rendezés különböző kollekciókon.

C++ Standard Template Library (STL) C++ Standard Template Library (STL)

Page 130: Programozási technológiák

A kollekció keretrendszer A kollekció keretrendszer használatának előnyeihasználatának előnyei

Csökkenti a fejlesztési időtCsökkenti a fejlesztési időt Növeli a program sebességét és minőségétNöveli a program sebességét és minőségét Megkönnyítik az API-k használatát, Megkönnyítik az API-k használatát,

tervezéséttervezését Elősegíti a szoftver újrafelhasználhatóságátElősegíti a szoftver újrafelhasználhatóságát

Page 131: Programozási technológiák

InterfészekInterfészek

Page 132: Programozási technológiák

A kollekció interfészek (generic, általános) A kollekció interfészek (generic, általános) típus paraméterekkel dolgoznak. Például:típus paraméterekkel dolgoznak. Például: public interface Collection<E> ...public interface Collection<E> ...

Az Az <E><E> szintaxis azt jelenti, hogy az szintaxis azt jelenti, hogy az interfész általános (generikus) típussal interfész általános (generikus) típussal működik.működik.

Amikor deklarálunk egy Amikor deklarálunk egy CollectionCollection-t, meg -t, meg tudjuk határozni (ajánlott), hogy milyen tudjuk határozni (ajánlott), hogy milyen típusú objektumot tartalmaz a kollekció. típusú objektumot tartalmaz a kollekció.

A típus paraméter a fordítóprogram A típus paraméter a fordítóprogram számára lehetővé teszi, hogy csak az adott számára lehetővé teszi, hogy csak az adott típusú objektumot engedje belerakni a típusú objektumot engedje belerakni a kollekcióba, így csökkenti a futásidejű hibák kollekcióba, így csökkenti a futásidejű hibák számát.számát.

Ha megértettük az interfészek használatát, Ha megértettük az interfészek használatát, akkor a nagy részét megtudtuk annak, amit akkor a nagy részét megtudtuk annak, amit a JCF-ről tudni érdemes.a JCF-ről tudni érdemes.

Page 133: Programozási technológiák

CollectionCollection: akkor érdemes ezt : akkor érdemes ezt választani, ha a lehető legnagyobb választani, ha a lehető legnagyobb rugalmasságra van szükség. rugalmasságra van szükség.

SetSet: matematikai halmaz modellezése: matematikai halmaz modellezése ListList: sorszámozott kollekció, : sorszámozott kollekció,

hozzáférés az elemekhez index hozzáférés az elemekhez index segítségévelsegítségével

QueueQueue: várakozási sor létrehozására: várakozási sor létrehozására MapMap: az egyedi kulcsokat értékekké : az egyedi kulcsokat értékekké

képezi le.képezi le. SortedSetSortedSet SortedMapSortedMap

Page 134: Programozási technológiák

Általános célú implementációkÁltalános célú implementációk

Page 135: Programozási technológiák

A A CollectionCollection interfész interfész

Használható például különböző kollekciók Használható például különböző kollekciók közötti konverzióra (mint közös nevező)közötti konverzióra (mint közös nevező)All collection implementations have a All collection implementations have a constructor that takes a Collection constructor that takes a Collection argument. argument. Suppose, for example, that you have a Suppose, for example, that you have a Collection<String> cCollection<String> c, which may be a , which may be a ListList, a , a SetSet, or another kind of , or another kind of CollectionCollection. . This idiom creates a new This idiom creates a new ArrayListArrayList (an (an implementation of the implementation of the ListList interface), interface), initially containing all the elements in initially containing all the elements in cc. . List<String> list = new ArrayList<String>(c);List<String> list = new ArrayList<String>(c);

Page 136: Programozási technológiák

public interface Collection<E> extends Iterable<E> { // Basic operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); //optional boolean remove(Object element); //optional Iterator<E> iterator();

// Bulk operations boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); //optional boolean removeAll(Collection<?> c); //optional boolean retainAll(Collection<?> c); //optional void clear(); //optional

// Array operations Object[] toArray(); <T> T[] toArray(T[] a);}

Page 137: Programozási technológiák

import java.util.*;

public class HengerProgram { public static void main(String[] args) { Collection<Henger> hengerek= new ArrayList<Henger>(); hengerek.add(new Henger(2,10)); hengerek.add(new Henger(3,6)); hengerek.add(new TomorHenger(2,10,2)); hengerek.add(new Cso(2,10,2,1)); System.out.println(hengerek.size()); hengerek.clear(); System.out.println(hengerek.size()); }}

Page 138: Programozási technológiák

import java.util.*;

public class CollectionAddDemo { public static void main(String[] args) { Collection<Integer> szamok=new HashSet<Integer>(); int n=0; do{ if(szamok.add(Math.round((float)Math.random()*89)+1)) n++; }while(n<5); System.out.println(szamok); }}

Page 139: Programozási technológiák

import java.util.*;class Diak{ private String nev; private int pont; public Diak(String nev, int pont){ this.nev=nev; this.pont=pont; } public int getPont(){ return pont; } public boolean equals(Object obj){ return nev.equals(((Diak)obj).nev); } public String toString(){ return nev+": "+pont; }}

public class Diakok{ public static void main(String[]args){ Collection<Diak> diakok=new ArrayList<Diak>(); diakok.add(new Diak("Kovács István",10)); diakok.add(new Diak("Kiss Péter",2)); diakok.add(new Diak("Nagy Pál",10)); Diak diak=new Diak("Kiss Péter",0); System.out.println(diakok.contains(diak)); }}

Page 140: Programozási technológiák

A kollekciók bejárásaA kollekciók bejárása

1. A „1. A „for-eachfor-each” ciklussal” ciklussalfor (Object o : collection)for (Object o : collection) System.out.println(o); System.out.println(o);

for(Henger henger:hengerek)for(Henger henger:hengerek) System.out.println(henger.terfogat());System.out.println(henger.terfogat());

2. Iterátorral2. IterátorralAz iterátor egy olyan objektum, ami megengedi, Az iterátor egy olyan objektum, ami megengedi, hogy bejárjuk a kollekciót, és eltávolítsuk az hogy bejárjuk a kollekciót, és eltávolítsuk az elemeket a kollekcióból, ha akarjuk.elemeket a kollekcióból, ha akarjuk.Egy kollekció bejárásához az Egy kollekció bejárásához az iteratoriterator metódusának a meghívásával kérhetünk egy metódusának a meghívásával kérhetünk egy IteratorIterator objektumot. objektumot.

Page 141: Programozási technológiák

Az Az Iterator Iterator interfész:interfész:public interface Iterator<E> {public interface Iterator<E> { boolean hasNext(); boolean hasNext(); E next(); E next(); void remove(); } void remove(); }

A A hasNexthasNext metódus visszatérési értéke metódus visszatérési értéke truetrue, ha az , ha az iterációnak van még be nem járt eleme.iterációnak van még be nem járt eleme.A A removeremove metódus eltávolítja a kollekcióból az metódus eltávolítja a kollekcióból az utolsó elemet, amit a utolsó elemet, amit a nextnext hívására kaptunk. hívására kaptunk. Az Az Iterator.removeIterator.remove az egyetlen biztonságos út, az egyetlen biztonságos út, hogy módosítsuk a kollekciót az iteráció folyamán.hogy módosítsuk a kollekciót az iteráció folyamán.Iterátor használata célszerű a Iterátor használata célszerű a for-each for-each ciklus ciklus helyett a következő esetekben:helyett a következő esetekben:

Törölni szeretnénk a bejárás közben.Törölni szeretnénk a bejárás közben. Párhuzamosan több kollekciót szeretnénk bejárniPárhuzamosan több kollekciót szeretnénk bejárni

Page 142: Programozási technológiák

for (Iterator<Henger> it=hengerek.iterator(); it.hasNext(); )for (Iterator<Henger> it=hengerek.iterator(); it.hasNext(); ) System.out.println(it.next()); System.out.println(it.next());

for (Iterator<Henger> it=hengerek.iterator(); it.hasNext(); )for (Iterator<Henger> it=hengerek.iterator(); it.hasNext(); ) if (it.next().terfogat()<100) if (it.next().terfogat()<100) it.remove(); it.remove();

Page 143: Programozási technológiák

Collection Interface Bulk Operations Collection Interface Bulk Operations

Az egész kollekcióval hajtanak végre műveleteket.Az egész kollekcióval hajtanak végre műveleteket. containsAllcontainsAll – megmondja, hogy a kollekció tartalmazza-e – megmondja, hogy a kollekció tartalmazza-e

a paraméterben megadott kollekció összes eleméta paraméterben megadott kollekció összes elemét addAlladdAll – hozzáadja a kollekcióhoz a paraméterben – hozzáadja a kollekcióhoz a paraméterben

megadott kollekció összes elemétmegadott kollekció összes elemét removeAllremoveAll – eltávolítja a kollekcióból a paraméterben – eltávolítja a kollekcióból a paraméterben

megadott kollekció összes elemétmegadott kollekció összes elemét retainAllretainAll – eltávolítja a kollekcióból azokat az elemeket, – eltávolítja a kollekcióból azokat az elemeket,

amelyek a paraméterben megadott kollekcióban nincsenek amelyek a paraméterben megadott kollekcióban nincsenek bennebenne

clearclear – eltávolítja a kollekció összes elemét – eltávolítja a kollekció összes elemét

Pl: Pl: c.removeAll(Collections.singleton(e));c.removeAll(Collections.singleton(e)); c.removeAll(Collections.singleton(null));c.removeAll(Collections.singleton(null));

Collections.singleton(e)Collections.singleton(e): egy halmazzal tér vissza, mely : egy halmazzal tér vissza, mely csak a megadott elemet tartalmazza.csak a megadott elemet tartalmazza.

Page 144: Programozási technológiák

A A SetSet interfész interfész

Set Set egy speciális egy speciális CollectionCollection, amely nem , amely nem tartalmaz ismétlődő elemeket. tartalmaz ismétlődő elemeket.

A A SetSet csak a csak a CollectionCollection-tól örökölt metódusokat -tól örökölt metódusokat tartalmazza, azzal a megszorítással kiegészítve, tartalmazza, azzal a megszorítással kiegészítve, hogy nem engedi meg az elemek ismétlődését.hogy nem engedi meg az elemek ismétlődését.

public interface Set<E> extends Collection<E> { // Basic operations int size(); boolean isEmpty();

...

}

Page 145: Programozási technológiák

A Java platform három általános célú A Java platform három általános célú Set Set implementációt tartalmaz: a implementációt tartalmaz: a HashSetHashSet, , TreeSetTreeSet, és , és LinkedHashSetLinkedHashSet. .

HashSet HashSet esetén az elemeket egy hash esetén az elemeket egy hash táblában (hasítótáblában) tárolja, ez a táblában (hasítótáblában) tárolja, ez a legjobb választás, ha a bejárás sorrendje legjobb választás, ha a bejárás sorrendje nem fontos. nem fontos.

A A TreeSet TreeSet az elemeket egy fában tárolja az az elemeket egy fában tárolja az értékük szerint rendezetten. Lényegesen értékük szerint rendezetten. Lényegesen lassabb, mint a lassabb, mint a HashSetHashSet..

A A LinkedHashSetLinkedHashSet ötvözi a láncolt listát a ötvözi a láncolt listát a hash táblával. Beszúrás szerinti hash táblával. Beszúrás szerinti rendezettség.rendezettség.

Page 146: Programozási technológiák

import java.util.*;

public class SetDemo { public static void main(String[] args) { Collection<Integer> szamok=new ArrayList<Integer>(); for(int i=0;i<50;i++) szamok.add(Math.round((float)Math.random()*99)+1); for(Integer iobj:szamok) System.out.print(iobj+" "); System.out.println(); Set<Integer> szamokh=new HashSet<Integer>(szamok); for(Integer iobj:szamokh) System.out.print(iobj+" "); System.out.println(); }}

Page 147: Programozási technológiák

import java.util.*;public class FindDups { public static void main(String[] args) { String[] words={"i", "came", "i", "saw", "i", "left"}; Set<String> h = new HashSet<String>(); for (String s : words) if (!h.add(s)) System.out.println("Duplicate detected: " + s); System.out.println(h.size() + " distinct words: " + h); }}

String w="i came i saw i left";String s;Set<String> h = new HashSet<String>();for(StringTokenizer st=new StringTokenizer(w);st.hasMoreTokens();) if (!h.add(s=st.nextToken())) System.out.println("Duplicate detected: " + s); System.out.println(h.size() + " distinct words: " + h);

Note that the code always refers to the Collection by its interface type (Set) rather than by its implementation type (HashSet). This is a strongly recommended programming practice because it gives you the flexibility to change implementations merely by changing the constructor.

Page 148: Programozási technológiák

Set Interface Bulk Operations Set Interface Bulk Operations

Egyszerűen megvalósíthatók az algebrából ismert Egyszerűen megvalósíthatók az algebrából ismert halmazműveletek.halmazműveletek.

s1.containsAll(s2)s1.containsAll(s2) – Igaz logikai értékkel tér vissza, ha – Igaz logikai értékkel tér vissza, ha s2s2 részhalmaza részhalmaza s1s1-nek-nek

s1.addAll(s2)s1.addAll(s2) – Az – Az s1s1-be -be s1s1 és és s2s2 uniója kerül.uniója kerül. s1.removeAll(s2)s1.removeAll(s2) – Az – Az s1s1-be -be s1s1 és és s2s2 különbség kerül.különbség kerül. s1.retainAll(s2)s1.retainAll(s2) – Az – Az s1s1-be -be s1s1 és és s2s2 metszete kerül.metszete kerül. clearclear – eltávolítja a kollekció összes elemét – eltávolítja a kollekció összes elemét

Feladatok: Feladatok: 1. Módosítsuk a 1. Módosítsuk a FindDupsFindDups programot úgy, hogy azt akarjuk programot úgy, hogy azt akarjuk

tudni, hogy mely szavak fordulnak elő egyszer a listában, és tudni, hogy mely szavak fordulnak elő egyszer a listában, és mely szavak fordulnak elő többször, de nem akarunk duplán mely szavak fordulnak elő többször, de nem akarunk duplán kiírt szavakat látni. Ezt úgy tudjuk elérni, hogy két halmazt kiírt szavakat látni. Ezt úgy tudjuk elérni, hogy két halmazt hozunk létre: az egyik minden elemet tartalmaz, a másik hozunk létre: az egyik minden elemet tartalmaz, a másik csak a duplikáltakat.csak a duplikáltakat.

2. Hozzunk létre két Integer objektumokat tartalmazó halmazt 2. Hozzunk létre két Integer objektumokat tartalmazó halmazt a a FindDupsFindDups programban látott módon tömbökkel programban látott módon tömbökkel inicializálva. Állítsuk elő a két halmaz unióját, metszetét, inicializálva. Állítsuk elő a két halmaz unióját, metszetét, különbségét.különbségét.

Page 149: Programozási technológiák

A A ListList interfész interfész

Sorszámozott kollekcióSorszámozott kollekció A A CollectionCollection osztálytól örökölt műveletek osztálytól örökölt műveletek

mellett újabbakat is tartalmaz:mellett újabbakat is tartalmaz: Pozíció szerinti elérés: Az elemek a listában betöltött Pozíció szerinti elérés: Az elemek a listában betöltött

helyük alapján is elérhetők.helyük alapján is elérhetők. Keresés: A megadott elemet kikeresi a listából, és Keresés: A megadott elemet kikeresi a listából, és

visszaadja a pozícióját.visszaadja a pozícióját. Bejárás: Kibővíti az Bejárás: Kibővíti az Iterator Iterator lehetőségeitlehetőségeit Részlista: Lehetővé tesz részlista műveleteket.Részlista: Lehetővé tesz részlista műveleteket.

A Java platform két általános célú A Java platform két általános célú List List implementációt tartalmaz: a implementációt tartalmaz: a ArrayListArrayList (mely (mely általában hatékonyabb), és a általában hatékonyabb), és a LinkedList LinkedList (mely (mely bizonyos esetekben hatékonyabb), valamint bizonyos esetekben hatékonyabb), valamint hozzáigazította a régebbi hozzáigazította a régebbi Vector Vector osztályt az új osztályt az új interfészhez.interfészhez.

Page 150: Programozási technológiák

public interface List<E> extends Collection<E> { // Positional access E get(int index); E set(int index, E element); //optional boolean add(E element); //optional void add(int index, E element); //optional E remove(int index); //optional boolean addAll(int index, Collection<? extends E> c); //optional

// Search int indexOf(Object o); int lastIndexOf(Object o);

// Iteration ListIterator<E> listIterator(); ListIterator<E> listIterator(int index);

// Range-view List<E> subList(int from, int to); }

Page 151: Programozási technológiák

A Collection-tól örökölt metódusokat az A Collection-tól örökölt metódusokat az elvárásainknak megfelelően elvárásainknak megfelelően használhatjuk.használhatjuk. removeremove metódus mindig az első előforduló metódus mindig az első előforduló

elemet törli a listából. elemet törli a listából. Az Az addadd és és addAll addAll metódusnál az elem a metódusnál az elem a

lista végére kerül. Például a lista végére kerül. Például a list1list1 végére végére másolja a másolja a list2list2 elemeit:elemeit: list1.addAll(list2);list1.addAll(list2);

A listaelemek összehasonlítása azok A listaelemek összehasonlítása azok equals metódusa alapján történikequals metódusa alapján történik

A pozíció szerinti elérés és keresés A pozíció szerinti elérés és keresés metódusainak működése értelemszerűmetódusainak működése értelemszerű

Page 152: Programozási technológiák

Iterátor funkciók kiterjesztéseIterátor funkciók kiterjesztésepublic interface ListIterator<E> extends Iterator<E> { boolean hasNext(); E next(); boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex(); void remove(); //optional void set(E e); //optional void add(E e); //optional }

Pl:for (ListIterator<Type> it = list.listIterator(list.size()); it.hasPrevious(); ) { Type t = it.previous(); ...}

Page 153: Programozási technológiák

Range-viewRange-view

A A subList(int fromIndex, int toIndex)subList(int fromIndex, int toIndex) részlista metódus visszaadja a lista egy részlista metódus visszaadja a lista egy szeletétszeletét

A visszaadott lista kapcsolatban marad az A visszaadott lista kapcsolatban marad az eredeti listával. Így bármilyen módosítás eredeti listával. Így bármilyen módosítás történik a részlistán, az hatással lesz az történik a részlistán, az hatással lesz az eredetire is, sőt ez fordítva is igaz.eredetire is, sőt ez fordítva is igaz.

Pl: A lista egy részét töröljükPl: A lista egy részét töröljüklist.subList(fromIndex, toIndex).clear();list.subList(fromIndex, toIndex).clear();

Page 154: Programozási technológiák

Lista algoritmusokLista algoritmusok A A CollectionsCollections osztály nagyon hatékonyan osztály nagyon hatékonyan

használható algoritmusokat nyújt listák kezelésére.használható algoritmusokat nyújt listák kezelésére. A következő lista csak felsorolja a fontosabbakat:A következő lista csak felsorolja a fontosabbakat:

sortsort: Rendezi a listát.: Rendezi a listát. shuffleshuffle: Véletlenszerűen felcserél elemeket a listában. : Véletlenszerűen felcserél elemeket a listában.

(Permutál.)(Permutál.) reversereverse: Megfordítja az elemek sorrendjét a listában.: Megfordítja az elemek sorrendjét a listában. rotaterotate: Egy adott távolsággal rotálja az elemeket.: Egy adott távolsággal rotálja az elemeket. swapswap: Felcserél két meghatározott pozícióban levő elemet.: Felcserél két meghatározott pozícióban levő elemet. replaceAllreplaceAll: Az összes előforduló elemet kicseréli egy : Az összes előforduló elemet kicseréli egy

másikra.másikra. fillfill: Felülírja az összes elemet egy meghatározott : Felülírja az összes elemet egy meghatározott

értékkel.értékkel. copycopy: Átmásolja a forráslistát egy céllistába.: Átmásolja a forráslistát egy céllistába. binarySearchbinarySearch: Egy elemet keres a bináris keresési : Egy elemet keres a bináris keresési

algoritmust használva.algoritmust használva. indexOfSubListindexOfSubList: Visszatér az első olyan indexszel, : Visszatér az első olyan indexszel,

amelynél kezdődő részlista egyenlő a másik listával.amelynél kezdődő részlista egyenlő a másik listával. lastIndexOfSubListlastIndexOfSubList: Visszatér az utolsó olyan indexszel, : Visszatér az utolsó olyan indexszel,

amelynél kezdődő részlista egyenlő a másik listával.amelynél kezdődő részlista egyenlő a másik listával.

Page 155: Programozási technológiák

FeladatFeladat

Módosítsa a korábban látott raktárprogramot úgy, Módosítsa a korábban látott raktárprogramot úgy, hogy az egy listában tárolja az egyes árufajták hogy az egy listában tárolja az egyes árufajták adatait. Végezze el a következő műveleteket:adatait. Végezze el a következő műveleteket:

Árufajta felvételeÁrufajta felvétele ListázásListázás EladásEladás VételVétel ÁrmódosításÁrmódosítás

Page 156: Programozási technológiák

A A Map Map interfészinterfész

Kulcs-érték párokat tartalmazKulcs-érték párokat tartalmaz Az egyedi kulcs alapján megkereshetjük a Az egyedi kulcs alapján megkereshetjük a

kulcshoz tartozó értéket (sokkal kulcshoz tartozó értéket (sokkal kényelmesebb, mintha össze kellene kényelmesebb, mintha össze kellene állítanunk egy keresőobjektumot)állítanunk egy keresőobjektumot)

A Java platform három általános célú A Java platform három általános célú Map Map implementációt tartalmaz: implementációt tartalmaz: HashMap, HashMap, TreeMapTreeMap és és LinkedHashMap LinkedHashMap (melyek (melyek hasonló tárolási elvűek és működésűek, hasonló tárolási elvűek és működésűek, mint a Set implementációk), valamint mint a Set implementációk), valamint hozzáigazította a régebbi hozzáigazította a régebbi Hashtable Hashtable osztályt az új interfészhez.osztályt az új interfészhez.

Page 157: Programozási technológiák

public interface Map<K,V> { // Basic operations V put(K key, V value); V get(Object key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size(); boolean isEmpty(); // Bulk operations void putAll(Map<? extends K, ? extends V> m); void clear(); // Collection Views public Set<K> keySet(); public Collection<V> values(); public Set<Map.Entry<K,V>> entrySet(); // Interface for entrySet elements public interface Entry { K getKey(); V getValue(); V setValue(V value); } }

Page 158: Programozási technológiák

import java.util.*;

public class Freq { public static void main(String[] args) { String[] words={"i","came","i","saw","i","left"}; Map<String, Integer> m=new HashMap<String, Integer>();

for (String w: words) { Integer freq=m.get(w); m.put(w, (freq==null)?1:freq+1); }

System.out.println(m.size() + " distinct words:"); System.out.println(m); }}

Page 159: Programozási technológiák

A A Collection viewCollection view metódusokkal háromféle nézetét kapjuk metódusokkal háromféle nézetét kapjuk a Map-neka Map-nek keySetkeySet: kulcsok halmaza (: kulcsok halmaza (SetSet)) valuesvalues: értékek kollekciója (: értékek kollekciója (CollectionCollection)) entrySetentrySet: kulcs-érték párok halmaza (: kulcs-érték párok halmaza (SetSet). A ). A MapMap interfész interfész

tartalmaz egy kis beágyazott interfészt – tartalmaz egy kis beágyazott interfészt – Map.EntryMap.Entry – ezen – ezen halmaz elemei típusának meghatározására.halmaz elemei típusának meghatározására.

Csak a kollekció nézetekkel lehet iterációt végezni a Map-en.Csak a kollekció nézetekkel lehet iterációt végezni a Map-en. Használhatók Használhatók remove, removeAll, retainAll, clear remove, removeAll, retainAll, clear

kollekció műveletekkollekció műveletek

for (KeyType key : m.keySet()) System.out.println(key);

//With an iterator: //Filter a map based on some property of its keys.for (Iterator<Type> it = m.keySet().iterator(); it.hasNext(); ) if (it.next().isBogus()) it.remove();

//Following is the idiom for iterating over key-value pairs. for (Map.Entry<KeyType, ValType> e : m.entrySet()) System.out.println(e.getKey() + ": " + e.getValue());

Page 160: Programozási technológiák

További példák a kollekció nézetek használatáraTovábbi példák a kollekció nézetek használatára

//1.if (m1.entrySet().containsAll(m2.entrySet())) {

...}//2.if (m1.keySet().equals(m2.keySet())) {

...}//3.Set<KeyType>commonKeys = new HashSet<KeyType>(m1.keySet());commonKeys.retainAll(m2.keySet());//4.m1.entrySet().removeAll(m2.entrySet());//5.m1.keySet().removeAll(m2.keySet());

Page 161: Programozási technológiák

//6.Set<Employee>individuals=new HashSet<Employee>(managers.keySet());individuals.removeAll(managers.values());

//7. Suppose you want to fire all the employees who report directly to some manager, Simon.

Employee simon = ... ;managers.values().removeAll(Collections.singleton(simon));

//8. Once you've done this, you may have a bunch of employees whose managers no longer work for the company (if any of Simon's direct-reports were themselves managers). The following code will tell you which employees have managers who no longer works for the company.

Map<Employee,Employee> m=new HashMap<Employee,Employee>(managers);m.values().removeAll(managers.keySet()); Set<Employee> slackers = m.keySet();

Page 162: Programozási technológiák

RendezésRendezés

Collections.sort(l);Collections.sort(l);Alapértelmezett rendezés, a lista elemeinek Alapértelmezett rendezés, a lista elemeinek osztálya implementálja osztálya implementálja ComparableComparable interfészt, interfészt, azaz tartalmaz egy azaz tartalmaz egy compareTocompareTo metódust. metódust. Korlátok:Korlátok:

Csak egyféle rendezettségCsak egyféle rendezettség Be van égetve az objektumba, nem lehet változtatni rajtaBe van égetve az objektumba, nem lehet változtatni rajta Lehet, hogy nem is implementálta a Lehet, hogy nem is implementálta a ComparableComparable interfészt interfészt

Rendezés egy Comparator objektummalRendezés egy Comparator objektummalpublic interface Comparator<T> {public interface Comparator<T> { int compare(T o1, T o2); int compare(T o1, T o2); }} „„Névtelen osztály” létrehozásávalNévtelen osztály” létrehozásával

Page 163: Programozási technológiák

import java.util.*;

public class DiakokList3{ public static void main(String[]args){ final Comparator<Diak> PONTSZERINT=new Comparator<Diak>(){ public int compare(Diak d1, Diak d2){ return d1.getPont()-d2.getPont(); } };

List<Diak> diakok=new ArrayList<Diak>(); diakok.add(new Diak("Kovács István",10)); ... //Természetes rendezettség szerinti lista Collections.sort(diakok); for(Diak a:diakok) System.out.println(a); //Lista comparator szerinti rendezettséggel Collections.sort(diakok, PONTSZERINT); for(Diak a:diakok) System.out.println(a); }}

Page 164: Programozási technológiák

A A SortedSet SortedSet interfészinterfészpublic interface SortedSet<E> extends Set<E> { // Range-view SortedSet<E> subSet(E fromElement, E toElement); SortedSet<E> headSet(E toElement); SortedSet<E> tailSet(E fromElement);

// Endpoints E first(); E last();

// Comparator access Comparator<? super E> comparator();}

Rendezettség:Rendezettség:• Az elemek természetes rendezettsége szerintAz elemek természetes rendezettsége szerint•A létrehozásakor megadott A létrehozásakor megadott ComparatorComparator alapján alapján

Általános implementáció: Általános implementáció: TreeSetTreeSet

Page 165: Programozási technológiák

import java.util.*;public class SortedSetDemo{ public static void main(String[]args){ int[]a={21,25,23,28,22,26,12}; SortedSet<Integer> s1=new TreeSet<Integer>(); for(Integer i: a) s1.add(i); System.out.println(s1); System.out.println(s1.headSet(25)); Comparator<Integer> reverse=new Comparator<Integer>(){ public int compare(Integer i1, Integer i2){ return i2-i1; } }; SortedSet<Integer> s2=new TreeSet<Integer>(reverse); s2.addAll(s1); System.out.println(s2); }}

Page 166: Programozási technológiák

int count = dictionary.subSet("doorbell", "pickle").size();

dictionary.subSet("f", "g").clear();

for (char ch = 'a'; ch <= 'z'; ch++) { String from = String.valueOf(ch); String to = String.valueOf(ch); System.out.println(from + ": " + dictionary.subSet(from, to).size());}

Page 167: Programozási technológiák

A A SortedMap SortedMap interfészinterfész

public interface SortedMap<K, V> extends Map<K, V>{ Comparator<? super K> comparator(); SortedMap<K, V> subMap(K fromKey, K toKey); SortedMap<K, V> headMap(K toKey); SortedMap<K, V> tailMap(K fromKey); K firstKey(); K lastKey();}

Rendezettség:Rendezettség:• Az kulcsok természetes rendezettsége szerintAz kulcsok természetes rendezettsége szerint•A létrehozásakor megadott A létrehozásakor megadott ComparatorComparator alapján alapján

Általános implementáció: Általános implementáció: TreeSetTreeSet

Page 168: Programozási technológiák

Summary of InterfacesSummary of InterfacesThe core collection interfaces are the foundation of the Java The core collection interfaces are the foundation of the Java Collections Framework. The Java Collections Framework hierarchy Collections Framework. The Java Collections Framework hierarchy consists of two distinct interface trees: consists of two distinct interface trees:

The first tree starts with the Collection interface, which provides The first tree starts with the Collection interface, which provides for the basic functionality used by all collections, such as add and for the basic functionality used by all collections, such as add and remove methods. remove methods. Its subinterfaces — Set, List, and Queue — provide for more Its subinterfaces — Set, List, and Queue — provide for more specialized collections. specialized collections. The Set interface does not allow duplicate elements. This can be The Set interface does not allow duplicate elements. This can be

useful for storing collections such as a deck of cards or student useful for storing collections such as a deck of cards or student records. The Set interface has a subinterface, SortedSet, that records. The Set interface has a subinterface, SortedSet, that provides for ordering of elements in the set. provides for ordering of elements in the set.

The List interface provides for an ordered collection, for situations in The List interface provides for an ordered collection, for situations in which you need precise control over where each element is inserted. which you need precise control over where each element is inserted. You can retrieve elements from a List by their exact position. You can retrieve elements from a List by their exact position.

The Queue interface enables additional insertion, extraction, and The Queue interface enables additional insertion, extraction, and inspection operations. Elements in a Queue are typically ordered in inspection operations. Elements in a Queue are typically ordered in on a FIFO basis. on a FIFO basis.

The second tree starts with the Map interface, which maps keys The second tree starts with the Map interface, which maps keys and values similar to a Hashtable. and values similar to a Hashtable. Map's subinterface, SortedMap, maintains its key-value pairs in Map's subinterface, SortedMap, maintains its key-value pairs in ascending order or in an order specified by a Comparator. ascending order or in an order specified by a Comparator.

These interfaces allow collections to be manipulated These interfaces allow collections to be manipulated independently of the details of their representation. independently of the details of their representation.

Page 169: Programozási technológiák

Általános célú implementációkÁltalános célú implementációk

Az általános célú implementációk mind Az általános célú implementációk mind biztosítják az összes opcionális műveletet, biztosítják az összes opcionális műveletet, amit az interfészek tartalmaznak.amit az interfészek tartalmaznak.

Page 170: Programozási technológiák

Általános szabály, hogy programíráskor az Általános szabály, hogy programíráskor az interfészeken, és nem az implementációkon interfészeken, és nem az implementációkon kell gondolkodni. kell gondolkodni.

Legtöbb esetben az implementáció Legtöbb esetben az implementáció megválasztása csak a teljesítményt megválasztása csak a teljesítményt befolyásolja.befolyásolja.

Az előnyben részesített programozói stílus az, Az előnyben részesített programozói stílus az, ha egy interfész típusú változóhoz választunk ha egy interfész típusú változóhoz választunk egy implementációt. egy implementációt.

Így a program nem függ majd egy adott Így a program nem függ majd egy adott implementáció esetén az ahhoz hozzáadott új implementáció esetén az ahhoz hozzáadott új metódusoktól, ezáltal a programozó bármikor metódusoktól, ezáltal a programozó bármikor szabadon változtathatja az implementációt, szabadon változtathatja az implementációt, mikor jobb teljesítményt szeretne elérni, vagy mikor jobb teljesítményt szeretne elérni, vagy a működési részleteket szeretné módosítani.a működési részleteket szeretné módosítani.

Page 171: Programozási technológiák

The Java Collections Framework The Java Collections Framework provides several general-purpose provides several general-purpose implementations of the core interfaces: implementations of the core interfaces: For the For the SetSet interface, interface, HashSetHashSet is the most is the most

commonly used implementation. commonly used implementation. For the For the ListList interface, interface, ArrayListArrayList is the is the

most commonly used implementation. most commonly used implementation. For the For the MapMap interface, interface, HashMapHashMap is the most is the most

commonly used implementation. commonly used implementation. For the For the QueueQueue interface, interface, LinkedListLinkedList is the is the

most commonly used implementation. most commonly used implementation.