Upload
lucky
View
23
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
Programozási technológiákProgramozási technológiák
2007/082007/08
1. Az OOP főbb jellemzői1. Az OOP főbb jellemzői
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.
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
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)
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.
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
2. A Java nyelv 2. A Java nyelv
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
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)
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.
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!"); }}
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
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))
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!\"")
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
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);
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
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;
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.
import java.utils.*;import extra.*;//Egy vagy több osztály deklarálása, a sorrend mindegy
class C1{ ...}
class C2{ ...}...public class Prog{ ... public static void main(String[] args){ ... } ...}
Operá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.
++, --++, --
int a = 0, b, c;b = ++a;a = 0;c = a++;
c = ++b + a++;c = a+++++b;c = a++ + ++b;
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ó
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)
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.
É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;
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)
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: ;
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): { ... }
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ő
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.
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)
É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
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)
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…
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.
min
public static int min(int a, int b)
Returns the smaller of two int values. That is, the result the argument closer to the value of Integer.MIN_VALUE. If the arguments have the same value, the result is that same value.
Parameters: a - an argument. b - another argument.
Returns: the smaller of a and b.
See Also: Long.MIN_VALUE
Szelekciók - 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;
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
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
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.
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
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.
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!"); }}
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.
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}
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();}
for(char c='A'; c<='Z'; c++) System.out.print(c+" ");
//(c+' ') esetén a kódokat írja ki
for(char n='A',k='a'; n<='Z'; n++,k++) System.out.print(n+" "+k+" ");
for(double d=500000; d<=1000000; d*=1.1) System.out.println(d);
Kiugrás a ciklusbó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.
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.
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ó.
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.
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.
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; }
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(); } }
Osztály készítéseOsztály készítése
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
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
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.
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.
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.
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.
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.
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!
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)
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)
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
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
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
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
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)
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.
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; }
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
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"); } }
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
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: ");
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)
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()
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
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.
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););
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”;
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
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
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
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: ");
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(' ','-'));
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);
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
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
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
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
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
}}
}}
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
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
}}
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!
: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!
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[];
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];
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++)
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.
É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.
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];
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!
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
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(); }}
ÖröklődésÖröklődés
Ö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{ ... ...}}
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
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
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
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))
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)
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.)
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
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
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
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.
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.
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
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 } } } }
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.)
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ó
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; }}
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]); }}
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)
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
InterfészekInterfészek
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.
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
Általános célú implementációkÁltalános célú implementáció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);
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);}
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()); }}
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); }}
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)); }}
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.
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
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();
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.
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();
...
}
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.
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(); }}
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.
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.
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.
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); }
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ű
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(); ...}
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();
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.
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
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.
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); } }
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); }}
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());
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());
//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();
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
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); }}
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
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); }}
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());}
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
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.
Á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.
Á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.
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.