You are on page 1of 20

A Jva programozsi nyelv rejtelmei

Page 1 of 20

A Jva programozsi nyelv rejtelmei


Tartalomjegyzk:
Az alapok
Egy pldaprogram
A program szerkezete
Vltozk s rtkek
Megjegyzsek a programban
A fprogram
Vezrlsi szerkezetek
Kivtelkezels
A program trzse
Mdszerek
Hlzati kommunikci
Fordts, futtats
Objektumorientlt programozs Jva mdra
Absztrakt adattpusok ltrehozsa
Objektumok
Osztlyok defincija
Egyedvltozk
Mdszerek
Konstruktorok
Osztlyvltozk s -mdszerek
Tmbk
Szvegek
Pakkok
Lthatsg
rklds s kvetkezmnyei
Osztlyok leszrmaztatsa
Lthatsg
Mi rkldik, s mi nem
Polimorfizmus
Interfszek
Szlak
Szlak ltrehozsa
Szlak futsa
temezs
Szinkronizci s kommunikci
Programkk
Klnbsgek a programkk s a programok kztt
A programkk szerkezete
A futs vezrlse
Rajzols
Programkk egy Web oldalon

Az alapok
Ismeretes, hogy a Jva nyelv a C++ nyelvbl szletett, sok helyen egyszerstve, esetenknt bvtve azt. Az ismertetben
felttelezem, hogy az olvas legalbb a C nyelvet alaposan ismeri, br C++ nyelv, illetve az objektumorientlt
programozs fogalmainak ismerete sem rthat. Azt is remlem, hogy az olvas nem riad vissza, ha az Internet hlzat
vilgbl vett szolgltatsokat, protokollokat emlegetek.

Egy pldaprogram
Tapasztalataim szerint egy programozsi nyelvet a szraz ismertets helyett pldkat kvetve knnyebb megrteni. Persze
nem knny az ismerkeds elejre rthet, rvid, de nem tlzottan egyszer pldt tallni s sajnos a "Szervusz vilg!"
programot mr megmutattam.
A bevezet plda a Internet hlzat vilgba visz el bennnket. A drtposta (email) tovbbtsra itt az n. SMTP (Simple
Mail Transfer Protocol) protokoll hasznlatos. A levltovbbt programok (Message Transfer Agent, ltalban a sendmail

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 2 of 20

program) a 25-s TCP kapun vrakoznak arra, hogy valaki kiptse velk a kapcsolatot, ha a kapcsolat ltrejtt, egy
nagyon egyszer, karakterorientlt prbeszdbe kezdenek a hvval. A prbeszd egy ritkn hasznlt, de nha nagyon
hasznos parancsa, a VRFY (Verify) segtsgvel megkrdezhetjk egy SMTP kiszolgltl, hogy egy adott nev
felhasznlnak van-e a gpen postaldja.
A mi programunk pontosan ezt csinlja, a
java SMTPclient host user

parancs hatsra a host szmtgp SMTP szervertl a user felhasznl fell rdekldik, a kapott vlaszt pedig kirja a
konzolra.
Lssunk egy plda prbeszdet a kt gp kztt! Dlt betkkel a megszltott SMTP kiszolgl (a hapci.mmt.bme.hu
gpen), normlis betkkel az gyfl, a mi programunk (a tudor.mmt.bme.hu gpen) zenetei lthatk. A plda egy sikeres
s egy sikertelen lekrdezst is tartalmaz.
220 hapci.mmt.bme.hu 5.65c8/BMEIDA-1.4.4 Sendmail is ready at Wed, 14 Feb 1996 17:31:03 +0100
HELO tudor.mmt.bme.hu
250 Hello tudor.mmt.bme.hu, pleased to meet you
VRFY kiss
250 Kiss Istvan <kiss>
VRFY duke
550 duke... User unknown
QUIT
221 tudor.mmt.bme.hu closing connection

Lthat, hogy a kiszolgl minden zenett egy szmmal is kdolja.

A program szerkezete
A programok import utastsokkal kezddhetnek, felsorolva a programban felhasznlt knyvtrak nevt. Ez nem ktelez,
az egyes knyvtri elemekre val hivatkozsnl is megadhatjuk a knyvtr nevt.
C programozk figyelem: ez nem #include parancs, nem a fordtprogramnak szl zenet a forrsszveg beolvassra.
Az import a kapcsolatszerkesztnek, betltnek szl, mr lefordtott kd knyvtrakra hivatkozik. Importlsnl
csomagokbl (package) osztlyokat (class) importlunk, azaz a programunkban felhasznlhatv tesszk. A csillag az
adott csomag sszes osztlyt jelenti.
import
import
import
import

java.net.*;
java.io.*;
java.lang.*;
java.util.*;

Ezutn rgtn egy osztlydeklarcinak kell kvetkezni, a Jva programban minden vltoz, minden utasts csak
osztlyok trzsben szerepelhet. Eltntek a C globlis vltozi, globlis fggvnyei.
Aki most lt elszr C++-bl tvett osztlydeklarcit, ne essen ktsgbe, egyelre fogadja el, hogy mg a legegyszerbb
Jva program is a
class osztlynv { ... }

mintt kveti. Az osztlynv-ben, mint a Jva minden azonostjban, a kis- s nagybetk klnbzek.
class SMTPclient
{

Vltozk s rtkek
Az osztlyok belsejben vltozkat deklarlhatunk, a deklarci szintaxisa egy-kt mdost alapsz (static vagy final)
kivtelvel megfelel a C-nek:
tpus vltoznv [ = kezdeti_rtk ]

A nyelv tartalmaz nhny beptett, egyszer adattpust, amelynek neve s rtkkszlete a kvetkez tblzatban tallhat:
egsz tpusok byte

8 bit kettes komplemens

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 3 of 20

16 bit kettes komplemens


32 bit kettes komplemens
long
64 bit kettes komplemens
float
vals tpusok
32 bit IEEE 754 lebegpontos
double 64 bit IEEE 754 lebegpontos
karakter tpus char
16 bites Unicode karakter kd
boolean
logikai
true vagy false
short
int

Lthat, hogy csak eljeles egsz tpusok vannak, br ez nem jelenti azt, hogy nem lehet rjuk pldul a szoksos
bitmveletek alkalmazni. A C-tl eltrs az is, hogy itt az egyes beptett tpusok mrete, helyfoglalsa nyelvi szinten
definilt, nem fgg a programot futtat gp architektrjtl. A karakterek trolsnl a nemzetkzileg elfogadott, 16 bites
Unicode-ot hasznljk.
static final int SMTPport = 25;

A Jvban nincs #define, sem a C++ const-ja, ennek a legkzelebbi megfelelje a final vltoz, a fordtprogram
gondoskodik rla, hogy ennek rtke ne vltozhasson meg. Lthat, hogy a vltoz deklarcijval egytt kezdeti rtket
is adhatunk neki, ez persze final vltoz esetn ktelez.
A static mdost egyelre ne zavarjon bennnket, pontos jelentsre majd az osztlyok ismertetsnl trnk ki.
Elljrban csak annyit, hogy ezek azonosak a C++-bl ismert osztlyvltozkkal s ezek kzeltik meg leginkbb a
szoksos nyelvek globlis vltozit.
A beptett numerikus tpusokon a C-bl jl ismert mveletek rtelmezettek. Az numerikus tpus rtkekkel a szoksos
aritmetikai mveletek hasznlhatk. Az egsz tpus rtkekre hasznlhat bit mveletek kiegszltek a >>> opertorral,
amely jobbra lptetsnl 0-t s nem az eljelet lpteti be a legnagyobb helyirtk bitre. Ezek az opertorok rtkadssal is
kombinlhatk, pl.: +=, /=, ...
A logikai rtkek a C-vel ellenttben nem egsz tpusak. Azonos tpus rtkek sszehasonltsra hasznlt opertorok
logikai rtket lltanak el, ilyen rtkekre hasznlhatk az ismert logikai mveletek is.
A kvetkez tblzat tartalmazza a Jva nyelv sszes opertort - nmelyikrl egyelre nem beszltem - precedencijuk
cskken sorrendjben:
zrjelek, indexels, osztly komponensre hivatkozs
(pre- vagy poszt-) inkremens s dekremens,
++ -! ~
logikai s bitenknti negls,
instanceof
tpus ellenrzs
new (type)expression j egyed ltrehozsa
* / %
szorzs, oszts, modul
+ sszeads, kivons
<< >> >>>
bitenknti lptetsek
< > >= <=
sszehasonltsok
== !=
egyenl, nem egyenl
&
bitenknti AND
^
bitenknti XOR
|
bitenknti OR
&&
logikai AND
||
logikai OR
? :
feltteles kifejezs
() [] .

= += -= *= /= %= ^=
&= |= <<= >>= >>>=

klnbz rtkadsok

Az egyszer, beptett tpusokon tl a Jva csak ktfajta sszetett adattpust tartalmaz, a programozk ltal definilhat
osztlyokat (class) illetve a tmbket (array), amelyek egybknt teljes rtk osztlyok. Nincs struct, union, de nincs
typedef sem, st mutatk (pointer) sincsenek!
static Socket smtpconn;
static DataInputStream instream;
static DataOutputStream outstream;

A fenti 3 sor a szabvnyos Jva knyvtrakban definilt osztlyok - Socket, DataInputStream, DataOutputStream - egy-

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 4 of 20

egy pldnynak, egyednek (objektum) foglal helyet, pontosabban ezek egyelre csak res hivatkozsok, az objektumok
mg nem jttek ltre.

Megjegyzsek a programban
// Program: drtposta cmek ellenrzse SMTP kiszolgl segtsgvel
// Hasznlata:
//
java SMTPclient <host> <user>

A Jva rklte a C-bl a /* ... */ stlus megjegyzs szintaxist, a C++-bl a //-val kezdd egysoros megjegyzseket,
vgl a /** ... */ alak megjegyzsek a kiegszt dokumentcis rendszerrel (javadoc) egytt hasznlhatk.

A fprogram
Minden Jva alkalmazsnak, pontosabban az egyik osztlynak - mivel a Jvban minden utasts csak osztlyok
defincijban szerepelhet - tartalmaznia kell egy main nev, itt kvetkez fejlc fggvnyt:
public static void main (String args[])
{

A public a mdszer lthatsgrl nyilatkozik, jelentse: brhonnan meghvhat. A static jelentsrl egyelre annyit,
hogy az eljrs csak osztlyvltozt hasznl, void a mdszer visszatrsi rtknek tpusa: nem ad vissza rtket.
A Jva alkalmazs futtatst a virtulis gp a main eljrs vgrehajtsval kezdi A main eljrs paramtere egy
szvegtmb, amelynek egyes elemei a parancssorban megadott argumentumokat tartalmazzk. A szvegek trolsra,
kezelsre szolgl String egy elre definilt osztly, nem pedig karaktertmb, mint a C-ben. A tmbk indexrtkei itt is
nulltl kezddnek, viszont itt az args[0] nem a program nevt adja vissza, mint a C-ben, hanem tnylegesen az els
argumentum. Akinek hinyzik a megszokott argc argumentumok szma paramter, ne aggdjon, a Jva tmbk mrett
futs kzben is le lehet krdezni.
Az egyes eljrsokban termszetesen hasznlhatunk loklis vltozkat, itt a String osztly egyedre lesz szksgnk,
amelyet deklarcijval egyidejleg a new parancs segtsgvel ltre is hozzuk.
String res = new String();

Loklis vltozkat a mdszerek trzsben tetszleges helyen deklarlhatunk, st az egyes programblokkok - { ... } - sajt,
mshonnan nem lthat loklis vltozkkal rendelkezhetnek.

Vezrlsi szerkezetek
Kezdjk a programunkat azzal, hogy megvizsgljuk, megfelel szm argumentummal hvtk-e meg! Amennyiben a
programnak nem 2 argumentuma volt - az SMTP kiszolgl s a keresett felhasznl neve -, tjkoztat zenetet runk ki
s befejezzk a program mkdst.
if (args.length != 2)
{
System.out.println("Usage:");
System.out.println("
java SMTPclient <host> <user>");
System.exit(1);
}

A System knyvtr a Jva programok futtatshoz szksges objektumokat, mdszereket tartalmazza. Ilyen a programok
szabvnyos kimenett (standard output) - pl. konzol perifria - megvalst out objektum. A kir eljrs a print illetve
println, amelynek csak egyetlen paramtere van, de elg "intelligens" ahhoz, hogy karakteres formban tetszleges tpus
rtket (igen, mg a felhasznl ltal definilt objektumokt is) "megjelentsen". A programunkban csak szvegek
kiratsra fogjuk hasznlni. A println mdszer a paramternek kirsa utn mg egy j sort is kir.
A programbl vagy a main mdszer befejezsvel, vagy a System knyvtr exit mdszernek meghvsval lehet kilpni.
A Jva nyelv tvette a C vezrlsi szerkezeteit, az elgazsokhoz az if-else s switch; ismtlsekre, ciklusszervezsre a for,
while s do-while utastsok hasznlhatk. Eltrs, hogy az sszes felttelnek logikai rtknek kell lennie, int nem
hasznlhat, ezrt a fordtprogram kiszri a C programozk "kedvenc" hibjt, amikor if-ben rtkadst ("=") runk
egyenlsg-vizsglat ("==") helyett.
A nyelvbl kimaradt az ugr utasts (goto), de megmaradtak a cmkk (label). A cmkket ciklusutastsok megjellsre
hasznlhatjuk, gy a ciklus trzsben kiadott break s continue utastsok nem csak a legbels, hanem brmelyik, cmkvel

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 5 of 20

elltott begyaz ciklusra hivatkozhatnak.

Kivtelkezels
Van mg egy utastscsoport, amely a program vgrehajtsnak sorrendjt befolysolhatja, a try-catch-throw csoport, amely
nagyon hasonl formban a C++ nyelvben is megtallhat.
A tisztessgesen megrt C programok legnagyobb problmjt az egyes eljrsok vgrehajtsa kzben esetleg elbukkan
hibk, n. kivtelek (exception) lekezelse jelenti. Kisebb gondossggal megrt programoknl a programoz hajlamos
elfeledkezni arrl, hogy legtbbszr az eljrs visszatrsi rtknek tesztelsvel ellenrizze, sikerlt-e a vgrehajtott
mvelet. Ha mgis megteszi, leggyakrabban egyszeren befejezi a programot, olyan bonyolult a hiba elbukkanst s
okt "felfel" terjeszteni s a megfelel helyen lekezelni azt. Ezen segthetnek a fenti utastsok. Most csak a felletesen
ismerkedhetnk meg a kivtelkezels rejtelmeivel, majd ksbb rszletesen visszatrnk a tmhoz.
try
{

Egy try blokkba zrt utastscsoporton bell brhol elfordul kivtel hatsra a program normlis futsa abbamarad s a
vezrls automatikusan a catch blokkra kerl. Itt a catch paramtereknt megkapjuk a hiba okt - ltalban egy Exception
tpus objektumot -, aztn kezdjnk vele, amit tudunk. A pldaprogramunk egyszeren kirja a hiba okt. A programoz
maga is definilhat ilyen kivteleket, amiket - no meg az egyes catch blokkokban lekezelhetetlen kivteleket - a throw
utastssal felfele passzolhatunk, amg valaki - legrosszabb esetben a virtulis gp - "lekezeli".

A program trzse
A programunk szerencsre nagyon egyszer: kiptjk az SMTP kapcsolatot az els argumentumknt megadott gppel:
openSMTPconnection(args[0]);

Elkldnk egy HELO zenetet, hozzfzve a sajt gpnk nevt (rszletekrl majd mskor), a visszakapott vlaszt (res
tartalma) nem hasznljuk.
res = sendMessage("HELO " +
java.net.InetAddress.getLocalHost().getHostName());

Elkldnk egy VRFY zenetet a msodik argumentumknt megkapott felhasznl nevvel. A visszakapott vlaszt kirjuk.
res = sendMessage("VRFY " + args[1]);
System.out.println(res);

Elkldjk a bcsz QUIT zenetet s lezrjuk a kapcsolatot.


res = sendMessage("QUIT");
closeSMTPconnection();
}

Brmi hiba trtnt, kirjuk a program kimenetre.


catch(Exception e)
{
System.out.println("Error: " + e.toString());
}
};

Egsz egyszer, nemde? Persze csaltam, azrt ilyen egyszer minden, mert "magasszint", a feladathoz alkalmazkod
eljrsokat hasznltam. Ezeket mg definilni kell, mert sajnos nem szerepelnek a Jva knyvtrakban.

Mdszerek
Emlkeznek mg arra, hogy egy osztly - SMTPclient - belsejben vagyunk? Az osztlyok belsejben definilt
fggvnyeket az objektumorientlt terminolgia szerint mdszereknek (method) hvjk. Defincijuk nem klnbzik a Cben megszokottaktl, persze a mi programunkban a main-hez hasonlan itt is meg kell adni a static mdostt, mert ezek a
mdszerek is hasznljk a fent definilt osztlyvltozkat.
static void openSMTPconnection (String host) throws IOException
{

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 6 of 20

Persze a korbban megismert kivtelkezels belezavar a kpbe: a Jva nyelv megkveteli, hogy a mdszerekben elfordul
kivteleket vagy le kell kezelni, vagy deklarlni kell, hogy lekezeletlenl tovbbadjuk. A mdszer fejben a throws parancs
erre szolgl. (Megjegyzs: a lekezeletlen kivtelek deklarlsnak szablya all is vannak "kivtelek", de errl is csak
ksbb.)

Hlzati kommunikci
A programhoz szksges hlzati kommunikcit szerencsre a Jva net knyvtra segtsgvel knny megoldani. A
rszletek mellzsvel: a knyvtr definil egy Socket osztlyt, amely egyszer TCP kapcsolat kiptsre s azon adatok
tvitelre szolgl.
Elszr ltrehozunk egy j Socket-et, egyben megnyitva az sszekttetst a paramterknt megkapott gp 25-s (SMTP
kiszolgl) kapujval (port).
smtpconn

= new Socket(host, SMTPport);

Az tvitelre kt - input s output - stream objektum szolgl, amelyeket a get...Stream eljrssal kibnyszunk a
kapcsolatbl.
instream = new DataInputStream(smtpconn.getInputStream());
outstream = new DataOutputStream(smtpconn.getOutputStream());

Ezen stream-ek segtsgvel mr kzvetlenl olvashatunk vagy rhatunk a kiplt kapcsolaton. Itt az els berkez sort az SMTP kiszolgl bejelentkez zenett - egyszeren eldobjuk.
String dummy = instream.readLine();
};

A kapcsolat lezrsa egyszer:


static void closeSMTPconnection () throws IOException
{
smtpconn.close();
};

Egy SMTP zenet kikldshez egy kicsit gyeskednnk kell:


static String sendMessage(String msg) throws IOException
{

Elszr is a kikldend zenetet - a String tpus msg paramtert - Byte-okk alaktva kell elkldeni. Ne feledjk el, hogy
a Jva a karakterek trolsra - s egy szveg is ezekbl ll - 16 Bites Unicode-ot hasznl, a szegny SMTP kiszolgl
alaposan meg lenne lepve, ha ezt kapn. A Byte-sorozat vgre mg odabiggyesztjk a protokoll ltal megkvnt CR s LF
karaktereket. Legalbb ltunk arra is pldt, hogyan lehet - gy, mint a C-ben - karakter konstansokat megadni.
outstream.writeBytes(msg);
outstream.write('\015'); outstream.write('\012');

A flush utasts kirti az tviteli puffert, elkldi az sszegylt Byte-okat az sszekttetsen.


outstream.flush();

Az SMTP szerver egy ilyen zenetet nem hagy vlasz nlkl, az egy soros vlaszt beolvassuk s visszaadjuk a mdszert
meghv programnak. Az utasts arra is plda, hogy egy vltozt (res) nem csak a mdszerek elejn, hanem brhol
deklarlhatunk, ahol Jva utasts llhat.
String result = instream.readLine();
return result;
};
}

Fordts, futtats
Ha valaki nem sajnlja a fradsgot s begpeli a fenti programot, mondjuk SMTPclient.java nven, lefordtani a
javac SMTPclient.java

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 7 of 20

paranccsal lehet. Ha nem kvettnk el gpelsi hibt s a Jva Fejleszti Krnyezetet (JDK) is helyesen teleptettk, akkor
a fordt ltrehoz egy SMTPclient.class llomnyt, ami a lefordtott Byte kdot tartalmazza. Az llomny neve nem a
forrs nevbl szrmazik, hanem az llomnyban definilt osztly nevt hordozza. Ha tbb osztlyt definilnnk, a fordt
tbb klnll llomnyt hozna ltre.
A programunkat tesztelhetjk pldul a
java SMTPclient hapci.mmt.bme.hu kiss

paranccsal s kis szerencsvel a vlasz:


250 Kiss Istvan <kiss>

lesz, aki pedig n vagyok!

Objektumorientlt programozs
Jva mdra
Az objektumorientltsg manapsg az egyik legdivatosabb programozsi paradigma (alapelv), termszetesen a Jva is
kveti a divatot. Br a nyelv se a C++ volt, m a Jvban sokkal tisztbban rvnyeslnek az objektumorientlt
programozs elvei, taln azrt, mert nem knyszerl arra, hogy mg a C nyelvbl szrmaz programozsi elveket,
szerkezeteket koloncknt magval hordozza.
Az objektumorientltsg mg elg j elv ahhoz, hogy a teoretikusok felhevlt hitvitkban prbljk definilni lnyeges
vonsait. A teljessg ignye nlkl n itt az egyik szles krben hasznlt defincit ismertetnm, termszetesen olyat,
amely illik a Jvra. Ezek szerint:


Egy objektumorientlt program egyttmkd objektumok (object) sszessge.


A program alap ptkvei az objektumok. Ezek olyan, a krnyezetktl jl elklnthet, viszonylag fggetlen
sszetevk, amelyeknek sajt viselkedsk, mkdsk s lehetleg rejtett, bels llapotuk van. Egy objektumra a
krnyezetben lv egyb objektumok hatnak s ennek hatsra sajt llapotuk megvltozhat.
Minden objektum valamilyen osztlyba (class) tartozik. Az osztlyok megfelelnek az absztrakt adattpusoknak,
minden objektum valamely tpus pldnya, egyede (instance). Az osztlyok definiljk az egyes objektumok
llapott ler adatszerkezetet s a rajtuk vgezhet mveleteket, az gynevezett mdszereket (method). Az egyes
egyedek csak az llapotukat meghatroz adatszerkezet tnyleges rtkeiben klnbznek egymstl, a
mdszerekkel definilt viselkedsk kzs.
Az egyes osztlyokat az rklds hierarchiba rendezi. Az rklds az az eljrs, amely segtsgvel egy osztly
felhasznlhatja a hierarchiban felette ll osztlyokban definilt llapotot (adatszerkezeteket) s viselkedst
(mdszereket). gy a kzs elemeket elegend egyszer, a hierarchia megfelel szintjn definilni.

ltalban csak az els hrom kvetelmnynek eleget tev programozsi nyelvet, technolgit objektum-alapnak (object
based), mg a negyedikkel kiegszlket objektumorientltnak (object-oriented) hvjk. Az els 3 ptelem mr korbbi
programozsi nyelvekben is megjelent, ezt leggyakrabban absztrakt adattpusoknak neveztk. Kezdetben n is ezzel
foglalkozom.

Absztrakt adattpusok ltrehozsa


A Jva nyelvben csaknem minden objektum. Mint korbban lthattuk, egy programban az import utastsokon kvl
minden utasts osztlyok belsejben szerepelhet csupn, nincsenek globlis vltozk, globlis eljrsok. A nyelv ugyan
tartalmaz nhny egyszer adattpust, de ezeken fell minden egyb adatszerkezet vagy valamilyen osztlyba tartoz
objektum, vagy tmb, amely, mint azt hamarosan ltni fogjuk, ugyancsak specilis osztly. Mellesleg a nyelv tartalmaz a
beptett tpusokat becsomagol osztlyokat (wraper class) is: Boolean, Character, Double, Float, Integer.

Objektumok
Az objektumok olyan programsszetevk, amelyek szoros egysgbe foglaljk az llapotukat ler bels adatszerkezetket
s a rajtuk rtelmezhet mveleteket. Ebben az rtelemben az egyes objektumok nagyon hasonltanak egy adott tpusba
tartoz rtkekhez. Egy int tpus rtk is elrejti ellnk a bels reprezentcijt s csak az elre definilt mveletek
vgezhetk rajta.

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 8 of 20

A Jvban minden egyes objektumnak meghatrozott tpusa kell, hogy legyen, azaz valamelyik osztlyba kell tartoznia. Az
objektumokra vltozkon keresztl hivatkozhatunk, pl. a
Person somebody;

azt jelenti, hogy a somebody nv mindig egy Person tpus objektumra hivatkozik. Viszont a C++ nyelvvel ellenttben a
fenti deklarci nem jelenti egy j objektum ltrejttt, a vltoz egyelre nem hivatkozik semmire, azaz "rtke" null. A
Person somebody = new Person("Kovacs", "Istvan", "15502280234");

utasts nem csak definil egy j vltozt, de a new paranccsal ltre is hoz egy j objektumot, amelyre a vltoz
hivatkozik.
Nagyon fontos megrtennk azt, hogy a Jvban minden vltoz hivatkozst tartalmaz csupn. Ezt szem eltt tartva
rthet, hogy az rtkads (=) opertor nem kszt msolatot, a bal oldali vltoz ugyanarra az objektumra hivatkozik
majd, mint a jobb oldal. Ha valakinek mgis msolatra van szksge, tbbnyire hasznlhatja a csaknem minden osztlyban
megtallhat clone mdszert. Hasonlkppen az egyenlsg vizsglatnak C-bl ismert opertora (==) is a referencik
egyenlsgt ellenrzi, az objektumok strukturlis ellenrzsre az equal mdszer val, mr amennyiben ltezik ilyen.
Ha mr minden objektumra amgy is csak referencikon keresztl hivatkozhatunk - termszetesen a hivatkozs
feloldsnak mvelett (dereference) nem kell kln kirnunk -, mr nem is tnik tl meglepnek, hogy a Jva kln
mutat tpust nem tartalmaz. Ez nagyon sok programozsi hibtl, biztonsgi problmtl megkml bennnket. A
referencik viszont szentek s srthetetlenek, semmifle mvelet, konverzi nem vgezhet rajtuk.
Az egyes referencik ltal hivatkozott objektumok tpust az instanceof logikai rtket ad opertorral tudjuk lekrdezni,
pldul
if (x instanceof Person) then System.out.println("x egy szemly!");

Azt mr lttuk, hogy j objektumokat a new utastssal lehet ltrehozni, megszntetni, trlni viszont nem kell. A Jva
virtulis gp, amely a programokat futtatja, tartalmaz egy szemtgyjt (garbage collection, gc) - jelenleg az n. markand-sweep tpus - algoritmust, amely ltalban a httrben, a CPU szabadidejben, a programmal aszinkron futva
sszegyjti a mr nem hivatkozott objektumokat s azok trterlett felszabadtja, hogy a new jra felhasznlhassa majd. A
szemtgyjts teljesen rejtetten, automatikusan trtnik, a programozknak ltalban nem is kell trdnik a
szemtgyjtssel.
Ha mr vannak objektumaink, nzzk meg, hogyan tudunk hatni rjuk. Az egyes objektumok mdszereit az
obj.method(parameter, parameter, ...)

szintaxissal hvhatjuk meg. Az objektumorientlt terminolgia ezt gyakran zenetkldsnek (message passing) nevezi, pl.
a
somebody.changePID("15502280234");

utasts "megkri" a somebody objektumot, hogy hajtsa vgre sajt magn a changePID mveletet a "15502280234"
paramterrel. Az ilyen mdszerhvsok vezethetnek az objektum bels llapotnak, azaz bels vltozi rtknek
megvltozshoz is, de gyakran csak egy bels vltoz rtknek lekrdezse a cl.
Br a tiszta objektumorientlt elvek szerint egy objektum bels llapotvltozinak rtkhez csak mdszerein keresztl
lehetne hozzfrni, a Jva - a C++-hoz hasonlan - megengedi a programoznak, hogy bizonyos vltozkat kzvetlenl is
elrhetv tegyen. Pl. amennyiben age kzvetlenl lthat a
somebody.age = 46;

utasts kzvetlenl a pldaszemlynk letkort vltoztathatja meg.

Osztlyok defincija
A Jva programozk osztlyokat a
class ClassName { /* az osztly trzse */ }

programszerkezettel definilhatnak, ahol a ClassName az jonnan definilt osztly neve lesz, az objektumok bels
llapott s viselkedst pedig a kapcsos zrjelek kztti programrszlet rja le. A class alapsz eltt, illetve az osztly

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 9 of 20

neve utn opcionlisan llhatnak mg klnbz mdostk, de ezekrl majd ksbb.

Egyedvltozk
Az osztly trzsben szerepelnek azok a vltoz-deklarcik, amelyek az egyes egyedek bels adatszerkezett valstjk
meg. Ezeket gyakran egyedvltozknak (instance variable, member variable) nevezzk, jelezve, hogy az osztly minden
egyede ezekbl a vltozkbl sajt kszlettel rendelkezik. A vltoz-deklarcik megfelelnek a C-ben megszokottaknak:
class Person
{
String
name, surname, pid;
byte
age;
Person
mother, father;

A kpzeletbeli Person tpusunkba tartoz egyedek hrom szvegvltozban trolhatjk a szemly vezetk- s keresztnevt,
szemlyi szmt (ez persze lehetne akr egy long egsz szm is), egy Byte-ban az letkort s kt Person tpus vltozban
az apjt s anyjt. Az utols 2 vltoz plda arra, hogy egy egyed bels llapota hivatkozhat ms - akr az egyeddel
megegyez tpus - objektumokra is.

Mdszerek
A tpus ltal rtelmezett mveleteket a mdszerek testestik meg, ezek definilsa megegyezik a C fggvnyekvel.
void changePID (String newPID) throws WrongPIDException
{
if (correctPID(newPID)) pid = newPID
else
throw new WrongPIDException();
}

Mint ltjuk, az egyes mdszereknek lehet visszatrsi rtke - br a pldnkban nincsen, ezt jelzi az ilyenkor ktelez void
-, illetve adott tpus s szm bemen paramtere. A mdszer nevt, visszatrsi rtknek s paramtereinek szmt,
tpust a mdszer lenyomatnak (signature) nevezzk.
A mdszerek meghvsnl a lenyomatban definilt formlis paramterek aktulis rtket kapnak. A Jvban minden
paramtertads rtk szerint trtnik, azaz a paramter helyn szerepl rtkrl msolat kszl, a mdszer ezt a msolatot
ltja, hasznlja. Persze, ha a msolat mdosul, az az eredeti rtket nem rinti. Kicsit becsaps a "mindig rtk szerinti
paramtertads" szablya. Amennyiben a paramter nem valamelyik beptett, egyszer tpusba tartozik, gy az tadsnl
a referencirl kszl msolat, azaz a C++ fogalmai szerint ilyenkor referencia szerinti tads trtnik, teht a hivatkozott
objektum a mdszer belsejben megvltoztathat. A visszatrsi rtk sem felttlenl egy egyszer tpusba tartoz rtk,
hanem lehet objektum referencia is.
Az osztly belsejben azonos nvvel, de egybknt klnbz lenyomattal tbb mdszert definilhatunk (tbbes jelents,
overloading), ilyenkor a fordt a mdszer hvsnl a paramterek szmbl s tpusbl dnti el, hogy melyik mdszert
akarjuk meghvni, de a kivlasztsnl a mdszer visszatrsi rtknek tpust a fordt nem veszi figyelembe.
A mdszerek trzsben a korbban mr megismert utastsokat rhatjuk. A kifejezsekben, rtkadsok bal oldaln
hasznlhatjuk az eljrs paramtereit, loklis vltozit, de az objektum egyedvltozinak rtkt is. Amennyiben a sajt
objektumra akarunk hivatkozni, gy hasznlhatjuk a this szimblumot. Pl. a pid = newPID azonos a this.pid = newPID
utastssal.
A mdszerek fejben hasznlhatjuk a native mdostt, ez a fordtprogramnak azt jelenti, hogy a mdszer trzst nem
Jvban rtuk meg, hanem az aktulis platformtl fgg mdon, pl. C-ben. Az ilyen mdszerek paramtertadsi mdja,
esetleg az elnevezsi konvencii az aktulis platformtl fgghetnek. Termszetesen ilyenkor az osztlydefinciban a
mdszernek csak a lenyomatt kell megadni. Az ilyen mdszereket hasznl programok sajnos elvesztik a Jva programok
architektra-fggetlensgt, de egybknt a native mdszerek mind a lthatsg, mind az rklds szempontjbl a tbbi
mdszerrel teljesen azonos mdon viselkednek.

Konstruktorok
Az osztlyban definilt mdszerek kzl kitnnek az n. konstruktorok (constructor), amelyek szerepe az objektumok
ltrehozsa, bels llapotuk kezdeti rtknek belltsa. Minden konstruktor neve megegyezik az osztlya nevvel,
visszatrsi rtke pedig nincs. Termszetesen a konstruktor is lehet tbbes jelents mdszer:
Person () { /* res */ };
Person (String name, String surname, String PID)
{

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 10 of 20

this();
// az res konstruktor egyenlre nem csinl semmit
this.name = name; this.surname = surname; this.PID = PID;
...
};

A konstruktorokat a new utasts kiadsa hvja meg, a konstruktorok kzl a new-nl megadott paramterek szma s
tpusa szerint vlasztunk. Kitntetett szerep a paramter nlkli, n. alap (default) konstruktor, ha mi nem definiltunk
ilyet, a Jva fordt automatikusan kszt egyet az osztlyhoz. Az gy generlt konstruktor a helyfoglalson kvl nem
csinl semmit.
A szemtgyjts miatt a C++-bl ismert destruktorok itt nem lteznek, viszont ha egy objektum vgleges megszntetse
eltt valami rendrak tevkenysg vgrehajtsra lenne szksg, akkor ezt rjuk egy void finalize() lenyomat
mdszer trzsbe, a Jva virtulis gp biztosan vgrehajtja, mieltt az objektum terlett a szemtgyjt felszabadtan,
azonban az aszinkron szemtgyjts miatt azt soha nem tudhatjuk biztosan, hogy ez mikor kvetkezik be.

Osztlyvltozk s -mdszerek
Mg az egyedvltozkbl minden pldny sajt kszlettel rendelkezik, addig az n. osztly- vagy statikus (static)
vltozkbl osztlyonknt csak egy van. Termszetesen mivel ezek nem egy pldnyhoz tartoznak, ezrt a hozzfrshez
sincs szksg egy konkrt objektumra, az osztly nevvel is hivatkozhatunk rjuk.
A csak statikus vltozkat hasznl mdszerek a statikus, avagy osztlymdszerek. Egsztsk ki a szemly pldnkat gy,
hogy minden j szemly kapjon egy egyedi sorszmot:
class Person
{
...
int
index;
static int counter;
static { counter = 0; }

// egyedi sorszm
// ltrejtt szemlyek szmllja
// statikus vltoz kezdeti rtke

Person () { index = counter++; }


// a konstruktorban hasznljuk fel a szmllt
static int howManyPersons () { return counter; )
...
}

A pldban lthat egy n. statikus inicializl programrszlet is - a static { ... } -, amely utastsai az osztly betltsnl,
az esetleges statikus vltozk kezdeti rtkadsval egyidejleg hajtdnak vgre. Megjegyzs: a pldban ez kihagyhat
lenne, helyette elg lenne
static int counter = 0;

// ltrejtt szemlyek szmllja

vltozdeklarcit rni.

Tmbk
A Jva nyelv tmbjei is objektumok, ha kiss specilisak is. Deklarlsuk nem csak a C-szer szintaxissal megengedett, de
vgre tehetjk a szgletes zrjeleket a "logikus helyre" is, azaz a kvetkez kt deklarci ekvivalens:
int a[] = new int[10];
int[] a = new int[10];

Mint a tbbi objektumnl, a nv itt is csak egy referencia, a tmb deklarcija utn azt a new paranccsal ltre is kell hozni.
Az indexels mvelete azonos a C-ben megismerttel, itt is 0 a legkisebb index. Lnyeges klnbsg viszont, hogy a
virtulis gp ellenrzi, hogy ne nyljunk tl a tmb hatrn; kivtel keletkezik, ha mgis megtesszk. Minden tmb
objektumnak van egy length nev egyedvltozja, amely a tmb aktulis mrett adja vissza. Ez azrt is fontos, mert a
program futsa sorn ugyanaz a tmbvltoz ms s ms mret tmbkre hivatkozhat.
Termszetesen nem csak a beptett, egyszer tpusokbl kpezhetnk tmbket, hanem tetszleges tpusbl, belertve
egyb tmbket. A Jva tbbdimenzis tmbjei is mint tmbk tmbje jnnek ltre. Pldul
int a[][] = new int[10][3];
system.out.println(a.length);
system.out.println(a[0].length);

// 10-et r ki
// 3-at r ki

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 11 of 20

Mg egy rdekessg: a referencik hasznlatnak kvetkezmnye, hogy nem csak "ngyszgletes" ktdimenzis tmbt
lehet kszteni, de olyat is, ahol az egyes sorok nem azonos hosszak. Pl. egy "hromszg alak tmb" ltrehozsa:
float f [][] = new float [10][];
for (int i = 0; i < 10; i++) f[i] = new float [i + 1];

Szvegek
A Jvban a szvegek (String) is teljes rang objektumok. A szvegek gyakori mdostsnak hatkonyabb elvgzsre
hasznlhatjuk a StringBuffer osztlyt is. Rszletes magyarzkods helyett lljon itt egy plda, egy olyan mdszer, amelyik
megfordt egy szveget:
String reverse (String source)
{
int i, len = source.length();
StringBuffer dest = new StringBuffer(len);
for (i = len - 1; i >= 0; i--) dest.append(source.charAt(i));
return dest.toString();
}

Pakkok
sszetartoz osztlyokat a pakk (package) segtsgvel a programozk egyetlen fordtsi egysgg foghatnak ssze. Ezzel
osztly-knyvtrakat pthetnk, s nagy szerep jut a lthatsg szablyozsnl is. A pakkot, amennyiben hasznljuk
egyltaln, a forrs els nem megjegyzs sorban kell megneveznnk, pl.
package mmt.networking.snmp

A pakkoknak programozsi konvencik szerint ltalban tbb komponens, ponttal elvlasztott nevet adunk, a fordt a
nvnek megfelel knyvtr-hierarchiba helyezi el a lefordtott osztlyokat. Ltezik egy nv nlkli pakk arra az esetre, ha
nem adtuk meg a package utastst.
Az gy ltrehozott pakkokbl lehet a mltkor megismert import utastssal egy vagy tbb osztlyt tvenni, hasznlni. A
Jva nyelvi krnyezet jelenleg a kvetkez pakkokat tartalmazza:
java.applet
java.awt
java.awt.image
java.awt.peer
java.io
java.lang
java.net
java.util

Programkk krnyezete
Ablakoz rendszer (Abstract Windowing Toolkit), grafikus s kezeli fellet elemek
segd osztlyok az AWT-hez
be- s kivitel
nyelvi szinten definilt osztlyok
hlzatkezels
segd osztlyok

Lthatsg
A programozk megadhatjk, hogy az ltaluk definilt egyes osztlyok, illetve az osztlyok vltozi, mdszerei milyen
krben hasznlhatk. Erre a clra az n. hozzfrst specifikl (access specifier) mdostk hasznlatosak. Egyelre amg az rkldsrl nem beszltnk - 3 ilyen specifikl lehet: nyilvnos (public), magn (private), barti (friendly). Ez
utbbi az alaprtelmezs, ha nem adjuk meg a hozzfrs mdjt, akkor ez mindig barti.
Osztlyokra csak a nyilvnos vagy a barti hozzfrs vonatkozhat: nyilvnos osztlyokat a programunkban brhol
hasznlhatunk, brmelyik pakkunkba importlhatjuk. Barti osztlyokat csak az adott pakkon bell lehet hasznlni.
Egyed- illetve osztlyvltozkra, mdszerekre a nyilvnos s barti hozzfrs a fentivel azonos jelents, ezen tl a
magn vltozk, mdszerek csak az adott osztlyon bell lthatk.

rklds s kvetkezmnyei
Az objektumorientltsg igazi csattanja az rklds. Ez teszi lehetv, hogy a korbbi programozsi mdszereknl jval
knnyebben felhasznlhassunk mr megrt programrszeket, ezt gyakran szoftver IC-knek reklmozzk. Br egyelre az
objektumorientlt paradigma nem vltotta be minden grett, de tagadhatatlan, hogy nem csak divatos, de sikeres is.

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 12 of 20

Osztlyok leszrmaztatsa
Ha egy j osztlyt mr valamelyik meglv alapjn akarjuk definilni, azt az osztly fejben a kvetkez szerkezettel kell
jelezni:
class Child extends Parent { /* Child trzse */ }

Az gy mdon megadott, n. leszrmazott osztly (Child) rkli a szlje (Parent) tulajdonsgait, azaz a bels llapott
ler adatszerkezett s a viselkedst megvalst mdszereit. Termszetesen az osztly trzsben ezt tovbb bvtheti, a
viselkedst mdosthatja, ezt sugallja az extends (kiterjeszt) kifejezs a defincinl.
A Jva a C++-szal ellenttben csak az n. egyszeres rkldst engedlyezi, azaz minden osztlynak egyetlen kzvetlen
szlje lehet. Tulajdonkppen nem csak lehet, de mindig van is szlje, a nyelv ugyanis definil egy beptett Object nev
osztlyt, amennyiben az j osztly defincijban mshogy nem rendelkeznk, automatikusan "extends Object" rtend,
azaz minden osztly kzvetlenl vagy kzvetve, de rkli az Object-ben definiltakat. Az gy rklt mdszerek pldul
az egyes objektumok msolsval (clone), sszehasonltsval (equals), megnevezsvel (toString), illetve osztlya
megklnbztetsvel (getClass), vagy a tbbszl futtatssal (pl. wait, notify) kapcsolatosak.
Szksg esetn a meglv osztlyainkbl val leszrmaztatst megtilthatjuk gy, hogy azt "final class"-knt definiljuk.
Ezt akkor alkalmazzuk, ha nem akarjuk, hogy egy msok ltal belle leszrmaztatott osztly nem kvnt mdon
mdostson az osztlyunkban definilt viselkedst.

Lthatsg
Az absztrakt adattpusoknl megismert, hozzfrst szablyoz mdostk - public, private, s a ki soha nem rt friendly - a
protected (vdett) alapszval bvltek. A vdettnek definilt vltozk s mdszerek csak az osztlyban, annak valamelyik
leszrmazottjban, vagy a pakkban lthatk, mg a privt vdett (private protected) vltozk az elzhz kpest a
pakkokban sem ltszanak ltalban. (Ez a C++-ban ismersk szmra az ottani protected lthatsg megfelelje.)

Mi rkldik, s mi nem
Az rkls sorn az j osztly rkli a szlje sszes egyedvltozjt. Ezek a vtozk mg akkor is megvannak a
leszrmazott tpus objektumban, ha azok egy private deklarci miatt kzvetlenl nem lthatk. Hasonl a helyzet akkor,
ha a leszrmazott definil egy, a szlben mr hasznlt nev vltozt, ilyenkor ez a vltoz eltakarja (shadowing) a szl
vltozjt. Ilyen esetekben ugyan a szltl rklt vltozk a leszrmazott osztly mdszereiben kzvetlenl nem
lthatk, de szl nem magn mdszerei segtsgvel tovbbra is hozzfrhetk.
A szl mdszerei is rkldnek, egy leszrmazott osztlyban hasznlhat a szl brmelyik nyilvnos, vdett vagy barti
mdszere. Azonban a mdszerek esetben nagyobb szabadsgunk van: ha a leszrmazottban a szlben meglv
mdszerrel azonos lenyomat mdszert definilunk, az elfedi a szlbeli jelentst, gy megvltoztatva egy a szlben
definilt viselkedst. A mdszerek ilyen jelentsnek megvltoztatst megakadlyozhatjuk, ha azt a szlben finalnak
definiljuk.
Lttuk, hogy egy mdszerben a sajt egyedvltozkra a this referencia segtsgvel hivatkozhatunk, rklds esetn a
szlbl rklt egyedvltozkra, mdszerekre hivatkozsnl a super referencit hasznlhatjuk.
Persze az j osztlyban lthatk lehetnek a szl osztlyvltozi s az ezeket kezel statikus mdszerek is, ez azonban nem
rkls, hanem inkbb klcsns hasznlat, hiszen minden statikus vltozbl s mdszerbl tovbbra is csak egy van.
Nem rkldnek a konstruktorok, minden osztlyhoz meg kell rni a sajt konstruktorait. Ebbl a fordt csak az alap paramter nlkli - konstruktort hajland automatikusan ltrehozni, amely gy mkdik, hogy miutn a trban a kazalon
(heap) az egyed szmra helyet foglalt, lehvja a szl alapkonstruktort, a super()-t. Egy leszrmazott-bli konstruktor ezt
a szl alapkonstruktort mindig automatikusan meghvja, hacsak a leszrmazott konstruktorban valamely ms
paramterezs super(...) konstruktort a sajt konstruktornak els utastsaknt meg nem hv.
Vgezetl az rkldsben rdekes szerep jut az abstract mdostval deklarlt mdszereknek, olyan mdszereknek,
amelyeknek egy osztly csak a fejt (lenyomatt) definilja, de a trzse helyt kihagyja. Az ilyen absztrakt mdszereket
valamelyik leszrmazott osztlynak kell majd definilnia. Legalbb egy absztrakt - sajt maga ltal absztraktnak definilt,
vagy gy rklt s nem konkretizlt - mdszerrel rendelkez osztlyt absztrakt osztlynak neveznk, ezt az osztly
fejben a class eltti abstract mdostval kell, hogy jelezzk. Az absztrakt osztlyok sajtossga, hogy nem lehetnek
egyedei, a fordt hibazenettel visszautastja a new utastst.

Polimorfizmus

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 13 of 20

A polimorfizmus tbbalaksgot, tbbarcsgot jelent. Az objektumorientlt nyelveknl ez valami olyasmit jelent, hogy
klnbz tpus objektumoknak lehet azonos lenyomat mdszere s e mdszerek kzl az objektum aktulis tpusnak
megfelel mdszer kerl meghvsra.
Ez persze csak akkor izgalmas, ha a program szvegbl nem ltszik konkrtan, hogy ppen milyen tpus elemmel van
dolgunk. Ez egy szigoran tpusos nyelvnl, mint a Jva, csak gy lehet, ha bizonyos laztsokat vezetnk be, pl.
megengedjk, hogy egy szl tpus referencia aktulisan hivatkozhat valamelyik leszrmazott tpusra is.
Definiljuk pldul a jl ismert vicc nyomn a pldabeli Person osztlyunkban egy absztrakt SqueezeToothPaste nev
mdszert a fogpaszta tubusbl kinyomsra.
class Person {

... void SqueezeToothPaste(); ... }

Szrmaztassuk le a frfi s a n osztlyokat a szemlybl, ezekben mr megadva konkrtan, hogyan is szoktk a frfiak s
a nk a fogkrmes tubust megnyomni:
class Man extends Person
{
void SqueezeToothPaste() { /* ... tekerd az egyik vgrl kezdve ... */ };
}
class Woman extends Person
{
void SqueezeToothPaste() { /* ... markold kzpen s nyomjad ... */ };
}

Ezek utn kpezhetnk egy tmbt, amely egyes elemei hol Man, hol Woman tpusak lehetnek
Person[] p = new Person [20];
p[1] = new Man();
p[2] = new Woman();
...

A programban elfordul p[n].SqueezeToothPaste() mdszerhvsrl a fordtprogram mg nem tudja eldnteni, a hogy p


adott index helyn pp frfival, avagy nvel akadt dolga. Ez csak a konkrt futskor derl ki, akkor kell majd kivlasztani
a kt SqueezeToothPaste() kzl az alkalmazandt. C++ programozk figyelem: ott ezt a mkdst virtulis
fggvnyhvsnak hvjk s minden esetben kln kell a programban deklarlni. A Jvban minden mdszer virtulis!
A plda azt is illusztrlja, hogy egy szl tpus referencia esetn hasznlhatunk minden tovbbi nlkl gyerek tpusra
hivatkozst. Egybknt itt is ismert a tpus tformls (type casting) fogalma, de itt ktttebb mint a C++-ban, mert



az tformls csak a referencia tpust rinti, magt az objektumot nem,


nem lehet objektum referencik tpust akrmiv talaktani, csak az rkldsi lncban felfel vagy lefel.

Interfszek
A C++-hoz kpest jts a Jva interfsz (interface) fogalma, a nyelv tervezi az Objective-C hatst emlegetik. Egy
interfsz nem ms, mint mdszerek lenyomatnak gyjtemnye, mgpedig olyan mdszerek, amelyek egy osztlyban
val egyidej megltt a programoz fontosnak tartja. Maga az interfsz a mdszerek trzst nem adja meg, de rhatunk
olyan osztlyokat, amelyek megvalstjk, implementljk az interfszt, azaz konkrtan definiljk az interfszben
felsorolt valamennyi mdszert.
Ennek nagy haszna, hogy az rkldsi hierarchiban nem rokon osztlyok is viselkedhetnek hasonlan, az
objektumorientlt terminolgia szerint azonos protokoll - a mdszergyjtemny - segtsgvel kommuniklnak.
Ha egy osztly megvalst egy interfszt, azt a
class A implements I { ... }

formban lehet kifejezni, de ennek az a kvetkezmnye, hogy A-ban az sszes I-beli mdszert meg kell valstani. A
Jvban tbbszrs rkls ugyan nincs, de egy osztly egyidejleg tbb interfszt is megvalsthat.
Egybknt az interfszben deklarlt minden mdszer nyilvnosnak s absztraktnak tekintend, de a mdostkat - sem
ezeket, sem msokat - nem lehet kirni. Szksg esetn egy interfsz deklarlhat vltozkat is, m ezek mind vglegesek,
nyilvnos s statikusak (final public static) s termszetesen rtkket azonnal inicilni kell.

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 14 of 20

Szlak
A rgivgs programozk programjai egyidejleg csak egyetlen tevkenysggel foglalkoznak, pl. egy grafikus
alkalmazs esetn vagy a kpernyre rajzolnak, vagy az egr mozgsra, billentyjeinek lenyomsra figyelnek. Ezrt van
az, hogy gyakran ltni olyan programot, hol egy-egy bonyolultabb rajz kzben az egr "megfagy", hiba lkdssk, a
kpernyn nem mozdul tovbb.
Persze a fenti feladatot meg lehetne gy is rni, hogy egy kicsit rajzolunk, majd egy kicsit az egrrel foglalkozunk, s gy
tovbb, de ez elg macers, klnsen azrt, mivel egy igazi programnl sok egyb esemnyre is figyelnnk kellene. J
lenne, ha a programozsi nyelvnk - s az alatta rejtz opercis rendszer - segtene bennnket, lehetv tenn, hogy a
programunk egyidejleg tbb tevkenysggel is foglalkozzon, s ezek sszehangolsval lehetleg ne kelljen sokat
trdni. gy merl fel a prhuzamos programrszletek hasznlatnak ignye. J elre rdemes kiemelni, hogy mg
napjainkban is a legtbb szmtgp egyetlen processzort tartalmaz, ezrt igazi prhuzamos, egyidejleg mkd
tevkenysgrl nem beszlhetnk.
Taln kicsit jogosulatlanul hasznltam a "rgivgs" jelzt, sokan azrt rnak egyetlen szlon fut programokat, mert
nincs egyb magasszint eszkz a kezkben, igazn nagy feladatatokat pedig kinek van kedve gpi kdban megrni.
A prhuzamosan fut tevkenysgek elszr az opercis rendszereknl jelentkeztek, a multiprogramozshoz
elengedhetetlen, hogy amg egy program (folyamat, process) pl. valamilyen lass perifris tvitelre vrakozik, a rendszer
ms programot is futtathasson legalbb egy rvid ideig. Az opercis rendszerek ezt a lehetsget megnyitottk a
rendszerkzeli programozk szmra is, pldul ilyen clokat szolgl a UNIX rendszerek fork() rendszerhvsa. Ezt mr
lehet pl. C nyelv programokbl hasznlni, de lassan-lassan megjelentek magasabbszint programozsi nyelvek (Ada,
Modula-2, ...), amelyek nyelvi absztrakciikban igyekeztek a prhuzamos programozs "piszkos" rszleteit mind jobban
elrejteni a programozk ell.
A szl (thread) viszonylag j fogalom, a szlak s a folyamatok kztti klnbsgek megrtst segti, ha megismerjk a
szlakra hasznlt msik elnevezst: pehelysly folyamat (lightweight process). Mg egy fork-kal ltrehozott tevkenysg
egszen nll letet l, sajt trterlettel rendelkezik, amelyre a rendszer fltkenyen vigyz, addig a szlak kzs
trterletet, llomnyokat s egyb rendszer-erforrsokat hasznlnak, csak a vermk s a regisztereik a sajtjuk. A kzs
erforrsok tulajdonosa ltalban egy folyamat, a szlak ennek a krnyezetben (context) futnak.
Ha vannak folyamataink, mirt kellenek a szlak? Gyorsabban lehet kzttk vltogatni, a vrakoz tevkenysg
gyorsabban felbredhet, reaglhat valamilyen esemnyre. A kzs memria megknnyti az tevkenysgek kztti
informcicsert is. Persze az elnyk mellett a szlakkal problmk is addhatnak: kzs lnak tros a hta, a kzs
trban turklsnl nagyon kell vigyzni arra, hogy mikor melyik szl kvetkezhet. Egy jl megtervezett nyelv, rendszer
igyekszik kivdeni ezeket a hibkat, de a programozk zsenilisak, ha j programozsi hibkat kell kitallni, s sajnos a
prhuzamos tevkenysgekkel egytt megjelentek a rettegett idfgg, nem reproduklhat hibk.
jabban divatt vltak a szlak, lassan nhny opercis rendszer - pl. a Sun Solaris 2.x rendszere, vagy a Windows NT rendszerszinten is tmogatja ezeket, de megjelentek olyan programcsomagok (pl. PThreads), amelyek segtsgvel a
hagyomnyos UNIX rendszereken is hasznlhattunk C nyelvi programokbl szlakat. A Jva nyelv tllp ezen, nyelvi
szintre emeli a szlak fogalmt, hasznlatuk tmogatst.
A szlaknl is, mint az egyb prhuzamos tevkenysgnl, a kvetkez alapvet problmk merlnek fel:





a szlak ltrehozsa, futtatsa;


a szlak szinkronizcija, futsuk sszehangolsa;
informcicsere a szlak kztt;
temezs, a kzponti egysg hasznlatnak felosztsa a szlak kztt.

Szlak ltrehozsa
A Jva nyelvben a szlak szmra a java.lang pakk tartalmaz egy kln osztlyt, a Thread-et. Minden prhuzamos
tevkenysg vagy egy Thread, vagy ebbl leszrmazott osztly egy pldnya. Szlakat teht pldul gy hozhatunk ltre,
hogy leszrmaztatunk a Thread osztlybl egy sajt osztlyt, amelybl aztn ltrehozunk egy vagy tbb pldnyt. Persze
meg kell adnunk, hogy a szlunk milyen tevkenysget hajtson vgre, ezt a Thread-bl rklt nyilvnos run mdszer
felldefinilsval teheljk meg
class MyThread extends Thread
{
public int ID;
MyThread (int i) { ID = i; };
public void run ()
{ /* a szl tevkenysgnek lersa */ }

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 15 of 20

Ezek utn a programunkban ltrehozhatunk nhny sajt szl objektumot:


MyThread first = new MyThread(1);
MyThread second = new MyThread(2);

A fenti plda azt is illusztrlja, hogy a leszrmazott osztly konstruktort felhasznlhatjuk arra, hogy az egyes szlaknak
megszletsk eltt egyedvltozkban olyan objektumokat adjunk t, amelyeket az egyes szlak az ltk folyamn
hasznlhatnak.
Az gy ltrehozott szlak mg csak "megfogantak", de nem szlettek meg, nem kezdtk el a run mdszer trzst
vgrehajtani. Ehhez meg kell hvni a Thread osztlybl rklt start mdszert:
first.start(); second.start();

A start mdszer indtja majd el a run trzst. Eztn mr mindkt szl fut, versengve az egyetlen kzponti egysgrt. Hogy
nagyobb legyen a tlekeds, a fenti kettn tl van mg nhny szl, amire taln nem gondoltunk: a fprogram - a main
statikus eljrs trzse - is egy szl, st a trgazdlkodshoz szksges szemtgyjts is prhuzamos tevkenysgknt
valsul meg.
A Thread osztlynak van mg nhny konstruktora, taln emltst rdemelnek azok a konstruktorok, ahol egy String
paramterben nevet is adhatunk a szlunknak, amit pl. a nyomkvetsnl jl hasznlhatunk. Ezt felhasznlva runk egy
msik konstruktort is:
class MyThread extends Thread
{
...
MyThread (int i, String name) { super(name) ; ID = i; };
...
}
MyThread first = new MyThread(1, "First");

A szlak ltrehozsnak a Thread-bl leszrmaztatson tl van egy msik mdja: a java.lang tartalmaz egy Runnable
interfsz is, amely egyetlen mdszert, a run-t specifiklja. Ha a mi osztlyunk implementlja a fenti interfszt,
ltrehozhatunk egy Thread tpus objektumot, a konstruktornak megadva az objektumunkat, amely a run-t megvalstja. A
fenti plda a rvidsg kedvrt egyetlen szllal az interfszt hasznlva gy nzhet ki:
class MyObj implements Runnable
{
public int ID;
MyThread (int i) { ID = i; };
public void run ()
{ /* a szl tevkenysgnek lersa */ }
};
MyObj firstObj = new MyObj(1);
Thread first = new Thread(firstObj);
first.start();

Egy trkk: ha ksbb nem akarunk sem az objektumra, sem a szlra hivatkozni, azaz megelgsznk azzal, hogy az fut, az
utols 3 sort ssze is vonhatjuk:
new Thread(new MyObj(1)).start();

Melyik ltrehozsi mdszert rdemes hasznlni? Gyakran nincs vlasztsi lehetsgnk, mivel a Jva nem engedlyez
tbbszrs leszrmazst, ha az osztlyunkat ms osztlybl akarjuk leszrmaztatni pl. programkt runk, akkor csak az
interfszen keresztli definci hasznlhat. A Thread-bl kzvetlen leszrmaztatst csak akkor rdemes hasznlni, ha
valamilyen okbl a Thread-bl rklt nhny mdszert - termszetesen a run-on kvl - fell akarunk definilni.

Szlak futsa
A Jva virtulis gp az egyes szlak vgrehajtsa sorn nyomonkveti azok llapott. A kvetkez llapottmeneti
diagramm szemllteti az egyes szlak viselkedst.

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 16 of 20

Az egyes szlak 5 klnbz llapotban lehetnek:








j llapotak az ppen ltrejtt szlak (Thread konstruktora lefutott);


Futsra kszek azok a szlak, amelyek ugyan futhatnnak, de egy msik szl hasznlja a Jva virtulis gpet;
A fut szl utastsait hajtja vgre a virtulis gp;
A vr llapot szlak valamilyen kls vagy bels esemny bekvetkezst vrjk;
A halott llapot folyamatok meglltak, futsuk befejezdtt.

Az egyes llapottmenetek magyarzata:


1. Lehvtk a szl start() mdszert, a szl futsa megkezddhet.
2. A szl stop() mdszert meghvva a szl vgrehajtsa befejezdik, brmelyik llapotban is legyen.
3. A szl vrakozni knyszerl, mert
 valaki a suspend() mdszerrel a szl futst felfggesztette,
 valaki - akr sajt maga - a sleep(long millisec) mdszerrel a megadott ideig vrakoztatja,
 a wait() mdszerrel egy objektumhoz rendelt n. feltteles vltozra vr,
 egy objektumhoz rendelt monitorra vr,
 valamilyen I/O mvelet lezajlsra vr.
4. Bekvetkezett a vrt esemny (a fenti sorrendben):
 valaki a resume() mdszerrel a szl futst tovbbengedte,
 letelt a sleep-ben megadott id,
 a vrt feltteles vltozra kiadtak egy notify() vagy notifyAll() hvst,
 a vrt monitor felszabadult,
 a vrt I/O mvelet befejezdtt.
5. Az temez a futsra ksz szlak kzl kivlaszt egyet s folyatja annak futtatst.
6. A szl a yield() hvssal lemondhat a futs jogrl valamelyik futsra ksz szl javra, illetve az temez is elveheti
az ppen fut szltl a futs jogt.
7. A szl elrte run mdszernek vgt, futsa befejezdik.

temezs
Mint az llapottmeneti diagramnl lttuk, a virtulis gpen megvalstott temez az 5-s s 6-os szmmal jellt
llapottmeneteknl kap szerepet. A Jva nyelv fix priorits preempv temezst definil, egyes architektrkon ez
idosztsos is lehet. Nzzk ennek a magyarzatt:
Minden szl rendelkezik egy, a "fontossgt" meghatroz int szmmal, amelyet rkl az t ltrehoz szltl, de a
setPriority(int newprio) hvssal brmikor be is llthatja a MIN_PRIORITY s MAX_PRIORITY kztti rtkre.
Azrt hvjk a rendszert mgis fix prioritsnak, mivel maga a virtulis gp soha nem mdostja szlak prioritst.
A futsra ksz folyamatok kzl a fut kivlasztsa mindig szigoran a prioritsok alapjn trtnik, a legnagyobb,
illetve az azonos prioritssal rendelkezk kzl a legrgebben vrakoz indul tovbb. Az temezs azrt preemptv,
mert amennyiben az ppen futnl nagyobb priorits szl vlik futsra kssz, akkor a fut megszakad (6-os
tmenet) s a legnagyobb priorits indul tovbb. (Megjegyzs: ez csak nagyobb priorits esetn trtnik, azonosnl
nem!)
Mg egy ilyen preemptv temezs esetn is elfordulhat, hogy a legnagyobb priorits szl kisajttja a virtulis
gpet, ha nem knyszerl vrakozni (3-as tmenet) s a yield() hvssal sem mond le egy idre a futs jogrl. Ezrt
hasznlnak nhny rendszernl idosztsos (time-slicing) temezst. Itt minden szl csak egy adott, maximlis ideig

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 17 of 20

lehet fut llapot, ha az idszelete letelt, a virtulis gp megszaktja s bell a futsra kszek kz, a vele azonos
prioritsak mg. Ez gyakran nagyon knyelmes, de figyelem, gondolom az egyes architektrkon elbukkan
implementcis problmk elkerlse vgett a nyelv nem kveteli meg, hogy az temezs idosztsos legyen! Ha
valaki erre szmt, elfordulhat, hogy a programja nhny architektrn nem helyesen fut. (Ennyit a hres
architektrafggetlensgrl! Nekem ez nagyon nem tetszik, de mit tehetnk, legfeljebb az vigasztal, hogy
vlemnyemmel nem llok egyedl.)
Egyes szlakat a programoz a setDaemon() hvssal "dmonizlhat". A dmonok olyan prhuzamos tevkenysgek,
amelyek ms szlaknak nyjtanak szolglatokat, ltalban vgtelen ciklusban futnak, gyakran arra vrva, hogy ms
szlak kommunikljanak velk. A Jva program addig fut, azaz a virtulis gp addig mkdik, amg van a
rendszerben legalbb egy nem dmon szl.

Szinkronizci s kommunikci
Az eddig megismert mdszerekkel ltrehozhatunk prhuzamosan fut szlakat, de ezek csak akkor igazn
hasznosak, ha sszehangoltan tevkenykednek valamilyen kzs cl rdekben. Ehhez szksges a szlak kztti
szinkronizci s kommunikci. Ezek kzl a szinkronizci a komolyabb feladat, a kommunikcit - ha a
szinkronizci helyesen mkdik - a szlak mr megoldhatjk kzsen hasznlhat objektumokhoz val
hozzfrssel.
Mivel a szlak kzs erforrsokon - pl. a tron - osztoznak., a legfontosabb szinkronizcis problma az n.
klcsns kizrs (mutual exclusion) biztostsa, azaz megolds arra, hogy bizonyos erforrsokat egyidejleg csak
egyetlen szl hasznlhasson, egy msik szl pedig csak akkor frhessen hozz, ha az elz mr konzisztens,
biztonsgos llapotban hagyta.
A klcsns kizrs megvalstsra a Jva a Hoare-fle monitor koncepcit kveti. Minden objektum rendelkezik
egy zrral (lock, monitor) s a programoz elrhatja, hogy bizonyos mdszerek vgrehajtsa csak akkor kezddhet
meg, ha az objektum szabad. Ez a mdszer fejben hasznlt synchronized mdostval trtnik. Az ilyen mdon
definilt mdszer meghvsa eltt a hv szl megprblja az objektumhoz - statikus mdszer esetn az osztlyhoz tartoz zrat lefoglalni. Amennyiben senki nem hasznlja a zrat, akkor elkezdi a mdszer vgrehajtst,
termszetesen ezzel kizrva az sszes tbbi verseng szlat. Amennyiben viszont foglaltnak tallja a monitort, akkor
vrakozni kezd. Kivtelt kpez az az eset, ha a monitort ugyanez a szl tartja lefoglalva, ilyenkor a futs
tovbbhaladhat, a Jva monitorja jrabelphet (reentrant).
Miutn a mdszer lefutott, kilpskor a szl felszabadtja a zrat, szksg esetn tovbbindtva - futsra kssz tve egyet a zrra vrakozk kzl. A programoznak kln meg kell mondania, hogy melyek azok a mdszerek vagy
kdrszletek, amelyek vgrehajtshoz kizrlagossgot kell biztostani. (Megjegyzs: a nyelv a "szinkronizci"
fogalmt sajnos az irodalomban elterjedtnl szkebben, a klcsns kizrs szinonimjaknt hasznlja. Ezentl, br
nem tetszik, de n is kvetem ezt a terminolgit.)
A szinkronizlt mdszerhvs alternatvjaknt hasznlhatunk szinkronizlt kdrszletet is, ahol a
synchronized (obj) { /* szinkronizland ... */ }

kdrszletet a paramtereknt megadott objektum - s nem a this, mint fentebb - zrja vdi. Termszetesen mindkt
mdon a programoz felelssge annak megllaptsa, hogy melyik mdszereket, kdrszletet kell vdeni, az itt
elkvetett hibkat a fordtprogram nem tudja kiszrni.
A monitor koncepciban megvalsul automatikus, a programoz ell rejtett implementcij klcsns kizrs
sajnos az egyttmkd szlakhoz ltalban nem elg, kell olyan eszkz is, amelyikkel egy szl bevrhatja, amg
egy msik elr tevkenysgnek adott pontjra. Erre szolgl a monitor koncepcit kiegszt, a Hoare-fle feltteles
vltoz (conditional variable). Minden Jva objektumhoz tartozik egy ilyen feltteles vltoz, amire lehet vrakozni
(wait()), illetve egyetlen (notify()) vagy az sszes (notifyAll()) vrakozt tovbb lehet indtani.
Mind a wait, mind a notify mdszert csak szinkronizlt mdszerekben lehet hvni. Wait esetn az azt kiad szl
vrakozni kezd a szinkronizlt objektum feltteles vltozjra, s ezzel egytt - ideiglenesen - felszabadtja a
monitort, hogy msik mdszer is futhasson. Egy szinkronizlt mdszerben kiadott notify kivlaszt az adott
objektumra vrakoz szlak kzl egyet, s azt futsra kssz teszi. Mikor a monitor legkzelebb felszabadul, a
tovbbindtott szl jra megszerzi, azaz lefoglalja a monitort, s folytatja a futst.
A wait mdszerben vrakoz szlat csak egy notify vagy notifyAll mozdthatja ki, de ltezik a wait-nek egy
paramteres, idztett vltozata is, ahol a szl legfeljebb a paramterben millisecundum mrtkegysgben megadott
idtartamon keresztl vrakozik. Ilyen wait-bl felbredve a szlnak meg kell gyzdnie arrl, hogy vajon egy notify
avagy az id lejrta miatt bredt-e fel.

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 18 of 20

Programkk
A Jva programozsi nyelv legnagyobb jtsa, rohamos terjedsnek oka, hogy kitalltk a programkkat (applet),
olyan Jva programokat, amelyeket a Web-en bngszve egy Web oldallal egytt letltnk a sajt szmtgpnkre,
majd az itt nlunk futni kezd. Egy ilyen program letet lehelhet a statikus Web oldalakba, a szerver kzremkdse
s a hlzat a terhelse nlkl pldul animcit jelenthet meg, illetve gyakran egy kliens-szerver programrendszer
klienseknt a szerver fel tart adatok elfeldolgozst, a vlaszok intelligens megjelentst vgezheti.
Programkkat alkalmazva lehetsg nylik a Web bngszk szolgltatsainak, kpessgeinek akr dinamikus,
ignyeknek megfelel bvtsre is.

Klnbsgek a programkk s a programok kztt


A Jva programok nllan futnak, kzvetlenl az opercis rendszer s az erre pl Jva virtulis gp felgyelete
alatt. A programkk hlzaton keresztli betltst s futtatst viszont egy Web bngsz program vgzi, a
programkk futsi krnyezete maga a bngsz. (A Jva fejleszti rendszerek tartalmaznak ugyan a programkk
kiprblsra segdprogramokat, mint pl. a SUN appletviewer-e, m ezek egy bngsznek pontosan megfelel
krnyezetet biztostanak.)
A programkk sokat profitlnak ebbl az albrletbl, hasznlhatjk a bngszben meglv teljes programinfrastruktrt: a Web oldalbl kihasthatnak maguknak terleteket, ahova rajzolhatnak, felhasznlhatjk a bngsz
grafikus-, multimdia s pl. HTML megjelentsi szolgltatsait, kezeli fellet elemeit, esemnykezelst, hlzati
kommunikcijt. Igaz, hogy lehet olyan nll Jva alkalmazst rni, amely egy programknak megfelelen
viselkedik, m egy ilyen krnyezet fellltsa viszonylag nagy munkt ignyel, a programkk viszont mindent
kszen kapnak.
Azonban, akrcsak egy valdi albrletben, a programkk itt is korltokba tkzhetnek. A tvoli szmtgprl
vatlanul gyakran a hln barangol tudta nlkl letlttt s a helyi szmtgpen futni kezd programok sokakban
jogosan a vrusok rmkpt idzik. Ezrt a bngsz szigoran korltozza a felgyelete alatt fut programkkat,
megakadlyozza, hogy potencilisan veszlyes tevkenysget hajtsanak vgre. gy pldul a Jva nyelvbe mr
amgyis beptett biztonsgi rendszeren, konzisztencia ellenrzsen tl a programkk:
 nem, vagy csak nagyon szigoran korltozva frhetnek hozz a helyi llomnyrendszerhez;
 csak azzal a szerverrel, az ott fut programokkal vehetik fel a kapcsolatot, ahonnan letltdtek;
 nem indthatnak el a helyi gpen lv programokat, nem tlthetnek be helyi programknyvtrakat.
Sokak szerint a fenti megktsek tlsgosan szigorak, de amg a Jva rendszerbe nem kerlnek be a programkk
mdosthatatlansgt, megbzhat azonostst lehetv tev titkostsi algoritmusok - dolgoznak rajtuk -, addig
nincs mit tenni, mint szigoran kulcsra zrni az sszes olyan kiskaput, ahol rosszindulat programkk beszivrogva
belerondthatnak a szmtgpnkbe.

A programkk szerkezete
Programkk rshoz a Jva nyelv kln pakkot (java.applet) s kln osztlyt (Applet) tartalmaz, sajt
programknkat ebbl kell - mgpedig nyilvnosan - leszrmaztatnunk. Teljessg ignye nlkl ismertetek nhny
fontosabb, felldefinilhat mdszert.

A futs vezrlse
Mg a Jva programok betltse utn a main statikus mdszer indul el, addig a programkk esetben a bngsz
biztostja azt, hogy megfelel esemnyek bekvetkeztekor meghvja a leszrmazott osztly az Applet-ben meglvt
felldefinil mdszereit. Persze nem kell minden itt ismertetett mdszert felttlenl felldefinilni ezek az Applet
osztlyban nem absztrakt, hanem ltez, de res trzs mdszerek. Az egyszer pldaprogramunknak sem lesz
mindegyikre szksge.
A programka futsnak vezrlsre az init, start, stop s destroy mdszerek szolglnak, valamennyien paramter
nlkliek. Az init trzse a programka letltsekor fut le, itt vgezhetk el a kezdeti belltsok. Rgtn az init utn a
start is lefut, de a start mdszert akkor is meghvja a bngsz, ha jra akarja indtani a programkt. A stop mdszer
a programka futsnak lelltsra szolgl. Tipikus, hogy egy HTML oldalt letltve betltdnek az ott lv
programkk is, majd lehvdik ezek init s start mdszere. Ha ezutn bngszs kzben tovbblpnk errl az
oldalrl, akkor az sszes ott fut programka stop mdszere is lehvsra kerl. Ha visszatrnk a lapra, akkor mr
csak a start-ok indulnak el, az init nem.
Ha a stop mdszert resen hagyjuk, a lapot elhagyva a programknk folytathatja a mkdst, ezzel esetleg
feleslegesen hasznlva rendszer erforrsokat. A stop-ban gondoskodhatunk rla, hogy a programka mkdse

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 19 of 20

felfggesztdjn.
Vgezetl a destroy mdszer lehetv teszi, hogy a programka lellsa eltt felszabadtsa az sszes ltala lefoglalt
specilis erforrst, tisztn s rendben hagyja itt a vilgot. A destroy-t pl. a bngsz lellsa, vagy egy fut
programka jra betltse eltt hvja meg.
Br a bngszk tipikusan egy-egy szlat alloklnak a letlttt oldalon lv minden programkhoz s ebbl a szlbl
hvjk meg a programkt vezrl mdszereket, de ez nem zrja ki, hogy a programknk vgrehajtsa kzben maga is
ltrehozzon szlakat. Szlak hasznlata tipikus a folytonos animcit biztost programkknl, de clszer a hossz
ideig tart inicializlst - pl. nagy mret kpek hlzatrl letltst - is egy prhuzamosan fut szllal megoldani.

Rajzols
A paint mdszer, amelynek egy java.awt.Graphics osztlyba tartoz paramtere is van, szolgl arra, hogy a
programka a bngsz ltal megjelentett lap terletre "rajzoljon", azaz szveget, grafikt jelentsen meg. A
bngsz feladata, hogy ezt a mdszert lehvja mindig, amikor a programka ltal hasznlt terletre rajzolni kell, pl.
init utn, vagy ha a bgsz ablaka lthatv vlik, mrete megvltozik, ms helyre kerl a kpernyn, stb.
Ha a programka sajt maga akarja kezdemnyezni a rajzolst, akkor meghvja a repaint mdszert, amely hatsra a
bngsz egy alkalmas idpontban meghvja a programka update mdszert. Az update is az Applet-bl rkldik,
amennyiben nem definiltuk jra, egyszeren paint-et hv, de felldefinilva lehetsgnk van pldul kihasznlni
azt, hogy a programka mr felrajzolta, amit akart, neknk elg a meglv kpen mdostanunk.
Klnsebb magyarzat nlkl kzlk egy egyszer pldt, a szoksos "Hello vilg" programka vltozatt. A
programkban van egy kis csavar: kpes tvenni az t tartalmaz laprl egy paramtert, gy a "world" helyett ezt a
szveget rja majd ki, persze, ha ltezik egyltaln ilyen paramter. A feladat egyszersge miatt elg csak az init-et
s a paint-et definilni.
import
import
import
import

java.applet.Applet;
java.awt.Graphics;
java.awt.Font;
java.awt.Color;

public class HelloWorldApplet extends Applet


{
Font f = new Font("TimesRoman", Font.BOLD, 36);
String name;
public void init()
{
name = getParameter("name");
if (name == null) name = "World";
name = "Hello " + name + "!";
}
public void paint(Graphics g)
{
g.setFont(f);
g.setColor(Color.red);
g.drawString(name, 5, 50);
}
}

Programkk egy Web oldalon


Ahhoz, hogy a programknk egy Web oldallal egytt letltdjn s elinduljon, a lapot ler HTML dokumentumot
ki kell egszteni a programka, annak elhelyezkedsnek, esetleges paramtereinek megadsval. Erre a clra szolgl
a <APPLET> HTML tag.
Remlem a pldm hasznlathoz szksges, itt kzlt HTML lap klnsebb magyarzatok nlkl is rthet.
<HTML>
<HEAD>
<TITLE>Hello!</TITLE>
</HEAD>
<BODY>
<P>
<APPLET CODE="HelloWorldApplet.class" WIDTH=300 HEIGHT=50>
<PARAM NAME=name VALUE="Pisti">
Hello to whoever you are!

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

A Jva programozsi nyelv rejtelmei

Page 20 of 20

</APPLET>
</BODY>
</HTML>

Szeretnm felhvni a figyelmet a "Hello to whoever you are!" szvegre. Az <APPLET> tag defincija szerint
annak lezrsa eltt szerepl brmilyen, nem a programka lershoz tartoz szveget azok a bngszk jelentik
meg, amelyek nem kpesek programkk futtatsra. gy ezt a plda lapot olvasva mindenki ltna valamit, a
szerencssebbek nagy piros betkkel azt, hogy
Hello Pisti!

a kevsb szerencssek csak azt, hogy


Hello to whoever you are!

de azrt k se csggedjenek!
Kiprblod?
Kiss Istvn
updated: 96/06/30, http://www.eunet.hu/infopen/cikkek/java/javaprog.htm

http://www.cab.u-szeged.hu/WWW/java/kiss/javaprog.html

2008.03.04.

You might also like