Professional Documents
Culture Documents
PROGRAMOZS III.
Objektumorientlt programozs
Java nyelven
Szerz:
Varjasi Norbert
egyetemi tanrsegd
Lektor:
Pusztai Pl
egyetemi adjunktus
Programozs III.
A dokumentum hasznlata
Vissza
A dokumentum hasznlata
Mozgs a dokumentumban
A dokumentumban val mozgshoz a Windows s az Adobe Reader megszokott elemeit s mdszereit hasznlhatjuk.
Minden lap tetejn s aljn egy navigcis sor tallhat, itt a megfelel
hivatkozsra kattintva ugorhatunk a hasznlati tmutatra, a tartalomjegyzkre, valamint a trgymutatra. A s a nyilakkal az elz s a kvetkez oldalra lphetnk t, mg a Vissza mez az utoljra megnzett oldalra
visz vissza bennnket.
Pozcionls a knyvjelzablak segtsgvel
A bal oldali knyvjelz ablakban tartalomjegyzkfa tallhat, amelynek
bejegyzseire kattintva az adott fejezet/alfejezet els oldalra jutunk. Az
aktulis pozcinkat a tartalomjegyzkfban kiemelt bejegyzs mutatja.
A tartalomjegyzk s a trgymutat hasznlata
Ugrs megadott helyre a tartalomjegyzk segtsgvel
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Tartalomjegyzk
Vissza
Tartalomjegyzk
Elsz..................................................................................................................... 8
1. A Java nyelv alapjai ........................................................................11
1.1. Trtneti ttekints....................................................................................11
1.2. A Java programok s a virtulis gp szerkezete..................................... 13
1.3. Krdsek......................................................................................................16
2. Az objektumszemllet elmleti megkzeltse ............................ 17
2.1. Az osztly s az objektum ........................................................................ 19
2.2. Egysgbezrs.............................................................................................23
2.3. Adatrejts ....................................................................................................24
2.4. rklds ...................................................................................................25
2.5. Tbbalaksg.............................................................................................. 29
2.6. Osztlyok s objektumok egyttmkdse, kapcsolatai ...................... 34
2.7. Kontner osztlyok....................................................................................35
2.8. Komponensek ............................................................................................37
2.9. Krdsek......................................................................................................37
2.10. Feladatok...................................................................................................38
3. A Java technolgirl kzelebbrl ............................................... 39
3.1. Keretrendszerek .........................................................................................39
3.2. Nyelvi alapelemek ......................................................................................40
3.3. Krdsek......................................................................................................74
3.4. Feladatok.....................................................................................................75
4. Az osztlyok hasznlata ............................................................... 76
4.1. Az osztlyok, s az objektumok letciklusa ........................................... 76
4.2. rklds ...................................................................................................81
4.3. Tbbalaksg.............................................................................................. 85
4.4. Absztrakt osztlyok ................................................................................... 95
4.5. Osztlyvltozk s osztlymetdusok ....................................................97
4.6. Krdsek....................................................................................................102
4.7. Feladatok...................................................................................................102
5. Interfszek ...................................................................................104
5.1. Interfszek deklarcija...........................................................................105
5.2. Interfszek kifejtse, megvalstsa.......................................................106
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Tartalomjegyzk
Vissza
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Tartalomjegyzk
Vissza
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Elsz
Vissza
Elsz
A programozsi nyelvek trtnete nem lel fel nagy idintervallumot. Az
utbbi tven v alatt nagy fejldsi vet jrtak be mind a hardver-, mind a
szoftvertervezsi mdszertanok. A szmtgpek elterjedsvel a piac egyre tbb alkalmazsfejlesztsi ignyt tmasztott. A szmtgpes programok termelshez szigor szablyok, egysges mdszertanok szksgesek.
A szoftverek tervezshez s elksztshez a modellez rendszerek ismerete szksges. A szoftverfejleszts sorn egy-egy elmleti skon brzolt
feladat magasszint modelljbl kell lekpezni a szmtgpen trolhat
adatstruktrkat s algoritmusokat az adott hardver- s szoftverkrnyezetben.
A modellalkotsnak szmos elmlete ismert. Az 1960-as vekben megjelen, majd szles krben a 80-as vekben elterjed objektumorientlt
modellezsi s programozsi szemllet j megkzeltsi mdot adott az
adatszerkezetek s az algoritmusok tervezsbe. Az j megkzelts szerint
az let szmtgpektl fggetlen, termszetes jelensgeit kell megfigyelni,
s ezeket a megfigyelseket programozsi krnyezettl fggetlenl kell
modellezni. Az gy ellltott ltalnos modellt azutn olyan programozsi
nyelven kell megvalstani, amelyek tmogatjk ezt az objektumorientlt
szemlletet. Ha nem ilyen programnyelveket hasznlunk, akkor a programozs nehzkess vlhat, az objektumorientlt rendszer elemei srlhetnek, vagy legrosszabb esetben a felvzolt modellt torztjuk el, gy pedig
nem a modell szerinti feladat lesz a vgeredmny, hanem valami ms.
Az objektumorientlt szemlletmd szaktva a strukturlt programozs
elvvel ahol egy adott feladat megoldsa fgg az implementl nyelvtl,
mert a feladatokat mindig az adott programnyelv brzolhat adatstruktrjval s utastskszletvel kszthetjk el egy gpektl s programozsi nyelvektl fggetlen modellszemlletet, modellalkotst kvetel meg a
fejleszttl. Az elll objektumorientlt modellek azutn, egy-egy adott
objektumorientlt nyelven megvalsthatak.
A Java a 90-es vek s napjaink dinamikusan fejld programnyelve.
Az Internet korban amikor lehetsgess vlt az egymssal sszekttetsben ll gpek hasznlata a Java nyelv kpes az sszekapcsolt, nylt
rendszereket hasznl szoftverek fejlesztsre. Htkznapi szemll ltal
is megfigyelhet az a folyamat, amelyben az eddig csak klnll gpeken
fut egyedi programokat, a hlzatos, kliens-szerver, vagy a napjainkra
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Elsz
Vissza
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Elsz
Vissza
10
Vissza
10
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
11
Vissza
11
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
12
re, mint pldul a lasssg fontos szerepet jtszott ksbb, a nyelv gyors
elterjedsben.
A virtulis gp a Java alkalmazsok futtatsra kpes, ltalban szoftveresen megvalstott mkdsi krnyezet. A virtulis gp feladata a Java
osztlyokat tartalmaz .class llomnyok betltse, kezelse, valamint az
azokban tallhat Java kdban adott mveletek gpi kd utastsokk
trtn talaktsa.
Gosling ezt az alapelvet az rd meg egyszer, futtasd brhol kifejezssel magyarzta. Mivel a kutatsban rszt vev fejlesztk C++ programozk voltak, gy a kifejlesztett j nyelvhez a C++ nyelv alapjait hasznltk
fel kiindulsknt, ezt egyszerstettk, alaktottk. Cljuk egy olyan nyelv
megalkotsa volt, ami tisztn objektumorientlt, s amelyben a gyakran
elfordul programozsi hibk mr fordtsi idben kiderlnek. Kezdetben Oak (tlgy) nvvel illettk az elkszlt nyelvet, de ez a sz mr foglalt
volt. A Java nvvlaszts a fejlesztk kvzsi szoksbl ered. (Jva szigetrl szrmaz kvt fogyasztottak az j nv kivlasztsakor.)
Az j nyelv elksztse mg nem jelentett egyrtelmen szleskr elterjedst akkor sem, ha az a nyelv, illetve a kidolgozott technolgia hatkony. Az elkszlt eszkz (Set Tob Box interaktv kbeltelevzis rendszer) messze megelzte a kort, mert a 90-es vek elejn az ipar s a piac
(konkrtan a kbeltelevzis rendszerek) mg nem ismertk fel ebben az j
technolgiban rejl lehetsgeket.
A nyelv ismertsge s gyors elterjedse annak volt ksznhet, hogy a
90-es vekben rohamosan fejld web-alkalmazsokra is felksztettk.
Ekkoriban vlt ugyanis npszerv a hipertext, s a web-bngszkbe
belecsempszett, bepl JVM-ek (HotJava Browser, Netscape stb.) letre
keltettk az addig statikus lapokat. Vagyis a Java-kpes bngsz motorok
kpesek voltak a HTML-oldalakba ptett, elre lefordtott bjtkdok futtatsra, animcik, mozg brk, zenk s videk formjban (az
appletek 1995-96-tl) jelentek meg.
A Java programozsi nyelvet 1995 mjusban adta ki a Sun Microsystems, ekkor mr a fbb gyrt s feljesztcgek bejelentettk a Java
technolgival val egyttmkdst (Netscape, Oracle, Toshiba, Lotus,
Borland, Macromedia, Silicon Graphics, Symantec, IBM, Adobe, Microsoft stb.).
1998-tl mkdik a Java Community Process (JCP), mint a Java fejlesztseket sszefog, tbb nagyvllalatot s szmos kutatintzetet, valamint egyni fejlesztt sszefog fggetlen szervezet.
Vissza
12
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
13
Vissza
13
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
14
Vissza
14
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
15
Egyszer: A nyelv a C++ (mint a 90-es vek legnpszerbb s legelterjedtebb krnyezete) egyszerstett vltozata. A Java nyelv sokkal kevesebb nyelvi eszkzt sokkal nagyobb ktttsgekkel tartalmaz.
Objektumorientlt: A Java tisztn objektumorientlt nyelv, egy Java
alkalmazs nem tartalmaz globlis, illetve osztlyokhoz nem kthet
kdot.
Elosztott: A Java alkalmazsok kpesek hlzatos krnyezetben, az
internet egysges erforrs azonostival (URL Uniform Resource
Locator) egyrtelmen azonostott objektumokat kezelni. A Java rendszer tovbb kpes a tvoli eljrshvson alapul kliens-szerver jelleg
alkalmazsok kifejlesztsre.
Robusztus: (hibatr, megbzhat): A nyelv tervezsekor fontos
szempont volt a programozi hibk mr fordtsi idben val kiszrse, a futsi idej hibk minimalizlsa.
Biztonsgos: A nyelv mr kezdeti szakaszban tmogatta a hozzfrsek s jogosultsgok kezelst. A Java krnyezet a hlzatos alkalmazsok s elosztott rendszerek tmogatsa mellett hatkony biztonsgi megoldsokkal rendelkezik. Az osztlyok virtulis gpbe tltsekor (Class loader) hibaellenrzs trtnik, s a virtulis gp az adott
opercis rendszer felett az n. homokverem (sandbox) modell szerint
mkdik, amely azt jelenti, hogy a fut programok az opercis rendszer egy kijellt s lahatrolt terletn futnak, gy kptelenek a gazdagp erforrsaihoz kzvetlenl hozzrrni.
Hordozhat: A Java nyelv s a programozsi krnyezet nem tartalmaz implementcifgg elemeket. Egy adott forrsbl minden Java
fordt ugyanazt a trgykdot lltja el.
Architektra-fggetlen (gpfggetlen): A fordts sorn az azonos
tpusok minden krnyezetben azonos mret memriaterletet foglalnak, a fordts utn elll class fjlok brmelyik szabvnyos virtulis
gpen futtathatak. A futtat krnyezet a trgykd llomnyokat
azonos mdon hajtja vgre. Az egyes architektrkhoz s opercis
rendszerekhez elksztett virtulis gpek alaktjk t a class llomnyokat natv kdokra.
Interpretlt: Az egyes hardvereken fut natv kdot a virtulis gp
futsi idben hozza ltre, a lefordtott trgykd llomnyokbl.
Nagy teljestmny: Ez az utols jellemz mg nem kerlt teljes
mrtkben megvalstsra. A Java krnyezet kritikusai az interpretlt
Vissza
15
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
16
jellegbl add lass futst s az optimalizls nehzkessgt nagy hibnak rjk fel, azonban a processzorok fejldsvel, s a Just In Time
(JIT) fordtk kutatsba fektetett erforrsokkal a Java fejleszti a jvben ezt a szempontot is meg szeretnk valstani. A JIT fordtk a
lefordtott trgykdokat a futs alatt megrzik, optimalizljk.[5]
Tbbszl: A Java krnyezet tmogatja a prhuzamos programozst,
s alkalmas prhuzamos algoritmusok megvalstsra. Ezt az adott
hardveren gy valstja meg, hogy egy idben egymstl fggetlenl
tbb programrszt futtat. Egyprocesszoros rendszereknl ezt termszetesen egyms utni vgrehajtssal, a szlak temezsvel oldja meg.
Dinamikus: Az osztlyknyvtrak szabadon tovbbfejleszthetk, s
mr a tervezsnl figyelembe vettk, hogy egy esetleges ksbbi bvts a mr megalkotott programok mkdst ne akadlyozza.
A Java programok forrsszvege a C, C++ nyelvhez hasonlan egy
tiszta karaktersorozat. Az egyes nyelvi elemeket fehr karakterekkel (szkz, tabultor, soremels) tagoljuk, illetve vlasztjuk el egymstl. A program rsakor be kell tartanunk a nyelv szablyait, s rdemes figyelembe
venni a Java nyelv kdolsi konvenciit (lsd: Kdolsi szabvnyok).
A szintaktikai szablyok szigoran meghatrozzk, hogy milyen elemeket, azonostkat milyen sorrendben alkalmazhatunk a forrskdban.
Szintaktikai hiba pldul, ha egy azonostt hibsan runk le. A szintaktikailag hibs program nem fordthat le rvnyes class fjl formtumba.
A szemantikai szablyok a program mkdsi elvt, futst hatrozzk
meg. Ezek a hibk fordtskor ltalban nem derthetek ki, csak a futs
kzben jelennek meg. Pldul ha a programban egy a/b alak kifejezsben
0-val val osztst ksrelnk meg vgrehajtani.
1.3. Krdsek
Vissza
16
Programozs III.
Vissza
17
2. Az objektumszemllet elmleti
megkzeltse
Az elz fejezetben megismerkedtnk a Java krnyezettel, ttekintettk a
trtneti vonatkozsokat s a mkds fbb alapelveit. Maga a Java nyelv
egy tisztn objektumorientlt programozsi nyelv. Az objektumorientlt
programozs elsajttshoz szksgnk van a nyelv jelkszletnek s mkdsi elvnek megismersre.
Az objektumorientlt alapelvek s modellek azonban rvnyesek
konkrt programozsi nyelv nlkl is, hiszen alkalmazsuk magasabb szint, ltalnos megoldsokat nyjt. Ebben a fejezetben ennek a gondolkodsmdnak mskppen programozsi paradigmnak alapelveivel ismerkednk meg.
A programozs hskorban a programok csupn nhny szz soros,
alacsonyszint utastssorozatbl lltak. A magasszint, strukturlt programnyelvek megjelense az 1960-as vektl kezdve knnyebb s hatkonyabb programozsi technikkkal ltta el a szakembereket. A konstansok, vltozk vezrlsi szerkezetek s a szubrutinok megjelense nagyobb
s sszetettebb problmk megoldst tette lehetv: a feladatok magas
szint modellezst s algoritmizlst. A kalsszikus strukturlt programozs szablyai szerint a megoldand feladatokat t kell alaktani szmtstechnikai modell, azaz a megoldshoz felhasznlt gp szmra rtelmezhet adatokra, illetve az ezekkel az adatokkal, a feladatot elvgz algoritmusra. A megvalstshoz szmos programnyelv kszlt, s ahogy ntt a
szmtgpekkel elvgzett feladatmegoldsok szma, az egyes programozsi nyelvek is gy vltak sszetettebbek, ltalnosabb.
Megjegyzs: Struktrltnak tekinthet az a program, amely vezrlsi szerkezetknt megengedi a szubrutinhvsokat, a szekvencia, a szelekci, az
iterci utastsokat, de ms vezrlstad utastsokat (pl. ugr utasts)
nem. [Marton02]
A 80-as vekre az elkszlt programok mrete s sszetettsge akkorra
ntt, hogy mindinkbb szembetlttek a strukturlt programtervezs korltai. Ezt az idszakot a szoftverkrzis idszaknak is neveztk, gyakori
volt a hatridk csszsa, az eredmnytelen fejleszts s a kltsgvetsek
Vissza
17
Programozs III.
Vissza
18
Vissza
18
Programozs III.
Vissza
19
keresni. Az objektumorientlt programokban hiszen ptkvei a strukturlt programozsbl szrmaznak ppgy megtalljuk a strukturlt
alapelemeket, algoritmusokat, mint a hagyomnyos programokban. Mgis
egy msik vilgban talljuk magunkat.
Az objektumorientlt programozs a mai szoftverfejleszts legelterjedtebb mdja. Ennek a legfbb oka az, hogy az osztlyhierarchik segtsgvel hatkonyan tmogatja az absztrakt objektumok kialaktsval. Az jrafelhasznlhat kdok, csomagok s komponensek tmogatsval nagymrtkben tudja cskkenteni a fejlesztshez szksges idt.
Az albbiakban egy tmr ttekintst tallunk az objektumorientlt
szemllet legfontosabb alapelveirl. A fogalmak tisztzsa sorn mg nem
lesz sz egyes programnyelvi elemekrl, hiszen az albbi elveket minden
nyelv majd a maga mdjn valstja meg.
2.1. Az osztly s az objektum
A vals vilg lersban az emberi gondolkodst kvetve osztlyozhatjuk, csoportosthatjuk a ltottakat, a modellezs sorn absztrakt fogalmakat s ltalnostott tteleket llthatunk fel. Az absztrakcis modellezskor az sszetett s bonyolult dolgokat egyszerstjk, s csak a feladat
szmra informcival br rszleteit hasznljuk fel.
Ha pldul egy tkeresztezds forgalmt figyeljk, akkor nem fontos,
hogy egy jrm hny alkatrszbl ll, mennyire sszetett s hogy hny
klnbz jellemzje van, pontszernek tekinthetjk. Annyi azonban
fontos lehet, hogy a jrm szemly-, vagy tehergpkocsi.
Ms esetben a vilg sszetett dolgait rszekre kell bontanunk. A specializl modellezskor ezeket a rszeket valamilyen szablyok mentn
sszekapcsoljuk, hiszen a problma megoldshoz elengedhetetlennek
bizonyul.
Fenti pldnkat folytatva egy gpkocsi diagnosztikai mhely szmra
mr nem elgsges a fenti modellalkots, itt mr egy gpkocsit elemeire
kell szednnk, s meg kell figyelnnk ezen alkatrszek tulajdonsgait, mkdst.
Az objektumorientlt modellalkotsban objektumoknak nevezzk azokat a dolgokat, amelyekhez a vals vilgban egy-egy nll dolgot (jelentst, tartalmat, vagy fogalmat) rendelhetnk. A szakirodalomban egyarnt
tallkozunk az objektum, a pldny, vagy az egyed kifejezssel is. Az objektumokat valamilyen mrhet tulajdonsgval jellemznk, s megfigyeljk, hogy egy kls esemnyre (zenetre) hogyan reaglnak. A reakci az
Vissza
19
Programozs III.
Vissza
20
Vissza
20
Programozs III.
Vissza
21
Vissza
21
Programozs III.
Vissza
22
5. bra: A pldnyosts
Az objektumok lettartamuk sorn mindig valamilyen bels llapotban
vannak. A feladatvgzst minden esetben egy kezdllapotbl kiindulva
rtelmezzk. Az objektum ezt a kezdllapott, illetve a ksbbiekben a
bels llapott egy-egy zenet hatsra mdosthatja.
Vissza
22
Programozs III.
Vissza
23
Vissza
23
Programozs III.
Vissza
24
tly rszeknt kell rtelmezni. Ezzel a megkzeltssel az objektumorientlt rendszerek a vals vilg modellezsnek egy hatkony s ttekinthet
lerst adjk.
Az egy osztlyban definilt adattagok s a hozzjuk tartoz mveletek
(metdusok) sszetartoznak, zrt s sztvlaszthatatlan egysget alkotnak.
Az egyes hibrid objektumorientlt nyelvekben (Object Pascal, Delphi,
C++, C#, PHP) az egysgbezrst a hagyomnyos, sszetett adatszerkezetek (struktrk, rekordok) kibvtsvel valstottk meg. A tisztn objektumorientlt nyelvekben a modellek lerst csak osztlyokban adhatjuk
meg, nll, vagy globlis adatokat s mveleteket nem definilhatunk.
2.3. Adatrejts
A msodik objektumorientlt alapfogalom az adatrejts (data hiding) szorosan kapcsoldik az egysgbezrshoz. Elzleg utaltunk r, hogy az
adatokat minden egyes objektum elrejti a klvilg ell. Ez azrt szksges,
hogy egy adatot kvlrl ne lehessen mdostani, manipullni, csak valamilyen ellenrztt zeneten keresztl. Segtsgvel egy objektum csak olyan
zenetre reagl amit ismer, s az rkez zenetet ellenrzs utn vgrehajtja. Az adatok ellenrzse azonban itt is a programoz feladata! Az
adatrejts elvnek betartsval mellkhatsknt a program tbbi rszt
is vdhetjk az adott objektumban fellp hibktl, gy a fejlesztsek sorn a hiba forrsa knnyen azonosthat lesz.
Minden objektum vdi a bels adatait, gy adatstruktrja kvlrl nem
rhet el. Ezekhez az adatokhoz csak a sajt mveletei frhetnek hozz.
Az egyes nyelvekben az adatrejtst a lthatsgi szablyok definiljk. A
hozzfrsi kategrik mind az adatok, mind a metdusok szmra hasznlhatk. A legfbb kategrik a nyilvnos (public), jellse: +; a vdett
(protected), jellse: # s a privt (private), jellse: . Az egyes programnyelvek megadhatnak ennl tbb, illetve kevesebb kategrit, illetve
definilhatnak msfajta hozzfrsi mdokat is. Az adatrejts elvnek
megsrtse olyan szemantikai hibkhoz vezethet, amelyek nehezen felderthetk, illetve csak huzamosabb hasznlat utn vletlenl okoznak
Vissza
24
Programozs III.
Vissza
25
Vissza
25
Programozs III.
Vissza
26
6. bra: rklds
Az rktsi mdok az egyes programrendszereknl tbbflekppen valsthatak meg. Minden objektumorientlt programrendszer lehetv teszi
az egyszeres rklst, ahol minden leszrmazott osztlynak egy s csakis
egy se lehet. Egyes rendszerek lehetv teszik a tbbszrs rklst is,
ekkor egy leszrmazott kt, vagy tbb sosztly leszrmazottja is lehet. A
tbbszrs rkldsnl is rvnyesl az rklsi szably, azaz minden
leszrmazott osztly rkli az sosztlyok adattagjait s metdusait. A
leszrmazott osztlyok objektumai (pldnyai) elrhetik a sajt, illetve az
sosztly mveleteit.
Programozsi szempontbl az egyes osztlyok definilsnl a keresd
az st mdszert alkalmazhatjuk. Azaz minden olyan mvelet, amely az
osztlyhierarchia egy adott szintjn tbb osztlyban is megjelenik, azt mr
az sosztlyban clszer definilni, hiszen gy minden leszrmazott rkli
Vissza
26
Programozs III.
Vissza
27
azt, gy a mveletet elg egyszer megadni. Az rklds ezen tulajdonsgainak kihasznlsa segt elfelejteni azt a hibs programozi gyakorlatot,
amikor a hasonl mveletek elvgzshez redundns kdot rnak.
2.4.1. Absztrakt osztlyok
Az objektumhierarchia tervezse sorn a konkrt programnyelvi megvalststl fggetlenl kialaktjuk a feladatot ler tpusdefincikat. Sok
esetben a programtervezs sorn szksgnk van egy kzs sre, amibl
kiindulva az sszes leszrmazott rtelmezhet. Teht egy olyan osztlyt
kell definilnunk, amely egysgbe foglalja, knnyen kezelhetv teszi a
leszrmazott osztlyhoz tartoz objektumokat. Ezek az osztlyok ltalban mg ltalnosak, sokszor csak az osztlyhierarchia szmra szl zenetek szablyait definiljk. (A hierarchia klnbz szintjhez kapcsold objektumokat gy azonos zenetekkel rhetjk el.) Ezeket az osztlyokat absztrakt osztlyoknak nevezzk.
Az absztrakt osztlyok kizrlag rktsi cllal ltrehozott osztlyok. Az
absztrakt osztlyokhoz nem rendelhetek objektumok, nem
pldnyosthatak.
Az absztrakt osztlyok megvalstsban gyakran hinyoznak az adattagok, s sokszor tallkozunk res metdusokkal, melyek csak egy egysges
interfszt, a leszrmazott objektumok szmra kldhet azonos zeneteket definiljk.
Az absztrakt metdusok mindegyike res trzs virtulis metdus. Ezeket
az absztrakt metdusokat majd a leszrmazottak felldefiniljk, megvalstjk. Absztrakt metdus csak absztrakt osztlyban adhat meg.
Az absztrakt osztlyok nem pldnyosthatk, hiszen tartalmaznak olyan
mveleteket, amelyek mg definilatlanok.
Vissza
27
Programozs III.
Vissza
28
Vissza
28
Programozs III.
Vissza
29
2.4.2. Interfszek
Vissza
29
Programozs III.
Vissza
30
Vissza
30
Programozs III.
Vissza
31
Felldefinils
A tbbalak mveletek msik csoportja a mveletek felldefinilsa
(overriding). Az rkls tulajdonsgt gy definiltuk, hogy a leszrmazott
osztly rkli az sosztly minden mvelett is. Ahol az sosztly mveletei hasznlhatk, ott a leszrmazott mveletek is felhasznlhatk lesznek.
Azonban az rklst sokszor azrt hasznljuk, hogy a leszrmazott osztlyt specializljuk, mert a leszrmazottak egy-egy mveletet mr msknt
hajtanak vgre. Egy osztly akkor definil fell egy metdust, ha az rklsi lncban megtallhat az adott metdus, gy azt teljes mrtkben rkln, de az adott osztly ugyanarra a metdusra sajt defincit ad.
Egy objektum attl fggen, hogy az osztlyhierarchia melyik szintjn
lev osztly pldnya, egy-egy zenetet mskpp hajt vgre. A metdusok
felldefinilsa (override) ezt teszi lehetv.
Vissza
31
Programozs III.
Vissza
32
Az egyes programozsi nyelvek ktfle zenet szerepkrt definilnak. Beszlhetnk statikus s dinamikus mveletekrl. A hagyomnyos programozsi nyelvekben statikus kts szubrutinokkal tallkozunk. Ez azt
jelenti, hogy az adott fordtprogram mr a fordts sorn (fordtsi idben) a szubrutin kapcsolsi cmt egyrtelmen meghatrozza (early
binding korai kts). gy egy adott nev szubrutin hvsa egyrtelm, a
hagyomnyos programozsi nyelvek nem lennnek alkalmasak arra, hogy
hatkonyan hasznljk ki a mveletek felldefinilst, illetve felltltst,
vagyis azt, hogy egy objektum mdostott metdusait elrjk. (A statikus
kts metdusokat az objektumorientlt programozsban osztlymetdusnak nevezik.)
Az objektumorientlt szemllet viszont ms megoldsokat vr, hiszen
az egyes objektumokhoz szorosan hozz kell rendelni az egyes mveleteket, teht olyan megoldst kell adni, amely futsi idben kpes az azonos
zeneteket legyen az egy felltlttt, vagy felldefinilt metdus hvsa
egyrtelmv tenni. Ehhez a megoldshoz a mveletek dinamikus sszekapcsolsa szksges.
A tbbalaksg kzs tulajdonsga, hogy a mveletek azonos nvvel hvhatk, m a vgrehajtskor a futs alatti kts, vagy ksi kts (late
binding, runtime binding) segtsgvel vlik egyrtelmv, hogy egy objektum egy zenetre melyik mveletvel reagl.
Tekintsk azt az esetet, amikor statikus hozzrendelssel definilva
egy osztlyban (tovbbiakban sosztly) definiljuk az A s B metdust,
ahol az A metdus a B-t hvja. rklssel ltrehozunk egy leszrmazott
osztlyt. Az rkls hatsra a leszrmazott is rendelkezik mind az A,
mind a B metdussal. A leszrmazott osztlyban a B metdust felldefiniljuk. Ha az sosztlyt pldnyostjuk, s a ltrejv pldnyt felkrjk,
hogy hajtsa vgre az A mveletet, akkor az elkezdi az sosztly A mvelett vgrehajtani, amely az sosztly B metdust hvja meg, majd az abban
definilt mveleteket vgrehajtja. Ez eddig hibtlanul mkdtt. Ha azonban a leszrmazott osztly egy pldnyval kvnjuk ezt a fenti mveletet
Vissza
32
Programozs III.
Vissza
33
vgrehajtani, akkor kudarcot vallunk. Hiszen a leszrmazott osztly pldnya (ha felkrjk az A mvelet vgrehajtsra) mivel a sajt osztlyban
nem tall A metdust, gy az rklsi lncon visszafel haladva megtallja
s vgrehajtja az sosztly A metdust. Az sosztly A metdusa pedig a
B metdust hvja meg. s itt trtnik a hiba, hiszen a statikus szerepek
miatt az sosztly csak a sajt metdusait ismeri, a vezrls nem tallja
meg a leszrmazott pldnyhoz tartoz felldefinilt B metdust, gy azt
az sosztlybl hvja. A leszrmazott pldnyhoz viszont a felldefinilt B
mveletet kellett volna elvgezni.
A dinamikus sszekapcsolst az egyes programnyelvekben eltren vgzik,
de vzlatosan a kvetkez szempontok szerint jrnak el:
Azokat a mveleteket, amelyeknl ki szeretnnk hasznlni a tbbalaksgot, virtulis mveletnek kell definilni.
Ha egy mveletet egy rklsi gban virtulisnak minstettnk, akkor
annak az sszes leszrmazottjban is virtulisnak kell lennie. A virtulis
metdusok kezelshez minden osztlyhoz az n. virtulis metdus
tblkat (VMT) rendelnek hozz. A VMT nem ms, mint az egyes osztlyhoz rendelt mind az sosztlybl szrmaz, mind a felldefinilt,
ill. felltlttt metdusok cmeit tartalmaz adatstruktra.
ltalnosan kijelenthet, hogy minden definilt osztlyhoz (amely
hasznl virtulis metdusokat) tartozik egy VMT, amelyet a pldnyostskor hozz kell rendelni az j objektumhoz.
Ezt a mveletet a tovbbiakban konstrukci nvvel illetjk.
A dinamikusan sszekapcsolt tbbalak vltoz- s metdushasznlat sorn nagyon fontos szempont az objektumok tervezett lettartamuk vgn
val teljes memria-felszabadts. A helyes programtervezshez hozztartozik a munka utni rendraks. Itt a konstrukcival ellenttes irny mveletet kell vgrehajtanunk, melyet destruktornak hv a szakirodalom.
A VMT kezelst az egyes programozsi krnyezetek mind msknt
valstjk meg, mkdst elrejtik a programoz ell. A hagyomnyos
hibrid programrendszereknl (Object Pascal, Delphi, C++) a virtual
kulcsszval hozhatunk ltre dinamikusan sszekapcsolt metdusokat, a
tisztn objektumorientlt nyelveknl (Smalltalk, Eiffel, Java) minden metdus alaprtelmezs szerint virtulis.
Vissza
33
Programozs III.
Vissza
34
Vissza
34
Programozs III.
Vissza
35
Vissza
35
Programozs III.
Vissza
36
Vissza
36
Programozs III.
Vissza
37
2.8. Komponensek
Az objektumorientlt programtervezs sorn clszer a logikailag sszetartoz s egyttmkd osztlyokat csoportostani. Az gy elll csomagok, vagy ms terminolgia szerint komponensek jrafelhasznlhat, ms
programokba beilleszthet kdot alkotnak. A komponensek egymsba
gyazhatak, gy tetszleges mlysg komponens-struktra pthet fel.
Komponens: egy adott rendszer rszt kpez klnll, ltalnos cl
osztlygyjtemny (amely nmagban is zrt egysget kpez), de ms
programokba is szabadon bepthet.
Az elksztett komponensek szabvnyos, sszeszerkesztett, tesztelt ptelemek. Az egyes objektumorientlt programnyelvekben definilt komponensek hasznlata hatkonyabb s szabvnyosabb fejlesztst tesz lehetv.
Ilyen komponens lehet pldul: egy adott adatbziskezel rendszer szabvnyos elrst, vagy ppen egy grafikus vezrlelemet megvalst komponens.
2.9. Krdsek
Vissza
37
Programozs III.
Vissza
38
2.10. Feladatok
Tervezze meg az albbi, egymstl fggetlen osztlyokat, s rajzolja meg
az UML osztlydiagramokat! (Lehetleg gyjtse ssze a legjellemzbb
adatokat s azokat a mveletet, melyek az adott osztlyhoz tartoz pldnyokon elvgezhetk.):
Alkalmazott
rucikk
Gpjrm
Dobkocka
bresztra
Bejrati ajt
Lzernyomtat
Tintasugaras nyomtat
MP3-zeneszm
Fnykp
Hibajelensg
Vissza
38
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
39
Vissza
39
Programozs III.
Vissza
40
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
extends
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while
Vissza
40
Programozs III.
Vissza
41
Lers, mret
logikai tpus (1 bjt)
char
Character
byte
Integer
-128127
short
Integer
-3276832767
int
Integer
long
Long
float
Float
-9223372036854775808
92233372036854775807
1.4 10-45 3.4 1038
double
Double
Vissza
41
Programozs III.
Vissza
42
false
\u0000
0
0.0
null
Vissza
42
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
43
Azonban nem szabad sszekevernnk referencit a C nyelv mutat tpusval. Ott a mutat egy adott memriacmre val hivatkozs, amelynek
adattartalmt indirekcival rhetjk el. A Java nyelvben azonban a referencia klnbzik a hagyomnyos mutatktl abban, hogy a hozzrendels utn ezt a cmet azonnal elrejti a programoz ell, s automatikusan
az egsz lefoglalt objektumot jelenti. A pldnyosts sorn teht a new
opertor ltal ellltott referencit hozzrendeli a megfelel tpus azonosthoz (t2). Ezutn az ezzel az azonostval hivatkozott objektum nyilvnos tagjai hivatkozhatk.
Egy specilis referencia rtk a null, amely rtkl adhat minden referencia tpus vltoznak. A null olyan referencia, amely nem mutat
egyetlen objektumra sem. A null rtk referencikon keresztl nem
lehet egyetlen objektumra sem hivatkozni, metdust hvni (ha mgis megtennnk futsi idej kivtel esemny keletkezik: NullPointerException;
a kivtelkezelsrl bvebben a 7. fejezetben lesz sz).
Abban az esetben, ha egy objektumra mr nincsen tbb szksgnk,
clszer a lefoglalt memrit felszabadtani. Sok programozsi nyelvben ezt
a programoznak kell kezdemnyeznie destruktor hvssal. A Java nyelv
azonban nem hasznl destruktort, hanem az n. szemtgyjt mechanizmussal (garbage collector) sznteti meg a nem hasznlt objektumokat.
A szemtgyjts a virtulis gp rsze, mkdse elve a kvetkez:
minden egyes objektumot addig tekint hasznlatban lvnek, amg arra
valamilyen referencia hivatkozik. Amint ezt a hivatkozst megszntetjk,
az objektum mr a programbl elrhetetlen hiszen megsznt az sszekapcsols a trterletet a szemtgyjt felszabadtja.
3.2.3. Megjegyzsek
Vissza
43
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
44
Vissza
44
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
45
//osztlydefinci
//adattagok
Vissza
45
Programozs III.
Vissza
46
);
);
);
);
}
}
A fenti pldban ltrehoztuk a Teszt osztlyt, amelybl a Teglalap tpus objektumokat el kvnjuk rni. A futtathatsghoz konzolos programok esetn egy main metdust kell definilnunk, amelynek trzsrszben megadjuk a program utastsait. (A main tbbi mdostjra mg ksbb visszatrnk.) A Teglalap tpus t1 objektumot a Teglalap osztly pldnyostsval keltjk letre.
A this kulcssz
A metdusok definilsakor gyakran hasznlt elem a this kulcssz. A
Java nyelvben a this tbb jelentst is takarhat.
A metdusokban szerepl this az aktulis objektumra val hivatkozst jelenti. Az egysgbezrtsg s az adatrejts elvben azt fogalmaztuk meg, hogy egy metdus az objektum sajt adatain dolgozik. Ezrt
Vissza
46
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
47
egy adattagra val hivatkozs minsts nlkl alaprtelmezs szerint az aktulis pldny vltozjt ri el. Ehhez az adott metdusnak
tudnia kell, hogy ppen melyik pldny adataival kell dolgoznia.
Ezt gy oldottk meg, hogy minden egyes metdus rendelkezik egy
rejtett, referencia tpus paramterrel, amely ppen az aktulis pldnyt
jelli. Ezt a paramtert minden egyes hvskor a vgrehajtand metdus megkapja. A this hasznlatval az osztly adattagjai akkor is elrhetek lesznek, ha a paramterbl rkez, vagy azonos nev loklis vltozk elfednk azokat (lsd lthatsgi szablyok).
A Teglalap osztly konstruktort gy is felrhatjuk:
public Teglalap(double a, double b){
this.a = a;
this.b = b;
}
A kifejezsek alapveten kt clt szolglnak: egyrszt a mr ismert rtkekbl j rtkeket lltanak el, msrszt mellkhatsknt vltozsokat
eredmnyezhetnek. A kifejezsek rtknek meghatrozst kirtkelsnek
hvjuk. A kifejezsek operandusokbl (vltozk, konstansok), opertorokbl (mveleti jelek) s zrjelekbl llnak.
Az opertorok elhelyezkedse szerint az egyes mveletek lehetnek:
prefix az opertor az operandus eltt ll,
postfix az opertor az operandus utn ll, vagy
infix jelleg az opertor az operandusok kztt helyezkedik el.
Ezeken kvl a kifejezseket csoportosthatjuk operandusainak szma
alapjn is, gy beszlhetnk egyoperandus (unris) vagy ktoperandus
(binris) kifejezsekrl. A Java nyelv rklte a C nyelv egyetlen hromoperandus mvelett, a feltteles kifejezst is ( ? : ).
Vissza
47
Programozs III.
Vissza
48
Megnevezs
[ ]
.
( )
tmb indexels
tagelrs pl: java.lang.Math.PI
zrjeles kifejezs
kif++ kif--
postfix opertorok
pldnyosts
tpusknyszerts
* / %
+ -
aritmetikai mveletek
<<
>>
>>>
sszehasonltsok
az objektum pldnya-e az osztlynak
== !=
egyenlsg vizsglatok
&
bitenknti S
bitenknti VAGY
&&
logikai S
||
logikai VAGY
? :
feltteles kifejezs
= += -= *= /= %=
hozzrendels, rtkads
Vissza
48
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
49
3.2.6. Tpuskonverzi
Vissza
49
Programozs III.
Vissza
50
Vissza
50
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
51
A Java a strukturlt programozshoz hasonlan az utastsokat sorrlsorra hajtja vgre. Azonban az objektumorientlt programokat is valahogyan vezrelni kell. Az ismert alapszerkezetek a Java nyelvbe is bekerltek,
az albbiakban ezekkel ismerkednk meg.
Vissza
51
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
52
Utastsok
Legelszr az utastsokkal foglalkozunk. Az utastsok alapveten kt
csoportba sorolhatk: kifejezs-utasts, s deklarcis utasts. Minden
utastst a ; karakterrel zrunk le. Minden utasts helyn llhat egy
blokk, amelyet utastsok sorozataknt { s } jelek kz rva hozunk ltre.
Egy blokkon bell ltrehozhatunk loklis vltozkat deklarcis utastssal. Minden loklis vltoz az t magba foglal blokk vgig ltezik.
Logikai kifejezs
A Java nyelvben a boolean tpus true s false konstanssal reprezentlja
a logikai rtkeket. A logikai kifejezsrl beszlnk akkor, ha a kifejezs
logikai rtkt a fordt minden esetben egyrtelmen meg tudja hatrozni
automatikus konverzikkal. A relcis s a logikai opertorok, illetve zrjelezs segtsgvel sszetett logikai kifejezseket is felpthetnk. Szmos
szerkezetben hasznlunk logikai kifejezseket.
a >= b+1
objektum != null
objektum instanceof Osztaly
Feltteles kifejezs
Egy adott elemi vltoznak, vagy objektumnak sokszor feltehet eldntend krds, melyre igen/nem vlaszt vrunk. A feltteles kifejezs egy, a
C nyelvbl ismert hromoperandus kifejezs:
felttel ? kifejezs-ha-igaz : kifejezs-ha-hamis
a > b ? a : b
//feltteles kifejezs
max = (a>=b)? a : b;
//rtkad kifejezsbe gyazva
A felttel egy logikai kifejezs, amely a felttel igazsga esetn a kifejezs-ha-igaz, klnben pedig a kifejezs-ha-hamis rtket szolgltatja a teljes kifejezs rtkeknt.
Elgazsok, szelekcik
Az if utastssal a programban kt-, vagy tbbirny elgazst hozhatunk
ltre, ahol a megadott feltteltl fggen hajtdik vgre a program egyik,
vagy msik ga. Az if utasts szerkezete a kvetkez:
if (felttel) utasts;
Vissza
52
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
53
Vissza
53
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
54
else {
utasts_n;
}
A Java nyelv rklte a C nyelvbl ismert switch utastst, melyet egy klnleges elgazs tpusnak, esetsztvlasztsnak hvunk.
Vissza
54
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
55
switch (egsz-kifejezs) {
case konstans-kifejezs_1 :
utasts_1;
break;
case konstans-kifejezs_2 :
/* tovbblps! */
case konstans-kifejezs_3 :
utasts_2;
break;
default:
utasts_n;
}
Vissza
55
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
56
nem teljesl, a program a ciklust kvet utastssal folytatja futst. Elfordulhat az az eset is, hogy a ciklusmag egyszer sem lesz vgrehajtva.
while (felttel) {
utastsok;
}
int i=0;
while (i<10){
System.out.println(i);
i++;
}
Vissza
56
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
57
A feltteles kifejezs alaprtelmezs szerint mindig igaz rtk, gy a teljesen hinyos for(;;); utasts szintaktikailag helyes ugyan, de szematikai
szempontbl nem, hiszen vgtelen ciklust eredmnyez.
Egy adott blokkbl nem csak a felttel hamiss vlsval van lehetsgnk kilpni. A break utasts amint a switch utastsnl is lthattuk
egy adott blokkbl val kilpsre szolgl. Ha a vezrls egy switch, for,
while, vagy do utasts blokkjban egy break utastst tall, akkor az t
tartalmaz blokk utni utastssal folytatja a vgrehajtst.
Amennyiben cmke : utasts; alak n. utastscmkt hasznlunk,
akkor a break cmke; alak hvs hatsra a program a cmkvel jellt
utastssal folytatja a vgrehajtst. Azonban metdusbl, vagy inicializtor
blokkbl val kiugrsra a break nem hasznlhat.
A continue utasts kizrlag egy while, do, vagy for utastson bell rtelmezett. Hatsra a ciklusmag htralv rsze tugorhat, a ciklus a
feltteles kifejezs kirtkelsvel folytatja futst.
int i=-10;
while (i < 10){
if (i==0) continue;
System.out.println(100/i);
i++;
}
Vissza
57
Programozs III.
Vissza
58
A ciklusok, itercik tetszleges mlysgben egymsba gyazhatk, azonban egy t szintnl mlyebb egymsba gyazsra csak ritkn van szksg.
Az ilyen ciklusok csak j szintaktikus tagolssal, illetve megfelel
kommentezssel lthatak t.
for (int i=2 ; i<100 ; i++){
System.out.print(i+ oszti: );
for (int j=1 ; j<=i ; j++){
if((i%j)==0) System.out.print(j+ );
}
System.out.println();
}
3.2.9. Tmbk
A hagyomnyos programozsi nyelvekben hasznlt a tmb, mint az azonos tpus elemekbl kpzett, fix elemszm sszetett adatszerkezet. A
tmbelemek indexelhetk. A Java nyelv is definil tmb adattpust, amelyet az alaptpusokbl vagy referencikbl kpezhetnk. A tmbk fbb
jellemzi:
Elre megadott, n szm elemet tartalmaz,
az adatok azonos tpusba tartoznak,
az elemeket a 0. elemtl n-1. elemig rhetjk el az indexels segtsgvel. Az indexelshez szgletes zrjelprt hasznlunk: [].
A tmbk egymsba gyazhatak, gy tbbdimenzis tmbket is deklarlhatunk. Azonban a Java a deklarlt tmbt mg nem engedi felhasznlni, az elemek szmra a memriban helyet is kell foglalnunk.
A tmb deklarcija
A tmb a Java rendszerben a referencia tpus vltozk kz tartozik. (A
C s C++ nyelvtl eltren ez egy valdi dinamikus memriaterletet
hasznl vltoz, s nem a mutat tpus egy msik alakja!) Egy tmb deklarcit az albbi kt mdon tudunk megadni:
<elemtpus>[] <tmbazonost>;
<elemtpus> <tmbazonost>[];
// itt aT s bT is tmb
// cT egy tmb, de d elemi adat!
//referenciatmb deklarci
Vissza
58
Programozs III.
Vissza
59
iT = new int[365];
dT = new double[365/12];
sT = new String[4];
// 30 az egszoszts miatt!
A tmblefoglalt mrett futsi idben is elrhetjk a kvetkez kifejezssel: tmbazonost.length. A tmb maximlis indexe length-1 lesz.
(Ez a szmadat valjban a tmbk Java nyelvbeli defincijban megadott konstansnak rtke.)
A tmb futsa sorn ismeri a mrett, amelyet futs sorn, minden
egyes tmbelem-hivatkozskor ellenrz is a virtulis gp. Ha ez az index
nem rvnyes, egy IndexOutOfBoundsException tpus kivtel keletke-
Vissza
59
Programozs III.
Vissza
60
Tbbdimenzis tmbk
A Java nyelv a C nyelvhez hasonlan a tbbdimenzis tmbket tmbkbl ll tmbkkel kpezi le. A tbbdimenzis tmbt gy deklarljuk,
hogy a tmb alaptpust is tmbknt deklarljuk. A tbbdimenzis tmb
ltrehozsa hasonl mdon mkdik, mint az egydimenzis esetben.
Vissza
60
Programozs III.
Vissza
61
<elemtpus>[][] <tmbazonost>;
double [][] a;
a = new double[2][3];
Vissza
61
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
62
t1 = t2;
Vissza
62
Programozs III.
Vissza
63
jelents
soremels
kocsivissza
vzszintes tab karakter
lapdobs
a \ karakter
idzjel
aposztrf
backspace
karakter oktlisan (0-377)
unicode karakter hexadecimlisan
(\u0000 \uffff)
Vissza
63
Programozs III.
Vissza
64
A String osztly
A String osztly konstans karakterlncok trolsra alkalmas. Az osztly
a karakterlncokat karakteres tmbben trolja kt szmrtkkel (a sztring
els karakternek pozcijt, s a szveg hosszt), s definilja a hozz
tartoz alapmveleteket (hossz, kis-nagybets konverzi, sszefzs, szszehasonlts, rszsztring kpzs, karakterek keresse stb.). A ltrehozs
utn azonban a String tpus objektumot mdostani mr nem tudjuk.
Az ilyen tpus vltozt leggyakrabban az albbi utastsokkal hozunk
ltre (pldk):
String szov1 = new String(els szveg);
String szov2 = msodik szveg;
String szov3 = Eredmny =+3 ;
Vissza
64
Programozs III.
Vissza
65
//kimenet: f
Vissza
65
Programozs III.
Vissza
66
Vissza
66
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
67
A StringBuffer osztly
Mint lttuk, a String osztly konstans karakterlncokat kezel. A virtulis
gp minden karakterlnc-sszefzskor egy-egy jabb memriaterletet
foglal az jonnan elll szveges adat szmra. Az ilyen mveletek nagyon memriapazarlak (a virtulis gp a lefoglalt s nem hasznlt memriaterleteket csak a szemtgyjtssel tudja ismt hasznlhatv tenni)
ezrt hasznlatuk kerlend!
Abban az esetben, ha a futs alatt tbb szrtingbl ll szveges adatot
szeretnnk ellltani, amelynek rszeit, hosszt stb. ms-ms idpontban
kapjuk meg, akkor az ilyen szvegmveletekhez a StringBuffer osztlyt
kell hasznlnunk. A StringBuffer osztly a String osztlyhoz hasonlan
a Java krnyezet rsze. A String osztlyban ismertetett alapmveleteken
kvl a kvetkez mveletek elvgzsre hasznljuk:
Egy String objektumot StringBuffer-r alakthatunk, s vissza.
A szveges adathoz hozzfzhetnk, vagy az adatba egy msik szveget beszrhatunk (append, insert).
A szveg hossza mdosthat (rvidts, bvts). A StringBuffer
objektum rendelkezik egy capacity adattaggal, amely az objektum
tnyleges memriafoglalst mutatja. A szveg aktulis hosszt a
length() metdussal kaphatjuk meg. Amennyiben a hozzfzs, vagy
beszrs sorn a szveg nem frne be az adott memriaterletre, a
StringBuffer mrett a virtulis gp megnveli.
A szveg megfordthat (reverse).
A szvegbl karakterek, vagy rsz-szvegek trlhetk.
A Java osztlyknyvtrakban gyakran tallkozunk StringBuffer tpus
referencival visszatr metdusokkal.
Az albbi pldaprogram-rszletben a StringBuffer osztly mkdst tanulmnyozhatjuk (a teljessg ignye nlkl):
//Konstrukci
StringBuffer szoveg1 = new StringBuffer(2);
//Konstrukci egy mr definilt sztring segtsgvel
StringBuffer szoveg2 = new StringBuffer("Almafa");
//Automatikus trbvts:
szoveg1.append("Nagyon hossz szveg! ");
//A length() a tartalmazott szveg hosszt, a capacity() a
//StringBuffer objektumban rendelkezsre ll helyet jelenti
int hossz = szoveg1.length();
int kapacitas = szoveg1.capacity();
Vissza
67
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
68
System.out.println(szoveg1);
System.out.println("szoveg1 hossza = " + hossz);
System.out.println("szoveg1 kapacitsa = " + kapacitas);
System.out.println("---------------------------------\n");
//A StringBuffer objektum kibvtse
szoveg1.ensureCapacity(20);
szoveg2.ensureCapacity(50);
System.out.println(szoveg2);
//Elemi rtkek hozzfzse s beszrsa a StringBuffer
//objektumba
double d = 3.54;
int i = 100;
char [] karaktertomb = {'P', 'i', 's', 't', 'i', 'k', 'e'};
szoveg2.append(d).append(i);
szoveg2.insert(0, karaktertomb);
// A StringBuffer objektum mdosthat:
char regi = szoveg2.charAt(7);
szoveg2.setCharAt(7, 'a');
// A StringBuffer objektum tartalmnak rvidtse:
szoveg2.setLength(2);
// A StringBuffer objektum kapacitsnak cskkentse:
szoveg2.trimToSize();
System.out.println("szoveg2 = " + szoveg2);
System.out.println("szoveg2 hossza = " + szoveg2.length());
System.out.println("szoveg2 kapacitsa = " +
szoveg2.capacity());
Vissza
68
Programozs III.
Vissza
69
den olyan helyen, ahol az adott rtket objektumknt szeretnnk felhasznlni, esetleg konvertlni.
3.2.12. A felsorolt tpus (enum)
A Java 5.0-s kiadsban bevezettk a felsorolt tpusokat [12]. Ezek a felsorolt tpusok (enumercik) olyan jelleg adatszerkezetek, amelyeket mr
az ANSI C nyelv is hasznlt ugyanilyen nvvel. A mkdsi alapelve hasonl, mgis a megvalstsban szmos klnbsget tallunk. Elszr
azonban tekintsk t, hogy mikor hasznlhatunk felsorolsokat!
Hagyomnyos megoldsok
A rgebbi Java verzikban felsorolt szerkezeteket hasznltunk pldul egy
munkafolyamat llapotainak kvetsre. Ekkor az egyes sttuszokat egyegy konstans rtkkel lehetett definilni:
public class Kapcsolat{
public static final int
public static final int
public static final int
public static final int
RENDBEN = 0;
HIBA= 1;
KAPCSOLODAS = 2;
ADATFELOLTES = 3;
A konstansok megadhatk a hasznlni kvnt osztlyban osztlyvltozknt (lsd: 4.5. fejezet), vagy egy fggetlen interfszben is (lsd: 5. fejezet). Ennek a megadsnak az elnye az, hogy a konstansok csak 4-4 bjtot foglalnak (int tpus) s rtkk mg szelekciban (switch) is felhasznlhatak.
Azonban ennek a megoldsnak szmos htrnya is van: a fordts sorn a konstans rtkek mr behelyettestve jelennek meg a kdban, nincs
lehetsg tpusellenrzsre, nyomkvetskor, vagy az rtket kiratva nem
szolgltat informatv eredmnyt, s fejlett adatszerkezetekbe sem helyezhet el egyszeren (hiszen ott csak referencikkal dolgozunk).
Megadhat a konstans szveges rtkknt is. Ekkor ugyan javul az olvashatsg, de megn az adatterlet, s a vezrls bonyodalmasabb vlik
a sztringmveletektl.
Msodik lehetsgknt lehetsgnk van egy olyan osztly definilsra is, amely az elzeken tlmutatva csak osztlyszint szveges konstansokat tartalmaz, s szmos mveletet megvalst, de nem rendelkezik
publikus konstanssal.
Vissza
69
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
70
Megjegyzs: A konstruktor azrt kap privt minstst, hogy csak az osztlybetlts sorn jjjenek ltre a konstans objektumok (static final minsts), s a ksbbiekben ne lehessen tbb ilyen objektumot ltrehozni!
Az gy megadott konstansok egyszeren felhasznlhatk ms osztlyokbl:
System.out.println(Kapcsolat.HIBA);
Vissza
70
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
71
Vissza
71
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
72
Vissza
72
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
73
Vissza
73
Programozs III.
Vissza
74
3.3. Krdsek
Vissza
74
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
75
3.4. Feladatok
1. Ksztsen olyan pldaprogramot, melyben egy, illetve ktdimenzis
tmbben trol egsz, ill. vals rtkeket. A trolt rtkeket jrja be s
jelentse meg!
2. lltsa el egy n x m-es mtrix transzponltjt!
3. Gyakorolja a karakterlncok kezelst az albbi pldk alapjn:
Felhasznli adatokat egy sorban adunk meg, vesszkkel elvlasztva: (nv, lakcm, irnytszm, telefon). A karakterlncbl nyerje ki
az egyes rszadatokat.
Egy mondat, vagy hosszabb szvegrsz szavainak (fehr karakterek hatrolta egysgek) sorrendjt fordtsa meg!
Egy tetszleges osztly toString() metdust rja meg
StringBuffer segtsgvel. (Azaz a metdus ne tartalmazzon
String objektumokat, s karakterlnc sszefzst "+" sem!)
4. Csomagol osztlyok felhasznlsval konvertljon karakterlncban
megadott rtkeket egsz, illetve vals szmokk!
5. Tervezzen egyszer, illetve kiterjesztett felsorolt tpusokat a kvetkez
fogalmakhoz:
ht napjai,
kzlekedsi eszkzk,
sportgak.
Vissza
75
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
76
4. Az osztlyok hasznlata
A 3.2.2. fejezetben mr megismerkedtnk az osztlyok nhny alaptulajdonsgval, most pedig egy tfogbb kpet rajzolunk, hogy hogyan is pl
fel egy Java program, s hogy milyen eszkztrat ad keznkbe a Java API
(a Java osztlyknyvtrak gyjtemnye).
4.1. Az osztlyok, s az objektumok letciklusa
A Java programok legkisebb nll egysgei az osztlyok. Egy-egy osztly
a valsg egy jl krlhatrolhat egysgt rja le. Ezek, ahogy azt az objektumorientlt modellezs elmleti rszben kifejtettk, a konkrt objektumok lersnak absztrakt modelljei. Pldul lehetnek az osztlyok egy
vllalatnl dolgoz szemlyek nyilvntartsra szolgl modellek, vagy
ppen egy ktirny dinamikus listt ler adathalmaz s szablyrendszer.
Mkdse sorn a program pldnyostja az osztlyokat, vagyis a modellek
smja szerint konkrt objektumokat (pldnyokat) hoz ltre. Minden
objektum rendelkezik egy bels llapottal, amely egyrszt befolysolja a
mveletek vgrehajtst az objektumon, msrszt a mveletek hatsra
meg is vltozhat.
A pldnyostssal ltrejv objektum bels llapota a kezdllapot. A
mveletek vgrehajtst az egyes objektumok kezdemnyezhetik nmagukra, vagy ms objektumokra.
Megjegyzs: Az objektum, pldny vagy egyed kifejezs az objektumorientlt terminolgiban ugyanazt a fogalmat takarja, az egyes szakirodalmak
ezeket felvltva hasznlhatjk.
Az osztlyokat (class) a Java nyelvben egy logikailag kt rszre bonthat
definci rja le. Az els rsz deklarlja azokat a vltozkat, (adattagok,
tulajdonsgok), amelyekkel egy objektum llapota lerhat, jellemezhet,
s amelyeknek konkrt rtkeiben az azonos tpus objektumok klnbzhetnek egymstl. Az osztly minden pldnya sajt memriaterlettel
rendelkezik ezekbl a vltozkbl. Szoksos mg pldnyvltozknak is
hvni ket.
A msodik rsz az objektumok viselkedst, mkdst s az objektumnak kldhet zenetek feldolgozst vgz mveleteket (metdusok,
Vissza
76
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
77
tagfggvnyek) tartalmazza. Egy metdus hasonlt a hagyomnyos programozsi nyelvek eljrsaira s fggvnyeire. Ms szval egy metdus egy
olyan utastssorozat, amely paramtereket fogadhat, az objektum adattagjain mveleteket hajthat vgre, s rtket adhat vissza.
A metdushvs nem ms, mint az adott objektum fel irnyul zenetklds. A metdus defincija osztly szint, hiszen minden egyes objektumon ugyanazt az utastssorozatot hajtja vgre, de a metdus futsakor mindig egy konkrt objektum adattagjaival dolgozik.
Az objektumorientlt mdszertan a tpusokat mveleteikkel egytt tekinti rtelmes egysgnek (egysgbe zrtsg). Ebbl a szempontbl egy
osztly nem ms, mint egy teljes tpusdefinci, amely lehetv teszi az
adatok s az adatokat kezel mveletek egyttes kezelst. A 3.2.7. fejezetben trgyalt hozzfrsi kategrik alkalmazsval megvalsthat az
adatok klvilg ell trtn elrejtse is.
Az albbiakban egy egyszer osztlyt definilunk. A LinearisFuggveny
osztly az elemi matematikbl megismert egyszer fggvnyt r le.
// A lineris fggvny osztly defincija
public class LinearisFuggveny {
//sajt adattagok, tulajdonsgok
private double a,b;
//konstruktor, amellyel majd pldnyostunk
public LinearisFggveny(double a_, double b_) {
a=a_; b=b_;
}
// metdusok
// a lineris fggvny -> y rtke x helyen, azaz ax+b
public double y(double x) {
return a*x+b;
}
// egy jabb metdus, amelyik szvegesen is megjelenti
// a fggvny jellemzit
public String toString() {
return "Lineris fggvny y="+a+"*x+"+b;
}
}
Vissza
77
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
78
lyezni, a Java nvadsi konvencii miatt. Ezutn az osztly mr lefordthat, s sikeres fordts utn egy LinearisFuggveny.class trgykd llomnyt kapunk.
Az osztly defincijt a class kulcssz vezeti be, amelyet az osztly
neve kvet. Az osztlyokat nagybetvel kezdd azonostval ltjuk el.
sszetett osztlynv esetn nem hasznlhatunk szkzket, a szavakat
egyberjuk, s minden szt nagybetvel kezdnk, esetlegesen a _ karakter is hasznlhat. A nvadsnl clszer fneveket vlasztani.
Az osztly hozzfrsi kategriba is sorolhat, aszerint, hogy honnan
engedlyezzk majd ennek az osztlynak a pldnyostst. Ezt a class
kulcssz el rt mdost szval tehetjk meg. Ez a mdost a vele elltott egysg egszt ruhzza fel a hozzfrsi kategria tulajdonsgaival.
Egy osztly definilsakor a public, final, vagy abstract mdostt
hasznlhatjuk.
A public mdost azt jelenti, hogy az osztlyt a nyilvnos hozzfrsi kategriba soroljuk, teht ez brmely ms osztlyokbl hivatkozhat,
s pldnyosthat. Ha az osztly el nem rjuk ki a public mdostt,
akkor azt az osztlyt csak a sajt csomagjn belli (azonos knyvtrban
lv) osztlyokbl rhet el. Az abstract s final mdostkrl az
rklds fejezetben lesz sz. Az osztly neve utn tallhat kapcsos zrjelek kztt az osztly tnyleges defincija ll.
Az osztly defincija sorn elszr az adattagokat, majd a metdusokat adjuk meg. Pldnkban kt privt vltozt a, b s hrom metdust
(LinearisFuggveny, y, toString) definiltunk.
A vltozkat kisbetvel kezdd fnvvel, a metdusokat kisbetvel
kezdd igvel szoks azonostani. (Az sszetett, tbb modulbl s komponensbl ll munkkban az eligazodst nagymrtkben knnyti a Java
kdolsi konvencik betartsa. Lsd: 12. fejezet) Egy adott rtk belltst ltalban a set, egy rtk lekrdezst a get szcskval kezdnk
(setName, getName). Egy adott tulajdonsg fennllst vizsgl, logikai
rtket visszaad metdust a megfelel mellknvrl clszer elnevezni,
s azt is eltaggal szoks elltni (isEmpty).
Megjegyzs: Sajnos a magyar s az angol nyelv eltr jellegzetessgei miatt
ez az elv nem mindig tarthat be. A programokban nagyon sokszor keverednek a magyar s angol metdusnevek. Egy programon bell clszer
azonban minl inkbb egysges elnevezseket hasznlni.
Vissza
78
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
79
Amennyiben a Java krnyezet a CLASSPATH krnyezeti vltozban megadott knyvtrakban, vagy csomagokban ilyen nev osztlyt nem tall, a
program futsi hibval lell. (Az osztly megltt termszetesen fordtskor
is ellenrzi, s a hibt mr itt is jelzi; de elfordulhat extrm esetben, hogy
az elzleg lefordtott osztly class fjlja elrhetetlen, vagy trlve lett.)
A betlts sorn a virtulis gp inicializlja az osztlyban szerepl osztlyvltozkat s osztlyfggvnyeket (statikus adattagok s metdusok)
bvebben lsd az 4.5. Osztlyvltozk fejezetben, tovbb belltja a virtulis metdusok tblzatt (VMT). Amint az osztly betltse s inicializlsa megtrtnt, mr alkalmas a pldnyok ltrehozsra.
Vissza
79
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
80
4.1.2. A pldnyosts
Vissza
80
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
81
Vissza
81
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
82
Vissza
82
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
83
Vissza
83
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
84
A szl konstruktornak meghvsa tbb szempontbl is clszer. Egyrszt cskkenthet a redundns kdok szma. A pldban ugyan csak kt
adattag szerepelt, de egy vals feladatban egy osztlynak az sszes rkldst beleszmtva rengeteg adattagja is lehet. Msrszt ha a szl adattagjai privt minstsek, akkor csak a super hvssal tudjuk ezeket az
ersen vdett adattagokat elrni.
A super() hvsnak mkdsi elve miatt meg kell elznie a
konstruktor tbbi utastst! A super() hvs folyamata a kvetkez:
A pldnyosts sorn az adott objektum trterlet kap.
Majd elkezdi vgrehajtani a konstruktorban megadott utastsokat.
Ha az els utasts egy super() hvs, akkor a pldnyvltoz inicializlsa eltt vgrehajtja az s megfelel konstruktort. (A super() hvsnak azrt kell els helyen llnia, mert elszr az stl rklt vltozkat kell inicializlni, s csak ezutn lehet a leszrmazott objektumhoz rendelni.)
Ezutn a vezrls visszatr a leszrmazotthoz, s a fennmarad utastsokat is vgrehajtja.
A paramterek nlkli konstruktort Osztly() alakban, alaprtelmezett konstruktornak nevezzk. Ha egy osztlyhoz nem definilunk egyet-
Vissza
84
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
85
Vissza
85
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
86
Megjegyzs: A kompatibilits fordtva nem mkdik, azaz egy Fonok tpus referencia automatikusan nem rendelhet egy Alkalmazott objektumhoz, a fordt incompatible types hibazenettel lell.
Ezt a megoldst a Java programok sokszor alkalmazzk, mikor osztlyhierarchikat kell kapcsolatba hozni. Ekkor a hierarchia tetejn lev osztlyt, vagy interfszt kapcsoljuk hozz egy msik osztlyhoz. A hierarchin
belli automatikus konverzi segtsgvel a pldnyok mveletei elrhetek lesznek, tervezsk, nyilvntartsuk is tlthatbb lesz.
A java.util csomag Vector osztlya alaprtelmezetten Object tpus
referencikat trol egy dinamikus tmbben. Mivel az Object osztly minden ms osztly se, gy automatikus konverzi segtsgvel ez az osztly
alkalmas brmilyen pldny tartalmazsra. Ezt, mint kontner osztlyt
rszletesen trgyaljuk a ksbbiekben.
Explicit tpuskonverzit, vagy tpusknyszertst is alkalmazhatunk referencikra. Ha a fenti mdon egy s tpus referencihoz egy leszrmazott
tpus objektumot rendelnk, akkor csak az sben definilt metdusokat
rjk el, hiszen az s nem tud a leszrmazott mveleteirl.
Ekkor kt lehetsgnk van. Az els az, hogy tpusknyszertst alkalmazunk az objektum referencijra. A tpusknyszertst az alaptpusokhoz hasonlan megadhatjuk (LeszrmazottOsztly)referencia
alakban.
A msik megolds az, ha mr az s szmra is ismertt tesszk az
adott mveletet, melyet a leszrmazottakban felldefinilunk (esetleg
absztrakt osztlyok s metdusok, vagy interfszek hasznlatval).
4.3.2. Metdusok felldefinilsa
Vissza
86
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
87
A pldban mg egy msik metduson keresztl is megfigyelhet a felldefinils. Az osztlyokban definilt toString() metdusokon ezt hasznljuk ki. A toString() metdust az Object osztly vezeti be. Szerepe
az, hogy az objektum referencihoz egy szveges megjegyzst, rtelmezst
fzznk. Ez a metdus az objektum.toString() hvssal rhet el.
A legtbb esetben azonban a toString()-et a virtulis gp automatikusan hvja. A Java nyelvben ezt a metdust gy definiltk, hogy amikor
egy objektum referencit olyan helyen hasznlunk, ahol azt Stringg kell
konvertlni, az automatikus konverzi ennek a metdusnak a vgrehajtsval fut le.
Vissza
87
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
88
Vissza
88
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
89
A final mdost segtsgvel lehetsgnk van egy osztlyt, vagy metdust vglegesnek tekinteni. A final kulcssz hasznlata utn egy osztlyt
mr nem lehet leszrmaztatni, illetve a metdust nem lehet felldefinilni.
gy elrhet, hogy egy metdus a leszrmazott osztlyokban is garantltan
ugyangy hajtdjon vgre. (Ilyen pldul az Object osztly getClass()
metdusa, amely az adott pldnyt ler dinamikus osztlytpust hatrozza
meg. Mivel ennek megvltoztatsa az egsz Java krnyezetre kihatssal
lenne, ezrt vglegestettk.)
4.3.3. Metdusok felltltse
Vissza
89
Programozs III.
Az osztlyok hasznlata
Vissza
90
A felltlttt metdusok kivlasztsa elmleti szinten, ha tbb felldefinilt s felltlttt metdus is szerepel nem teljesen egyrtelm folyamat. A Java minden esetben, a dinamikus metdushvs miatt, a hvs
helyn az aktulis paramterek tpusa szerinti legjobban illeszked metdust hvja meg.
Nagyon gyakran elfordul, hogy egy osztlyban felltlttt konstruktorokat hasznlunk. A hasznlat oka a pldnyosts folyamatnak ltalnos rtelmezse. Gyakran kell ugyanis egy objektumot klnfle rtkekbl ltrehozni, de elfordulhat olyan eset is, amikor a ltrehozs pillanatban mg nem ismert minden szksges adat.
Ha pldul egy osztlyban trtszmokat szeretnnk kezelni, akkor a pldnyostsnak tbb felltlttt metdusdefincit is adhatunk:
public class Tort{
private int a,b;
public
a =
}
public
a =
}
public
a =
}
public
a =
}
Tort(){
0; b = 1;
//szmll s nevez
//alaprtelmezett konstruktor
Tort(int a_){
a_; b = 1;
Tort(int a_, int b_){
a_; b = b_;
Tort(Tort t){
t.a ; b = t.b;
// msol konstruktor
Vissza
90
Programozs III.
Az osztlyok hasznlata
Vissza
91
Az negyedik konstruktor definci a ltrehozand osztly egy pldnyn keresztl hoz ltre j objektumot. Ezt ms nven msol konstruktornak is nevezzk (copy constructor).
Megjegyzs: Emltettk, hogy ha egy osztlyban nem definilunk egyetlen
konstruktort sem, akkor a fordt elltja alaprtelmezett konstruktorral.
Ha azonban megadunk legalbb egy sajt konstruktort, akkor nem kerl
befordtsra az alaprtelmezett konstruktor.
A this kulcsz trgyalsakor emltettk (lsd: 3.2.4.), hogy fontos szerepe
lesz a konstruktoroknl. A konstruktordefinci els utastsban a
this() hvssal hivatkozhatunk egy elzleg mr definilt konstruktorra. A this() hvs hasznlatval a defincit visszavezethetjk egy mr
definilt mveletre, gy cskkenthet a kd redundancija, hiszen a felltlttt konstruktorok hasonl mveleteket hajtanak vgre, kisebb mdostsokkal. Az elz pldt akr gy is definilhatjuk:
public
public
public
public
Vissza
91
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
92
Egy osztlyban definilt metdus termszetesen meghvhat ms metdusokat. Abban az esetben, ha egy metdus nmagt hvja, rekurzv metdushvsrl beszlnk. A rekurzi a hagyomnyos programnyelvekben
hasznlt rekurzv mkdshez hasonlan hasznlhat. Egyszer s knynyen ttekinthet kdot ad, de ugyangy lassabb s erforrs ignyes a
vgrehajtsa (a paramtereknek s a loklis vltozknak minden egyes
hvskor trhelyet kell foglalni).
Vissza
92
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
93
Vissza
93
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
94
94
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
95
Vissza
95
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
96
Vissza
96
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
97
A Sikidom osztly egy absztraktknt definilt osztly kt absztrakt metdussal a kerlet s a terlet meghatrozsra. A kt leszrmazott osztlyban (Kor, Teglalap) ezeket a metdusokat felldefiniljuk, s konkrt
utastssal ltjuk el, hiszen a modell ezen a szintjn mr ismerjk a megfelel kpleteket.
Az absztrakt osztlyok csak abban klnbznek egy tlagos osztlytl,
hogy tartalmazhatnak trzs nlkli, absztrakt metdusokat. Mivel az
absztrakt metdusok csak a metdusok szignatrjt rgztik nem adnak
defincit ezrt az absztrakt osztlyok nem pldnyosthatk. (Termszetesen tartalmazhatnak rendes adattagokat s metdusokat is.)
Ha absztrakt osztlybl hoznnk ltre objektumokat, akkor azoknak
nem lehetne rvnyes zenetet kldeni, futs kzbeni hibkat idznnek
el, hiszen az absztrakt metdusok nem tartalmaznak utastsokat. (Az
absztrakt metdusok eltt nem hasznlhatjuk a private, static s a final
mdostkat.)
Az absztrakt osztlyok tartalmazhatnak egyb adattagokat s definilt
metdusokat is.
Az absztrakt osztlyok leszrmazottjai is lehetnek absztraktak, de az
osztlyhierarchit gy kell kialaktani, hogy legyen legalbb egy olyan osztly, amely az absztrakt metdusokat megvalstja.
Az absztrakt osztlyok hasznlata sorn elfordulhatnak tipikus programozi hibk.
A fordt nem engedi meg, hogy absztrakt osztlyokat pldnyostsunk, s a Sikidom is abstract; cannot be instantiated
hibazenetet adja.
A msik gyakori hibalehetsg, hogy a leszrmazott osztlyban nem
definiljuk az s absztrakt metdusait. Ekkor a Teglalap is not
abstract and does not override abstract method
kerulet() in Sikidom hibazenetet kapjuk, vagyis a fordt azt
zeni, hogy vagy a Teglalap osztlyt kell absztraktnak minsteni,
vagy meg kell adni a kerulet() metdus defincijt.
Vissza
97
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
98
Egy osztlyvltoz az egsz osztlyra vonatkoz rtket trol. Az osztlyvltozk az osztly minden pldnya szmra kzsek s elrhetk. Vagyis
az osztlyvltozk szmra pontosan egy trterletet rendel a virtulis gp.
Az albbi pldban egy cg alkalmazottai mindannyian 62 ves korukban
mennek nyugdjba. Mivel ez a tulajdonsg minden egyes pldnyra kzs,
osztlyvltozban definiljuk. gy a pldnyoknak nem kell kln-kln
trterletet foglalni ehhez az rtkhez.
public class Alkalmazott{
private static int nyugdijKorhatr = 62;
private int eletkor;
Az osztlyvltozk definilsi sorrendben kapnak kezdrtket. A kezdrtkads mr az osztly virtulis gpbe val betltsekor megtrtnik. (A
pldnyvltozk termszetesen a konstrukci sorn kapnak kezdrtket.)
Az osztlyvltozk kezdrtk adsnl a mr definilt osztlyvltozkat
felhasznlhatjuk, de a pldnyvltozkat nem! Az osztlyvltozkat ksbb az objektumok kezdrtkhez (pldnyvltozk) mr felhasznlhatjuk, hiszen addigra az rtkk mr definilt lesz.
Az osztlyvltozkat az osztly defincija kzben ugyangy rnk el,
mint pldnyvltozkat. Nagyon gyakori, hogy osztlyvltozkban konstans rtkeket trolunk. Ilyenkor a minsts static final, vagyis csak
egyszer kaphat kezdrtket a vltoz, amelynek rtke a futs sorn nem
vltoztathat meg. (Ebben az esetben nem srtjk meg az adatrejts elvt,
hiszen a vltoz vgleges, csak olvashat.)
Vissza
98
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
99
osztlyvltozval definilja.
A publikus osztlyvltozkra Osztly.osztlyvltoz alakban is hivatkozhatunk, pl.: Math.PI . Ilyen statikus adattag pl. a System osztly
out adattagja is, amely alaprtelmezs szerint az opercis rendszer karakteres kimenett jelenti, gy ennek az osztlyvltoznak a felhasznlsval
tudunk a kpernyre karaktereket rni. (pl.: System.out.println().)
4.5.2. Osztlymetdusok
Ha az Alkalmazott osztlyban a nyugdjkorhatrt meg szeretnnk vltoztatni, akkor azt egy osztlymetdusban tudjuk megtenni:
Vissza
99
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
100
Vissza
100
Programozs III.
Az osztlyok hasznlata
Vissza
101
Vissza
101
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
102
4.6. Krdsek
Milyen szablyok vonatkoznak egy osztly definilsra a Java nyelvben?
Milyen hozzfrsi kategrikat adhatunk meg az egyes elemeknek?
Mit tudunk a virtulis gp trgazdlkodsrl?
Hogyan zajlik a pldnyosts folyamata?
Milyen kulcsszt hasznlunk az rklds jelzsre?
rkldnek-e a konstruktorok?
Mit jelent a super() hvs?
Mit jelent a szignatra sz?
Mit jelent egy metdus felldefinilsa?
Mit jelent egy metdus felltltse?
Hogyan tallja meg a virtulis gp az objektumhoz tartoz metdust?
Van-e lehetsgnk a Java nyelvben rekurzv metdust rni?
Hogyan definilunk absztrakt osztlyt?
Hogyan deklarlunk absztrakt metdust?
Mi trtnik, ha absztrakt osztlybl szeretnnk pldnyostani?
Hogyan definilunk osztlyvltozt, s osztlymetdust?
Mikor kell osztlyvltozt, ill. osztlymetdust hasznlnunk?
Az osztly pldnyai elrik az osztlyvltozkat? Ha igen, hogyan?
Az osztlymetdusok elrik a pldnyok adattagjait? Ha igen, hogyan?
Mit jelent a static final minsts?
Mikor beszlnk a vltozk elfedsrl?
4.7. Feladatok
Tervezze meg s ksztse el az albbi Java nyelv osztlyokat! gyeljen az
adatrejts betartsra!
Tglatest (a tglatestet a, b, c oldalval jellemezzk; definiljon
konstruktort, a tovbbi szmtand rtkek: felszn, trfogat).
Alkalmazott (nv, lakcm, havi fizets; metdusok: a szemlyi adatokat megjelent, s az ves fizetst kiszmt).
Henger (sugr, magassg, ill. felszn, trfogat) s Gmb (sugr, ill. felszn, trfogat).
Vissza
102
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az osztlyok hasznlata
Vissza
103
Vissza
103
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
104
5. Interfszek
A Java alapvet ptelemeit az osztlyok jelentik. Az objektumorientlt
tervezsi s programozsi munka sorn a legtbbszr osztlyokkal dolgozunk. Az elzekben megismerkedtnk az absztrakt osztlyokkal, mint az
ltalnossgban megfogalmazott s konkrt pldnyokkal, kizrlag rktsi cllal ltrehozott osztlyok tpusval. Ilyen szerepet tltenek be a Java
nyelvben az interfszek is.
Az interfsz nem ms, mint az osztlyok egy olyan ltalnostsa, amely
csupn konstans rtkeket, s metdusok deklarcijt tartalmazhatja. (Az
absztrakt osztlyok mg tartalmazhattak vltoz jelleg adattagokat, s
definilt metdusokat is.)
Az interfsz csak egy felletet, kapcsoldsi pontot jelent, hiszen itt a mveletek prototpust adjuk meg, azaz egy szablyt, hogy milyen mveletet
akarunk az adott objektumon vgrehajtani. A modellezsben ezt a magasabb absztrakcis szintet mr elvonatkoztathatjuk minden konkrt adattl,
vltoztl.
Az sszehasonltst pldul absztrakt mdon megadhatjuk gy, hogy ha
kt objektumot ssze akarok hasonltani, akkor azt egy logikai fggvnnyel
vgezzk. Az egyes konkrt osztlyokban pedig megadjuk az sszehasonlts szablyt, hogy milyen tnyleges adattagok, vagy ms jellemzk segtsgvel hasonltunk ssze kt objektumot. (Ha pldul szemlyeket hasonltunk ssze, akkor nv szerint, gpjrmveket pedig mondjuk tpusuk
szerint klnbztetnk meg stb.)
Ha egy adott adatszerkezetben rendezetten szeretnnk objektumokat trolni, akkor definilnunk kell a rendezsi szablyt (metdust). De ezt a
rendezsi szablyt ismernie kell majd annak az osztlynak is, amelyiknek a
pldnyait trolni szeretnnk (hiszen itt tudjuk megadni az sszehasonlts
kplett az egysgbe zrtsg s adatrejts miatt). Valahogy teht szinkronba kell hozni ezt a kt osztlyt, hogy azonos zenettel hvjk, illetve
hajtsk vgre a mveleteiket. Erre szolglnak az interfsz osztlyok, hiszen
itt csak a protokollt adjuk meg.
Vissza
104
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
105
A java.lang csomag Comparable interfsze az egyes objektumok szszehasonltst teszi lehetv. Deklarcija nagyon egyszer:
public interface Comparable{
public int compareTo(Comparable o);
}
A Java nyelv nem engedi meg, hogy egy osztlynak tbb se legyen, de
megengedi egy, vagy tbb interfsz felhasznlst, megvalstst.
Az interfszek ltalban kt olyan osztlyt ktnek ssze logikailag, amelyeknek nem sok kze van egymshoz, mgis szeretnnk egy olyan kzsen
hasznlhat felletet megadni, amelyik mindkt osztlyban garantlja, hogy
Vissza
105
Programozs III.
Interfszek
Vissza
106
az adott mvelet hasonl mdon menjen vgbe. A rendezsek sorn pldul fontos szerepet jtszik az egyes objektumok sszehasonltsa.
5.2. Interfszek kifejtse, megvalstsa
Egy osztly megvalst egy interfszt, ha az osztlydefinciban az
implements kulcsszval bejelentett interfsz metdusaira defincit ad.
public class Osztly implements Interfsz;
public class Osztly extends s implements Interfsz;
public class Osztly extends s implements Intf1, Intf2;
Ha a fenti Comparable interfszt egy konkrt osztlyban kell megvalstani, akkor az albbi alakban lehet azt megtenni:
public class Osztly implements Comparable{
double d;
//az interfszben elrt metdus defincija:
public int compareTo(Comparable obj){
return ( this.d (Osztly)obj.d );
}
}
Vissza
106
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
107
Az brn lthat feladatban kt osztlyt szeretnnk elltni hasonl funkcikkal. Abban az esetben, ha a kt osztly egy-egy fggetlen leszrmazsi
lnc rsze, akkor a Java megszortsai miatt egy msodik st nem mr nem
rendelhetnk hozzjuk. A Madr, mint az llat osztly, illetve a Replgp, mint a Gp osztly leszrmazottja kt teljesen fggetlen rklsi
lncot jelent, mgis mind a kt osztlyban hasznlni szeretnnk a replsi
kpessgeket meghatroz mveleteket. Ehhez interfszt kell hasznlnunk. Az interfsz nevt itt mellknvi rtelemben hasznljuk (milyen?)!
Az interfszben deklarlt metdusfejeket az interfszt megvalst osztlyban fejtjk ki. gy elmondhatjuk, hogy a Madr is s a Replgp is
Repl (replni kpes).
/** A replni kpes llnyek/trgyak kzs interfsze*/
public interface Repulo {
public void felszall();
public void leszall();
public void repul();
}
public abstract class Eloleny{
private String nev;
public Eloleny(String nev_){ nev = nev_;}
public String getNeve(){ return nev;}
public abstract String taplalkozik();
}
public abstract class Gep{
private String nev;
public Gep(String nev_){nev = nev_;}
public String getNeve(){ return nev;}
public abstract String hasznalatiUtasitas();
}
public class RepuloGep extends Gep implements Repulo{
public RepuloGep(String nev_){
super(nev_);
}
public String hasznalatiUtasitas(){
return "A replgp lgi kzlekedsi eszkz.";
}
// az interfszben deklarlt metdusok kifejtse
public void felszall(){
System.out.println("A replgp a
kifutplyrl szll fel.");
}
Vissza
107
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
108
Vissza
108
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
109
Ekkor a kiterjesztett interfsz rkli az snek konstans tagjait, s metdusdeklarciit, illetve tartalmazza a sajt trzsben deklarltakat. Az ilyen
tpus interfszek megvalstsakor mind az s, mind a kiterjesztett interfsz metdusaira defincit kell adnunk, klnben a fordt a Osztly
is not abstract and does not override abstract method metdus(int) in Interfsznv hibazenettel jelzi, hogy az implemen-
Vissza
109
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
110
}
}
Statikus tagosztlyok
A statikus s dinamikus deklarci lesen elklnl egymstl. Statikus
esetben azt hasznljuk ki, hogy egy begyazott, statikus minsts osztly
elrejthet a klvilg ell, annak ltezsrl csak a tartalmaz tud. A statikus bels osztlyok szoros kapcsolatban vannak a tartalmaz osztllyal. A
kls osztly metdusai hozzfrnek a statikus tagosztlyok privt tagjaihoz, gy a bels osztly tagjainl szerepl minstsek csak a klvilgnak
szlnak. Magnak a bels osztlynak a minstse (public, protected,
private) megengedett, lthatsga gy szablyozhat. A statikus tagosztly definilsa esetn maga a definci fggetlen a tartalmaz osztlytl.
A Lista osztlyt egy ktirny lncolt lista megvalstsra szeretnnk
definilni. A lista minden elemt a privt Elem bels statikus osztly pldnyaknt definiljuk. Az Elem osztly nllan ltezik a List-tl fggetlenl, de a klvilg ell rejtve marad. Kezdetben res listbl indulunk
ki, majd a beszur metdussal tudunk jabb elemeket a listba felvenni.
Vissza
110
Programozs III.
Interfszek
class Lista{
private Elem elso;
Vissza
111
Vissza
111
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
112
Vissza
112
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
113
Sokszor szksgnk van olyan osztlyokra, amelyet csak egyszer hasznlunk, pldnyostunk. Ezeknek az osztlyoknak a defincijt a pldnyosts helyn is megadhatjuk. Az gy keletkez osztlyt nvtelen osztlynak
nevezzk. Megadsa gy trtnik, hogy a tartalmaz osztlybl egy j ideiglenes leszrmaztatst ksztnk, j metdusokkal gy hogy a tartalamz
osztly pldnyostsa sorn heyben megadjuk az j osztly defincijt.
new Osztly(paramterek) { osztlytrzs }
Vissza
113
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Interfszek
Vissza
114
5.5. Krdsek
5.6. Feladatok
Definiljon egy Sikidom interfszt, amelyben deklarlja a kerlet s
terletszmtshoz szksges metdusokat, majd definiljon benne jellemz konstansokat. Alaktsa t a Kr, a Tglalap s a Hromszg
osztlyokat gy, hogy azok megvalstsk a Sikidom interfszt.
Ksztsen interfszt Hasonlithato nvvel (a Comparable mintjra),
s deklarljon egy mveletet, amely kt skidomot a terletk alapjn
sszehasonlt. Alaktsa t gy az elz feladatot, hogy a Kr, Tglalap s Hromszg osztlyok ezt az interfszt is megvalstjk!
Definiljon verem adatszerkezetet bels osztlyok segtsgvel, majd
lssa el karbantart mveletekkel.
Vissza
114
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Csomagok, komponensek
Vissza
115
6. Csomagok, komponensek
Egy nagyobb program elksztsekor trekednnk kell az ttekinthet,
knnyen mdosthat, s tovbbfejleszthet kd ellltsra. Ennek elrshez a programokat megfelelen tagolni kell. A tagolsnak mr az
objektumorientlt modellezs s a programtervezs szintjn meg kell nyilvnulnia. Az sszetartoz osztlyokat ezrt a modell s a mkds szerint csomagokba szervezzk. A Java osztlyknyvtrait is csomagokban,
jl tlthat szerkezetben definiltk. A csomagokbl kpezhet egy magas szint zrt egysg, ms szhasznlattal lve komponens.
Minden csomag egy nll nvteret (namespace) vezet be, amelyben
egyediv teszi a benne tallhat osztlyok szerkezett. A csomag alkalmas
a hozzfrsi kategrik kezelsre, s a csomagszint hozzfrsi kategrival definilt osztlyok, interfszek, metdusok csak a csomagon bell
lesznek elrhetek.
A csomagoknak nyelvi szinten a fordtsi egysgek(osztlyok,
intrfszek) adnak konkrt tartalmat. Egy csomaghoz tartoz fordtsi egysgben tallhat a csomag forrskdja. Ez a csomagszerkezet hierarchikus
hasonlan az llomnyok knyvtrszerkezetben val elhelyezshez
gy a csomagok kztt logikai al-flrendeltsgi viszony is elfordulhat.
Ekkor alcsomagnak nevezzk a csomagban tallhat msik csomagot.
Minden csomag tetszleges szm alcsomagot tartalmazhat.
6.1. A Java nyelv alapcsomagjai
A JDK csomagstruktrja kveti a fjlrendszerek knyvtrszerkezett, gy
a fcsomagok egy-egy klnll knyvtrban helyezkednek el, amelynek
alknyvtrai lesznek a fcsomagok alcsomagjai stb. A legfels szinten
helyezkedik el tbbek kztt a java csomag. Az egyes alcsomagokba tovbbi csomagokat, vagy osztlyokat s interfszeket tallunk. gy a java.lang csomag mint a nyelv alapcsomagja a nyelv alaposztlyait, a
mkdshez elengedhetelen osztlyok definciit tartalmazza, a java.io
csomag a fjlkezelshez szksges osztlydefincikat, a java.applet
csomag tartalmazza a hagyomnyos html oldalakba pl alkalmazsok
(appletek) lerst tartalmaz osztlyokat, a java.awt a grafikus alkalmazsok alaposztlyait tartalmazza stb.
Vissza
115
Programozs III.
Csomagok, komponensek
Vissza
116
Vissza
116
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Csomagok, komponensek
Vissza
117
A tovbbi bvtsi lehetsgeket, az interneten hasznlt URL hivatkozsokhoz hasonlan az egyes gyrtk ltal knlt osztlyokat is elrhetjk:
import com.sun.security.auth.*;
A csomagokat hagyomnyosan fjlrendszerben, egyes esetekben adatbzisokban is trolhatjuk. A fjlrendszerben trolt csomagok egy kiindul
knyvtrbl rhetek el. Ebbl a knyvtrbl, mint gykrbl kiindulva
adhatjuk meg az egyes alcsomagok knyvtrt, s ezzel prhuzamosan a
forrskdban a csomag elrst.
A Java forrsok vizsglatval a Java krnyezet alapknyvtrban tallhat src.zip fjlbl lthatjuk, hogy a Math osztly hivatkozsa java.lang.Math alak, s forrsa Math.java, amely a java/lang
knyvtrban tallhat. (A lefordtott osztlyok is ugyanezt a hierarchit
kvetik az rt.jar fjlban.)
A kialaktott osztlyszerkezet elrshez az opercis rendszerben
szksgnk van egy CLASSPATH nev krnyezeti vltozra, ahol a csomagok gykrpontjait rgztjk.
A Java krnyezet a CLASSPATH-ban megadott knyvtrak alapjn a
csomaghivatkozsokat elri. A CLASSPATH krnyezeti vltozhoz nem
csak knyvtrnevek, hanem csomag.zip s csomag.jar alakban
megadott fjlok is hozzfzhetk. Mivel a Java rendszert felksztettk a
tmrtett llomnyok feldolgozsra is, ezrt hozzadhat a .zip, vagy
az ugyanilyen tmrtsi algoritmust hasznl .jar fjl is. Sokszor megadjuk az aktulis knyvtrat jelent hivatkozst is: ..
Vissza
117
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Csomagok, komponensek
Vissza
118
Abban az esetben, ha a fordtsi egysg elejrl elhagyjuk a csomag deklarcit (package), akkor az egy n. nvtelen csomagba tartozik. Ez a nvtelen csomag azoknak a forrsfjloknak az sszessge, amelyek egy alknyvtrban helyezkednek el (jellemzen az opercis rendszer alaprtelmezett munkaknyvtrban). A nvtelen csomag csak nagyon egyszer
programokhoz, ltalban ideiglenes, vagy tesztosztlyok fejlesztshez
hasznlhat. A nvtelen csomaban nem deklarlhatunk alcsomagokat. Egy
sszetett alkalmazs esetn, a nvtelen csomagokkal elvesztjk a
modularits adta elnyket s a program tlthatsga is ersen romlik,
hiszem minden osztlyt fizikailag egy knyvtrban kell trolnunk.
Vissza
118
Programozs III.
Csomagok, komponensek
Vissza
119
sikidom.Teglalap;
sikidom.*;
java.util.*;
java.util.zip.Zipfile
com.sun.security.auth.login.ConfigFile
Vissza
119
Programozs III.
Csomagok, komponensek
Vissza
120
sikidom.Teglalap
java.util.Vector
java.util.Zipfile
com.sun.security.auth.login.ConfigFile
Vissza
120
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Csomagok, komponensek
Vissza
121
A Main-Class bejegyzsben adhat meg a belpsi pont,azaz a fenti plda szerint a jar fjl betltsekor a publikus "Teszt" osztly main osztlymetdusval elkezddik a program vgrehajtsa.
6.5.1. Jar fjl ksztse
A .jar fjlok elksztst a jar segdprogram megfelelen paramterezett hvsval kezdemnyezhetjk. Az aktulis knyvtrban (ahol a csomagot kszteni szeretnnk) az albbi paranccsal indthatjuk a modulptst:
jar cvfm sajatcsomag.jar Manifest.mf .
Ezutn a sajatcsomag.jar nven elll modult futtathatjuk, vagy felhasznlhatjuk a tovbbi fejlesztshez. (A jar segdprogramnak mg szmos, itt nem trgyalt funkcija s lehetsge van.)
Megjegyzs: A manifest fjl szintaktikja elrja, hogy minden sora, gy az
utols utn is legyen soremels, klnben a jar csomagol ezt nem veszi
figyelembe!
6.5.2. Jar fjl futtatsa
Egy jar fjl, amely tartalmaz egy olyan publikus osztlyt, amelynek van
main osztlymetdusa s ezt a manifest fjlban is megadtuk, az albbi
paranccsal futtathat:
java -jar sajatcsomag.jar
Vissza
121
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Csomagok, komponensek
Vissza
122
6.6. Krdsek
6.7. Feladatok
Egy tetszleges, elzekben kidolgozott feladathoz (lsd: 3.4, 4.7, 5.6.
fejezet) ksztsen egy csomagot, majd a csomag osztlyaibl s a bemutat programbl lltson el futtathat .jar llomnyt.
a logikailag sszetartoz osztlyok egy knyvtrban legyenek,
a bemutat program egy szinttel ezen knyvtr fltt helyezkedjenek el.
Vissza
122
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
123
7. Kivtelkezels
A programozsi munka sorn ltalban a helyes hasznlatnak megfelelen
ksztjk fel a programokat. A mkds sorn azonban elfordulhatnak
olyan, esetleg kivteles llapotok is (a helytelen hasznlatbl, valami kls
okbl, vagy programozsi figyelmetlensgbl ereden), amikor a program
hibsan mkdik.
A hagyomnyos programozsi technikkban a szubrutinok hibakdokkal jeleztk a vgrehajts helyessgt, illetve hibit. A Java nyelv ms
szemlletmddal kezeli a hibk elfordulst. A programkd kivteles
llapotba kerlsekor a virtulis gp egy kivtelt (exception) vlt ki. A
kivtelek olyan objektumok, amelyek egyes kivtel-osztlyokba sorolhatk.
A kivtel osztlyokat a Throwable osztly alosztlyaiknt definiltk. A
kivtel jelleg osztlyok kt csoportba sorolhatk:
Error (hiba): Az ilyen tpus kivtelek olyan alapvet hibkat jellnek,
amelyeknek azonnali programfuts lells az eredmnye, s nem kezelhetek le (pl: elfogy a memria).
Exception (kivtel): Ezek a fajta kivteles esemnyek a futs sorn
lekezelhetk. Ekkor a program normlis menete megszakad, s a vezrlst az elrt vezrlsi szerkezetekkel az aktulis hibt lekezelni hivatott programrszre irnythatjuk.
A kivtelkezels ersen pt a Java tipikusan objektumorientlt elemeire: A
futsi idben elll hiba hatsra egy objektum keletkezik, amely a hiba
fellpsnek krlmnyeit (a hiba tpust s a program aktulis llapott)
rja le, ezt a virtulis gp szleli s tadja egy, a kivtel feldolgozsra sznt
programrsznek, amely a kivtelobjektumba csomagolt informciknak
megfelelen gondoskodik a folytatsrl.
A kivtelek feldolgozsa szempontjbl megklnbztetnk ellenrztt s nem ellenrztt kivteleket. Azokat a kivteleket, amelyeket felttlenl fel kell dolgozni (azaz ktelez vagy specifiklni, vagy elkapni), ellenrztt kivtelnek nevezik.
A Java fordt minden esetben hibt jelez, ha gy szleli, hogy egy metdus valamilyen ellenrztt kivtelt vlthat ki, de az nem tartalmazza az
adott kivtelt elkap programblokkot, illetve a kivtelobjektum tpust
sem specifiklja. Ilyen esetek pldul a fjl- s hlzatkezelssel, specilis
sztringkonverzival stb. foglalkoz programrszek.
Vissza
123
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
124
Vissza
124
Programozs III.
Kivtelkezels
Vissza
125
Vissza
125
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
126
nek krlmnyeit), az ezeknek rtket ad konstruktort s az olvas metdusokat lehet megadni, illetve felldefinilni.
class MyException extends Exception {
public String toString() {
return Hiba trtnt!;
}
}
class MyException2 extends Exception {
public MyException2(String s) {
super(s);
System.err.println(MyException2 hiba lpett fel!);
}
}
Az elre megadott, vagy a sajt osztllyal definilt kivtelt az egyes metdusokhoz is hozzrendelhetjk. Ehhez a throws kulcsszval a metdusfej
specifikcijba illesztjk a kivteles esemnyt lekezel osztlyt, vagy osztlyokat.
A RuntimeException osztlyba s ennek alosztlyaiba tartoz kivteleket a java krnyezet automatikusan a metdusokhoz rendeli. gy az
ezekbe az osztlyokba tartoz s gyakran elfordul hibkat nem kell a
metdusoknl megjelentennk, a virtulis gp a RuntimeException jelleg kivteleket szksg esetn automatikusan dobja.
<tpus> metdusnv(<paramterek>) throws KivtelOsztly { }
Vissza
126
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
127
finally {
// Zr blokk
}
Vissza
127
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
128
Vissza
128
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kivtelkezels
Vissza
129
7.4. Krdsek
7.5. Feladatok
A Sikidomok osztlyokhoz ksztsen sajt kivteleket ler osztlyokat,
amelyek az albbi hibk esetn vltanak ki kivtelt:
negatv, vagy zrus oldalhossz, vagy sugr megadsa,
megszerkeszthetetlen hromszgek megadsa,
olyan adatok megadsa, amelyeknl a szmtott rtkek mr tlcsordulnak.
Vissza
129
Programozs III.
Vissza
130
A tpuskarakterek jellsre rszben tvettk a C nyelv szintaktikjt, rszben kiegsztettk a Java-specifikus formzsi lehetsgekkel. A tpuskaraktereket (nagy szmuk miatt) t f kategriba soroltk: ltalnos, karakter, numerikus (egsz vagy vals), dtum/id, illetve egyb tpusok.
A szveges formz karakterek lehetsges rtkeit a kvetkez tblzat
tartalmazza. (Tovbbi rszletekrt rdemes a java.util.Formatter
osztly specifikcijt ttanulmnyozni.)
Vissza
130
Programozs III.
Vissza
131
Formz
karakter
%b, %B
Tpus
Jelents
ltalnos
%h, %H
ltalnos
Ha a paramter null rtk, akkor az eredmny "false" lesz. Ha elemi boolean, vagy
Boolean objektum tpus, akkor az eretmny
"true", vagy "false" rtk lesz.
Ha a paramter null rtk, akkor az eredmny "null" lesz. Klnben az eredmny az
hexadecimlis rtk lesz, az
Integer.toHexString(arg.hashCode())
%s, %S
ltalnos
%c, %C
karakter
%d
egsz
%o
egsz
%x, %X
egsz
%e, %E
vals
%f
vals
%g, %G
vals
%t, %T
dtum/id
%%
%n
ltalnos
ltalnos
hvs eredmnyeknt.
Ha a paramter null rtk, akkor az eredmny "null" lesz. Ha a paramter megvalstja a Formatter interfszt, akkor annak
formatTo() metdusnak kimenete lesz,
klnben az eredmny a paramter
toString() rtke lesz.
Az eredmny Unicode formtum karakter
lesz.
Az eredmny tzes szmrendszer, egsz
formtum.
Az eredmny nyolcas szmrendszer, egsz
formtum.
Az eredmny hexadecimlis egsz formtum.
Az eredmny tzes szmrendszer, normlalak, vals formtum.
Az eredmny tzes szmrendszer, vals formtum.
Az eredmny tzes szmrendszer, rgztett
pontossg, normlalak s vals formtum.
A dtum/id formzsok jellsnl hasznlt
formzkarakter. Bvebben lsd: 0. fejezet.
A szzalkjel '%' ('\u0025')
Platformfgg sorvgjel. (CR, CR-LF)
5. tblzat: Szvegformzs
Vissza
131
Programozs III.
Vissza
132
Itt %s a jl ismert szveges helyettestst, %d egy egsz rtk helyettestst jelli, a %tc egy Date, Calendar, vagy milliszekundumokban megadott idadatot helyettest a loklis dtumformtummal, s legvgl a %n
egy platformfgg sorvgjelet jelent meg.
A PrintWriter s a String osztlyok ezeken fell rendelkeznek egy
format() nev osztlymetdussal. Mg a printf() egy megadott kimenetre kldi a formzott karakterlncot, addig a format() a megformzott
sztringet visszaadja. gy a fenti szveg inicializlhat j szveges vltozknt az albbi mdon:
String uzenet = String.format(%s felhasznl %d prblkozs
utn bejelentkezett. Utols ltogats ideje: %tc %n,
felhNev, belepesekSzama, utolsoLatogatasDatuma);
Vissza
132
Programozs III.
Vissza
133
lenthetk: a memria egy elklntett rszn, a konzolon, egyszer szveges, vagy XML formzott fjlban, hlzati socketen keresztl, vagy ezek
valamely kombincijaknt.
A naplzsi mechanizmus segt a programok fejlesztsi, teleptsi s felhasznli szakaszban a rszletes hibadetektlsban, s a nyomkvetsben.
A java.util.logging csomag fbb osztlyai:
Logger: A naplkezels fosztlya. Az alkalmazsok a bejegyzseket
ezen osztly pldnyain keresztl kezdemnyezik. Szmos metdussal
rendelkezik, melyek a megfelel szinteken a naplba az adott zeneteket bejegyzik.
LogRecord: A LogRecord objektumok maguk az egyes logbejegyzsek vivobjektumai, a naplz mechanizmus ezeket kldi a Handler
fel.
Handler: Feladata a logbejegyzsek valamilyen kimenetre val elkldse (memria, fjl, socket stb.). Szmos leszrmazottja ismert.
(MemoryHandler, ConsoleHandler, FileHandler, SocketHandler,
treamHandler.)
Level: Az ltalnos naplbejegyzsekhez hasznlt jelzsszintek. A
programban bellthat, hogy a Logger s a Handler milyen szint s
a szint feletti logrekordokat kezeljen.
Formatter: A logrekord objektumok a kimenetre klds eltt a
Formatter osztlyok segtsgvel formzhatk, talakthatk. Jelenleg
kt implementcija adott, a SimpleFormatter s az XMLFormatter.
LogManager: A virtulis gp globlis objektuma. Felels a Logger
objektumok kezelsrt. gy egy nagyobb program osztlyai (akr ms
csomagbl is) ugyanazokat a loggereket hasznlhatjk.
A naplkezels a kvetkez modell szerint rtelmezhet:
Az alkalmazs indulsakor a LogManager inicializlja a Logger objektumok nvtert. Amennyiben egy konfigurcis fjlban van megadott
logmenedzser bejegyzs, akkor az azokban megadott rtkekkel inicializlja.
A programbl csak a Logger objektumhoz rkezhetnek zenetek.
Minden egyes Logger objektum rendelkezik egy nvvel, s egy naplzsi
kszbbel. A naplzsi kszb s afeletti szint zenetekbl a Logger
objektum egy LogRecord objektumot llt el s elkldi a megadott
Handlernek. A Handler ezt a Logrecord-ot a megadott Formatter
Vissza
133
Programozs III.
Vissza
134
LogRecord
Logger
i/n
LogRecord
Filter
kimenet
Handler
Loglevel
1,2,3,4,5,6,7
i/n
Filter
String
LogRecord
Formatter
Log mechanizmus
tekre.
Azokban a forrsokban, ahol a loggolst hasznlni szeretnnk, termszetesen importlnunk kell a java.util.logging csomagot. Ezutn egy
Logger s egy Handler objektumot kell ltrehoznunk. A programban a
logger s handler objektumot ssze kell kapcsolnunk, illetve bellthatjuk a
naplzs szintjt, s a handlerhez hozzrendelhetnk egy szrt is. Nagy
elnye ennek a mechanizmusnak, hogy a Logger objektumhoz tbb
handlert is rendelhetnk, gy a naplzs tbb gon, tbb mdszerrel is
folyhat egyidben.
Vissza
134
Programozs III.
Vissza
135
Vissza
135
Programozs III.
Vissza
136
Vissza
136
Programozs III.
Vissza
137
Date
Az idadatokat az 1970.00.00 00:00:00:000 idponttl szmtva milliszekundumokban trolja. Csak konstans idadatok kezelsre szolgl. Szmos metdusa mr elavult, mra mr csak a toString(), az equals(), a
before(), az after() hasznlhatak. A paramterek nlkli Date()
konstruktorhvs az aktulis gpidvel inicializlt dtumadatot tartalmaz
objektumot szolgltatja.
Calendar
A Date osztly kiegsztseknt hoztk ltre, amely az idadat trolsn
kvl egyes helyfgg szolgltatsokat is kpes kezelni (pl. idznk). Az
osztly pldnyaibl lekrdezhet, bellthat a kvnt dtumrtk, s klnbz konverzik vgezhetk el rajtuk.
A szmos elre definilt konstans rtk segtsgvel egy konkrt naptradat egyes sszetevi lekrdezhetk. Legfontosabb metdusok a
get(), a set() s az add(). Az add metdussal lehet pldul az egyes
dtumrtkhez valamilyen rtket hozzadni, melyet rtkhelyesen, a szkveket figyelembe vve vgez el. Pl: 2006.12.11 +3 hnap = 2007.3.11
lesz.
TimeZone
A TimeZone osztly a hordozhat programok, ms dtum s idformtumokra val inicializlsra s konvertlsra hasznlhat. A TimeZone
absztrakt
osztly,
nem
pldnyosthat.
Hasznlathoz
a
TimeZone.getDefault(zna) hvs szksges, ahol a zna egy szveges adatknt megadott idzna rtk. Az inicializlshoz szmos elre
rgztett rtk tartozik Europe/Budapest, America/Los_Angeles
formban. Azonban a GMT+01, vagy a GMT+0010 formtum is
hasznlhat, melyekben a greenwichi idznt 1 rval, illetve 10 perccel
toltuk el.
Az eurpai idszmtsi rendszerhez specilisan hasznlhat mg a
SimpleTimeZone osztly is, amely a Gergely-naptrakhoz olyan knnyen
hasznl funkcikat nyjt, mint pldul a tli/nyri idszmts pontos
kezelse.
Vissza
137
Programozs III.
Vissza
138
%tL
%tN
%tZ
%ts
%tQ
Jelents
raadat 24 rs formtumban, vezet nullkkal feltltve,
00 - 23.
raadat 12 rs formtumban, vezet nullkkal feltltve,
01 - 12.
24 rs raadat, vezet nullk nlkl, 0 - 23.
12 rs raadat, vezet nullk nlkl, 1 - 12.
Percadat, vezet nullkkal feltltve, 00 - 59.
Msodpercadat, vezet nullkkalfeltltve, 00 - 60 (A "60"
olyan specilis rtk, amely az UTC korrekcis msodperceket jelzi).
Hrom karakteres milliszekundum adat, vezet nullkkal
feltltve, 000 - 999.
Kilenc karakteres nanoszekundum adat, vezet nullkkal
feltltve 000000000 - 999999999.
Az aktulis idzna szveges rtke.
Az UTC kezdrja ta eltelt msodpercek (1970. 01. 01
00:00:00 UTC ) rtkei Long.MIN_VALUE/1000 s
Long.MAX_VALUE/1000 kzttiek lehetnek.
Az UTC kezdrja ta eltelt id milliszekundumban.
rtkei Long.MIN_VALUE s Long.MAX_VALUE kzttiek
lehetnek.
6. tblzat: Dtum- s idformzs
Vissza
138
Programozs III.
Vissza
139
Formz
Jelents
karakter
(Dtumadatok)
Helyspecifikus, teljes hnapnv pl. "January", vagy janu%tB
r. (A formtum a helyspecifikus belltsokat kveti,
bvebben lsd Locale osztly)
Helyspecifikus, rvidtett hnapnv pl. "Jan", vagy jan..
%tb
Helyspecifikus, teljes alak napnv pl. "Sunday",
%tA
"Monday" , vagy vasrnap
Helyspecifikus, rvid formtum napnv. "Sun", "Mon" ,
%ta
vagy V, H
A ngyjegy vszmok els kt jegyt jell szmadat,
%tC
vezet nullkkal feltltve, 00 - 99
Ngyjegy vszmadat, vezet nullkkal feltltve, 0000
%tY
9999.
Ktjegy vszmadat, vezet nullkkal feltltve, 00 - 99.
%ty
Az v napjnak sorszma, vezet nullkkal feltltve, 001
%tj
366.
Ktjegy hnapadat, vezet nullkkal feltltve, 01 - 13.
%tm
Ktjegy napszm adat, vezet nullkkal feltltve, 01 - 31
%td
Ktjegy napszm adat, vezet nullk nlkl, 1 - 31.
%te
(Vegyes dtum/id formzsok)
24 rs idadat, megegyezik a "%tH:%tM"-vel
%tR
24 rs idadat, megegyezik a "%tH:%tM:%tS"-vel.
%tT
12 rs idadat, megegyezik a "%tI:%tM:%tS %Tp"-vel.
%tr
Dtumadat, amely megegyezik a"%tm/%td/%ty"-vel.
%tD
ISO 8601 formj dtumadat, megegyezik a "%tY-%tm%tF
%td"-vel.
UTC idformtum, megegyezik a "%ta %tb %td %tT
%tc
%tZ %tY"-vel.
7. tblzat: Dtum- s idformzs (folytats)
Vissza
139
Programozs III.
Vissza
140
java.util.Date;
java.util.Calendar;
java.util.GregorianCalendar;
java.util.TimeZone;
java.util.SimpleTimeZone;
class Datum {
public static void main(String[] args) {
// Melyik idznk megfelelek neknk, magyaroknak? (1 ra
Greenwich-tl)
String[] megfelelo=
TimeZone.getAvailableIDs(1*60*60*1000);
System.out.println("Greenwich-tl keletre 1 rnyira
lev idznk:");
for(int i=0;i<megfelelo.length;i++){
System.out.println("\t" + megfelelo[i]);
}
System.out.println("--------------------------");
//Vesszk azt az idznt, amit hivatalosan hasznlunk
//(Central European Time = GMT+1):
SimpleTimeZone cet = new SimpleTimeZone(1,"CET");
//Belltjuk a nyri idszmts kezdett prilis
//els vasrnapjra, hajnali 2 rra
cet.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY,
2*60*60*1000);
// ... s a vgt oktber utols vasrnapjra, 2 rra.
cet.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY,
2*60*60*1000);
//Ezzel az idznval ltrehozunk egy
//Gergely-fle idszmtst hasznl naptrat:
Calendar calendar = new GregorianCalendar(cet);
//Az aktulis idpillanatot lekrdezzk,
Date most = new Date();
// majd a naptrat belltjuk erre az idpontra.
calendar.setTime(most);
// ezutn jn a kirats a Calendar osztly konstansaival
System.out.println("Az aktulis id:");
System.out.print(calendar.get(Calendar.ERA)==0 ? "i.e. "
: "i.sz. ");
System.out.print(calendar.get(Calendar.YEAR) + ".");
System.out.print((calendar.get(Calendar.MONTH)+1) + ".");
System.out.print(calendar.get(Calendar.DATE) + " ");
Vissza
140
Programozs III.
Vissza
141
System.out.print(calendar.get(Calendar.AM_PM)==1?"du "
:"de ");
System.out.print((calendar.get(Calendar.HOUR)+1) + ":");
System.out.print(calendar.get(Calendar.MINUTE) + ":");
System.out.print(calendar.get(Calendar.SECOND) + " mp. ");
System.out.println(calendar.get(Calendar.MILLISECOND) +
" ezredmp.");
System.out.println("Ez a "+
calendar.get(Calendar.DAY_OF_YEAR)+
". nap ebben az vben.");
System.out.println("A hnap +
calendar.get(Calendar.WEEK_OF_MONTH) +
"., a teljes v " +calendar.get(Calendar.WEEK_OF_YEAR)+
". hetben jrunk. ");
// hrom hnap mlva milyen nap lesz?
System.out.println("Hrom hnap mlva ilyenkor: ");
calendar.add(Calendar.MONTH, 3);
System.out.println(calendar.get(Calendar.YEAR)+ "."
+(calendar.get(Calendar.MONTH)+1) + "."
+calendar.get(Calendar.DATE));
}
}
8.5. Tmbmveletek
A 3.2.9. fejezetben megismerkedtnk a Java tmbkezelsi mdszereivel. A
sztringkezels sorn megismertk azokat a metdusokat, amelyek a szveges adatokat bjt-, vagy karaktertmbbe konvertlja, illetve ilyen tmbk-
Vissza
141
Programozs III.
Vissza
142
Megfigyelhet, hogy a msolat tmb azon rszei, ahova nem kerlt rtelmes karakter, a 0 ASCII kd karakterrel inicializlt.
A java.util csomag tartalmaz egy Arrays nev osztlyt. Ez az osztly
azokat a knnyen s egyszeren hasznlhat tmbmveleteket foglalja
magba, mint a tmbk inicializlsa megadott kezdrtkekkel, a binris
keress, a rendezs, s az rtkek szerinti sszehasonlts.
Vissza
142
Programozs III.
Vissza
143
A tmbmanipulcis mveletek alapja a tmb elemeinek sszehasonlthatsga. A Jva alaptpusait hasznl tmbk esetn (boolean, int,
double, char stb.) a rendszer gondoskodik a tpusnak megfelel, n.
alaprtelmezett sorrendrl, gy ezeknl ltalban nem tkznk akadlyokba. Ugyangy sztringek esetn is ltezik egy alaprtelmezett sorrend,
hiszen a String osztlyt az API eleve sszahasonlthatnak definilja.
Objektumok hasznlata esetn azonban mr a programoz felelssge
az objektumok sszehasonlthatsgnak biztostsa. Ehhez az Arrays
osztly megkveteli a Comparable, illetve a Compare interfsz implementlst, s annak compateTo(), vagy compare() metdusnak kifejtst.
(Bvebben lsd a 0. fejezetben.)
Az Arrays osztly leggyakrabban hasznlt mvelete a rendezs. A
sort() metdus segtsgvel rendezhetjk a tmb tpusa szerinti termszetes sorrendbe. A sort mveletet meghvhatjuk az egsz tmbre, illetve
a tmb egy intervallumra.
A msik gyakori mvelet egy elem kikeresse. Az Arrays osztlyban a
binris keress algoritmust implementltk a fejlesztk.
Nagyon fontos azonban tudni, hogy a binris keres algoritmus csak rendezett tmb esetn mkdik, rendezetlen tmb esetn meghatrozhatatlan
a vgeredmny!
A binris keress ugyangy, mint a rendezs felttelezi, hogy a tmb elemi
sszehasonlthatk. A fordt itt is megkveteli a megfelel interfszek
implementlst. A binarySearch() metdus kt paramtert fogad: magt a rendezett tmbt, s a keresett rtket. A keresett rtk tpusnak
meg kell egyezni a tmb elemeinek tpusval, gy sok esetben explicit tpuskonverzit kell hasznlnunk.
Rendezznk egy egsz szmokbl ll tmbt, majd keressk meg egyes
konkrt rtkek helyt (indext)!
Vissza
143
Programozs III.
Vissza
144
// 3.
Vissza
144
Programozs III.
Vissza
145
8.6. Krdsek
Melyek a hasonlsgok s a klnbsgek az ANSI C s a Java nyelv
szvegformz lehetsgei kztt?
Milyen clra hasznljuk a naplz fjlokat?
A naplzsnak milyen kimeneti csatorni lehetnek?
Mi a klnbsg a Logger s a Handler osztly kztt?
Mi jellemzi a Java dtum- s idkezelst?
Melyik osztly segtsgvel tudunk klnleges tmbmleteket vgezni,
s hogyan?
8.7. Feladatok
Az Alkalmazott osztlyt egsztse ki egy szletsi dtumot tartalmaz
adattaggal, s mdostsa az rintett metdusokat.
Ksztsen egy tetszleges feladathoz egy komplett naplz szolgltatst.
Vissza
145
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
146
9. Fejlett adatszerkezetek
A programtervezsi munkban gyakori feladat a rgztett objektumok
valamilyen szempont szerinti csoportostsa, rendezse, adott tulajdonsg
elem megkeresse, illetve a trolt elemek karbantartsa (j elemek felvtele, mdosts, trls stb.). Az elemek karbantartshoz s az elemek keresshez az elemeket valahogyan azonostanunk kell, vagyis meg kell tudnunk llaptani egy elemrl, hogy azt keressk-e (referencija, vagy valamely tulajdonsga alapjn). Tovbb a rendezshez ezeket az elemeket
ssze kell tudni hasonltani, vagyis meg kell llaptanunk, hogy melyik objektum szerepel majd a sorban elbb, illetve utbb.
A programozsi gyakorlatban szmos adattrolsi mdszer s rendezsi algoritmus ltezik, ezeket tbb-kevsb a Java krnyezet is tmogatja.
A klasszikus adatmodellek s a rajtuk rtelmezett eljrsmodellek az objektumorientlt rendszerekre is kiterjeszthetk. A magasabb fok adatszerkezetek amelyek majd az egyes objektumokat troljk kiegszthetek az
adatszerkezetet manipull mveletekkel. Zrt egysgbe rendezhetek,
vagyis megadhatak rjuk interfsz-, illetve osztly definci.
A magasabb fok adatszerkezeteket az albbi modell szerint rendszerezhetjk:
Asszociatv adatszerkezetek: az elemek kztti laza kapcsolatokat az
elemek azonos tulajdonsgai ltestik.
Tmb, dinamikus tmb,
Indextbla,
Halmaz.
Szekvencilis adatszerkezetek: az egyes elemek szigoran egymst
kvetve helyezkednek el. Mindig van egy kezdelem, s minden elemet
egy msik kvet. A kapcsolat 1:1 jelleg.
Verem (LIFO),
Sor (FIFO),
Ktirny s cirkulris listk.
Hierarchikus adatszerkezetek: az elemek egymssal alflrendeltsgi viszonyban vannak. A kapcsolatok 1:N alakak.
Fa (binris-, tbbg-, fesztfa, kupac)
sszetett listk
Vissza
146
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
147
Hls adatszerkezetek: brmelyik csompont brmelyik csomponttal kapcsolatban llhat. A kapcsolatok N:M alakak.
Irnytott grf
Hlzat
9.1. A gyjtemny keretrendszer
A bels osztlyok trgyalsakor mr lttunk egy pldt az egyirny lista
egy lehetsges megvalstsra (lsd: 5.4. fejezet). A Java osztlyknyvtrakban a java.util csomagban megtallhat a Gyjtemny keretrendszer(Collection Framework), amely a legfontosabb s gyakran hasznlt
adatszerkezetekre ksz modelleket ad. A Java osztlyknyvtrak 1.5-s
kiadsakor ezt a csomagot alaposan kibvtettk.
A legjellemzbb gyjtemnyfajtk a tmbkre, dinamikus tmbkre
s az objektumok referencikon keresztl trtn sszekapcsolsn alapulnak.
A gyjtemny keretrendszer felptsi elve a kvetkez:
Az interfszek hierarchija a megfelel absztrakt adattpusokat specifiklja. Az ket megvalst osztlyok pedig tartalmazzk a konkrt adat- s
mveletreprezentcikat. Az interfszek s a megvalst osztlyok sztvlasztsra azrt van szksg, hogy a magas szint objektumorientlt
modellezst (OOA, OOD) a tartalmazott adatoktl fggetlenl tegyk
lehetv.
Az elkszlt tpusok hosszas tervezsi s tesztelsi folyamat eredmnyei, gy hasznlatuk nvelheti a fejlesztend programok megbzhatsgt.
Az albbiakban megismerkednk a magasabb szint sszetett adatszerkezetek alapfogalmaival, majd ttekintjk a Java csomag egyes interfszeit,
osztlyait.
9.1.1. A kontner
Vissza
147
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
148
A tpusknyszerts sorn a zrjelezs azrt szksges mert a . opertor magasabb priorits, mint a tpusknyszerts.
Megjegyzs: A generikus tpusok alkalmazsval elhagyhatk lesznek az
explicit tpuskonverzik, gy a sokszor olvashatatlann vl kd kiegyszersthet (lsd: 9.4. fejezet).
9.2. A gyjtemny keretrendszer interfszei
Elszr az absztrakt modellel, vagyis az interfszekkel kell megismerkednnk. Itt adhat meg a trolt adatoktl fggetlen mkds, s itt rhat el
a szmtalan leszrmazott osztly szmra az azonos zenetklds. A
polimorfizmus segtsgvel az egyes leszrmazott osztlyokban megadhatak lesznek a specilis keres, rendez s bejr algoritmusok. A keretrendszer az albbi interfszeket definilja:
Vissza
148
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
149
Collection
List
Queue
Set
SortedSet
Map
SortedMap
Vissza
149
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
150
Vissza
150
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
151
Vissza
151
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
152
Vissza
152
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
153
System.out.println(alakzat);
Kimenet:
[Tglalap [4.0,4.0], Tglalap [5.0,6.0], Tglalap
[12.0,4.0]]
Vissza
153
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
154
//Kimenet:
//Pros szmok: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18}
//Hrommal oszthat szmok: {0, 3, 6, 9, 12, 15, 18}
//Hattal oszthat szmok: {0, 6, 12, 18}
EnumSet
Mint azt a 3.2.12. fejezetben lthattuk, a Java 1.5-s verzijtl lehetsgnk van felsorolt tpus adatok hasznlatra (enum) [12]. A kollekci
keretrendszerben helyet kap tpus a java.util.EnumSet. Ebben az
adatszerkezetben a felsorolt tpus adatok halmazt kszthetjk el. A mkds elve eltr a tbbi halmaztl, mert itt az j tpust csak kzvetlenl a
specilis halmazmveletek segtsgvel hozhatjuk ltre, az albbi mdokon:
public enum Napok {HE, KE, SZE, CSU, PE, SZO, VAS};
Vissza
154
Programozs III.
Fejlett adatszerkezetek
System.out.println(
System.out.println(
SZO, VAS]
System.out.println(
System.out.println(
System.out.println(
Vissza
155
foglaltNapok );
// [HE, SZE, PE]
hetNapjai );
// [HE, KE, SZE, CSU, PE,
ures ); // []
szabadNapok );
// [KE, CSU, SZO, VAS]
munkaNapok ); // [HE, KE, SZE, CSU, PE]
9.3.2. Listk
Vissza
155
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
156
//Kimenet:
//A vektor elemei:
//[Tglalap [5.0,6.0], Tglalap [4.0,4.0], Tglalap
//[12.0,4.0]]
Az elz pldban kifejtett elv szerint List tpusnak deklarlt v1 vektorba az elemek referencijnak megadsval tehetnk elemeket. Azonban
kzvetlenl is adhatunk elemet a vektornak, egy konstruktor megadsval.
Ekkor a referencit csak a vektor mveletein keresztl rhetjk el. A programrszlet vgn a vektor tartalmt egyszeren kiratjuk a vektor
toString metdusn keresztl (automatikus konverzi), amely sorra bejrja a vektor elemeit, s azok toString metdusaival lltja el az
eredmnysztringet.
Stack
A Vector osztly leszrmaztatsval elll Stack osztly egy verem
rendszer adattrolt (LIFO last in first out) reprezentl. A kiterjeszts
sorn t j metdust vezet be az adatmanipullshoz. A push s pop metdusok segtsgvel lehet a verem tetejre egy elemet elhelyezni, illetve
levenni. A peek metdus segtsgvel a verem tetejn lev elemet felhasznlhatjuk, anlkl, hogy a verembl kivennnk. A veremben kikereshetnk
egy rtket (search) s megvizsglhatjuk, hogy res-e (empty).
Vissza
156
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
157
//Kimenet:
//A verem tartalma:
//A verem utols eleme
//Tglalap [12.0,4.0]
//Tglalap [4.0,4.0]
//Tglalap [4.0,4.0]
//Tglalap [5.0,6.0]
//A verem els eleme
Vissza
157
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
158
els s utols elemt. (A LinkedList megvalstja a Queue interfsz metdusait is, kifejtst lsd albb.)
Troljunk szveges adatokat egy ktirny listban!
List list = new LinkedList();
list.add("a nyri");
list.add("nap");
list.add(0,"le");
list.add(0,"Tzesen");
list.add(1,"st ");
// Tpusksnyszertssel elrhetek a LinkedList sajt
metdusai is:
((LinkedList)list).addLast("sugra.");
// Lista bejrsa egy specilis interfsz segtsgvel:
ListIterator it = list.listIterator();
while (it.hasNext()) {
System.out.println(it.next());
}
//Kimenet:
//Tzesen
//st
//le
//a nyri
//nap
//sugra.
9.3.3. Sorok
Vissza
158
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
159
PriorityQueue
Egy olyan sor kezelsre van lehetsgnk, amelyet valamilyen szempont
szerint rendeznnk kell.
A rendezs felttele, hogy a sorba illesztett elemeknek sszehasonlthatak legyenek, vagyis a TreeeSet s TreeMap osztlyoknl is hasznlt
Comparable interfszt implementljk. Egy adott elem a hozzadsakor
egybl a rendezsi szempont szerinti megfelel helyre kerl. A sor hossza
tetszleges lehet.
(Az egyidej konkurens programozsi feladatokban hasznlnak mg specilis osztlyokat, amelyek sklzhatk, hibatrk: ArrayBlockingQueue,
DelayQueue, PriorityBlockingQueue, LinkedBlockingQueue s
SynchronousQueue, de ezekkel ebben a jegyzetben nem foglaklozunk.)
9.3.4. Lekpezsek
Vissza
159
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
160
TreeMap
A Map interfsz implementcija rendezett fa adatszerkezet segtsgvel
gy, hogy a kulcsoknak sszehasonlthataknak kell lennik. Az sszehasonlts hasonl a TreeSet-ben alkalmazotthoz. A kulcsknt szerepl
objektumoknak implementlniuk kell a Comparable interfszt. A kulcsrtk prok ebben az osztlyban is a put s a get metdussal kezelhetk.
A kulcsok a keySet, a hozzrendelt rtkek pedig az entrySet metdussal halmazknt kln-kln is lekrdezhet.
Troljunk lekpezsek segtsgvel neveket a hozzjuk tartoz letkorral
egytt, nvsorba rendezetten.
Map szemelyek = new TreeMap();
szemelyek.put(Pisti, 17);
szemelyek.put(Bla, 43);
szemelyek.put(Dezs, 60);
szemelyek.put(Dezs, 71);//a rgi hozzrendels elveszik!
// kirs kulcsok szerint
System.out.println (Kulcsok: +szemelyek.keySet());
// kirs rtkek szerint
System.out.println (rtkek: +szemelyek.values());
// kirs egytt
System.out.println (A teljes lekpezs: +szemelyek);
// vizsglatok:
System.out.print("Van Pisti nev kulcs? ");
if (szemelyek.containsKey("Pisti")){
System.out.println("Igen.");
System.out.println("rtke:"+szemelyek.get("Pisti"));
}
else System.out.println("Nincs!");
//Kimenete:
//Kulcsok: [Bla, Dezs, Pisti]
//rtkek: [43, 71, 17]
//A teljes lekpezs: {Bla=43, Dezs=71, Pisti=17}
//Van Pisti nev kulcs? Igen.
//rtke:17
IdentityHashMap
A HashMap osztly egy alternatvja. Ebben a ritkn hasznlt osztlyban a
kulcsrtkek referencii szerinti sszehasonlts vgezhet el.
Vissza
160
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
161
LinkedHashMap
A lekpezst egy ktirnyban lncolt listban tartja. ltalban lekpezsek
msolathoz hasznljk, mert a lekpezs a fizikai felvtel sorrendjt megtartja.
EnumMap
Enum tpus felsorolt adatokhoz hasznlhat lekpezs. Az adatokat specilis tmbkben helyezi el. Tmr adattrolst tesz lehetv.
Az EnumMap osztly a specilisan felsorolt tpusok hozzrendelshez
hasznlhat. Segtsgvel nagyon knnyen tudunk a felsorolt tpus alap
hozzrendelseket, vagy indexelseket megadni.
A tpus definilshoz fel fogjuk hasznlni a felsorolt tpus osztlyt,
mint inicializtort, tovbb a generikus tpusokat(a generikus tpusokkal
bvebben a 9.4. fejezetben tallkozunk), a fordtsi idej tpusellenrzsek
miatt az albbi formban:
EnumMap<Kapcsolat, String> kapcsolatLeiro =
new EnumMap<Kapcsolat, String>(Kapcsolat.class);
Vissza
161
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
162
Vissza
162
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
163
Vissza
163
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
164
Vissza
164
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
165
//Egsz szmokkal
Map <Integer, String> hozzarendeles1 =
new HashMap <Integer, String>();
hozzarendeles1.put(1, "els");
hozzarendeles1.put(2, "msodik");
hozzarendeles.add(3.14, "Pi"); //fordtsi hiba!
System.out.println(hozzarendeles1);
//ltalnos szmformtummal
Map <Number, String> hozzarendeles2 =
new HashMap <Number, String>();
hozzarendeles2.put(1, "els");
hozzarendeles2.put(2, "msodik");
hozzarendeles2.put(3.14, "Pi"); // OK.
System.out.println(hozzarendeles2);
A generikus tpusok egymsba gyazhatk, gy egy kellen sszetett adatszerkezet is knnyen kezelhet lesz.
Az albbi pldban egy olyan sszetett adatszerkezetet definilunk, amelyben egsz szmokbl ll tmbket lncolt listban helyeznk el, s ilyen
listbl kulcs-rtk prokkal lekpezseket ksztnk. (Hasonl mdon
ms adatszerkezetek is felpthetk.)
// Egszekbl ll tmbkbl egy ktirnyban lncolt listt
ksztnk,
// majd a listt behelyezzk egy lekpezsbe
int [] a = {0,1,2,3,4};
int [] b = {10,11,12,13,14,15 };
int [] c = {20,21,22,23,24,25,26,27};
// lista elksztse
List <int[]> szamlista = new LinkedList<int[]>();
szamlista.add(a);
szamlista.add(b);
szamlista.add(c);
// a lista tartalma, egyszerstett hozzfrs:
System.out.println("A lista tartalma:");
for (int i=0; i < szamlista.size(); i++){
for (int j=0; j < szamlista.get(i).length; j++) {
System.out.print(szamlista.get(i)[j]+", ");
}
System.out.println();
}
Vissza
165
Programozs III.
Fejlett adatszerkezetek
Vissza
166
hozzarendeles
"Els" =
... = ...
...
szamlista
(0.)
(1.)
LinkedList <int[]>
(2.)
NULL
NULL
int[]
c[]
b[]
a[]
10
1
11
3
20
21
22
23
12
13
14
15
24
25
26
27
hozzarendeles.get("Els").get(0)[1]
Vissza
166
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
167
Vissza
167
Programozs III.
Fejlett adatszerkezetek
Vissza
168
//Metdusok
V getErtek(){ return this.ertek;}
void setErtek(V ertek){ this.ertek=ertek;}
int getAgakSzama(){ return agak.size();}
TobbaguFa<V> getAg(int n){ return agak.get(n);}
void addAg(TobbaguFa<V> ujag){ agak.add(ujag);}
}
public class NFaTeszt{
public static void main(String[] args){
TobbaguFa <String> gyoker =
new TobbaguFa<String>("Gykr");
//Adatfeltlts
gyoker.addAg(new TobbaguFa<String>("1_Bal"));
gyoker.addAg(new TobbaguFa<String>("1_Kozep"));
gyoker.addAg(new TobbaguFa<String>("1_Jobb"));
gyoker.getAg(0).addAg(new TobbaguFa<String>("2_Bal Bal"));
gyoker.getAg(0).addAg(new TobbaguFa<String>("2_Bal Kzp"));
gyoker.getAg(0).addAg(new TobbaguFa<String>("2_Bal Jobb"));
gyoker.getAg(1).addAg(new TobbaguFa<String>("2_Kzp Bal"));
...
}
}
Gykr
1_Bal
2_Bal
Bal
2_Bal
Kzp
1_Kzp
2_Bal
Jobb
1_Jobb
2_Kzp
Bal
Vissza
168
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
169
figyelmeztets kikapcsolhat, (pldul korbbi Java verzira rt forrsokhoz), ha a fordtst az -Xlint:unchecked opcival vgezzk.
9.4.3. Generikus tpusok korltozsai
Vissza
169
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
170
Vissza
170
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Fejlett adatszerkezetek
Vissza
171
9.6. Feladatok
Ksztsen pldaprogramot, melyben egy Vllalat (cgnv, vezet,
alkalmazottak, tevkenysgi kr) szemlyi nyilvntartst vezetjk. A
vllalatnl egy cgvezet s szmos Alkalmazott (nv, szemlyi ig.
szm, letkor) adatait tartjuk nyilvn. A Vllalat megalakulsakor a
cgvezet mr ismert. Az alkalmazottak trolst valamilyen kontner
osztly segtsgvel oldja meg! A program legyen kpes:
ismertetni a vllalat sszes dolgozjnak adatait nv szerinti abc
sorrendben,
letkor szerinti cskken sorrendben,
az sszes dolgoz letkort egy vvel megnvelni,
felvenni s elbocstani alkalmazottakat.
Ksztsen pldaprogramot, amelyben halmaz adatszerkezetekben trolja emberek csoportjait. Az els csoport legyen a Lakk, tagjai a kvetkezk: Bla, Tni, Gza, Jzsi, Andi. A Bolt dolgozi a kvetkez
szemlyek: Andi, Dezs, Gza. A kzeli Szervz dolgozi: Andi, Jzsi, Tni.
Jelentse meg azokat a szemlyeket, akikre igazak az albbi megllaptsok:
aktv dolgozk,
munkanlkliek,
tbb helyen is dolgoznak,
azok a dolgozk, akik nem laknak a krnyken.
Ksztsen olyan programot, amely rendezetlen lekpezsben a kvetkez adatokat tartja nyilvn:
hallgatk neve s pontszm,
becenevek s szemlyi adatokat tartalmaz objektunmok.
Vissza
171
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
172
A File.separator statikus adattagban az adott opercis rendszerhez tartoz fjl elvlaszt karaktert tartja. Ennek segtsgvel az elbbi tvonalat
ikonok+File.separator+javalogi.gif-knt megadva hordozhatv tehetjk a kdot.
Listzzuk ki az aktulis knyvtr sszes txt kiterjeszts fjljt!
Vissza
172
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
173
import java.io.*;
public class listazas {
public static void main( String[] args )
throws IOException {
File knyvtr = new File(".");
// nvtelen bels osztly alapjn szrnk
File [] fjlok = knyvtr.listFiles(new FileFilter(){
public boolean accept( File tvonal ){
return (tvonal.isFile()
&& tvonal.getName().endsWith(".txt"));
}
} ); //listFiles vge
for( int i=0; i<fjlok.length; i++ ){
System.out.println(fjlok[i].toString());
}
}
}
10.1. Adatfolyamok
A folyam (stream) egy olyan objektum, amely adatokat kpes rni, illetve
olvasni egy adott clhelyre, illetve clhelyrl. A folyamok hasznlatakor a
felhasznl nem szleli a mgttes hardver elemek sajtossgait, gy az egy
hatkony, magas szint s rugalmas ki- s bemenetet biztost programozsi szempontbl. Az adatfolyamok segtsgvel a kimenet clja, vagy a bemenet forrsa knnyen vltoztathat, a program sokoldalv tehet.
Vissza
173
Programozs III.
Az I/O s hlzatkezels
Vissza
174
A folyamkezels sorn az adatokat sorosan dolgozza fel a Java krnyezet (FIFO trolk). A folyamokat a bennk halad adatok szerint bjt-,
karakter-, (elemi tpus) adat-, illetve objektumfolyamnak is nevezhetjk.
Az adatramls irnya alapjn pedig beviteli (input) s kimeneti (output)
folyamokat szoks megklnbztetni.
Vissza
174
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
175
ObjectInputStream
OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
DataOutputStream
BufferedOutputstream
ObjectOutputStream
Reader
InputStreamReader
FileReader
BufferedReader
LineNumberReader
CharArrayReader
Writer
OutputStreamWriter
FileWriter
BufferedWriter
CharArrayWriter
Vissza
175
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
176
Vissza
176
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
177
Vissza
177
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
178
Vissza
178
Programozs III.
Az I/O s hlzatkezels
Vissza
179
Vissza
179
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
180
Vissza
180
Programozs III.
Az I/O s hlzatkezels
Vissza
181
szveges
adatok
feldolgozshoz
hatkonyan
hasznlhat
Vissza
181
Programozs III.
Az I/O s hlzatkezels
Vissza
182
literlok. Hasznlata egyes nyelvi feldolgoz alkalmazsok gyors fejlesztst teszi lehetv. Az osztlyban konstansknt definiltk az egyes
tokenek rtkeit:
TT_EOF (-1)
TT_EOL (\n)
TT_NUMBER (-2)
TT_WORD (-3)
llomny vge,
sorvgjel,
szm jelleg adat,
szveg vagy azonost jelleg adat.
10.2.3. Szerializci
Vissza
182
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
183
objektum rs- olvass jelleg mveletek tulajdonkppen az adatok nyilvnossgra hozatalt jelentik, s az adatrejts alapelve miatt ezt csak gy
nem tehetnnk meg.)
Az Externalizable interfsz megvalstsakor a readExternal(),
s a writeExternal() metdusokat ktelez definilni, amelyben kifejtjk, hogy az adatok elmentse s visszaolvassa hogyan trtnjen.
Egy objektum szerializcijakor nemcsak egy objektum adatait, hanem
az t ler osztly azonostjt is elmentsre kerl, s a beolvasskor ezen
osztlyazonost szerint trtnik a beolvass. Amennyiben az rs s az
olvasa kln modulban van akkor a mentskor hasznlt osztly teljes defincijnak a fogad (beolvas) oldalon is ismertnek kell lennie. A static
s tranzient mdostval elltott adattagokat a szerializci nem menti,
beolvasskor ezek az adattagok alaprtelmezett rtket kapnak.
10.2.4. Kzvetlen elrs llomnyok
Az eddigi adatkezelssel csak a soros (szekvencilis) adatfeldolgozst tettk lehetv. Azaz minden olvass s rsi folyamat csak meghatrozott
sorrendben hajthat vgre.
A tmbk indexelses elrshez hasonlan nha szksgnk van a
forrsfjlok vletlen sorrend elrsre, a fjlon belli pozicionlsra. A
RandomAccessFile osztly segtsgvel ezt is megtehetjk. Az osztly
ltal elrt fjl esetn meghatrozhat a hossz (length), az aktulis fjlmutat (getFilePointer), s szabadon pozicionlhat (seek). Egy fjl
megnyithat csak olvassra r illetve rsra s olvassra rw. A kzvetlen elrs fjlok is tmogatjk a korbban bemutatott adatfolyamok kezelst, de ezzel rszletesen itt nem foglalkozunk.
10.3. Hlzatkezels
A Java hlzati knyvtra (java.net) jelenleg a TCP/IP protokollcsaldra pl, ami a jelenlegi Internet hlzat alapja. Ennek rszleteit csaknem
teljesen elfedi a programoz ell. A kommunikcit egyrszt a TCP
(Transfer Control Protocol) kapcsolatorientlt protokoll, msrszt a
datagrammokra (adatcsomag) pl UDP (User Datagram Protocol) protokoll segtsgvel valstja meg. Ezeken tl tmogatja a HTTP protokoll
kzvetlen hasznlatt, de lehetsget ad egyb kezel eljrsok (protocol
handler) fejlesztsre.
A TCP/IP hlzat szlltsi rtege ktfajta, az n. sszekttets alap
s sszekttets-mentes szolgltatst ismer.
Vissza
183
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
184
Az sszekttets alap szolgltatst megvalst TCP protokoll tulajdonkppen a kommunikl programok kztt egy ktirny adatfolyamot
valst meg, amelyen az informci bjtsorozatknt ramlik. A kapcsolatorientlt szolgltatst megbzhatnak is nevezik, mert a TCP biztostja a
bjtfolyam torztsmentes, sorrendhelyes tvitelt, kikszblve az elveszett, megsrlt, megduplzdott, vagy ksve rkezett informcicsomagok hatst. Ha pedig semmi nem segt, akkor legalbb a kld, de nha a
vev is rtesl arrl, hogy valami helyrehozhatatlan hiba trtnt.
Az alkalmazsok egy rsznek nincs szksge ekkora megbzhatsgra.
Ekkor berjk az egyszerbben kezelhet UDP protokoll sszekttetsmentes szolgltatsval. Ebben az esetben a knyvtrak s a hlzati architektra mindssze annyit gr, hogy a csomagba sszepakolt bjtokat
(maximlisan 1500 bjt) egyben elkldi a cmzett fel, s mindent megtesz
azrt, hogy az odatalljon, de az elfordul hibk lekezelst nem oldja
meg.
Mivel mindkt esetben konkrt programok kommuniklnak, ezek
egymsra tallshoz a szmtgphez IP cmt ki kell egsztennk a
kommunikcira szolgl kapcsoldsi pontokkal (kapuk, portok). Az
els 1024 port hasznlatt ltalban korltozzk csak rendszergazda
jogosultsg programok olvashatjk a tbbi rendelkezsre ll. A kapuk
egy rsze, az n. jl ismert kapuk (well-known ports) minden szmtgpen szabvnyos funkcikat betlt programokhoz tartoznak.
A Java krnyezet hlzatkezelst tmogat osztlyait a java.net csomagban definiltk, hasznlatukhoz a programok elejn elrhetv kell
tenni az I/O -kezelst megvalst osztlyokkal egytt:
import java.net.*;
import java.io.*;
Vissza
184
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
185
Vissza
185
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
186
Vissza
186
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
187
A szerver oldal
A szerver alkalmazsok a ServerSocket osztly egy pldnynak accept()
metdust hasznljk arra, hogy a kliensek kapcsolatkrseire vrjanak. Ez
a metdus hozza ltre a klienssel val adatcserhez szksges Socket
tpus objektumot.
Miutn egy kapcsolat felplt, a szerver mr ugyanolyan tpus
Socket objektumokat hasznl, mint a kliensalkalmazs. A ServerSocket
objektum csak a kapcsolat felptshez szksges.
Vissza
187
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
188
try {
Boolean vege = false;
ServerSocket ss = new ServerSocket(12345);
while (!vege) {
//Felvesszk a kapcsolatot a kvetkez klienssel
//A szerver itt vrakozik egy j kliensre, ha kell
Socket s = ss.accept();
//A kommunikcis vgpontrl adatot olvas folyam
BufferedReader input = new BufferedReader(
new InputStreamReader(s.getInputStream()));
//A kommunikcis vgpontra adatot r folyam
PrintWriter output = new PrintWriter(
s.getOutputStream(), true); // AutoFlush
//Adatfeldolgozs, adatklds
String st = input.readLine();
System.out.println("Klienstl rkezett: " + st);
output.println("Viszlt, s ksz!");
//Kapcsolat lebontsa
s.close();
if (lellsi felttel) vege =true;
}
//A teljes kommunikci lezrsa
ss.close();
} catch (IOException io) {
System.err.println("Szerver hiba! "+io);
}
Vissza
188
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
189
az elkldend adatot,
az elkldend adat hosszt,
a clszmtgp Internet cmt,
a clszmtgp UDP portjnak azonostjt.
Vissza
189
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
190
Vissza
190
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
191
Az URL (Uniform Resource Locator) az Interneten elhelyezked erforrsok (brmilyen tpus adatforrst) egysges forrsazonostja. Azonkvl, hogy meghatrozzk egy adattmeg helyt az Interneten, informcit
tartalmaznak az adatok kinyershez hasznlhat protokollrl is. Az URLek tbbnyire szveges adatknt jelennek meg.
protokoll://kiszolgl/hely/objektum
Vissza
191
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
192
do {
st = input.readLine();
System.out.println(st);
} while (st != null);
input.close();
} catch(Exception e) {
System.out.println(e);
}}
}
A programban az adott URL-lel azonostott adatot egy pufferezett karakteres folyamknt megnyitjuk, majd soronknt kiratjuk a kimenetre.
10.4. Krdsek
Melyik csomagban talljuk a fjl, s melyikben a hlzatkezelst tmogat osztlyokat?
Mit neveznk adatfolyamnak?
Melyik az a ngy f adatfolyam tpus, amelyet a Java nyelv hasznl?
sszekapcsolhatk-e a Java adatfolyamai? s ha igen, hogyan?
Mit jelent az objektumok szerializcija?
Mi az a socket erforrs?
Mi a klnbsg az sszekttets-alap, s az sszekttets-mentes
kommunikci kztt?
Mi a kliens s a szerver jelleg programok fbb szerepei?
Mi jellemzi az URL osztlyt?
10.5. Feladatok
Egy tetszleges szveges fjlt olvasson be az aktulis knyvtrbl,
majd ksztsen az elfordul karakterekbl betstatisztikt.
Az elz feladat kimenett lltsa el folyam segtsgvel karakteres
fjlban (.txt). Az elll szvegfjl legyen megfelelen tagolt s olvashat.
Egy tetszleges feladatban szerepl osztlyokhoz ksztsen olyan metdusokat, melyek az objektumok adatait egy-egy szvegfjlban troljk.
Egy "matrix.bin" fjlban kb. 500 db long tpus szmot szeretnnk
letrolni. Ksztsen olyan Matrix osztlyt amely ezzel a fjllal tud dolgozni.
Vissza
192
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Az I/O s hlzatkezels
Vissza
193
Vissza
193
Programozs III.
Fordtsi hibazenetek
Vissza
194
A hiba oka
; missing
already defined
ambiguous class
array not initialised
can't access class
can't be instantiated
does not override
abstract method
cannot override
class or interface
Vissza
194
Programozs III.
Fordtsi hibazenetek
Vissza
expected
duplicate methods,
method already
defined
Exception never
thrown
identifier expected
incompatible type
main must be static
void
method matches
constructor name
method not found
not initialised
possible loss of
precision
undefined variable
unclosed character
literal
unreported exception
unsorted switch
type expected
195
Vissza
195
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
196
Vissza
196
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
197
Minden forrs elejn egy C-stlus megjegyzsnek kell lennie, amely tartalmazza az osztly nevt, verzival kapcsolatos informcikat, dtumot s
copyright megjegyzseket:
/*
* Osztlynv
*
* Verzival kapcsolatos informcik
*
* Dtum
*
* Copyright megjegyzsek
*/
Az els sor a Java forrsban, mely nem megjegyzs, az a csomagdeklarci. Ezutn az importdeklarcik kvetkezhetnek. Pldul:
package java.awt;
import java.awt.peer.CanvasPeer;
Az egyedi csomag azonost els tagja mindig kisbetkbl lljon, s toplevel domain azonost legyen, azaz com, edu, gov, mil, net, org vagy a
ktbets orszg azonost, melyeket az ISO Standard 3166, 1981definil.
A Java API-ban definilt csomagok is bejelenthetk, de megjegyezzk,
hogy a java, javax s sun azonostk a Sun Microsystems szmra fenntartottak.
12.2.4. Osztly s interfsz deklarcik
Vissza
197
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
198
2. Osztly/interfsz fejrsze.
3. Osztly/interfsz implementcis megjegyzsek, ha szksgesek. Ez a
megjegyzs tartalmazhat osztly vagy interfsz szint kiegszt informcikat, melyek nem kerltek be a dokumentcis megjegyzsbe.
4. Osztlyvltozk. Elszr a nyilvnos, majd a vdett (protected), majd
a flnyilvnos tagok, vgl a privt tagok.
5. Pldnyvltozk. Kvetve az elbbi sorrendet.
6. Konstruktorok
7. Metdusok. Ezeket a metdusokat inkbb a mkds alapjn kell csoportostani, mint a hozzfrhetsg vagy lthatsg alapjn. Pldul
egy privt metdus szerepelhet kt publikus metdus kztt. A cl,
hogy a kd olvassa s megrtse egyszerbb legyen.
12.2.5. Behzs
A behzs alapegysge ngy szkz karakter. A ngy szkz elhelyezsnek pontos mdja nincs specifiklva (lehet hasznlni szkzt vagy tab-ot
is). A tab-nak pontosan nyolc szkzbl kell llnia, nem ngybl.
Sorhossz
A 80 karakternl hosszabb sorok kerledk, mivel tbb terminl s fejleszteszkz nem tudja megfelelen kezelni.
Megjegyzs: A pldk a dokumentcikban ltalban rvidebbek, a sorhosszak nem nagyobbak, mint 70 karakter.
Sortrsek
Ha egy kifejezs nem fr el egy sorban, akkor a sortrst a kvetkez
alapelvek szerint kell vgezni:
Vissza
198
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
199
Kvetkezik kt plda a metdusdeklarci behzsra. Az els a hagyomnyos eset. A msodik esetben a msodik s a harmadik sort nyolc szkzzel hztuk be, ugyanis a sorok a jobb oldalon srsdnnek a konvencionlis megolds hasznlata esetn.
// Konvencionlis behzs
someMethod(int anArg, Object anotherArg,
String yetAnotherArg,Object andStilAnother) {
...
}
// Tbbszint behzs esetn nyolc szkz hasznlata
private static synchronized horkingLongMethodName(
int anArg,
Object anotherArg,
String yetAnotherArg,
Object andStilAnother) {
...
}
Vissza
199
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
200
12.3. Megjegyzsek
A Java programokban ktfajta megjegyzsek lehetnek: implementcis s
dokumentcis megjegyzsek. Az implementcis megjegyzsek vannak
C++ nyelv forrsszvegben is, melyeket a /* */, vagy a // szimblumok jellnek. A dokumentcis megjegyzsek csak Java nyelvben lteznek,
ezeket a /** */ zrjelprokkal kell jellni. A javadoc programmal ezek
a megjegyzsek bekerlnek egy HTML fjlba sok egyb informcival
egytt. Az implementcis megjegyzsekkel a forrskd szvege magyarzhat. A dokumentcis megjegyzsek ezzel szemben a specifikcit
magyarzzk, mellzve az implementcis krdseket, s azokhoz a fejlesztkhz szlnak, melyeknek nincs szksgk az adott rsz forrskdjra.
A megjegyzsek szksg esetn nyjtsanak ttekintst, illetve olyan
plusz informcikat tartalmazzanak, amelyek nem szembetnk a kd
egyszeri elolvassakor. A megjegyzseknek csak olyan informcikat kell
tartalmaznia, melyek segtik a program olvashatsgt, illetve megrtst.
Vissza
200
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
201
Vissza
201
Programozs III.
Kdolsi szabvnyok
Vissza
202
Utmegjegyzsek
Nagyon rvid megjegyzsek kerlhetnek egy sorba a kdrszlettel, melyet
magyarznak, viszont megfelel tvolsgra kell attl tenni. Ha tbb mint
egy megjegyzs tartozik egy kteg programsorhoz, akkor azokat ugyanolyan tvolsgra kell tenni.
if (a == 2) {
return TRUE;
} else {
return isPrime(a);
}
/* specilis eset */
/* csak pratlan szmok esetn */
Sorvgi megjegyzsek
A // karakterekkel megjegyzsbe lehet tenni egy teljes sort, illetve egy sor
vgt. Nem szabad hasznlni tbbsoros megjegyzsekhez, abban az esetben viszont lehet, ha a forrskdbl tbb egyms utni sort akarunk megjegyzsbe tenni.
Plda a hrom hasznlati mdra:
if (foo > 1) {
// Dupla dobs.
...
}
else {
return false; // Mirt itt?
}
Vissza
202
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
203
Dokumentcis megjegyzsek
A dokumentcis megjegyzsek jellemzik a Java osztlyokat, interfszeket,
konstruktorokat, metdusokat s adattagokat [14]. Minden dokumentcis
megjegyzst a /** s */ karaktersorozatok hatrolnak, osztlyonknt,
interfszenknt s tagonknt egyszer. Ennek a megjegyzsnek a deklarci
eltt kell szerepelnie:
/**
* Az Example osztly ...
*/
public class Example { ...
ajnlott az
Vissza
203
Programozs III.
Kdolsi szabvnyok
Vissza
204
int level,size;
helyett.
Egy sorba semmikppen ne tegynk klnbz tpus deklarcikat.
Pldul:
int foo, fooarray[]; //HIBS!
Inicializls
rdemes a loklis vltozkat ott inicializlni, ahol deklarlva lettek. Az
egyetlen eset, amikor ez nem hasznlhat, ha a kezdrtk valamilyen
szmts eredmnye.
Elhelyezs
A deklarcikat lehetleg a blokk elejre tegyk. Blokk a kapcsos zrjelek
{ } ltal hatrolt rsz. Ne vrjunk a deklarcival addig, mg a vltozt
elszr hasznlatba vesszk.
void myMethod() {
int int1 = 0;
if (condition) {
int int2 = 0;
...
}
}
Vissza
204
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
205
int count;
...
myMethod() {
if (condition) {
int count; // KERLEND!
...
}
...
}
12.4.2. Utastsok
Egyszer utastsok
Minden sornak csak egy utastst szabad tartalmaznia, pldul:
argv++; // Helyes
argc++; // Helyes
argv++; argcc++; // KERLEND!
Vissza
205
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
206
sszetett utastsok
Az sszetett utastsok olyan utastsok listja, melyek kapcsos zrjelek
kztt vannak: { utastsok }.
A kapcsos zrjelek kztti utastsokat egy szinttel beljebb kell hzni.
A nyit zrjelnek azon sor vgn kell szerepelnie, mely megkezdi az
sszetett utastst; a csuk zrjelnek sor elejn kell szerepelnie, annyival behzva, mint a kezd utasts.
Zrjeleket akkor is hasznlni kell, ha egy vezrlsi szerkezet trzseknt csak egy utastst szeretnnk szerepeltetni. Ez megknnyti a
trzs bvtst, anlkl, hogy valami hibt vtennk a zrjelek elhagysa miatt.
A return utasts
A return utastsnl nem szksges hasznlni a zrjeleket, ha a visszatrsi rtk gy is nyilvnval. Pldk:
return;
return myDisk.size();
returt (size ? size : defaultSize);
Vissza
206
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
207
A for utasts
A for utastsnl a kvetkez formt ajnlott kvetni:
for (inicializalas; feltetel; leptetes) {
utasitasok;
}
A do-while utasts
Formja:
do {
utasitasok;
} while (feltetel);
Vissza
207
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
208
A switch utasts
A switch utastst a kvetkez alakban kell hasznlni:
switch (feltetel) {
case ABC:
utasitasok;
/* tovbblp */
case DEF:
utasitasok;
break;
case XYZ:
utasitasok;
break;
default:
utasitasok;
break;
}
Minden esetben, ha a vezrls a kvetkez eseten folytatdik (azaz hinyzik a break utasts), hasznlni kell egy megjegyzst a break helyn. Jelen
esetben a /*tovbblp */ megjegyzst hasznltuk.
A try-catch utasts
A try-catch utastst a kvetkez alakban hasznljuk:
try {
utasitasok;
} catch (ExceptionClass e) {
utasitasok;
}
Vissza
208
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
209
res sorok
Az res sorokkal a logikailag sszetartoz kdrszeket emelhetjk ki, ami
nveli az olvashatsgot.
Kt res sort hasznlunk a kvetkez esetekben:
a forrs fjl kt bekezdse kztt;
osztly- s interfszdefincik kztt.
Egy res sort hasznlunk a kvetkez esetekben:
metdusok kztt;
egy adott metdus loklis vltozi s az els utasts kztt;
blokk vagy egysoros megjegyzs eltt;
az egy metduson belli logikai szakaszok kztt az olvashatsg nvelse rdekben.
Szkzk
Szkzket kell hasznlni a kvetkez esetekben:
Ha egy kulcsszt kerek zrjel kveti, akkor el kell vlasztani ket egy
szkzzel.
while (true) {
...
}
Vissza
209
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
210
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "\n");
Csomagok
Az egyedi csomagnevek prefixt mindig kis ASCII karakterekkel kell rni
s a top-level domain nevek egyiknek kell lennie. Jelenleg lehet com, edu,
gov, mil, net, org vagy az orszgok angol ktbets azonostkdjnak
egyike, melyeket az ISO 3166 s 1981 szabvnyok definilnak.
A csomag nevnek tbbi komponenst a szervezet sajt bels elnevezsi
konvenciinak megfelelen vltoztathatjuk. Pldul a csomagnevek tartalmazhatnak divzi, osztly, hivatal, projekt, gp s felhasznl neveket.
com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
Osztlyok
Az osztlyneveknek fneveknek kell lennik s minden bels sz els
betjt nagybetvel kell rni. Trekedni kell, hogy az osztlynevek egyszerek s kifejezek legyenek. Kerlendek a rvidtsek, kivve nagyon
nyilvnval esetben, mint az URL vagy HTTP.
class Raster;
class ImageSprite;
Vissza
210
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
211
Interfszek
Az interfsznevekben a fneveket az osztlynevekhez hasonlan nagybetvel kell kezdeni.
interface RasterDelegate;
interface Storing;
Metdusok
A metdus neveknek kisbetvel kezdd igknek kell lennie, de a bels
szavakat nagybetvel kell kezdeni.
run();
runFast();
getBackground();
Vltozk
A for vltozkat kivve minden pldny-, osztly- s osztlyhoz tartoz
konstans kezdbetjnek kisbetnek kell lennie, a bels szavak nagybetvel kezddjenek. Pldul az
int i;
char c;
float myWidth;
vltoz nevek nem kezddhetnek alhzs (_) vagy dollrjellel ($), habr
mindkett szintaktikailag megengedett.
A vltoznevek lehetleg rvidek s kifejezek legyenek. A vltoznv
megvlasztsakor gyeljnk arra, hogy a nv tkrzze a vltozk hasznlatnak szerept. Az egy-karakteres vltoz neveket kerljk kivve az ideiglenes, eldobhat vltozkat. Az ideiglenes vltozknak ltalnos nevei
pldul az i, j, k, m s n az egsz tpusak; c, d s e a karakter tpusak
szmra.
Konstansok
Az osztlyszint konstansoknak deklarlt vltozkat s a konstansokat
csupa ANSI nagybetvel kell rni s a szavakat alhzs jellel (_) kell elvlasztani.
static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;
Vissza
211
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
212
Konstansok
Numerikus konstansokat nem szabad kzvetlenl a kdban szerepeltetni a
-1, 0 s 1 kivtelvel, melyek pldul a for ciklus fejbn szerepelhetnek.
rtkads
Kerlend tbb vltoznak az egy utastsban val rtkads, mert nehezen olvashat. Pldul:
fooBar.fChar = barFoo.lchar = 'c'; // KERLEND!
Ne hasznljuk az rtkads opertort olyan helyeken, ahol knnyen sszetveszthet az sszehasonlt opertorral. Plda:
if (c++ = d++) { //HIBS!
...
}
Helyette gy hasznlhatjuk:
if ((c++ = d++) != 0) {
...
}
Vissza
212
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
213
Helyette:
a = b + c;
d = a + r;
Zrjelek
ltalban vve j programozi gyakorlat a zrjelek b alkalmazsa a kifejezsekben, hogy elkerljk a precedencia problmkat. gy azok szmra
is egyrtelm lesz, akik nem ltjk t elsre a kifejezst vagy nincsenek
tisztban az opertorok precedencijval.
if (a == b && c == d) // KERLEND!
if ((a == b) && (c == d)) // Helyes
Visszatrsi rtkek
Prbljuk a program struktrjt gy kialaktani, hogy tkrzze a szndkot. Pldul az albbi sorok helyett:
if (booleanExpression) {
return true;
} else {
return false;
}
Hasonlan az elzhz:
if (condition) {
return x;
}
return y;
Helyette:
return (condition ? x : y);
Vissza
213
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
214
Specilis megjegyzsek
Hasznljuk az XXX szt a megjegyzsben annak jelzsre, ha valami mg
hibs, de mkdik. Hasznljuk a FIXME, vagy a TODO szt pedig annak a
jellsre, hogy valami hibs s nem mkdik jl.
12.7. Kd pldk
Java forrsfjl pldk
A kvetkez plda bemutatja hogyan formzzuk az egyszer publikus
osztlyt tartalmaz Java forrs fjlt. Az interfszeket hasonlan kell formzni.
/*
* @(#)Blah.java 1.82 99/03/18
*
* Copyright (c) 1994-1999 Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
* All rights reserved.
*
* This software is the confidential and proprietary
* information of Sun Microsystems, Inc. ("Confidential
* Information"). You shall not disclose such Confidential
* Information and shall use it only in accordance with the
* terms of the license agreement you entered into with Sun.
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
* Az osztly lersa ide jn.
*
* @version 1.82 18 Mar 1999
* @author Firstname Lastname
*/
public class Blah extends SomeClass {
/* Itt kvetkezhetnek az osztly implementcis megjegyzsei
*/
/** classVar1 dokumentcis megjegyzs */
public static int classVar1;
/**
* classVar2 dokumentcis megjegyzs,
* egy sornl hosszabb eset
*/
Vissza
214
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Kdolsi szabvnyok
Vissza
215
215
Vissza
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Mellkletek
Vissza
216
13. Mellkletek
Az albbiakban a jegyzet f fejezeteibe be nem sorolhat, illetve nhny
gyakran felmerl krdst tisztz fejezetet tallunk. A jegyzetben tallhat pldaprogramokat terjedelmi okokbl nem kzljk, de a forrskdok
a http://szt1.sze.hu/java/ cmrl szabadon letlthetek.
13.1. A Java keretrendszer teleptse s a
krnyezet belltsa
Ahhoz, hogy Java programokat fejleszthessnk, be kell szereznnk a Java
forrsokat (legegyszerbben a http://java.sun.com/j2se cmrl).
Elszr a Java fejlesztshez alkalmas szoftvert kell telepteni. Mivel a
rvidtsek kztt gyakori a kevereds, fontos a JRE s a JDK megklnbztetse:
JRE (Java Runtime Environment) ~10Mb /, tartalmazza a java alkalmazsokhoz hasznlhat erforrsokat, mint pl: Java Virtulis
Gp (JVM), a szabvnyos osztlyknyvtrak (class library), Java alkalmazsindt stb. Azonban ez mg nem tartalmaz fordtt, hibakerest, s fejleszt krnyezetet sem, gy a fejlesztsekhez nem alkalmas
JDK (Java Development Kit) ~40Mb 60Mb, a java fejlesztsekhez hasznlatos krnyezet. Tbb parancssori eszkzt tartalmaz
(javac, javadoc, appletviewer, HtmlConverter, jar fjlcsomagol
stb.). Tartalmazza a JRE-t is.
JDK + NetBeans ~120Mb 130 Mb, Java fejlesztkrnyezet,
amely mr a NetBeans integrlt fejlesztkrnyezetet is tartalmazza.
Msodszor be kell lltani a megfelel elrsi utakat s krnyezeti vltozkat. A PATH bejegyzsben fel kell venni a teleptett JDK bin knyvtrt.
(pl: c:\jdk1.5.0\bin\). Ugyanitt ltre kell hozni egy CLASSPATH nev s . ; c:\munkakvt rtk krnyezeti vltozt.
Linux opercis rendszeren a kvetkez mdon:
export PATH=$SPATH:/opt/java/bin: .
export CLASSPATH=$CLASSPATH:/home/munka: .
Vissza
216
Programozs III.
Mellkletek
Vissza
217
Vissza
217
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Mellkletek
Vissza
218
Vissza
218
Programozs III.
Mellkletek
Vissza
219
parancs segtsgvel. A megadott osztlyok forrskdjaibl a csomag, osztly s az adattagok, metdusok szerkezett megvizsglja, majd a dokumentcis megjegyzseket a megadott elemekhez kapcsolja. Kimenetknt
az adott knyvtrban egy jl formzott html szerkezetet kszt, melynek
kiindulpontja az index.html fjl lesz. A javadoc kapcsolival a kimenet tartalmi formtumait adhatjuk meg:
Opci
-d
-version
-author
-use
-public
-protected
-package
-private
-overview
<file>
-subpackages
Jelents
kimeneti knyvtr neve
bekapcsolhatk a @version tag-ek
bekapcsolhatk a @author tag-ek
bekapcsolhatk a dokumentci keresztreferencii
(ms osztlyok is importlhtak)
csak a publikus hozzfrs tagokat jelenti meg
a protected s public tagokat mutatja
a csoport hozzfrs s protected s public tagokat
mutatja
minden tagot megmutat a dokumentciban
egy ttekint oldalt fz a dokumentci elejre a megadott html fjlbl
rekurzv mdon a megadott alcsomagok osztlyai is
kifejtsre kerlnek
stb.
Vissza
219
Programozs III.
Mellkletek
Vissza
220
Lers
Az -author kapcsol hasznlatval megadhat a forrs
@author
szerzje/ tulajdonosa.
Konstruktorok s metdusok paramtereinek lersra
@param
hasznlhat.
Megadhat, hogy a metdus milyen visszatrsi rtket
@return
szolgltat.
Hiperlink hivatkozs fzhet a dokumentumba, amely egy
@see
msik osztlyra mutat.
Megadhat, hogy az adott metdus milyen kivteleket
@throws
vlthat ki.
@exception Megegyezik a @throws tag-gel
@deprecated Egy Deprecated bejegyzst helyez el a lersba. Ez a fejlesztknek azt jelzi, hogy az adott mvelet elavult, s csak
kompatibilitsi szempontok szerint maradt a definciban.
ltalban az j s hatkonyabb mveletek kivltjk az
elavult metdusokat.
Egy kls hiperlink hivatkozs fzhet a dokumentumba,
@link
amely egy msik html oldalra mutat.
Egy Since bejegyzst helyez el a dokumentumban. A cso@since
magok s az osztlyok fejlesztsnl megadhat, hogy az
adott tulajdonsg melyik verzi ta rsze a defincinak.
Egy version bejegyzst helyez el a dokumentumban, ha a @version
version opci aktv. Ezzel a szoftver letciklusa, fbb fejlesztsi lpsei jelezhetek.
8. tblzat: a javadoc vezrlelemei
A sikeres dokumentci elksztse utn az osztlyknyvtrak dokumentciihoz hasonl oldalakat kapunk, amelyet tetszleges bngszvel megtekinthetnk:
Vissza
220
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Mellkletek
Vissza
221
Vissza
221
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Mellkletek
Vissza
222
A doxygen szmos nyelven gy magyarul is kpes dokumentci sablonokat generlni. Az elkszlt s megfelelen dokumentlt forrsfjlokat
a doxygen segtsgvel parancssorbl, vagy grafikus felletrl indthatjuk.
(Rszletes hasznlati tmutat a program sgjban tallhat.)
Vissza
222
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Irodalomjegyzk
Vissza
223
Irodalomjegyzk
[Angster01] Angster Erzsbet: Objektumorientlt tervezs s programozs. Budapest : 4Kr Bt., 2001. 1020p. ISBN: 963 00 62623
[Cormen01] T. H. Cormen Ch. E. Leiserson R. L. Rivest : Algoritmusok. Budapest : Mszaki Knyvkiad, 2001. 884p.
ISBN: 963 16 3029 3
[Flanagan05] David Flanagan: JAVA in a nutshell, fifth edition. O'Reilly
Media Inc., 2005. ISBN: 0-596-007733-6
[Kondorosi04] Kondorosi Lszl Szirmay Kalos: Objektumorientlt szoftverfejleszts. Budapest : Computerbooks, 2004.
ISBN: 963 618 108 X
[Lemay02] Lemay, Laura Cadenhead, Rogers: Teach yourself in Java 2 in
21 days. Elektronikus jegyzet, 2002.
http://www.cadenhead.org/book/21java/
[Marton02] Marton Lszl - Fehrvri Arnold : Algoritmusok s adatstruktrk. Gyr : Novadat Bt., 2002. 344 p. ISBN: 963 9056 332
[Nyky01] Java2 tikalauz programozknak : Nykyn Gaizler Judit
(szerk.) et al. Budapest : ELTE TTK Hallgati alaptvny, 2001.
1400p. ISBN: 963 463 485 0
[Nyky03] Programozsi nyelvek: Nykyn Gaizler Judit (szerk.) et al.
Budapest, Kiskapu Kft., 2003. 760p. ISBN: 963 9301 477
[Schildt03] Schildt, Herbert : Java 2: A beginners guide 2nd edition :
McGraw-Hill Osborne Media, 2003. Elektronikus jegyzet 544p.
http://www.osborne.com/downloads/downloads.shtml
[Vg99] Vg Csaba Juhsz Istvn: Java start! Debrecen : Logos 2000,
1999. 228p. ISBN 963 03 9005 1
Vissza
223
Programozs III.
A dokumentum hasznlata | Tartalomjegyzk | Trgymutat
Irodalomjegyzk
Vissza
224
Online hivatkozsok:
[1] A Java nyelv trtnete:
http://java.com/en/javahistory/
[2] Doxygen dokumentcis segdprogram:
http://www.doxygen.org
[3] Az UML 2.0 szabvny:
http://www.uml.org/
[4] Java editorok s IDE eszkzk sszefoglal lersa:
http://java.about.com/od/idesandeditors/ ,
http://www.javaworld.com/javaworld/tools/jw-tools-ide.html
[5] Java just in time (JIT) interpreter s krnyezet
http://www.shudo.net/jit/
[6] Java kdolsi konvencik:
http://java.sun.com/docs/codeconv/, illetve magyarul:
http://dragon.unideb.hu/~vicziani/pdf/jkk.pdf
[7] Javadoc segdprogram:
http://java.sun.com/j2se/javadoc/
[8] Java Tutorial:
http://java.sun.com/docs/books/tutorial/index.html
[9] Thinking in Java 3rd edition (Bruce Eckels):
http://www.mindview.net/Books/TIJ/
[10] A Java nyelv hivatalos weboldala:
http://java.sun.com
[11] J2SE 1.4 Merlin Release Contents JSR 59. 2002.05.09:
http://jcp.org/en/jsr/detail?id=59
[12] J2SE 5.0 Tiger Feature List JSR 176. 2004.09.30:
http://jcp.org/en/jsr/detail?id=176
[13] Java SE 6 "Mustang" Release Contents JSR 270 (beta version
2005.12.21): http://jcp.org/en/jsr/detail?id=270
[14] How to Write Doc Comments for Javadoc
http://java.sun.com/products/jdk/javadoc/writingdoccomments.html
Vissza
224
Programozs III.
Trgymutat
Vissza
225
Trgymutat
A,
abstract 96
absztrakt metdus 27, 96
absztrakt osztly 27, 104
absztrakt osztlyok 96
adatrejts 24
adattag 76
aggregci 35
alaprtelmezett konstruktor 90
alaptpus 41
alcsomag 115
args[] 100
ArrayBlockingQueue 159
arraycopy 142
ArrayIndexOutOfBoundsExcepti
on 128
ArrayList 149, 155
Arrays 142
asszocici 34
Asszociatv adatszerkezetek 146
B
data hiding 24
DatagramPacket 188
DatagramSocket 185, 188
DataInputStream 177
DataOutputStream 177
Date 132, 137
Vissza
225
Programozs III.
Trgymutat
dtummveletek 136
default constructor 90
DelayQueue 159
destruktor 80
dokumentci
doxygen 221
javadoc 219
Double 68
dynamic method dispatch 88
E,
early binding 32
egysgbe zrtsg 77
egysgbezrs 23
elemi tpus 41
elemi tpusok 85
elfeds 101
ellenrztt kivtel 123, 125
encapsulation 23
entrySet 160
enum 69
haszlata 72
kiterjesztse 73
tpus definci 70
Enumeration 161
EnumMap 161
EnumSet 154
Ers tartalmazs 35
error 123
escape szekvencik 63
exception 123
Exception 124, 128
explicit tpuskonverzi 86
export 122
export CLASSPATH 118
extends 81, 109, 169
Externelizable 182
Vissza
226
fjlkezels 172
Felsorolt tpus 69
felldefinils 86
felltlts 89
felltlttt konstruktorokat 90
File 172
FileHandler 133
FileInputStream 176
FileNotFoundException 176
FileOutputStream 176
FileReader 180
FileWriter 180
fill 144
FilterInputStream 177
FilterOutputStream 177
FilterReader 180
FilterWriter 180
finalize 81
finally 128
Float 68
foglalat 184
folyam 174
fordtsi egysg 118, 120
format 132, 138
Formatter 133
futs alatti kts 32, 88
G
garbage collect 81
generic method 163
generic type 163
generikus tpus definilsa 167
generikus tpusok 161
GMT 136
Gy
Gyenge tartalmazs 35
Vissza
226
Programozs III.
Trgymutat
Vissza
I,
I/O 175
IdentityHashMap 160
import 117
inheritance 25
InputStream 175
InputStreamReader 180
instaceof 48
Integer 68
interface 105
interfsz 104
deklarci 105
implementls 105
implemetlsa 106
rkldse 109
Interfsz 29
interpreter 11
IOException 176, 181
ismertsgi kapcsolatban 34
Iterator 161
227
227
karakter tpus 63
ksi kts 88
keySet 160
kivtel 123
kivteles esemny 124
komponens 37
kompozci 35
kontner 35
L
late binding 32
lekpezs 159
Level 133
LineNumberReader 180
LinkedBlockingQueue 159
LinkedHashSet 153
LinkedList 149, 157, 158
List 163
ListIterator 162
Locale 139
Logger 133
LogManager 133
LogRecord 133
Long 68
M
main 100
manifest 120
Map 159, 161
msol konstruktor 91
Vissza
Programozs III.
Trgymutat
Math.PI 96, 99
MemoryHandler 133
metdus 76, 78
mveletek
precedencia 48
N
namespace 115
nanoTime 141
naplzs 132
nem ellenrztt kivtel 125
nvtelen csomag 118
new 80
null referencia 80
Number 169
O,
Vissza
228
override 31, 86
,
rklds 25, 81
sszekttets alap hlzat 183
sszekttets-mentes hlzat 183,
188
P
Queue 158
R
RandomAccessFile 183
Reader 175, 180
referencia 80, 85
rt.jar 117
runtime binding 32
RuntimeException 124, 128
S
Serializable 182
ServerSocket 185, 187
SET 122
SET CLASSPATH 118
Vissza
228
Programozs III.
Trgymutat
SimpleTimeZone 137
socket 184
Socket 185
SocketHandler 133
sorvgjel 132
src.zip 117
Stack 156
static 98, 99
static final 98
statikus kts 101
stream 174
StreamHandler 133
StreamTokenizer 181
String 64, 132, 143
StringBuffer 67
Stringbuffer mdostsa 67
StringReader 180
StringWriter 180
super 51, 84, 87
switch 69, 72
SynchronousQueue 159
System.gc() 81
System.out 179
Sz
tagfggvny 77
tagosztly
statikus 110
tagosztly 110
tagosztly
dinamikus 112
TCP/IP 183
Vissza
229
229
this 99
throw 40, 124, 126, 127, 129
Throwable 124
throws 126
throws IOException 176
TimeZone 137
tpuskonverzi 49
automatikus 49
explicit 49
szveges 49
toString 87
tbbalaksg 29, 85
dianikus tpus 29
felldefinils 31
felltlts 30
tmb 58
deklarci 58
rtkads 62
ltrehozsa 59
memriamodellje 60
sztringekbl 65
tbbdimenzis 60
tmb rendezse 142
tmbmsols 142
tmbk inicializlsa 142
TreeeSet 159
TreeMap 149, 159, 160
TreeSet 149, 151, 160
try-catch 127, 176
TT_EOF 182
TT_EOL 182
TT_NUMBER 182
TT_WORD 182
U,
UNIX id 136
URL 191
UTC 136
Vissza
Programozs III.
Trgymutat
vltozk elfedse 47
Vector 86, 119, 120, 149, 155, 156
vezrlsi szerkezetek 51
ciklus 55
elgazs 52
esetsztvlaszts 54
feltteles kifejezs 52
szelekci 54
Vissza
230
Vissza
230
virtulis gp 12
VMT 33
W
wrapper class 68
Writer 175, 180