Professional Documents
Culture Documents
Java Technologijos
Java Technologijos
5LPDQWDV%HOHYLþLXV
JAVA TECHNOLOGIJOS
Mokomoji knyga
Vilnius 2005
5LPDQWDV %HOHYLþLXV Java technologijos. Mokomoji knyga. Vilnius: Technika,
2005. 190 p.
/HLGLQ³UHNRPHQGDYR9*78)XQGDPHQWLQLÐPRNVOÐIDNXOWHWRVWXGLMÐNRPLWHWDV
ReFHQ]DYRSURIKDELOGU5ýLHJLVLUGRFGU'0DåHLND
9*78OHLG\NORVÄ7HFKQLND³PRNRPRVLRVOLWHUDWÌURVNQ\JD
2
TURINYS
3UDWDUP¡ 5
²YDGDV 6
Trumpa Java istorija 9
3DJULQGLQLDLNDOERVEUXRåDL 10
Java programavimo instrumentai 11
1. JAVA ELEMENTAI 13
1.1. Kalbos konstrukcijos 13
1.2.2EMHNWÐNÌULPDVLUGDUEDVVXMDLV 13
1.3. Primityvieji duomenys 14
1.4.,GHQWLILNDWRULÐPDWRPXPRVULW\V 15
1.5..ODV¡V 16
1.6.6WDWLQLDLNODVLÐODXNDLLUPHWRGDL 17
1.7.9HLNVPÐRSHUDWRULDL 17
1.8.,ãYHVWLV³SXOW 18
1.9.3DSUDVþLDXVLÐDXWRQRPLãNRVSURJUDPRVLUNOLHQWLQ¡V
programos pDY\]GåLDL 19
2. JAVA6,17$.6 ,â6$0,$8 23
2.1.6O\JRVRSHUDWRULDL 23
2.2. Selektorius 23
2.3. Ciklai 24
2.3.1.&LNOÐå\P¡MLPDV&LNOÐQXWUDXNLPDV 25
2.4. Metodas – konstruktorius. Konstruktoriaus ir metodo
perkrovimas 26
2.5.5DNWDåRGLVthis 30
2.6.2EMHNWÐQDLNLQLPDV 31
2.7.3UDGLQLÐUHLNãPLÐVN\ULPDV 32
2.8.3UDGLQLÐUHLNãPLÐSULHVN\UDPDV\YDPV 33
2.9.9DUGÐODXNÐPHWRGÐLUNODVLÐVO¡SLPDV 34
2.9.1. Paketai 34
/DXNÐLUPHWRGÐVO¡SLPDV 36
.ODVLÐVO¡SLPDV 37
2.10. .RGRIUDJPHQWÐNDUWRMLPDVNRPSR]LFLMDLUSDYHOGLPXPDV 37
2.10.1. 6LQWDNV¡.RQVWUXNWRULÐY\NG\PDV 37
2.10.2. .\ODQW\VLVWLSÐSHUWYDUN\PDV 40
2.10.3. 5DNWDåRGLVfinal ir paveldimumas 40
2.11. Polimorfizmas 41
2.12. %HVLOHLGåLDQW\VLVWLSÐSHUWYDUN\PDV 44
2.13. $EVWUDNþLRVLRVNODV¡VLUPHWRGDL 45
2.14. 6VDMÐNODV¡V 46
2.15. 9LGLQ¡VNODV¡V 48
2.16. .ODLGÐDSGRURMLPRPHFKDQL]PDV 51
2.16.1. Operatoriai try ir catch 52
2.16.2. Operatorius throw 53
2.16.3. Operatorius throws 54
2.16.4. Operatorius finally 55
.DLNXULRVYLGLQ¡VJava išimtys 55
3
2.17. ²YHVWLHVLULãYHVWLHVVLVWHPRVSDJULQGDL 57
2.18. 6DYLDQDOL]¡VVLVWHPD 62
2.19. Vykdymo srautai 65
2.19.1 SraXWRVLQWDNV¡ 66
6UDXWÐVLQFKURQL]DYLPDV7DUSVUDXWLQLDLU\ãLDL 73
2.20. Kolekcijos 75
2.20.1. .ROHNFLMÐKLHUDUFKLMD 76
2.20.2. Collection kolekcijos 77
2.20.3. Map OHQWHO¡V 83
2.20.4. Collections NODV¡VDOJRULWPDL 84
3. JAVA TECHNOLOGIJOS 86
3.1..OLHQWLQ¡VSURJUDPRVSwing technologija 86
%HQGURVLRVåLQLRVDSLHNOLHQWLQHVSURJUDPDV 86
.OLHQWLQ¡VSURJUDPRVDUFKLWHNWÌUD 88
²Y\NLÐDSGRURMLPRVLVWHPD 89
.OLHQWLQLÐSURJUDPÐSDY\]GåLDL 93
3.1.5. Baziniai grafiniai komponentai 98
.RPSRQHQWÐLãG¡VW\PRNRQWHLQHU\MHWYDUN\NO¡V 100
3.1.7. Kai kurie Swing komponentai 101
.OLHQWLQLÐSURJUDPÐDUFK\YDYLPDV 109
3.2. Java Beans technologija 110
3.3. Bazinis tinklinis programavimas 112
5\ã\VWDUSGYLHMÐNRPSLXWHULÐWLQNOH 112
3.3.2. Ryšys tarp HTTP serverio ir kliento 120
3.4.6HUYHULQ¡VSURJUDPRV 122
%HQGURVLRVåLQLRVDSLHVHUYHULQHVSURJUDPDV 122
6HUYHULQ¡VSURJUDPRVJ\YDYLPRFLNODV 124
3.4.3. Servlet $3,VVDMÐNODV¡VNODV¡VLUPHWRGDL 125
3.4.4. JSP technologija 133
3.5. RMI technologijos pagrindai 134
3.6.%HQGURVLRVåLQLRVDSLH&25%$WHFKQRORJLM 137
/,7(5$7Ë5$ 141
35,('$,3URJUDPÐSDY\]GåLDLLUVDYDUDQNLãNRGDUERXåGXRW\V 142
4
3UDWDUP¡
5
²9$'$6
6
QXURGR &*, N GDU\WL VX DWVLÐVWDLV GXRPHQLPLV -XRV JDOL DSGRroti pati CGI
SURJUDPD NXUL GDåQLDXVLDL UDãRPD Perl kalba, tiesiogiai skirta tekstui apdoroti arba
peradresuoti kitai kompetentingai programai.
'DXJ ZZZ VHUYHULÐ LU ãLXR PHWX IXQNFLRQXRMD &*, SDJULQGX -Ð SDJULQGLQLV
WUÌNXPDV – našumo problemos. Šios probOHPRV VSUHQGLPR EÌGDV – programavimas
NOLHQWR PDãLQDL SDYHGDQW QDUã\NOHL YLV ³PDQRP GDUE NOLHQWR SXV¡MH 9LHQDV Lã
NOLHQWLQLR SURJUDPDYLPR EÌGÐ – SO¡WLQLÐ PRGXOLÐ QDUã\NO¡PV plug-ins) rašymas.
3O¡WLQ\V VXWHLNLD QDUã\NOHL SDSLOGRPDV IXQNFLMDV QXR WR PRmento, kai jis yra
³GLHJLDPDV )DNWLãNDL SO¡WLQLDL DWY¡U¡ NHOL NXUWL QDXMDV NOLHQWLQLR SURJUDPDYLPR
kalbas –YDGLQDPVLDVVFHQDULMÐNDOEDV7RNLDNOLHQWLQ¡SURJUDPDWLHVLRJ³WHUSLDPD³
+70/ SXVODS³ R M DSGRURMDQWLV PRGXOLV DXWRPDWLãNDL VXDNW\YLQDPDV SHUåLÌULQW
SXVODS³ /DELDXVLDL SDSOLWXVL VFHQDULMÐ NDOED PDW\W \UD JavaScript, palaikoma tiek
Internet Explorer, tiek Netscape NavigatorQDUã\NOLÐ7RNVVSUHQGLPDV\UDJUHLWDVLU
GDåQLDXVLDL QDXGRMDPDV JUDILQ¡PV YDUWRWRMR VVDMRPV *8, Graphical User
InterfaceSDWREXOLQWL/DLNRPD%(FNHOLVNDGWDLSLãVSUHQGåLDPD% klientinio
SURJUDPDYLPRXåGDYLQLÐ
/LNXVLHPV XåGDYLQLDPV GDEDU SRSXOLDULDXVLDV VSUHQGLPR ³UDQNLV \UD Java,
WXULQWLYLVDVVFHQDULMÐJDOLP\EHVLUHVDQWLYLVDYHUW¡GDXJLDVUDXW¡SURJUDPDYLPRkalba
VXLãSO¡WRWRPLVED]LQLRWLQNOLQLRSURJUDPDYLPRVVDMRPLVLãVNLUVW\WRVNDLþLDYLPREHL
U\ãLR VX GXRPHQÐ ED]¡PLV VVDMRPLV .OLHQWLQLV SURJUDPDYLPDV Java – tai
YDGLQDPÐMÐ NOLHQWLQLÐ SURJUDPÐ applets UDã\PDV .OLHQWLQ¡ SURJUDPD – paprastai
QHGLGHO¡SURJUDPDY\NGRPDQDUã\NO¡VYLGXMH3URJUDPD³NHOLDPDNDLSZZZSXVODSLR
GDOLV -³ VXDNW\YLQXV Y\NGRPD SURJUDPD âLÐ SURJUDPÐ SDWUDXNOL VDY\E¡ –
nepriklausomumas nuo kompiuterio platformos. Programos apdorojamos dviem
HWDSDLV SLUPLDXVLD NRPSLOLXRMDPRV ³ EDLWNRG EÌWHQW EDLWNRGDV LU QHSULNODXVR QXR
NRPSLXWHULR DUFKLWHNWÌURV EÌWHQW MLV VLXQþLDPDV WLQNOX QDUã\NOHL R M³ LQWHUSUHWXRMD
virtuali Java mašina (JVM, Java Virtual MachineNXULSDODLNRGDXJXPDQDUã\NOLÐ
-HLNOLHQWLQ
SURJUDPVXGDURNHOLPRGXOLDLNODV¡VWDLMRVLXQWLPXLWLQNOXSDJUHLWLQWL
YLVL PRGXOLDL VXJODXGLQDPL ³ YLHQ YDGLQDPM -$5 Java ARchive ULQNPHQ LU ML
VLXQþLDPD 6DXJXPR VXPHWLPDLV NOLHQWLQ¡V SURJUDPRV WXUL JULHåWXV DSULERMLPXV
darbui su klientinio kompiuterio ištekliais: pavyzGåLXLWRNLDSURJUDPDQHWXULSULHLWLHV
WHLVLÐSULHNOLHQWLQLRNRPSLXWHULRNLHWRMRGLVNRQHLVNDLW\WLQHL³UDã\WL
.LWDV NOLHQWLQLR SURJUDPDYLPR ³UDQNLV \UD Microsoft ActiveX technologija,
OHLGåLDQWL SULMXQJWL SURJUDPLQLXV PRGXOLXV SULH ZZZ SXVODSLR LU MXos vykdyti.
7
7HFKQRORJLM SDODLNR Internet Explorer ir Netscape Navigator QDUã\NO¡V ActiveX –
savarankiški programiniai komponentai, kuriami kompanijos Microsoft (MsSDVLÌO\WD
technologija COM (Common Object Model WROLDX Y\VWDQþLD REMHNWLQLR
programavimRLG¡MDV.RPSRQHQWDLJDOLEÌWLY\NGRPLWLNNLWÐDSOLNDFLMÐ-NRQWHLQHULÐ
YLGXMH LU SUDWXUWLQD MÐ IXQNFLQHV JDOLP\EHV 7RNLÐ NRQWHLQHULÐ SDY\]GåLDL \UD Ms
Visual Basic, Ms Access, Ms Internet Explorer ,ã NRPSRQHQWÐ NDLS Lã VWDW\ELQLÐ
EORNÐ JDOL EÌWL PRQWXRMDPRV LU NLWRV DSOLNDFLMRV 7DUNLPH NDWDORJÐ PHGåLXL
DWYDL]GXRWLNXULRMHQRUVJUDILQ¡MHDSOLNDFLMRMHJDOLPDUDVWLLUSDQDXGRWLGDXJHOLRILUPÐ
platinamus ActiveXNRPSRQHQWXVWDLSVXWDXSDQWSURJUDPXRWRMRODLN
²+70/SXVODS³WRNLHNRPSRQHQWDL³YHGDPLVDNLQyje <OBJECT!WXULQþLDPH
SDUDPHWUXV &/6,' XQLNDOLDP NRPSRQHQWR LGHQWLILNDYLPR QXPHULXL ³G¡WL LU
<CODEBASE> – komponento rinkmenos URL (Uniform Resource Locator, unikalus
rinkmenos adresas tinkle) adresui.
3DJULQGLQ¡SUREOHPDQDXGRMDQWActiveX komponentus HTML dokumentuose,
\UD NOLHQWR NRPSLXWHULR VDXJXPR XåWLNULQLPDV -HL NOLHQWLQ¡V SURJUDPRV G¡O VDYR
SULJLPWLHV QHJDOL SDGDU\WL åDORV NOLHQWXL WDL ActiveX NRPSRQHQWDL WXUL SULHLJ SULH
NOLHQWR NRPSLXWHULR DWPLQWLHV 6DXJXP VWHQJLDPDVL XåWLNULQWL QDXGRMDQW
NRPSRQHQWDPV VNDLWPHQLQLXV SDUDãXV ²GLHJLDQW QDXM NRPSRQHQW ³ NRPSLXWHU³
QDUã\NO¡GLDORJRODQJHXåNODXVLDYDUWRWRMRDUNRPSRQHQWUHLNLD³NHOWLDUQH/DQJH
QXURGRPDNDVVXNÌU¡NRPSRQHQWNDVSODWLQDNDVQXVWDW¡NRPSRQHQWRDXWHQWLãNXP
(viena tokiÐ RUJDQL]DFLMÐ LãGXRGDQþLÐ DXWHQWLãNXPR VHUWLILNDWXV \UD VeriSign,
www.verisign.com 0DW\W NLHNYLHQDP \UD WHN
PDW\WL WRNLXV ODQJXV ³GLHJLDQW
programas Windows genties OS.
Serverinis programavimas. .OLHQWÐ XåNODusos serveryje apdorojamos tam
tikromis programomis, tradiciškai CGI ir Perle 7DþLDX ZZZ-VHUYHULDL JDOL EÌWL
rašomi ir Java WRNLRV SURJUDPRV YDGLQDPRV VHUYHULQ¡PLV SURJUDPRPLV DQJO
servlets), ir naudojant Java serverinius puslapius (JSP, Java Server Pages).
3DJULQGLQLV WRNLÐ VSUHQGLPÐ SUDQDãXPDV \UD VHUYHULR QHSULNODXVRPXPDV QXR
NRPSLXWHULÐWLSR
6DYDUDQNLãNÐ SURJUDPÐ UDã\PDV -DYD Java – patogi programuoti kalba.
Teigiama, kad JavaSDUDã\WLSURJUDPJDOLPDGDXJJUHLþLDXQHL&NDOED(VPLQLV
Java trÌNXPDV ãLRMH VULW\MH – QDãXPDV *DOLPL SUREOHPRV VSUHQGLPR EÌGDL \UD WDP
WLNURV SDJUHLWLQDQþLRV WHFKQRORJLMRV hotspot JDOLP\E¡ QDXGRWL SURJUDPRMH NLWRPLV
NDOERPLVSDUDã\WXVPRGXOLXVJDOLP\E¡DWVLVDN\WLQHSULNODXVRPXPRQXRNRPSLXWHULÐ
8
DUFKLWHNWÌURV LU NRPSLOLXRWL SURJUDP WDP WLNULHPV NRPSLXWHULÐ WLSDPV 6SDUþLDL
HYROLXFLRQXRMDQWNDOEDLNLHNYLHQDDXNãWHVQ¡JavaYHUVLMDWDPSDYLVJUHLWHVQ¡
9
vykdoma tik su naršykle. Panašios yra Visual Basic Script, AppleScript VFHQDULMÐ
kalbos. Paplitus Java, Sun Microsystems sutikus, Netscape Communications
SHUYDUGLMR VDYR NDOE ³ JavaScript. Taigi Java ir JavaScript JHQH]¡ \UD YLVLãNDL
skirtinga.
3DJULQGLQLDLNDOERVEUXRåDL
10
(baitkodas nepriklauso nuo kompiuterio platformos), o šis
interpretuojamas virtualios Java mašinos JVM.
8. Saugumas. Java NOLHQWLQ¡V SURJUDPRV QHWXUL SULHLWLHV SULH NOLHQWLQLR
NRPSLXWHULRDWPLQWLHVVDNRPDNDGMLHY\NGRPLQDUã\NO¡VÄVP¡OLRG¡å¡MH³
– yra tam net specialus angliškas terminas sandboxing<UDLUÄSDWLNLPг
VNDLWPHQLQLX SDUDãX DSUÌSLQWÐ NOLHQWLQLÐ SURJUDPÐ QHWXULQþLÐ WRNLÐ
ULERMLPÐ 3DQDãLDL QLHNR NHQNVPLQJR VHUYHULR PDãLQDL QHJDOL SDGDU\WL LU
ÄQHSDWLNLPRV³VHUYHULQ¡VSURJUDPRV
11
âLгUDQNLÐQDXGRMLPDVDSUDã\WDVWHNVWH
Kurse naudosime Java NODVHVLããLÐNODVLÐSDNHWÐ
- java.lang –ED]LQLÐNDOERVNODVLÐSDNHWDV
- java.io – Javos³YHVWLHVLULãYHVWLHVNODVLÐSDNHWDV
- java.util –SDJDOELQLÐJavaNODVLÐSDNHWDV
- java.awt, java.awt.event – Java³Y\NLÐDSGRURMLPRNODVLÐSDNHWDL
- java.net –NODVLÐGDUEXLVXWLQNOXUHDOizuoti paketas;
- javax.swing –SDNHWDVJUDILQ¡PVYDUWRWRMRVVDMRPVNXUWL
- javax.servlet, javax.servlet.http – SDNHWDL VHUYHULQLÐ SURJUDPÐ NÌULPR
NODV¡PV
12
1. J A V A E L E M E N T A I
2EMHNWÐNÌULPDVLUGDUEDVVXMDLV
String s; –VXNXULDPDURG\NO¡³StringWLSRREMHNWMLQHQXWDLN\WD³MRN³
REMHNW WRG¡O WXUL UHLNãP
null LU MDL QHJDOLPD SDVLÐVWL MRNLR
pranešimo – bus deklaruota kompiliavimo klaida.
String s = new String( “abc” ); – þLD RSHUDWRULXV new VXNXULD LU SDW³
REMHNW LU QXWDLNR URG\NO
³ REMHNWR
DWPLQWLHVVULWLHVSUDGåL
13
Visi objektai saugomi kompiuterio operatyviosios atminties srityje heap.
.RPSLOLDWRULXVQHåLQRQHLNRNLHREMHNWDLEXVVXNXUWLNRGRY\NG\PRPHWXQHLNLHNMÐ
bus. Atmintis objektams skiriama dinamiškai, kodo vykdymo metu operatoriaus –
metodo-konstruktoriaus new pagalba. Tai – lanksti VLVWHPDWDþLDXO¡WD
,ãSURJUDPRVQH³PDQRPDNUHLSWLV³NRPSLXWHULRUHJLVWULQ
DWPLQW³SURFHVRULDXV
YLGXMHDU³G¡NOLQ
DWPLQW³stackRSHUDW\YLRMRMHDWPLQW\MH7DþLDXNRPSLOLDWRULXVJDOL
VXG¡WL³G¡NOLQ
DWPLQW³URG\NOHV³REMHNWXV
Jei objektas ar kuris nors jo laukas yra statinis – deklaruotas su
modifikatoriumi static MLV GHGDPDV ³ YDGLQDPM VWDWLQ
RSHUDW\YLRVLRV DWPLQWLHV
WDOS\NO – YLVR NRGR Y\NG\PR PHWX GXRPHQLXL VNLUWRML DWPLQWLV \UD DSLEU¡åWRMH
operatyviosios atminties vietoje.
9LVLDULWPHWLQLDLGXRPHQ\VWXULåHQNO
6WDQGDUWDV ,((( UHDOL]XRWDV GDXJHO\MH SURJUDPDYLPR NDOEÐ QXVWDWR
WRNLDVUHDOLÐMÐVNDLþLÐFKDUDNWHULVWLNDVYLHQJXERWLNVOXPRGXRPHQÐWLNVOXPDV yra 6–
7 reikšminiai skaitmenys, kitimo diapazonas yra iki ~+/–H PDåLDXVLD VNLUWLQJD
QXR PDãLQRV QXOLR UHLNãP¡ \UD a–10e–38. Dvigubo tikslumo duomenims
analogiškos charakteristikos: 15– UHLNãPLQLÐ VNDLWPHQÐ a–10e308 ir ~+/–10e–
308.
$WLWLQNDPÐWLSÐOLWHUDODLXåUDãRPLWDLS
14
float SDY\]GåLXL 1.2f arba 1.2F, arba eksponentine
forma 1.2e0f, 12e-1f ir pan.
double SDY\]GåLXL 1.2 arba 1.2d ar 1.2D, arba eksponentine
forma 1.2e0 ir pan.
char VLPEROLÐ UHLNãP¡V DSLPDPRV µ µ Specialieji simboliai
XåUDãRPL WDLS QDXMD HLOXW¡ – \n , ‘ – \’ , \ – \\ ,
tabuliatorius – \t ir t. t.
'DåQDL SULH SULPLW\YLÐMÐ GXRPHQÐ SULVNLULDPD LU Java YLGLQ¡ NODV¡ String -
HLOXWLQLRWLSRGXRPXR-RVOLWHUDODVXåUDãRPDVWDUSDQJOLãNÐNDEXþLÐVLPEROLг³
7DLJLYLHQVLPERO³NRGHJDOLPDVDXJRWLLUNDLSSULPLW\YÐM³GXRPHQ³char, ir
NDLSNODV¡VCharacterREMHNW
char c = ‘a’;
Character cClass = new Character( ‘a’);
,GHQWLILNDWRULÐPDWRPXPRVULW\V
$QJOLãNDL WDL YDGLQDPD YLHQX åRGåLX scope. 6ULWLV DSLEU¡åLD WLHN YDUGR
PDWRPXP WLHN LU MR J\YDYLPR ODLN )DNWLãNDL þLD DSWDULDPD PDWRPXPR VULWLV
metoduose aSLEU¡åWLHPV YDUGDPV NODVLÐ NÌQXRVH DSLEU¡åWÐ YDUGÐ VULW\V SDNOÌVWD
VSHFLDOLHPVPRGLILNDWRULDPVSDY\]GåLXLpublic ar privateNXULHEXVDSWDUWLY¡OLDX
0DWRPXPRVULW³DSLEU¡åLDVNOLDXVWDL{ }.
3DY\]GåLXL
{ int x = 1;
þLD[\UDPDWRPDVLUSULeinamas
{ int y = 2;
þLDPDWRPL[LU\
}
þLDPDWRPDV[R\QHPDWRPDV
}
þLDQHPDWRPLQHL[QHL\
Java QHOHLGåLD ³G¡WLQ¡MH YLGLQ¡MH PDWRPXPR VULW\MH QDXGRWL WR SDWLHV YDUGR
3DY\]GåLXLWDL\UDNODLGLQJDVIUDJPHQWDV
{ int x = 1;
{ int x = 2; } }
15
PDWRPXPRVULWLHVSDEDLJDýLDQHEHOLNVURG\NO¡VVWDþLDXREMHNWDV³NXU³
DQNVþLDX URG¡ URG\NO¡ LãOLHND -DP VNLUWD DWPLQWLV EXV JUåLQWD RSHUDFLQHL Vistemai
WLN SR WR NDL VDYR GDUE DWOLNV ÄãLXNãOLÐ ULQNWXYDV³ SHULRGLãNDL SHUåLÌULQWLV NRGXL
VNLUWDWPLQW³LUVXUHQNDQWLVDWPLQW³REMHNWгNXULXRVQHURGRMRNLDQXRURGD
.ODV¡V
.ODV¡GHNODUXRMDPD
.ODV¡VNÌQHJDOLEÌWLNODV¡VNLQWDPLHML–ODXNDLLUPHWRGDL6XNÌUXVREMHNWMR
laukais operuojama taip:
class DataOnly {
int i;
float f;
}
...
DataOnly d = new DataOnly( );
d.i = 1;
d.f = 1.2f;
...
-HL NODV¡V ODXNDV \UD NLWRV NODV¡V REMHNWDV WDL ãLR ODXNDV LãVNLULDPDV WROLDX
W
VLDQWÄWDãNLQ
³DGUHVDFLM
d.i.a = . . .
ir t. t.
-HL NODV¡V ODXNDPV – primityvams rHLNãP¡V Q¡UD SULVNLUWRV SDJDO QXW\O¡MLP
MLHPV VXWHLNLDPRV QXOLQ¡V UHLNãP¡V boolean primityvui – UHLNãP¡ false 7DþLDX
lokaliems metoduose deklaruotiems laukams –SULPLW\YDPVUHLNãP¡VWRNLXEÌGXQ¡UD
skiriamos.
Metodas deklaruojamas:
0HWRGRNÌQXåEDLJLDRSHUDWRULXVreturn>JUåLQDPDUHLNãP¡@.DLPHWRGDV
QHJUåLQD MRNLRV UHLNãP¡V W \ GHNODUXRWDV VX UDNWDåRGåLX void), return QHEÌWLQDV.
Metodas „m“ objektui „o³NYLHþLDPDVDUEDWDLS
16
o.m( ); // –NDLPHWRGDVQHJUåLQDMRNLRVUHLNãP¡V
DUEDWXULEÌWLNLWRRSHUDWRULDXVGDOLPLMHLUHLNãP
SDY\]GåLXL, floatWLSRJUåLQD
float f = o.m( );
6WDWLQLDLNODVLÐODXNDLLUPHWRGDL
-HL NXULRV QRUV NODV¡V YLVÐ REMHNWÐ NXULV QRUV ODXNDV \UD EHQGUDV YLVLHPV
REMHNWDPV LU WXUL VDXJRWL WRNL SDþL UHLNãP
MLV GHNODUXRMDPDV VX PRGLILNDWRULXPL
static. Tokie laukai kitaip nei dinaminiai laukai saugomi atmintyje ir kitaip jiems
priskiriamoV SUDGLQ¡V UHLNãP¡V LãVDPLDX WDL DLãNLQDPD NDOEDQW DSLH PHWRGÐ –
NRQVWUXNWRULÐDWOLNLPRWYDUN3DY\]GåLXL
class StaticField {
static int i = 1;
}
...
StaticField sf1 = new StaticField( ),
sf2 = new StaticField( );
class StaticMethod {
static void incr( ) {
StaticField.i++ ;
}
}
...
StaticMethod sm = new StaticMethod( );
sm.incr( );
StaticMethod.incr( ); // alternatyvi kvietimo forma
9HLNVPÐRSHUDWRULDL
...
int i, j = 2;
i = (j+=2)*(j+3);
System.out.println( “j=”+j+”i=”+i ); // bus spausdinama j=4 i=28
17
...
...
int i, j, k;
i = 1;
j = i++; // j=1: pirma atliekama prieskyra, paskui – prieaugio operacija
// (post- forma)
k = ++i; // k=3 – prieaugio pre- forma
...
,ãYHVWLV³SXOW
System.out.println( String s );
3DY\]GåLDL
18
6\VWHPRXWSULQWOQ[\
LãSUDGåLÐEXVVXVNDLþLXRWDVDULWPHWLQLVUHLãNLQ\V
WDLS \UD WRG¡O NDG RSHUDWRULXV MXQJLD
aritmetinius duomenis ir yra interpretuojamas
NDLSVXG¡WLHVRSHUDWRULXVWDGDJDXWDUHLNãP¡EXV
SHUYHVWD³6WULQJWLS6SDXVGLQV
System.out.println( “Sum of x and y is: “+x+y ); /* Spausdins:
Sum of x and y is: 34
7DLS\UDWRG¡ONDGSLUPDVLVRSHUDWRULXVMXQJLD
6WULQJ WLSR EHL DULWPHWLQ³ GXRPHQLV LU \UD
interpretuojamas kaip sujungimo operatorius, o jo
GDUER UH]XOWDWDV EXV 6WULQJ WLSR UHLNãP¡ 7ROLDX
DQDORJLãND VLWXDFLMD SDVLNDUWRV GDU NDUW LU
galutinis rezultatas bus gautas toks, koks
SDURG\WDV DXNãþLDX 1RULQW JDXWL DWVSDXVGLQW
WLNU DULWPHWLQLR UHLãNLQLR UH]XOWDW DULWPHWLQ³
UHLãNLQ³UHLNLDDSVNOLDXVWL«[\«
System.out.print( “Ja” );
System.out.print( “va” ); // spausdins: Java
3DSUDVþLDXVLÐDXWRQRmiškos programos ir
NOLHQWLQ¡VSURJUDPRVSDY\]GåLDL
class FirstApplication{
public static void main( String [ ] args ) {
System.out.println( “The first application” );
}
}
19
FirstApplication.java. KrHLSWL G¡PHV³ ³ GLGåLVLDV LU PDåVLDV UDLGHV –
Java kompiliatorius jas skiria. 9¡OLDX PDW\VLPH NDG QHSDVNHOEXV
VWDUWLQ¡VNODV¡VW\NODV¡VNXULRMH\UD metodas main) vieša – public,
ULQNPHQRVYDUGJDOLPDSDULQNWLLUVNLUWLQJQXRVWDUWLQ¡VNODV¡Vvardo.
2. run ir commandNRPDQGRPLVSDOHLVWLSXOWcdNRPDQGDSHUHLWL³DSODQN
NXULDPH \UD SURJUDPRV SUDGLQ¡ ULQNPHQD LU SDOHLVWL Java NRPSLOLDWRULÐ
javac:
javac FirstApplication.java
java FirstApplication
Pastabos. Java NRGDV VXVLGHGD Lã NODVLÐ ýLD YLHQLQWHO¡MH NRGR NODV¡MH Q¡UD
SDVNHOEWDMRNLÐODXNÐ
²¡MLPR WDãNDV ³ SURJUDP – metodas main SHU DUJXPHQWÐ VUDã JDXQDQWLV
HLOXW¡V WLSR YLHQPDW³ PDV\Y args – SURJUDPRV SDOHLGLPR Lã SXOWR NRPDQGLQ¡MH
HLOXW¡MH SR NRPDQGRV java FirstApplication QXURG\WXV HLOXWLQLXV GXRPHQLV ýLa
WRNLÐGXRPHQÐQ¡UDPDV\YDVOLHNDWXãþLDV0HWRGDVWXULEÌWLpublic – viešas, statinis
– staticLUQHJUåLQDMRNLRVUHLNãP¡V– void.
0HWRGH NUHLSLDPDVL ³ LãYHVWLHV PHWRG println .UHLSLDQWLV ³ Java vidinius
PHWRGXV UHLNLD åLQRWL MÐ YLHW Java YDUGÐ HUGY¡MH 3LOQDV println vardas yra
java.lang.System.out.println. Paketo, kuriame saugomi sisteminiai Java dalykai, –
java.lang YDUGR QXURG\WL QHEÌWLQD âLV SDNHWDV DXWRPDWLãNDL LPSRUWXRMDPDV ³ YLVDV
SURJUDPDVâLDPHSDNHWH\UDNODV¡System, turinti PrintStream NODV¡VWLSRODXNout, o
NODV¡ PrintStream WXUL VWDWLQ³ PHWRG println WRG¡O GDåQLDXVLDL MLV NDLS þLD
NYLHþLDPDVNODV¡VYDUGX
import javax.swing.*;
public class FirstApplet extends JApplet{
public void init(){
System.out.println( “The first applet” );
}
}
7DL ÄGLUEWLQ¡³ NOLHQWLQ¡ SURJUDPD QHV WRNLRV SURJUDPRV \UD VNLUWRV QH
VSDXVGLQWL ³ SXOWR HNUDQ R QDUã\NO¡V URGRPDP +70/ SXVODSLXL SUDWXUWLQWL
SpausdiQLPDV ³ SXOW þLD EÌWÐ SDWHLVLQDPDV QHEHQW GHULQLPR VWDGLMRMH ãLDLS MDX
UHLN¡WÐSDVLWHONWLLãNOLHQWLQ¡VSURJUDPRVVXSHUNODV¡VSDYHOGLPXVPHWRGXVJUDILQLDPV
elementams išvesti.
.OLHQWLQ¡VSURJUDPRVSDOHLGLPRHWDSDL
1. ²UDã\WLSURJUDPRVWHNVWYDUGXFirst Applet.java³DWVNLUDSODQN
20
2. 6XNRPSLOLXRWLWHNVWNRPDQGDjavac FirstApplet.java.
3. ² W SDW³ DSODQN ³UDã\WL +70/ ULQNPHQ NXULRMH NUHLSLDPDVL ³ NOLHQWLQ
SURJUDP
<HTML>
<HEAD>
<TITLE> APPLET FirstApplet</TITLE>
</HEAD>
<BODY>
<APPLET CODE = FirstApplet WIDTH = 100 HEIGHT =100 >
</APPLET>
</BODY>
</HTML>
import javax.swing.*;
public class FirstApplet extends JApplet{
public void init(){
System.out.println( ‘The first applet” );
}
}
o 4-DMDPHHWDSHYLHWRMHQDUã\NO¡VSDOHLVWL
appletviewer FirstApplet.java
7RNLXEÌGXSDSUDVWXPRG¡OHLSDOHLVLPHNOLHQWLQHVSURJUDPDVYLVRNXUVRPHWX
21
nenaudotinos) arba javax.swing (rekomenduojama naudoti klases iš šio paketo). Visi
SDNHWDL NXULÐ YDUGDL SUDVLGHGD javax (nuo Java extension), turi Java galimybes
SUDSOHþLDQþLDVNODVHV3DNHWDVLPSRUWXRMDPDVRSHUDWRULXPimport, o „*“ reiškia, kad
GLQDPLãNDLLPSRUWXRMDPRVWLNUHLNLDPRV³NHOWLNODV¡V
.OLHQWLQ¡VSURJUDPRVVWDUWLQ¡NODV¡WXULQWLPHWRGinitSULYDOREÌWLSDVNHOEWD
public LU WXUL SDYHOG¡ti (extends NOLHQWLQ¡V SURJUDPRV VXSHUNODV¡V JApplet MHL EÌWÐ
QXWDUWD ULQNWLV DQDORJLãN NODV
Lã java.awt paketo – WHNWÐ LPWL Applet) savybes ir
metodus.
²¡MLPR³SURJUDPWDãNDV– metodas initQHJUåLQDQWLVMRNLRVUHLNãP¡V
22
2. J A V A S I N T A K S ,â6$0,$8
2.1. SO\JRVRSHUDWRULDL
if( reiškinys )
^RSHUDWRULÐJUXS¡`
else
^RSHUDWRULÐJUXS¡`
5HLãNLQLRUHLNãP¡SULYDOREÌWLORJLQ¡-HLJUXS¡VH\UDWLNSRYLHQRSHUDWRULÐ
ILJÌULQLDL VNOLDXVWDL QHEÌWLQL else LU DQWURML RSHUDWRULÐ JUXS¡ WDLS SDW QHEÌWLQL -HL
reikia, prie else JDOLPD SULUDã\WL SDSLOGRP VO\J HOVH LI UHLãNLQ\V ^ RSHUDWRULÐ
JUXS¡`
3DY\]G\VVNDLþLDXV³YHGLPDVLãNODYLDWÌURVLUQXVWDW\PDVDUVNDLþLXVO\JLQLV
ar nelyginis.
...
int number = System.in.read( )³YHGDPDVYLHQDVVLPEROLVLãNODYLDWÌURV
if( number %2 = = 0 ) MHL³YHVWLNHOLVLPEROLDL– imamas paskutinis
System.out.println( “Even number entered” );
else
System.out.println( “Odd number entered” );
...
2.2. Selektorius
switch( reiškinys ) {
case value1:
^RSHUDWRULÐJUXS¡`
break;
case value2:
^RSHUDWRULÐJUXS¡`
break;
...
default:
{ operDWRULÐJUXS¡G`
break;
}
23
public class VowelsAndConsonants{
public static void main( String args[ ] ){
char c = ( char ) System.in.read( );
switch( c ) {
case ‘a’:
case ‘e’:
case ‘i’:
case ‘o’:
case ‘u’:
System.out.println( “Vowel” );
break;
case ‘y’:
case ‘w’:
System.out.println( “Sometimes vowel” );
break;
default:
System.out.println( “Consonant” );
}
}
}
2.3. Ciklai
1.
ZKLOHUHLãNLQ\V^RSHUDWRULÐJUXS¡`
2SHUDWRULDXV UHLãNLQLR UHLNãP¡ WXUL EÌWL ORJLQ¡ *DOLPDV DWYHMLV NDL FLNODV Lã
viso nebus vykdomas –NDLUHLãNLQLRUHLNãP¡false; galimas begalinio ciklo atvejis –
NDLUHLãNLQLRUHLNãP¡SDVWRYL– true.
Pavyzdys: tarkim metodas processCharNDåNRNLXEÌGXDSGRURMDLãNODYLDWÌURV
³YHVWVLPERO³GDUEDVQXWUDXNLDPDV³YHGXVVLPERO³q.
...
char c = (char) System.in.read( );
while( c != ‘q’ ) {
processChar( c );
c = (char) System.in.read( );
}
...
2.
GR^RSHUDWRULÐJUXS¡`
while( reiškinys );
Šio operatoriaus skirtumas nuo pirmojo – MLV EHQW YLHQ NDUW YLVDGD EXV
vykdomas. Dabar ankstesnis pavyzdys su šiuo operatoriumi:
24
...
do {
char c = (char) System.in.read( );
processChar( c );
}
while ( c != ‘q’ );
...
3.
forUHLãNLQ\VUHLãNLQ\VUHLãNLQ\V^RSHUDWRULÐJUXS¡`
...
for( char c = (char) System.in.read( ); c != ‘q’; c = (char) System.in.read( ) )
processChar( c );
...
...
for( int i = 1, j = i+10; i < 5; i++, j = i*2 ) {
System.out.println( “i= “+i+” j= “+j );
}
...
Spausdinimo rezultatai:
i=1 j = 11
i=2 j=4
i=3 j=6
i=4 j=8
&LNOÐå\P¡MLPDV&LNOÐQXWUDXNLPDV
Nors Java ir yra JULHåWDL REMHNWLãNDL RULHQWXRWD NDOED YLV WLN LU MRMH IDNWLãNDL
\UD SURJUDPDYLPR SXULVWÐ VPHUNLDPDV RSHUDWRULXV go to. Java jo funkcijas atlieka
FLNOÐå\P¡MLPDVLUFLNORQXWUDXNLPRRSHUDWRULXVbreakEHLYDOG\PRSHUGDYLPR³å\P
operatorius continue. Šios NRQVWUXNFLMRVWXULSUDVP
NDUWRWLQLXRVHFLNOXRVH
Tarkime, apdorojamas kvadratinis masyvas array, turintis arraySizeHLOXþLÐLU
VWXOSHOLÐ 0DV\YR HLOLQLV HOHPHQWDV DSGRURMDPDV PHWRGX processArrayElement. Jei
randamas bent vienas neigiamas elementas, – tolesnis masyvo apdorojimas
nutraukiamas: nutraukiami abu ciklai.
25
...
HUUå\P¡åHPLDXHVDQþLDPRSHUDWRULXL– for
for( i = 0; i < arraySize; i++ ) {
for( j = 0; j < arraySize; j++ ) {
if( arry[ i ] [ j ] < 0 ) {
System.out.println( “Error: negative number encountered”
);
EUHDNHUUQXWUDXNLDPDVå\P¡WDVLV- išorinis ciklas
}
processArrayElement( array[ i ] [ j ] );
}
}
...
class AClass{
float x;
AClass( ) {
System.out.println( “Creation of AClass object” );
x = 1.23f;
}
}
class AClass2{
AClass2( int i ){
System.out.println( “AClass object No “+ i );
}
}
public class ObjectCreation{
public static void main( String args [ ] ){
for( int i = 0; i < 10; i++ ) {
new AClass2( i );
}
}
}
26
VXNXULDREMHNWÐVXQXPHULDLV«$LãNXãLHREMHNWDLQHWXULMRNLгVDYH
QXNUHLSWÐURG\NOLÐWRG¡OMXRVVXQDLNLQVãLXNãOLÐULQNWXYDV
7RV SDþLRV NODV¡V REMHNWXV JDOLPD VXNXUWL VNLUWLQJDLV EÌGDLV 7DP WHNWÐ
PHWRG-NRQVWUXNWRULÐ SDQDãLDL NDLS SDSUDVW PHWRG ÄSHUNUDXWL³ overload).
3HUNUDXQDQW PHWRGXV JDXQDPD YLVD EHQGUDYDUGåLÐ PHWRGÐ JUXS¡ 0HWRGDV QXR
PHWRGR ãLRMH JUXS¡MH WXUL VNLUWLV DUJXPHQWÐ VUDãX JDOL VNLUWLV QHW LU DUJXPHQWÐ
LãG¡VW\PRWYDUND.RPSLOLDWRULXVLãPHWRGÐJUXS¡VUHLNLDPPHWRGDWVLUHQNDSDJDO
NYLHWLPRPHWXQXURG\WDUJXPHQWÐVUDã
3DY\]G\VVXPHWRGÐ-NRQVWUXNWRULÐLUPHWRGÐSHUNURYLPX
class AClass3{
int number;
AClass3( ){
System.out.println( “Simple creation” );
number = 0;
}
AClass3( int i ){
System.out.println( “Numbered creation. No ”+i );
number = i;
}
void info( ){
System.out.println( “Object “+ number );
}
void info( String s ){
System.out.println( s + “ object “ + number );
}
}
public class Overloading{
public static void main( String args [ ] ){
AClass3 ac = new AClass3( );
ac.info( );
ac.info( “Overloaded” );
for( int i = 0; i < 10; i++ ) {
ac = new AClass3( i );
}
}
}
Skiriasi PHWRGÐ VX DUJXPHQWDLV – SULPLW\YDLV SHUNURYLPDV 7DLS \UD G¡O WR
NDG SULPLW\YDL DXWRPDWLãNDL JDOL EÌWL SHUYHVWL ³ EHQGUHVQ³M³ WLS ,ãLPWLV þLD \UD WLN
char SULPLW\YDVMLVSHUYHGDPDVLãNDUW³intWLSDSHLQDQWPDåLDXXåint bendrus byte
ir short tipus. Visi galimi atvejai parodyti šiame pavyzdyje:
27
void m1(short x){ prt("m1(short)"); }
void m1(int x){ prt("m1(int)"); }
void m1(long x){ prt("m1(long)");}
void m1(float x){ prt("m1(float)"); }
void m1(double x){ prt("m1(double)"); }
void testChar( ){
char x ='x';
prt("char argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
void testByte( ){
byte x =1;
prt("byte argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
void testShort(){
short x =1;
prt("short argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
28
void testInt(){
int x =1;
prt("int argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
void testLong(){
long x =1L;
prt("long argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
void testFloat(){
float x =1F;
prt("float argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
void testDouble(){
double x =1;
prt("double argument");
m1(x); m2(x); m3(x); m4(x); m5(x); m6(x); m7(x);
}
29
OHQWHO¡VW
VLQ\V
long argument float argument double argument
m1(long) m1(float) m1(double)
m2(long) m2(float) m2(double)
m3(long) m3(float) m3(double)
m4(long) m4(float) m4(double)
m5(long) m5(float) m5(double)
m6(float) m6(float) m6(double)
m7(double) m7(double) m7(double)
5DNWDåRGLVthis
âLXRDWYHMXNDLYLHQDVPHWRGDVNYLHþLDNLWWRVSDþLRVNODV¡VYLGXMHthisQ¡UDEÌWLQDV
ýLD MLV SDSUDVþLDXVLDL SDEU¡åLD NDG PHWRGDV m1 NYLHþLDPDV GDEDU DSGRURMDPDP
objektui.
5DNWDåRGLVEÌWLQDVNDLSDSUDVWDVPHWRGDVJUåLQDNODV¡VREMHNW
30
5DNWDåRGLVEÌWLQDV NRQVWUXNWRULXMH NYLHþLDQWNLWPDåLDX EHQGU PHWRGR-
NRQVWUXNWRULDXV YDULDQW ýLD SDW LU SDY\]G\V SLUPDVLV AClass6 konstruktoriaus
variantas), kai be this NLOWÐ YDUGÐ NRQIOLNWDV %H DEHMR NRQIOLNWR OHQJYD LãYHQJWL
SDUHQNDQW DUJXPHQWXL NLWRN³ YDUG W GHPRQVWUXRja antrasis konstruktoriaus
YDULDQWDV 7DþLDX GDXJHOLV DXWRULÐ SURSDJXRMD SURJUDPDYLPR VWLOLÐ NDLS SLUPDMDPH
konstruktoriaus variante – su this naudojimu.
2EMHNWÐQDLNLQLPDV
31
System.gc( );
MHWRGRSDYDGLQLPDVNLO
VQXRåRGåLÐgarbage collectionSLUPÐMÐUDLGåLÐNDV
ãLDLSMDXQHEÌGLQJD JavaYDUGÐVLVWHPDL
âLXNãOLÐ ULQNWXYR GDUER DOJRULWPDL \UD SDNDQNDPDL VXG¡WLQJL QDXGRMDPD
schema „sustoti – ir – SHUNRSLMXRWL³ SURJUDPDL VNLUW DWPLQW³ heap) ³ NLW DWPLQWLHV
VULW³ SHUNRSLMXRMDPL WLN REMHNWDL WXULQW\V ³ VDYH QXNUHLSWDV URG\NOHV URG\NOLÐ
SUDGHGDPDLHãNRWLQXRSDþLDPHNODVLÐKLHUDUFKLMRVYLUãXMHHVDQþLRVNODV¡VObject). Be
WR³YDLULRV-90UHDOL]DFLMRVãLVFKHPGDUYLHQDLSDUNLWDLSSDWREXOina.
3UDGLQLÐUHLNãPLÐVN\ULPDV
class Tag{
Tag( int i ){
System.out.println( "Tag( " + i + " )" );
}
}
class Card{
7DJW QHZ7DJSULHãNRQVWUXNWRULÐ
Card( ){
System.out.println( "Inside constructor Card" );
t3 = new Tag( 33 );
}
Tag t2 = new Tag( 2 );
void m( ){
System.out.println( "Finish" );
}
Tag t3 = new Tag( 3 ); // after constructor !
}
32
Programos spausdinimai:
Tag( 1 )
Tag( 2 )
Tag( 3 )
Inside constructor Card
Tag( 33 )
Finish
2.8. PradiQLÐUHLNãPLÐSULHVN\UDPDV\YDPV
Masyvas – YLHQRGR WLSR REMHNWÐ VHND YLHQX YDUGX *DOL EÌWL YLHQPDþLDL
GYLPDþLDLLUWW9LHQPDWLVPDV\YDVDSLEU¡åLDPDVSDY\]GåLXLWDLS
ýLD QHJDOLPD QXURG\WL HOHPHQWÐ NLHNLR PDV\YH QHV Nol kas sukurta tik
nuoroda, o atmintis masyvui dar nepaskirta. Atmintis masyvui paskiriama jam skiriant
SUDGLQHVUHLNãPHV7DLGDURPDNHOLDLVEÌGDLV
1. int [ ] m1 = { 1, 2, 3, 4, 5 }; // VXSDSUDVWLQWDVLQWDNV¡
// primityvams ir …
Integer [ ] m2 = { new Integer( 1 ), new Integer( 2 ), new Integer( 3 ),
new Integer( 4 ), new Integer( 5 ) }; // …objektams
2. int [ ] m3;
...
m3 QHZLQW>@LUSULPLW\YÐPDV\YDPVJDOLPDVÄQHZ³QDXGRMLPDV
// visiems 5 masyvo eOHPHQWDPVVNLULDPRVUHLNãP¡V
33
int [ ] [ ] m4 ={ // dvimatis masyvas 2x3
{ 1, 2, 3 },
{ 4, 5, 6 },
};
int [ ] [ ] [ ] m5 = new int[ 2 ] [ 3 ] [4 ]; // trimatis nulinis masyvas 2x3x4
m5 = new int[ 2 ] [ ] [ ];
...
int i = . . . ;
int j = . . . ;
m5[ i ] = new int[ j ] [ ];
...
int k = . . . ;
m5[ i ] [ j ] = new int[ k ];
...
.LHNYLHQDVPDV\YDVWXULLOJLRODXN lengthNLHNYLHQDLGLPHQVLMDL3DY\]GåLXL
WDPSDþLDPWULPDþLDPPDV\YXLMRDWVNLUDVGLPHQVLMDVJDOLPDEÌWÐQXVWDW\WL
Java NDLS LU & NDOERVH PDV\YÐ HOHPHQWÐ LQGHNVDL NLHNYLHQRMH GLPHQVLMRMH
SUDGHGDPLVNDLþLXRWLQXRQXOLR
2.9. VardÐODXNÐPHWRGÐLUNODVLÐVO¡SLPDV
2.9.1. Paketai
34
package packageName;
Skirtingai neLNODVHLSDNHWRYDUG³SUDVWDSUDG¡WLPDåMDUDLGH'DEDUQRULQW
NUHLSWLV ³ public NODV
WDUNLPH MRV YDUGDV \UD AClass MDX WHNV QDXGRWL SLOQM³ MRV
YDUGpackageName.AClass arba importuoti paketo klases operatoriumi
import packageName;
Šiuo atvHMXNUHLSLQ\MHY¡OJDOLPDVWUXPSDVLVNODV¡VYDUGDV2SHUDWRULXV
import packageName.*;
package com.domeninisAdresas.def;
public class AClass{ . . . }
...
9¡OLDXLPSRUWDYXVSDNHW
import com.domeninisAdresas.def.*;
35
/DXNÐLUPHWRGÐVO¡SLPDV
3DNHWDL LU NODV¡V SDODLNR ³YDLULDV YDUGÐ DUED PDWRPXPR VULWLV 3DNHWDL
IDNWLãNDL \UD NRQWHLQHULDL NODV¡PV LU NLWLHPV SDNHWDPV .ODV¡V \UD GXRPHQÐ LU NRGR
NRQWHLQHULDL 7DL OHLGåLD REMHNWR GXRPHQLV NXULXRV QHEÌWLQDL WXUL åLQRWL YLVL NLWL
SURJUDPRV REMHNWDL SDVO¡SWL incapsulate) objekte arba keliuose susijusiuose
objektuose.
,ãYLVR\UDSULHLWLHVO\JLDLNODV¡VHOHPHQWDPV
DSULHLWLVLãWRVSDWNODV¡V
ELãNODV¡VVXENODVLÐãLDPHSDNHWH
c) iš ne VXENODVLÐãLDPHSDNHWH
GLãVXENODVLÐVNLUWLQJXRVHSDNHWXRVH
HLãQHVXENODVLÐNLWXRVHSDNHWXRVH
Terminas VXENODV¡þLDUHLãNLDNDGMLpaveldiQDJULQ¡MDPRVNODV¡VVDY\EHVåU
VN\ULÐ
3ULHã NODV¡V HOHPHQWXV JDOLPD ³UDã\WL SULHLWLHV PRGLfikatorius public, private
arba protected 0RGLILNDWRULXV YHLNLD WLN W REMHNW SULHã NXU³ MLV ³UDã\WDV -HL MRNV
PRGLILNDWRULXV QH³UDã\WDV SULHLWLV SULH ODXNR \UD friendly WDþLDX WRNLR UDNWDåRGåLR
Q¡UD 0RGLILNDWRULÐ UHLNãP¡ LOLXVWUXRMDPD OHQWHO¡Me: prieitis galima arba
negalima.
2.1 OHQWHO¡0RGLILNDWRULÐUHLNãP¡V
Modifikatorius /
Prieities lygis private „friendly“ protected public
package aPackage;
public class Class1{
int a = 0;
void m( ){
System.out.println( “AClass method” );
}
}
import aPackage.*;
public class Class2{
public static void main( String args[ ] ){
36
Class1 c1 = new Class1( );
c1.a = 1; // Klaida!
c1.m( ); // Klaida!
}
}
Norint ãL SURJUDP VXNRPSLOLXRWL EH NODLGÐ WHNV DUED VNHOEWL SLUPRVLRV
NODV¡V ODXN LU PHWRG YLHãDLV DUED protected LU VXVLHWL DQWUM NODV
VX SLUPMD
SDYHOGLPXPXåUVN\ULÐ
.ODVLÐVO¡SLPDV
class AClass{
private AClass( ){ . . . }
private static AClass ac = new AClass( );
public static AClass access( ){
return ac;
}
public void m( ){ . . . }
}
...
AClass.access( ).m( );
...
.RGRIUDJPHQWÐNDUWRMLPDV
kompozicija ir paveldimumas
6LQWDNV¡.RQVWUXNWRULÐY\kdymas
37
3DYHOGLPXPDV QDXGRWLQDV WDGD NDL UHLNLD SDQDXGRWL PRWLQLQ¡V DUED
VXSHUNODV¡V VVDM VXENODV¡ JDOL ãL VVDM LãSO¡VWL 7HLJLQ\V NXU³ ³J\YHQGLQD
paveldimumas –ÄãLWDL\UDSDQDãX³WDL³
/DQNVWHVQLV SURJUDPDYLPR PHFKDQL]PDV \UD NRPSR]LFLMD R SDYHOGLPXP
UHLN¡WÐWDLN\WLWHQNXUUHLNDOLQJDVÄN\ODQW\VLVWLSÐSHUWYDUN\PDV³åUWROHVQ³VN\ULÐ
.RPSR]LFLMRVVLQWDNV¡\UDDLãNLUDãRPRMHNODV¡MHNXULDPLMDXHJ]LVWXRMDQþLÐ
NODVLÐREMHNWDLWRG¡OG¡PHV³VXWHONVLPH³SDYHOGLPXPRPHFKDQL]P
.DG VXENODV¡ SDYHOGL VXSHUNODV¡V GXRPHQLV LU PHWRGXV LãUHLãNLDPD
UDNWDåRGåLXextendsLUVXSHUNODV¡VYDUGX3DY\]G\V
// Inheritance
//
class Class1 {
private String s = "Class1: ";
public void append( String ss ) { s += ss; }
public void m1( ) { append( "m1() " );}
public void m2( ) { append( "m2() " );}
public void m3( ) { append( "m3() " );}
public void print( ) { System.out.println( s );}
public static void main( String [ ] args ) {
Class1 c1 = new Class1();
c1.m1(); c1.m2(); c1.m3(); c1.print();
}
}
public class Class2 extends Class1 {
public void m3( ){ // overriding method m3
append( "Class2.m3( ) " );
super.m3( ); // calling m3 of superclass
}
public void m4( ) { append( " m4( )" ); } // extension of interface
public static void main( String [ ] args ) {
Class2 c2 = new Class2( );
c2.m1( ); c2.m2( ); c2.m3( ); c2.m4( ); c2.print( );
System.out.println( "Test for the superclass Class1:" );
Class1.main( args ); // args already defined
}
}
3URJUDPRVUH]XOWDWDLNDLNYLHþLDPDVDQWURVLRVNODV¡VPHWRGDVmain:
38
SUDG¡WLSURJUDPRVY\NG\PNRPDQGDjava Class2 paleis visos programos
Y\NG\PRjava Class1OHLVWÐWHVWXRWLWLNSLUPMNODV
2. .DLNODV¡VVXVLHWRVSDYHOGLPXPXNXULDQWVXENODV¡VREMHNWDXWRPDWLãNDL
EXV VXNXUWDV VXSHUNODV¡V REMHNWDV 7RG¡O NUHLSLQ\V c2.m1( ); spausdins
Class1: m1( ) NDGDQJL NRQVWUXRMDQW VXSHUNODV¡V REMHNW HLOXWHL s
priskiriama reikšm¡Class1: .
3. 6XSHUNODV¡V PHWRG VXENODV¡MH JDOLPD SHUUDã\WL DUED NLWDLS PRGLILNXRWL
(overrideNUHLSLQ\V³PHWRGO\JLDLWRNVSDW– public void m3( ), o metodo
NÌQDV SHUUDãRPDV NLWDLS âLDPH SHUUDã\WDPH NÌQH JDOLPD NUHLSWLV LU³ EHW
NXU³ VXSHUNODV¡V PHWRG UDNWDåRGåLX super: super.m3( ); . Beje, jei šioje
HLOXW¡MHUDNWDåRGåLRsuperQHEÌWÐEÌWÐUHNXUV\YLDLNUHLSLDPDVL³VXENODV¡V
PHWRGm3 .
'DEDU WUXSXW³ SODþLDX DSLH SDYHOGLPXPX VXVLHWÐ NODVLÐ NRQVWUXNWRULÐ
Y\NG\P .DGDQJL VXENODV¡MH \UD ijG¡WDV³ LU SUDSO¡VWDV VXSHUNODV¡V REMHNWDV WDL
NRQVWUXRMDQW VXENODV¡V REMHNW DXWRPDWLãNDL SULHã WDL VXNRQVWUXRMDPDV VXSHUNODV¡V
REMHNWDV7PDW¡PHLãDQNVWHVQLRSDY\]GåLR-HLNRQVWUXNWRULDLWXULDUJXPHQWXVWDLLã
VXENODV¡VNRQVWUXNWRULDXVMXRVUHLNLDUDLãNLDLSHUGXRWLijYLUãгSDQDXGRMDQWUDNWDåRG³
super su argumentais, kaip parodyta šiame pavyzdyje:
// Inheritance: constructors
//
class Class3 {
Class3( int i ) {
System.out.println( "Constructor of Class3 "+i );
}
}
class Class4 extends Class3 {
Class4( int i ) {
super( i ); // calling constructor of superclass
// Class3
i++; // scope of "i" is limited within constructor’s
// area
System.out.println( "Constructor of Class4 " +i );
}
}
public class Class5 extends Class4 {
Class5( int i ) {
super( i ); // calling constructor of superclass
// Class4
i++;
System.out.println( "Constructor of Class5" +i );
}
public static void main ( String [] args ) {
Class5 c5 = new Class5( 123 );
}
}
Programos spausdiniai:
39
Constructor of Class3 123
Constructor of Class4 124
Constructor of Class5 124
Jei MRNLÐDUJXPHQWÐSHUGXRWLQHUHLN¡WÐVXSHUNODV¡VNRQVWUXNWRULDXVNYLHWLPXL
åRGåLRsuperQHUHLN¡WЖMLVEÌWÐNYLHþLDPDVDXWRPDWLãNDL
Kreipinys super( ) VXENODV¡V NRQVWUXNWRULXMH SULYDOR EÌWL SDWV SLUPDV
RSHUDWRULXVRWDLQHOHLGåLDSHULPWLMRNLÐLãLPþLÐåUVN\ULÐDSLHNODLGÐDSGRURMLP
N\ODQþLÐNRQVWUXNWRULXMH
2.10.2. .\ODQW\VLVWLSÐSHUWYDUN\PDV
class Instrument{
public void play( ){ . . . }
static void tune( Instrument i ){
i.play( );
...
}
}
class Wind extends Instrument{
public static void main( String args[ ] ) {
Wind flute = new Wind( );
Instrument.tune( flute ); // upcasting here!
}
}
Kaip matyti, metodo tune argumentas yra Instrument WLSR WDþLDX NUHLSLQ\MH
jam atiduodamas WindWLSRDUJXPHQWDV7RNLDVLQWDNV¡Weisinga, nes WindNODV¡\UD
VXENODV¡ Instrument NODVHL R YLHWRMH ÄåHPHVQLRMR³ NODV¡V WLSR YLVDGD OHLGåLDPD
QDXGRWL ÄDXNãWHVQLRVLRV³ NODV¡V WLS WRG¡O LU WHUPLQDV WRNV – ÄN\ODQW\VLV WLSÐ
pertvarkymas“ (upcasting7RNVWLSÐSHUWYDUN\PDVYLVDGD\UD³PDQRPas ir saugus,
QHV VXENODV¡ WXUL YLVXV VXSHUNODV¡V PHWRGXV JDOL WXU¡WL LU GDXJLDX PHWRGÐ WRG¡O
VXSHUNODV¡VPHWRGYLVDGDEXV³PDQRPDDWOLNWL
7RNVWLSÐSHUWYDUN\PDVDWYHULDSROLPRUIL]PRJDOLP\E
NXULY¡OLDXLãVDPLDL
QDJULQ¡VLPH
40
5DNWDåRGLV SULHã PHWRG UHLãNLD NDG ãLV PHWRGDV QHJDOL EÌWL MRNLRMH NODV¡V
VXENODV¡MH QHL SHUNUDXWDV QHL SHUUDã\WDV ,ã HVP¡V PHWRGDPV UDNWDåRGLV QDXMÐ
JDOLP\ELÐ QHVXWHLNLD QHV private metodas savaime yra nekintantis; jo modifikuoti
NLWRMHNODV¡MHQHJDOLPD–PHWRGDVSDSUDVþLDXVLDLWHQQHPDWRPDV
final³WDNDGXRPHQLPVSDURGRPDãLDPHSDY\]G\MH
class Value{
int i = 1;
}
class FinalData{
final int i1 = 1; // constant for object
static final int i2 = 2; // constant for class
public static final int I3 = 3; // same; standard declaration
final Value v1 = new Value( ); // constant pointer
public static void main( String args[ ] ){
FinalData fd = new FinalData( );
fd.i1++; // Error!
fd.v1 = new Value( ); // Error!
fd.v1.i++;
}
}
2.11. Polimorfizmas
class Instrument{
public void play( ){
System.out.println( “Instrument.play( )” );
}
}
class Wind extends Instrument{
public void play( ) {
System.out.println( “Wind.play( )” );
}
}
public class Music{
public static tune( Instrument i ) {
i.play( );
}
public static void main( String args [ ] ){
41
Wind flute = new Wind( );
tune( flute ); // upcasting here!
}
}
Programos rezultatas:
Wind.play( )
. . . tune( Wind i ) { . . . }
Shape
draw( )
erase( )
SDY80/VFKHPDNODVLÐKLHUDUFKLMDL
42
Programos tekstas:
Programos rezultatai:
43
Circle.draw( )
Circle.erase( )
Square.draw( )
Square.erase( )
Triangle.draw( )
Triangle.erase( )
Taigi kODV¡ Shapes QHNUHLSLD G¡PHVLR ³ NRQNUHWÐ ILJÌURV WLS LU RSHUXRMD
tiesiog baziniu Shape WLSX âLRMH NODV¡MH NDG EÌWÐ GDU ³WLNLQDPLDX JDOLPD PDV\Y
ShapesXåSLOG\WLILJÌURPLVLUDWVLWLNWLQLXEÌGXDWVLWLNWLQLÐVNDLþLÐJHQHUDWRULDXVNXULR
rezultatas yra normalizuotas double VNDLþLXV Lã LQWHUYDOR > @ Math.random( ):
(int)(Math.random( )*3),LUQDXGRMDQWRSHUDWRULÐswitch*DOLPDVXNXUWLGDXJQDXMÐ
ILJÌUÐ WLSÐ WDþLDX NODV¡V Shapes WHNVWR MHL PDV\YR XåSLOG\PDV ILJÌURPLV EÌWÐ
atsitiktinis) keisti nereik¡V 7DL LU \UD SDJULQGLQLV SROLPRUIL]PR SUDQDãXPDV JDOLPD
DWVNLUWL NLQWDQþL LU QHNLQWDQþL SURJUDPRV GDO³ UDãDQW NRG WLN ED]LQLDPV GXRPHQÐ
WLSDPV7DLSJDOLPDGDXJHNRQRPLãNLDXXåUDã\WLSURJUDPRVWHNVW
%HVLOHLGåLDQW\VLVWLSÐSHUWYDUN\PDV
6XWRNLXGXRPHQÐWLSÐSHUWYDUN\PXVXVLGXULDPDSDYHOGLPXPRVFKHPRVHNDL
VXENODV¡V LãSOHþLD VXSHUNODV¡V VVDM R SURJUDPRVH RSHUXRMDPD EHQGUXRMX
VXSHUNODV¡VWLSX3DY\]G\V
Class1
m1( )
m2( )
Class2
m1( )
m2( )
m3()
m4( )
SDY.ODVLÐVFKHPD
44
'DEDU VLXQþLDQW SUDQHãLPXV EHndrajam tipui Class1 YLV WLN UHLN¡V WLNVOLDL
åLQRWLWLNUM³NODV¡VHJ]HPSOLRULDXVWLSMHLWDL\UDClass1 egzempliorius – jis negali
SULLPWL SUDQHãLPÐ m3( ) ar m4( ), jei Class2 egzempliorius – gali priimti visus
pranešimus m1( ), m2( ),m3( ), m4( ). Tod¡O Java tokiose situacijose naudoja
YDGLQDPM³ Y\NG\PR ODLNR WLSÐ QXVWDW\PR Run-Time Type Identification, RTTI)
PHFKDQL]P -HL WLSDV SDVLURGR QHWLQNDPDV – generuojama tipo pervedimo išimtis
ClassCastExceptionåUVN\ULÐVNLUWNODLGÐDSGRURMLPRPHFKDQLzmui).
Klaidingos programos parodytai schemai pavyzdys:
class Class1{
public void m1( ){ }
public void m2( ){ }
}
class Class2 extends Class1{
public void m1( ){ } // overriding
public void m2( ){ } // overriding
public void m3( ){ }
public void m4( ){ }
}
public class Class3{
public static void main( String args[ ] ){
Class1[ ] c = {
new Class1( ), new Class2( )
};
c[0].m1( );
c[1].m2( );
c[1].m3( ); // compilation error !
( ( Class2 ) c[1] ).m3( ); // downcasting here
( ( Class2 ) c[0] ).m3( ); // error: ClassCastException !
}
}
2.13. AbstrakþLRVLRVNODV¡VLUPHWRGDL
abstract void m( );
45
.ODV¡NXULRMH\UDEHQWYLHQDVDEVWUDNWXVPHWRGDVLUJLSULYDOREÌWLSDVNHOEWD
su modifikatoriumi abstract $EVWUDNþLRVLRV VXSHUNODV¡V VXENODV¡V SULYDOR SDWHLNWL
NÌQXV YLVLHPV DEVWUDNWLHVLHPV PHWRGDPV $QNVWHVQLDP SDY\]GåLXL NODV
Shape
JDO¡WXPHSHUUDã\WLWDLSYLVDVSURJUDPRVShapesAbstract.java tekstas yra prieduose):
$EVWUDNþLRMRMHNODV¡MHJDOLEÌWLLUUHDOÌVPHWRGDi.
6VDMÐNODV¡V
7DLGDUYLHQDVåLQJVQLVDEVWUDNWXPROLQNSDO\JLQWLVXDEVWUDNþLRPLVNODV¡PLV
MÐ NÌQH MDX QHJDOL EÌWL MRNLÐ UHDOLÐ PHWRGÐ NÌQH JDOL EÌWL WLN NRPSLOLDYLPR ODLNR
(static final, o jei tokie modifikatoriai nenurodyti – jie pritaikomi automatiškai)
NRQVWDQWRV .RQVWUXNFLMRV SDVNLUWLV GYHMRSD 6VDMÐ NODV¡V interfaces JDOL EÌWL
QDXGRMDPRV NDLS SURJUDPRV SURMHNWDYLPR EHL NÌULPR ³UDQNLV – QXURGDQW NODVLÐ
EHQGUDYLPR SURWRNROXV 0DW\W GDU VYDUEHVQ¡ SDVNLUWLV \UD VXNXUWL JDOLP\E
WDP
tiNUDP GDXJ\ELQLDP SDYHOG¡MLPXL Lã NHOLÐ ED]LQLÐ WLSÐ YLVLãNDL GDXJ\ELQLR
SDYHOG¡MLPR JDOLP\EHV UHDOL]XRMD WLN YLGLQ¡V NODV¡V DSLH WDL NDOE¡VLPH Y¡OLDX
6LQWDNV¡VSDY\]G\V
interface Interface1{
int i = 123; // static final supposed
float m1( ); // public supposed
void m2( ); // public supposed
}
interface Interface2{
void m3( );
}
class Class1 implements Interface1, Interface2{
public float m1( ){ . . . } // class implementing interface
public void m2( ){ . . . } // gives realization of all
public void m3( ){ . . . } // methods
System.out.println( “i = “ + i ); // “i” is accessible
}
...
46
ED]LQLÐ WLSÐ DEVWUDNþLRVLRV DU UHDOLRVLRV VXSHUNODV¡V EHL YLVÐ UHDOL]XRWÐ VVDMÐ
NODVLÐ3DWHLNLDPHWRNLRVSURJUDPRV-VFKHPRVSDY\]G³
.DLS PDW\WL NODV¡MH C NYLHþLDQW PHWRGXV NRQNUHWXV WLSDV C2 JDOL EÌWL
QDXGRMDPDVYLHWRMED]LQLÐWLSÐI1, I2, I3, C1 – automatiškai panaudojamas kylantysis
WLSÐSHUWYDUN\PDVWDLSO\JLUUHDOL]XRMDPDVSDYHOG¡MLPDVLããLÐWLSÐ
6VDMÐ NODV¡V JDOL SDYHOG¡WL NLWÐ VVDMÐ NODVLÐ FKDUDNWHULVWLNDV RSHUDWRULDXV
extends G¡ND
6VDMÐ NODV¡V JDOL EÌWL QDXGRMDPRV NRPSLOLDYLPR ODLNR NRQVWDQWRPV ODLN\WL
-RMH VXWHLNXV UHLNãPHV NRQVWDQWRPV QHW LU SDY\]GåLXL DWVLWLNWLQLÐ VNDLþLÐ
generatoriumi Math.random( ), YLVR SURJUDPRV Y\NG\PR PHWX NRQVWDQWÐ UHLNãP¡
QHNLV SUDGLQ¡ UHLNãP¡ VXWHLNLDPD WLN YLHQLQWHO³ NDUW ³NHOLDQW VVDMÐ NODV
7HUPLQ
ijNHOWL³ DQNVþLDX QDXGRMRPH WLN NDOE¡GDPL DSLH NODVHV WDþLDX VVDMÐ NODVHL M³ O\JLDL
WDLSSDWJDOLPHWDLN\WLQHVMXNVVDMÐNODV¡\UDWDPWLNUDDEVWUDNWLNODV¡VUÌãLV
Prieduose yra programa ShapesInterface.java, realizuojanti jau kelis kartus
QDJULQ¡W VN\ULDXV SDY\]G³ VX ILJÌURPLV ã³NDUW SHUUDã\WD VX VVDMÐ NODV¡PLV
3ULG¡WD LU YLHQD NRPSLOLDYLPR ODLNR NRQVWDQWD NDG EÌWÐ LOLXVWUXRWDV WRNLRV NODV¡V
kintamojo matomumas.
47
9LGLQ¡VNODV¡V
.ODV
JDOLPD³G¡WL³NLWRVNODV¡VDUPHWRGRYLGÐDUED³NXULQRUVPDWRPXPR
VULW³7RNLDNODV¡YDGLQDPDYLGLQHNODVH9LGLQ¡NODV¡JDOLQHWXU¡WLYDUGR
3DJULQGLQ¡ YLGLQ¡V NODV¡V SDVNLUWLV – SDVO¡SWL NODV¡V UHDOL]DFLM QXR M
³WDOSLQDQþLRVNODV¡VLãRU¡VDUEDUHDOL]XRWLWLNUGDXJ\ELQ³SDYHOG¡MLPQHQXRVVDMÐ
NODVLÐRSDYHOG¡MLPQXRNHOLÐYLGLQLÐNODVLÐWLSÐ
9LGLQ¡PV NODV¡PV JDOLPD WDLN\Wi prieities modifikatorius public, private ar
protected.
3DY\]G\VNODV¡NLWRVNODV¡VYLGXMH
Programos rezultatai:
j = 123 s = abc
Esminis skirtumas nuo ³SUDVWLQLÐ NODVLÐ – Lã Xå ExternalClass ULEÐ YLGLQ¡V
NODV¡V YLVLãNDL QHSDVLHNLDPRV URG\NOHV ³ YLGLQHV NODVHV JDOLPD EÌWÐ VXNXUWL WLN
naudojant specialius metodus:
...
public InnerClass1 makeInnerClass1( ){
return new InnerClass1( );
}
...
48
...
ExternalClass ec = new ExternalClass( );
ExternalClass.InnerClass1 ic1 = ec.makeInnerClass1( );
...
NRPSLOLDWRULDXVEÌWÐSULSDåLQWDVNODLGLQJX
49
9LGLQ¡V NODV¡V PHWRGÐ YLGXMH 5HPLDQWLV DQNVWHVQLX SDY\]GåLX MHL WXU¡WXPH
WLNYLHQYLGLQ
NODV
ýLD YLGLQ¡ NODV¡ \UD SDVO¡SWD GDU JLOLDX LU SULHLQDPD WLN Lã PHWRGR
makeInnerClass vidaus.
/DEDLSDQDãLDLYLGLQHVNODVHVJDOLPD³G¡WL³EHWNXULPDWRPXPRVULW³WLNLãWHQ
MRVLUEÌWÐSULHLQDPRV
%HYDUG¡VYLGLQ¡VNODV¡V3DY\]G\V
50
class C{ . . . }
abstract class D{ . . . }
class E extends C{
D makeD( ){
return new D( ){ . . . };
}
}
.ODLGÐDSGRURMLPRPHFKDQL]PDV
51
QXURGRNRGRIUDJPHQWNXULVEÌWLQDLWXULEÌWLDWOLNWDVQHDWVLåYHOJLDQW³WDLNLORLãLPWLV
DUQH7DLJLSULQFLSLQ¡NODLGÐDSGRURMLPRVFKHPD\UDWRNLa:
9LVRVLãLPW\V\UDNODV¡VThrowableVXENODV¡VäHPLDX\UDGYLMRVVXENODV¡V–
Exception ir Error. Exception NODV¡ DSLPD NODLGLQJDV SURJUDPRV VLWXDFLMDV NXULDV
WXU¡WÐVXJDXWLLUDSGRURWLSURJUDPXRWRMDV-RNXULDPRVLãLPW\VWDLSSDWWXULEÌWLãLRV
NODV¡V VXENODV¡V 6YDUEL Exception VXENODV¡ \UD RuntimeException: ji apima tokias
NODLGDV NDLS GDO\ED Lã QXOLR PDV\YR LQGHNVR LãHLWLV Xå PDV\YR ULEÐ LU SDQ $LãNX
SURJUDPXRWRMDV QRU¡GDPDV JDOL VXNHOWL WRNLR WLSR LãLPWLV LU SDWV .ODV¡V Error ir jos
VXENODVLÐ DSLEU¡åLDPÐ LãLPþLÐ SURJUDPRMH SHULPWL QHUHLNLD WDL WRNLRV LãLPW\V NXULÐ
programa negali pati apdoroti –WDLVLVWHPLQ¡VLUNRPSLOLDYLPRNODLGRV
Jei RuntimeException LãLPWLHV SURJUDPXRWRMDV QHSHULPD M DXWRPDWLãNDL
perima Java NODLGÐ DSGRURMLPR PHFKDQL]PDV LãYHGDPDV SUDQHãLPDV DSLH NODLG
PHWRGÐNYLHWLPÐVHNDLUSURJUDPRVGDUEDVQXWUDXNLDPDV6HNDLãYDUGLMDYLVPHWRGÐ
LUMÐNODVLÐYDUGÐVHNQXRLãLPW³VXN¡OXVLRPHWRGRLNLDXNãþLDXVLRPHWRGRLUDWURGR
taip:
at.ODV¡V9DUGDV0HWRGR9DUGDV5LQNPHQRV9DUGDVjavaHLOXW¡VQXPHULV
at .ODV¡V9DUGDV$XNãWHVQLRMR0HWRGoVardas (RinkmenosVardas.java HLOXW¡V
numeris)
...
class MyException{
public static void main( String args [ ] ){
int numerator, denominator, result;
try{
numerator = 123;
denominator = 0;
result = numerator/denominator;
System.out.println( “This won’t be printed” );
} catch( ArithmeticException ae ){
System.out.println( “Processing of exception” );
}
System.out.println( “After catch of exception” );
}
}
52
Programos spausdinimai:
Processing of exception
After catch of exception
...
} catch( ArithmeticException ae ){
System.out.println( “Exception” + ae );
...
...
try{
...
} catch ( Exception e ){
System.out.println( “Exception” + e );
} catch ( ArithmeticException ae ){
System.out.println( “Exception” + ae );
}
...
6XNHOLDSURJUDPXRWRMRLãLPW³QDXGRMDQWWRNLVLQWDNV
. . . throw ThrowableInstance;
þLD ThrowableInstance \UD DUED YLGLQ¡ Java išimtis – viena kuri nors Throwable
NODV¡V VXENODV¡ DUED SDWLHV SURJUDPXRWRMR VXNXUWD LãLPWLV WDLS SDW WXUL SDYHOG¡WL
ThrowableVDY\EHVâLVREMHNWDVVXNXULDPDV³SUDVWDLRSHUDWRULXPLnew9LVÐYLGLQLÐ
Java LãLPþLÐ NRQVWUXNWRULDL \UD GYLHMÐ WLSÐ EH DUJXPHQWR DUED VX String tipo
53
DUJXPHQWX 3DVWDUXRMX JDOLPD REMHNWXL VXWHLNWL SDDLãNLQDPM³ WHNVW NXU³ Y¡OLDX
spausdintume metodu toString.
²Y\NGåLXV RSHUDWRULÐ SURJUDPRV Y\NG\PDV SHUWUDXNLDPDV LU YDOGymas
atiduodamas atitinkamam catch blokui. Jei toks nerandamas –SURJUDPVWDEGRJava
NODLGÐ DSGRURMLPR PHFKDQL]PDV 3DY\]G\V-VFKHPD VXNHOLDPD YLGLQ¡ Java klaida
NullPointerException – tam operatoriumi new sukuriamas jos objektas; ji sugaunama,
paskui sukeliama nauja tokio pat tipo klaida, o jos apdorojimas atiduodamas
aukštesniam metodui:
Programos spausdinimai:
7DL UDNWDåRGLV PHWRGXL NXULV JDOL VXNHOWL LãLPW³ WDþLDX Sats jos neapdoros –
WDGD NODLG SULYDOR DSGRURWL DXNãWHVQLV NYLHþLDQW\VLV PHWRGDV DLãNX ãLV JDOL
SHUDGUHVXRWL DSGRURMLP GDU DXNãWHVQLDP PHWRGXL LU W W 3R RSHUDWRULDXV throws
galima išvardyti ir kelias išimtis – WDGD YLVRV MRV WXUL EÌWL SHULPWRV DXNãtesniame
metode. Nereikia apdoroti tik Error ir RuntimeExceptionLãLPþLÐEHLMÐVXELãLPþLÐ
Pavyzdys:
54
try{
throwException( );
} catch( Exception e ){
System.out.println( “Exception “ + e + “ caught” );
}
}
}
âLR RSHUDWRULDXV EORNDV UDãRPDV SR YLVÐ catch bloNÐ LU Y\NGRPDV EHW NRNLX
atveju – NLOR LãLPWLV DU QH 3DY\]GåLX JDO¡WÐ EÌWL GXRPHQÐ VNDLW\PDV Lã ULQNPHQRV
VNDLWDQW GXRPHQLV JDOL NLOWL YLGLQ¡ Java išimtis IOException – WRNLX DWYHMX M UHLNLD
perimti, o po jos apdorojimo –XåGDU\WLULQNPHQMHLGXRPHQ\V nuskaityti tvarkingai
EHNODLGЖYLVWLHNSRYLVNRULQNPHQUHLNLDXåGDU\WL%HMHMHL\UDRSHUDWRULXVfinally,
Java kompiliatorius nereikalauja po try bloko catchRSHUDWRULÐ
Tas pat pavyzdys su šiuo operatoriumi:
ArithmeticException
ArrayIndexOutOfBoundsException
ClassCastException
NullPointerException
.RQWUROLXRMDPRVLãLPW\VWXULEÌWLSHULPDPRVDUED³WUDXNLDPRV³throwsVUDã
-ÐSDY\]GåLDL
ClassNotFoundException
55
IllegalAccessException
InstantiationException – kai bandoma sukurti abstractNODV¡VREMHNW
InterruptedException –NDLEDQGRPDSHUWUDXNWLY\NGRPVUDXWåUWROHVQLXV
skyrius)
NoSuchMethodException
NoSuchFieldException
Programos spausdiniai:
Method compute( 5 )
Regular finish of method compute
Method compute( 15 )
An exception caught MyException5( 15 )
56
²YHVWLHVLULãYHVWLHVVLVWHPRVSDJULQGDL
InputStream –DEVWUDNþLRVLRVVUDXWÐNODV¡V³YHVþLDLLU
OutputStream LãYHVþLDL
BufferedInputStream –VUDXWDLQDXGRMDQW\VDWPLQWLHVEXIHU³NXULR
BufferedOutputStream WDOSD JDOL EÌWL QXVWDW\WD SDJDO QXW\O¡MLP DUED
išreikštai paties programuotojo. Daug
efektyvesni nei nebuferizuoti.
DataInputStream –SULPLW\YLÐGXRPHQÐLUStringGXRPHQÐ
DataOutputStream srautai
FileInputStream –VUDXWDLLãULQNPHQRVLU³ULQNPHQ
FileOutputStream
Reader –DEVWUDNþLRVLRVVUDXWÐNODV¡V
Writer
BufferedReader
BufferedWriter
FileReader
FileWriter
PrintWriter
57
Kadangi Java 2UHNRPHQGXRMDPLVLPEROLQLDLVUDXWDL\UDLUVSHFLDOLRVNODV¡V
SHUYHGDQþLRV EDLWLQLXV VUDXWXV ³ VLPEROLQLXV InputStreamReader ir
OutputStreamWriter.
*UHWDãLÐVUDXWÐSDODLNRPDLUYDGLQDPRMLVWDQGDUWLQ¡³YHVWLVLULãYHVWLV7RNLD
VYRND UHLãNLD YLVL GXRPHQ\V SURJUDPDL ³YHGDPL Lã YLHQLQWHOLR VWDQGDUWLQ¡V ³YHVWLHV
VUDXWRLULãYHGDPL³YLHQLQWHO³VWDQGDUWLQ³LãYHVWLHVVUDXWRYLVRVNODLGRVXåUDãRPRV³
YLHQLQWHO³ VWDQGDUWLQ³ NODLGÐ VUDXW âLH VWDQGDUWLQLDL VUDXWDL UHDOL]XRWL QH SDNHWH
java.io, bet java.lang.SystemNODV¡MHâLRMHNODV¡MH\UDpublic static laukai:
in –VUDXWDVVWDQGDUWLQHL³YHVþLDL
out –VUDXWDVVWDQGDUWLQHLLãYHVþLDL
err –VUDXWDVVWDQGDUWLQLDPNODLGÐVUDXWXL
²YHVWLV Lã SXOWR 5HNRPHQGXRMDPD QH EDLWLQ¡ EHW VLPEROLQ¡ ³YHVWLV LU GDU
buferizuota, t. y. reikia operuoti ne vienu simboliu, bet keliais iškart – taip efektyviau.
0LQ¡WDNDGSXOWR³YHVWLV–³YHVWLVLãREMHNWRSystem.in; šis objektas yra baitinio srauto
InputStream WLSR â³ EDLWLQ³ VUDXW UHLNLD SHUWYDUN\WL ³ VLPEROLQ³ WLOWX
InputStreamReader9LVNVXG¡MXVNDUWXWXULPH
3DY\]G\VVLPEROLгYHGLPDVLãNODYLDWÌURVNROQHEXV³YHVWDVVLPEROLVq:
import java.io.*;
class CharReading{
public static void main( String args [ ] ) throws IOException{
// “throws” transfers possible exception of method
// “read”.Now the “try” block is not needed
char c;
BufferedReader br = new BufferedReader(
new InputStreamReader(
System.in ) );
58
do{
c =( char )br.read( );
System.out.println( c );
} while( c != ‘q’ );
}
}
²YHGXVSDY\]GåLXLabcdq ir QXVSDXGXV³YHGLPRNODYLãSURJUDPDVSDXVGLQV
a
b
c
d
q
7DLS \UD WRG¡O NDG ³YHGLPDV EXIHUL]XRWDV – ³ EXIHU³ QXVNDLWRPL LãNDUW YLVL
VLPEROLDL R Lã EXIHULR VNDLWRPD MDX SR VLPERO³ 1HEXIHUL]XRWR ³YHGLPR WRNLX DWYHMX
EÌWгYHVWDVWLNSDVNXWLQLVVLPEROLV
import java.io.*;
class CharReading{
public static void main( String args [ ] ) throws IOException{
char c;
BufferedReader br = new BufferedReader(
new InputStreamReader(
System.in ) );
PrintWriter pw = new PrintWriter( System.out, true );
do{
c =( char )br.read( );
pw.println( c );
} while( c != ‘q’ );
}
}
59
'XRPHQÐ PDLQDL VX ULQNPHQRPLV 9LVRV Java ULQNPHQRV \UD EDLWLQ¡V
6UDXWDPVLãULQNPHQÐVDYRPDãLQRMHDWLGDU\WLSDSUDVWDLQDXGRMDPLNRQVWUXNWRULDL
6NDLWDQW ULQNPHQ PLQ¡WRML LãLPWLV N\OD NDL UDQGDPD ULQNPHQRV SDEDLJD (2)
JUåLQDPD UHLNãP¡ –1). Rekomenduojami simboliniai buferizuoti srautai, kurie turi
metodus readLine( ), kelis perkrautus write( ) metodus, ir kuriuos gautume jau
³SUDVWXEÌGX
3DY\]G\VULQNPHQRVNRSLMDYLPDV³NLWULQNPHQULQNPHQÐYDUGDLSURJUDPDL
WHLNLDPLNRPDQGLQ¡MHHLOXW¡MH
import java.io.*;
class CopyingFile{
public static void main( String args [ ] ) throws IOException{
// transfers exceptions of “write”, “read”, “close”
String line;
BufferedReader in;
PrintWriter out
try{
in = new BufferedReader(
new InputStreamReader(
new FileInputStream( args[0] )));
out = new PrintWriter(
new BufferedWriter(
new FileWriter( args[1] )));
} catch( FileNotFoundException e ) {
// exception may arise when searching for source file
System.out.println( “Source file does not exist” );
60
return;
} catch( ArrayIndexOutOfBoundsException e ){
// exception may arise when the program is
// wrongly launched from command line
System.out.println( “To be used:” );
System.out.println( “java CopyingFile source target” );
return;
}
do{
line = in.readLine( );
if( line != null ) {
out.write( line+”\n” ); // here the overridden
} // write( String ) is used.
} while(line != null ); // \n breaks the line.
in.close( );
out.close( );
}
}
3URJUDPDWXULEÌWLSDOHLVWDLãNRPDQGLQ¡VHLOXW¡VWDLSGDUELQLDPHDSODQNHMDX
WXULEÌWL³UDã\WDHLOXWLQLÐGXRPHQÐULQNPHQDsourceFile):
...
PrintStream out;
try{
out = new PrintStream(
new BufferedOutputStream(
new FileOutputStream( “file.out” )));
System.setOut( out );
System.setErr( out );
...
System.out.println( “This message goes to the file file.out” );
System.err.println( “This error-message goes to the file file.out, too” );
} catch( Exception e ) {
System.err.println( “Error “ + e );
}
...
out.close( );
...
61
Šiame pavyzdyje WHQND QDXGRWL VUDXW PrintStream QHV NODV¡V System laukas
out NXU³ LU QRULPH SHUDGUHVXRWL \UD OutputStream tipo; o PrintStream paveldi
OutputStreamIXQNFLRQDOXP7ROLDXGDUSULGHGDPDVEXIHULVVNDLW\PRLãULQNPHQRV
srautui FileOutputStream9LVNVXG¡Mus gaunamas reikiamas programos objektas out.
6LVWHPLQ¡V ³YHVWLHV SHUDGUHVDYLPDV Lã ULQNPHQRV WDUNLPH file.in EÌWÐ WRNV
G¡OIUDJPHQWRWUXPSXPRSUDOHLVLPHtryEORN
...
BufferedInputStream in = new BufferedInputStream(
new FileInputStream( “file.in” ));
System.setIn( in );
BufferedReader br = new BufferedReader(
new InputStreamReader( System.in ));
...
String line = br.readLine( );
...
in.close( );
...
Visa tai – WLN ³YDGDV ³ VXG¡WLQJ Java ³YHVWLHV LU LãYHVWLHV VLVWHP *DOEÌW
QRULQWUHDOL]XRWLNDLNXULDVLG¡MDVWHNVVDYDUDQNLãNDLLãQDJULQ¡WLLUNLWXVVUDXWXV
ZipInputStream, ZipOutputStream – VUDXWDL VX GXRPHQÐ DXWRPDWLQLX
VXVSDXGLPX³zipIRUPDW
PipedInputStream, PipedOutputStream ir analogiški simboliniai srautai
PipedReader, PipedWriter –VUDXWDLEHQGUDXWLWDUSNHOLÐSURJUDPRVY\NG\PRJLMÐåU
tolesnius skyrius);
RandomAccessFile –YLVLãNDLVDYDUDQNLãNDNODV¡ãLRWLSRULQNPHQRPVLUWW
6DYLDQDOL]¡VVLVWHPD
3DY\]GåLXL
62
Class c = Class.forName( “java.lang.String” );
.LHNYLHQDPHJ]LVWXRMDQþLDPEHWNXULRVNODV¡VREMHNWXLURG\NO
³MR&ODVVREMHNWWDLS
pat galima gauti metodu getClass( ):
...
ClassX cx = new ClassX( );
Class c = cx.getClass( );
...
//
// Utility: list of methods for the indicated class
// [ possessing indicated substring ]
// to the screen and
// to the file "List.out" in the same directory
//
63
}
64
Pastabos:
1. Metodas removeName( ) iš pilnojo konstruktoriaus ar metodo vardo išmeta
VXEHLOXW
java.lang. Tam pasitelkiami klaV¡V String metodai s.length( ) – jie nustato
String duomens s LOJ³ s.indexOf ( String sub ) – QXVWDWR VXEHLOXW¡V sub pirmojo
³¡MLPR ³GXRPHQ³sSR]LFLMRMHL³¡MLPRQ¡UD–JUåLQD–1; s.substring( int i1, int i2 ) –
JUåLQD s VXEHLOXW
SUDGHGDQW QXR simbolio pozicijoje i1 ir baigiant simboliu
pozicijoje i2 .DGDQJL ³ YLHQ PHWRGR DU NRQVWUXNWRULDXV DSUDã java.lang. JDOL ³HLWL
kelis kartus, metodas removeNameNYLHþLDPDVUHNXUV\YLDL
-HL ³UDQNLV ML NYLHþLDPDV QHWHLVLQJDL ³ SXOW LãYHGDPDV SUDQHãLPDs apie
WDL NDLS QDXGRWL ³UDQN³ String usage LU SURJUDPD VWDEGRPD NODV¡V System metodu
exit, kuriam teikiama int UHLNãP¡ ²SUDVWD NDG SURJUDPDL QRUPDOLDL EDLJLDQW GDUE
exitUHLNãP¡WXU¡WÐEÌWL0, kitais atvejais –NLWDSDY\]GåLXLNDLSþLD– 1.
3. Metodai getMethods ar getConstructors JUåLQD NODVLÐ Method ir
ConstructorREMHNWXVMXRVWHQNDLãUHLNãWDLSHUYHVWL³StringWLSPHWRGXtoString, kad
EÌWÐJDOLPDDQDOL]XRWLYDUGXV
Java OHLGåLD YLHQX PHWX Y\NG\WL NHOLDV SURJUDPRV dalis. Tai efektyvu,
SDY\]GåLXLDWOLHNDQW³YHGLPRLULãYHGLPRRSHUDFLMDVMDVDWOLHNDQW\V³UHQJLQLDLO¡WLLU
NLWDV SURJUDPRV RSHUDFLMDV YLHQX PHWX DUED JUDILQ¡MH YDUWRWRMR VVDMRMH
EHVLNDUWRMDQþLXV XåGDYLQLXV VOHQNDQWLV YDL]GDV EHVLVXNDQWLV SDYHLNVO¡Ois ir pan.)
SDOHLGåLDQWDWVNLUXQXRSDJULQGLQLRVVDMRVVUDXWRVUDXWX9LVDLVãLDLVDWYHMDLVSLOQLDX
išnaudojamas kompiuterio CPU.
Keli Java srautai (arba gijos, threadsSDOHLGåLDPLY\NG\WLYLHQRMHSURJUDPRMH
(kitaip – YLHQDPH SURFHVH LU QDXGRMD W SDþL DGUHVÐ HUGY
LU WXRV SDþLXV DWPLQWLHV
išteklius. Tuo Java VUDXWDL VNLULDVL SDY\]GåLXL QXR & VUDXWÐ NXULDPÐ IXQNFLMD
fork. Pastarieji yra pilnos pradinio srauto kopijos – atskiri procesai. Perjungimas iš
YLHQRVUDXWR³NLWUHLNDODXMDWDPWLNUÐLãWHNOLÐãLPWÐRSHUDFLMÐHLO¡VWDþLDXWDLGDXJ
HIHNW\YLDX QHL SHUMXQJLPDL WDUS SURFHVÐ SDY\]GåLXL GDXJLDSURJUDP¡MH 26
UHLNDODXMDQW\VWÌNVWDQþLÐRSHUDFLMÐHLO¡V
Programoje gyvuojant keliems srautams, galimos situacijos, kai keli srautai
NRQNXUXRMD G¡O WR SDWLHV NRPSLXWHULR LãWHNOLR SDY\]GåLXL NHOL VUDXWDL EDQGR YLHQX
PHWXUDã\WLGXRPHQLV³ULQNPHQ7RG¡OQRULQWVXWYDUN\WLNHOLÐVUDXWÐGDUEJDOLWHNWL
VXGHULQWLMÐGDUE– sinchronizuoti srautus.
6UDXWDL JDOL EÌWL JUXSXRMDPL ³ JUXSHV *DOLPD LãNDUW YDOG\WL YLHQRV JUXS¡V
visus srautus.
Visos Java ELEOLRWHNRV VXNXUWRV ³YHUWLQDQW JDOLP GDXJLDVUDXWLãNXP 0DW\W
GDXJLDVUDXWLãNXPR PRGHOLV YLV WLN Q¡UD WREXODV QHV GDXJHOLV DXWRULÐ SURJUDPDYLP
QDXGRMDQWNHOLVVUDXWXVYDGLQDPHQX9LVÐSLUPD\UDULERVNDLGLGHVQLVVUDXWÐNLHNLV
VXPDåLQD SURJUDPRV HIHNW\YXP WD ULED VLHNLD ãLPWXV LU WÌNVWDQþLXV VUDXWÐ LU
SULNODXVR QXR NRPSLXWHULR SDM¡JXPR $QWUD SDX]¡V VUDXWR Y\NG\PR PHWX
(gaunamos metodu sleep( )DUEDVDYDQRULãNDVYDOG\PRDWVLVDN\PDVVUDXWHNYLHþLant
PHWRG yield( ) JDOL WDLS SDW SDGLGLQWL SURJUDPRV HIHNW\YXP 7DLJL DXWRPDWLQLV
SHUMXQJLPRWDUSVUDXWÐPHFKDQL]PDVQ¡UDWREXODV
6UDXWREÌNO¡JDOLEÌWLWRNLD
3DVLUXRã
VGDUEXLVXNXUWDVEHWQHSDOHLVWDV
9\NGRPDV WLNVOLDX JDOL EÌWL Y\NGRPas, jei Java JVM srautui skirs CPU
LãWHNOLÐ
65
3DVLEDLJ
VEDLJ¡GDUEVUDXWRPHWRGDVrun( ) ).
%ORNXRWDV SDY\]GåLXL ODXNLD LãWHNOLR DUED SDWV VUDXWDV LãNYLHW¡ PHWRG
sleep( ) –WDGDMRHLO¡VUDXWÐHLO¡MHSUDOHLGåLDPDLUY\NGRPDVNLWDVVUDXWDV.
Vienas programos srautas yra pagrindinis: jame kuriami kiti srautai, jis turi
EDLJWLV SDWV SDVNXWLQLV -HL SDJULQGLQLV VUDXWDV JUHLþLDX EDLJLDVL QHL NXULV GXNWHULQLV
srautas – dokumentacijoje nurodoma, kad JVM gali „pakibti“. To išvengti padeda
metodas join( ),VXVLHMDQWLVSDJULQGLQ³VUDXWVXGXNWHULQLXLUOHLGåLDQWLVSDJULQGLQLDP
VUDXWXL SDODXNWL NRO EDLJV GDUE GXNWHULQLV 6UDXWDL PHWRGX setDaemon( true ) gali
EÌWLSDVNHOEWLVUDXWDLV-GHPRQDLVLUGLUEWLIRQLQLXUHåLPX'DEDUSURJUDPDEDLJLDVLNDL
baigiasi pagrindinis srautas.
'DEDU SDWHLNLDPD VUDXWR VXNÌULPR VLQWDNV¡ R Y¡OLDX – VUDXWÐ SDQDXGRMLPR
VDYDUDQNLãNRVH SURJUDPRVH LU NOLHQWLQ¡VH SURJUDPRVH SDY\]GåLDL 7RG¡O GDOLV ãLÐ
SDY\]GåLÐGDEDULNLJDORGDUQHEXVVXSUDQWDPLSULHMÐWHNVJU³åWLLãQDJULQ¡MXVSwing
SDNHW
6UDXWDV VDXJRPDV NODV¡V Thread REMHNWH âL NODV¡ UHDOL]XRMD VVDMÐ NODV
Runnable7RG¡OVUDXWJDOLPDVXIRUPXRWLGYLHPEÌGDLV–SOHþLDQWNODV
Thread arba
UHDOL]XRMDQWVVDMÐNODV
Runnable. Pagrindiniai Thread metodai yra šie:
start( ) –SDOHLGåLDVUDXW
run( ) – QXURGR N UHLNLD DWOLNWL VUDXWH -DP SDVLEDLJXV EDLJLDVL VUDXWR
gyvavimas;
sleep( t ) –EORNXRMDVUDXWODLNXLtPDWXRMDPDPPLOLVHNXQG¡PLV
yield( ) –DWLGXRGDYDOG\Pã³VUDXWVXNÌUXVLDPVUDXWXL – supersrautui;
join ( ) –VXVLHMDã³VUDXWVXSDJULQGLQLX
isAlive( ) – nustato, ar šis srautas dar gyvuoja;
getPriority( ) –QXVWDWRVUDXWRSULRULWHW
getName( ) –QXVWDWRVUDXWRYDUG
Net jei programa nesukuria jokio išreikšto srauto, vienas – pagrindinis srautas
MDL VXNXULDPDV DXWRPDWLãNDL 9DUG LU SULRULWHW MDP VXWHLNLD -90 9LVDGD JDOLPD
JDXWLURG\NO
³ã³VUDXWVWDWLQLXPHWRGXcurrentThread( ):
class OneThread{
public static void main( String args [ ] ){
Thread t = Thread.currentThread( );
t.setName( “Thread1” );
System.out.println( “Current thread: “ + t );
try{
for( int i=5; i>0; i-- ){
System.out.println( i );
t.sleep( 1000 );
}
} catch( InterruptedException ie ) { }
}
}
Programa spausdins:
66
Current thread: Thread[ Thread1, 5, main]
TRNLVSDXVGLQLPRIRUPQXVWDWRDXWRPDWLãNDLREMHNWXLtNYLHþLDPDVPHWRGDV
toString( ) R SDVNXL NDV VHNXQG
VSDXVGLQDPL FLNOH QXURG\WL VNDLþLDL QHV
NLHNYLHQDV FLNOR åLQJVQLV WRNLDP ODLNXL SHUWUDXNLDPDV .DLS PDW\WL VUDXWR
SULRULWHWDV SDJDO QXW\O¡MLP \UD 5 SULRULWHWÐ ULERV \UD –10), o srautas
DXWRPDWLãNDL³MXQJLDPDV³VUDXWÐJUXS
main6XVWDEGåLXVVUDXWJDOLNLOWLLãLPWLV
InterruptedException, MHL ã³ VUDXW SDX]¡V PHWX SHUWUDXNWÐ NLWDV VUDXWDV PHWRGX
interrupt( ).7HLJLDPDNDGWRNLDJDOLP\E¡EXVQDXdinga ir bus naudojama ateities
JavaYHUVLMRVH'DEDUWHQNDWLNSHULPWLLãLPW³
67
class NewThread implements Runnable{
Thread t;
NewThread( ){
t = new Thread( this, “Child-thread” );
System.out.println( “Child-thread: “ + t );
t.start( );
}
public void run( ){
try{
for( int i=5; i>0; i-- ){
System.out.println( “Child-thread: “ + i );
Thread.sleep( 500 );
}
} catch( InterruptedException ie ){ }
System.out.println( “End of child-thread” );
}
}
class TwoThreads2{
public static void main( String args[ ] ) {
new NewThread( );
try{
for( int i=5; i>0; i-- ){
System.out.println( “Main thread: “+ i
);
Thread.sleep( 1000 );
}
} catch( InterruptedException ie ){ }
System.out.println( “End of main thread” );
}
}
Ši programa parodo, kaip reikia sujungti kelis srautus metodu join( ), kad JVM
niekada „neSDNLEWгSDJULQGLQLDPVUDXWXLEDLJXVGDUESLUPLDXQHLGXNWHULQLDP
68
System.out.println( "End of child-thread" );
}
}
class TwoThreads21{
public static void main( String args[] ) {
NewThread nt = new NewThread( );
try{
for( int i=5; i>0; i-- ){
System.out.println( "Main thread: "+ i );
Thread.sleep( 1000 );
}
} catch( InterruptedException ie ){ }
try{
nt.t.join( ); //now main thread waits for finish
} catch( InterruptedException ie ){ } // of thread "nt.t"
System.out.println( "End of main thread" );
}
}
69
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
int count = 0;
Thread t;
volatile boolean running = true;
public Counter( int priority ){
t = new Thread( this );
t.setPriority( priority );
}
70
c1.stop( );
c2.stop( );
ta.append( "Low-priority counter: "+c2.count+ "\n" );
ta.append( "High-priority counter: "+c1.count+ "\n" );
}
} );
try{
Thread.sleep( 1000 );
} catch( InterruptedException ie ){ }
Container c = getContentPane( );
c.setLayout( new FlowLayout( ) );
c.add( b1 );
c.add( b2 );
c.add( ta );
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
71
moving = true;
t = new Thread( this );
t.start();
}
72
6UDXWÐVLQFKURQL]DYLPDV7DUSVUDXWLQLDLU\ãLDL
6LQFKURQL]DYLPDVOHLGåLDLãYHQJWLVUDXWÐVXVLGÌULPRNRQNXUXRMDQWG¡OWRSDWLHV
LãWHNOLR *DOLPD VLQFKURQL]XRWL YLV PHWRG DU DWVNLU MR GDO³ – YDGLQDPM NULWLQ
VHNFLM 6LQFKURQL]DYLPDV YLVDGD SDGLGLQD Y\NG\PR ODLN 3DY\]GåLXL % (FNHOLV
VLQFKURQL]XRWDV PHWRGR NYLHWLPDV Y\NGRPDV PDåGDXJ NHWXULV NDUWXV LOJLDX Xå
³SUDVWM³ NYLHWLP þLD WXULPDV RPHQ\MH SDWV PHWRGR NYLHWLPDV QH³YHUWLQDQW SDWLHV
metodo vykdymo).
Metodo sinchronizavimo pavyzdys:
EÌWÐEHJDOLQLVNDGDQJLM³XåEORNDYXVQH³PDQRPDSDNHLVWLrunningUHLNãP¡V5HLN¡WÐ
EORNXRWLWLNVNDLWLNOLRUHLNãP¡VNHLWLP
âLV SDY\]G\V Q¡UD SUDVPLQJDV LU VNLUWDV WLN NULWLQ¡V VHNFLMRV EORNDYLPXL
SDDLãNLQWLVNOLDXVWXRVHQXURGRPDVEORNXRMDPDVREMHNWDVRILJÌULQLXRVHVNOLDXVWXRVH
– YLVD EORNXRMDPRML VHNFLMD 7RNV SDY\]G\V EÌWÐ SUDVPLQJDV WLN WDGD MHL UHLNãPHL
NHLVWLUHLN¡WÐNHOLÐRSHUDFLMÐýLDEORNHW¡UDYLHQLQWHO¡RSHUDFLMDWRG¡OWRNLDLSDSUDVWDL
VHNFLMDLWDVSDWDUEORNXRWLMDUQH
Sinchronizuotuose srautuose galimi metodai wait( ), notify( ), notifyAll( ),
SDGHGDQW\VVXGHULQWLVUDXWÐGDUE9LVLãLHPHWRGDLDSLEU¡åWLNODV¡MHObjectWRG¡OLã
principo prieinami kiekvienai klasei.
73
ýLD SDURG\VLPH WLN VUDXWÐ GDUER VXGHULQLPR VLQWDNV
3DWV VUDXWÐ GHULQLPDV
LãHLQD Xå NXUVR ULEÐ LU \UD GDXJLDX O\JLDJUHþLÐMÐ VNDLþLDYLPÐ DOJRULWPÐ UHLNDODV
Klasikinis tarpsrautinio darbo organizavimo pavyzdys – GXRPHQÐ VWUXNWÌURV-HLO¡V
UHDOL]DYLPDV31DXJKWRQDV3URJUDPRMH\UDGYLNODV¡VSDODLNDQþLRVHLO¡VNODV
Q:
Producer ÄJDPLQD³ REMHNW – ³ HLO
³GHGD HLOLQ³ VNDLþLÐ PHWRGu void put( int n ), o
Consumer W VNDLþLÐ VXYDUWRMD – atspausdina metodu int get( ). -HL ³ SURJUDP
QH³WUDXNWXPH wait ir notify PHWRGÐ NYLHWLPÐ VUDXWÐ GDUEDV EÌWÐ QHVXGHULQWDV LU
SDY\]GåLXL JDPLQWRMDV JDO¡WÐ SDJDPLQWL Lã HLO¡V NHOLV VNDLþLXV MÐ QHVXYDrtojus
YDUWRWRMXLDUEDYDUWRWRMDVJDO¡WÐVXYDUWRWLWSDW³VNDLþLÐNHOLVNDUWXV
.DG SURJUDPRV HVP¡V QHXåGHQJWÐ VVDMRV RUJDQL]DYLPR LU NLWL GDO\NDL
SURJUDPDSDUDã\WDSDSUDVþLDXVLXEÌGXLU\UDEHJDOLQ¡-RVGDUEJDOLPDQXWUDXNWLWLN
klavišais Ctrl – C.
int n;
boolean go = false;
Q q;
Producer( Q q ){
this.q = q;
74
new Thread( this,"Producer" ).start( );
}
Q q;
Consumer( Q q ){
this.q = q;
new Thread( this,"Consumer" ).start( );
}
class InfiniteQueue{
public static void main( String [] args ){
System.out.println( "Press Ctrl-C for finish" );
Q q = new Q( );
new Producer( q );
new Consumer( q );
}
}
2.20. Kolekcijos
75
SDJDOELQ¡V Java NODV¡V EHL VVDMÐ NODV¡V PDQLSXOLXRWL GDWD LU ODLNX DWVLWLNWLQLDPV
VNDLþLDPVJHQHUXRWLHLOXWLQLÐGXRPHQÐDQDOL]HLLUWW
<UD NROHNFLMRV YLVRPV SURJUDPDYLPH SODþLDX QDXGRMDPRPV GXRPHQÐ
VWUXNWÌURPV GLQDPLQLDPV PDV\YDPV ULQNLQLDPV VUDãDPV VXVLHWLHVLHPV VUDãDPV
PHGåLDPV hash-OHQWHO¡PV 9LVL ³YDLULRPV NROHNFLMRPV UHLNDOLQJL DOJRULWPai sutelkti
NODV¡MH Collections LU ³IRUPLQWL NDLS VWDWLQLDL PHWRGDL -LH \UD SULHLQDPL YLVRPV
NROHNFLMRPV 0HWRGDL UHLNDOLQJL GXRPHQLPV Lã NROHNFLMRV LãULQNWL SR YLHQ Lã HLO¡V
NDLS MLH VXG¡WL ³ NROHNFLM DSLEU¡åWL VVDMÐ NODV¡MH Iterator (Java 1 yra panašias
IXQNFLMDV DWOLHNDQWL VVDMÐ NODV¡ Enumeration, tik, aišku, Java 2 kolekcijose ji
QHUHDOL]XRWD .LHNYLHQD NROHNFLMÐ NODV¡ UHDOL]XRMD VVDMÐ NODV
Iterator. Metodai,
UHLNDOLQJL NDL NXULRPV NROHNFLMRPV ³YDLULDL UÌãLXRWL DSLEU¡åWL VVDMÐ NODV¡MH
Comparator.
2EMHNWDPVVDXJRWLVNLUWLLUPDV\YDLNXULXRVQDJULQ¡MRPHDQNVþLDXLUNXULXRV
naudojant programose paketas java.util nereikalingas. Masyvas – pats efektyviausias
GXRPHQÐ NRQWHLQHULV WDþLDX MR PDWPXR Y\NGDQW SURJUDP \UD SDVWRYXV W \
programoje WXUL EÌWL QXURG\WD NLHN REMHNWÐ JDO¡V WLOSWL ³ PDV\Y R Y¡OLDX PDV\YDV
SULUHLNXV QHJDO¡V DXWRPDWLãNDL SO¡VWLV 3DNHWH java.util \UD NODV¡ ArrayList,
UHDOL]XRMDQWL DXWRPDWLãNDL EHVLSOHþLDQþLXV PDV\YXV EHW MRV HIHNW\YXPDV JHURNDL
menkesnis. Pakete taip paW\UDNODV¡Arrays, turinti statinius metodus equals – dviem
masyvams sulyginti, fill – PDV\YXL XåSLOG\WL QRULPDLV GXRPHQLPLV sort – masyvui
UÌãLXRWLWDPWLNUDWYDUNDbinarySearch –QRULPDPHOHPHQWXLUDVWLUÌãLXRWDPHPDV\YH
ir asList – masyvui pertvarkytL³VUDãList7DLJLNODV¡ArraysPDV\YDPV\UDNODV¡V
Collections kolekcijoms atitikmuo. Masyvams kopijuoti skirtas metodas yra
VWDQGDUWLQ¡MH Java bibliotekoje – NODV¡V System statinis metodas arraycopy kur kas
HIHNW\YHVQLV QHL PDV\YÐ NRSLMDYLPDV SDVLWHONLDQW FLNOÐ RSHUDWRULXV 0DV\YDL VNLUWL
tam tikro tipo duomenims, taip pat ir primityvams, saugoti (skyrius 2.8).
Visose kolekcijose yra tik Object tipo duomenys. Kadangi Object –
DXNãþLDXVLD Java NODVLÐ KLHUDUFKLMRV NODV¡ EHW NXUL WLHN Java, tiek programuotojo
VXNXUWD NODV¡ JDO¡V EÌWL ³G¡WD ³ EHW NXUL NROHNFLM SULPLW\YÌV GXRPHQ\V – QHJDO¡V
WDP SULPLW\YLXV GXRPHQLV UHLNLD SHUWYDUN\WL ³ DWLWLQNDPDV NODVHV-kevalus (1.3
VN\ULXV 7DþLDX WDGD SUDUDQGDPDV WLNVOXV NROHNFLMRMH HVDQþLÐ GXRPHQÐ WLSDV WRG¡O
v¡OLDXLãNROHNFLMRVSD¡PXVGXRPHQ³SULHãGLUEDQWMXRWHNVSDVLWHONWLEHVLOHLGåLDQW³M³
GXRPHQÐWLSÐSHUWYDUN\PVN\ULXV
.ROHNFLMÐKLHUDUFKLMD
76
Iterator Collection Map
WeekHashMap
List Set
Collections Arrays
Comparable Comparator
SDY.ROHNFLMÐKLHUDUFKLMD
77
boolean remove( Object o ) – SDãDOLQD Lã NROHNFLMRV HJ]HPSOLRULÐ o (jei
NROHNFLMD SDODLNR EHVLNDUWRMDQþLXV HOementus – SDãDOLQD WLN YLHQ HOHPHQW O\JÐ o).
Jei oSDãDOLQWDVJUåLQDPDUHLNãP¡true, jei o kolekcijoje nebuvo – niekas nepašalinta
– false.
6VDMÐ NODV¡ List NDLS PDW\WL Lã VFKHPRV LãSOHþLD VVDMÐ NODV
Collection
SDSLOGRPDLVPHWRGDLV9LVLãLHSDSLOGRPLPHWRGDLIDNWLãNDLOHLGåLDRSHUXRWLNROHNFLMRV
elementu (ar elementais) tam tikroje kolekcijos vietoje, apLEU¡åLDPRMH LQGHNVX
'DåQLDXLããLÐPHWRGÐQDXGRMDPL
78
List subList( int i1, int i2 ) –JUåLQDPHWRGNYLHþLDQþLRMRVUDãRGDO³–VUDã
pradedant nuo i1-ojo elemento ir baigiant i2-1-uoju elementu.
ArrayList( )
ArrayList( Collection c )
ArrayList( int capacity )
import java.util.*;
class MyArrayList{
public static void main( String args[ ] ){
ArrayList al = new ArrayList( );
System.out.println( "Initial size of array " + al.size( ) );
al.add( "A" );
al.add( "B" );
al.add( "C" );
al.add( "D" );
al.add( 1,"A1" );
System.out.println( "Size of array after resizing " + al.size( ) );
System.out.println( "Array: " + al ); // invokes method toString
al.remove( "C" );
79
al.remove( 1 );
System.out.println( "Size of array after removing " +
al.size( ) );
System.out.println( "Array: " + al );
Object array[ ] = al.toArray( ); // transforming list to
// an array
String sum = "";
for( int i=0; i<array.length; i++ )
sum = sum + ( String )array[ i ]; // downcasting
System.out.println( "Sum of array elements: " + sum );
}
}
HashSet( )
HashSet( Collection c )
HashSet( int capacity )
HashSet( int capacity, float fillRatio )
-Ð SUDVP¡ DLãNL Lã DQDORJLMRV VX ArrayList konstruktoriais, išskyrus 4-M
IRUPULQNLQLRXåSLOG\PRNRHILFLHQWDVfillRatioQXVWDWRULENXULSDVLHNXVULQNLQ\V
SOHþLDPDV.RHILFLHQWRUHLNãP¡VWXULEÌWLWDUSLURVWDQGDUWLQ¡NRHILFLHQWRUHLNãP¡
– âLRV NODV¡V REMHNWR HOHPHQWDL Q¡UD NDLS QRUV SDSLOGRPDL LãULNLXRMDPL WXR
tarpu TreeSet elementai – LãG¡VWRPL QDWÌUDOLD GLG¡MDQþLD WYDUND SDY\]GåLXL
simboliniai duomenys –SDJDOORW\QÐDE¡F¡O
DUEDNRPSDUDWRULXPLQXVWDW\WDWYDUND
âLRVNODV¡VREMHNWDLJDOLEÌWLNXULDPLYLHQXLãNRQVWUXNWRULÐ
80
TreeSet( )
TreeSet( Collection c )
TreeSet( Comparator comp )
TreeSet( SortedSet ss )
ýLD SortedSet yra dar viena anNVþLDX QHPLQ¡WD VVDMÐ NODV¡ UÌãLXRWDP
ULQNLQLXL³VLWHUSLDQWLWDUSTreeSetNODV¡VLUSetVVDMÐNODV¡V
Pavyzdys:
import java.util.*;
class MyTreeSet{
public static void main( String args[ ] ){
TreeSet ts = new TreeSet( );
ts.add( "F" );
ts.add( "b" );
ts.add( "B" );
ts.add( "K" );
ts.add( "A" );
ts.add( "a" );
System.out.println( "Set: " + ts );
}
}
Programa spausdina:
Set: [A, B, F, K, a, b]
Object next( ) – JUåLQD NLW HOHPHQW -HL NLWR HOHPHQWR Q¡UD VXNHOLDPD
išimtis NoSuchElementException.
void remove( ) – SDãDOLQDGDEDUWLQ³ HOHPHQW 9LVDGD WXUL EÌWLNYLHþLDPDVSR
next( ); jei to nepaisysime – kils išimtis IllegalStateException.
.ODV¡ListIteratorSDSLOGRPDLVLÌORPHWRGXV
void add( Object o ) – ³ VUDã SULHã HOHPHQW NXULV EÌWÐ JUåLQWDV PHWRGX
next( ),³WHUSLDPDVo.
Object previous( ) – JUåLQD DQNVWHVQ³M³ HOHPHQW -HL MR Q¡UD – kyla išimtis
NoSuchElementException.
81
int nextIndex( ) –JUåLQDNLWRHOHPHQWRLQGHNV
import java.util.*;
class MyIteratorComparator{
public static void main( String args[ ] ){
TreeSet ts = new TreeSet( new MyComparator( ) );
ts.add( "F" );
ts.add( "b" );
ts.add( "B" );
ts.add( "K" );
ts.add( "A" );
ts.add( "a" );
Iterator i = ts.iterator( ); // getting iterator
while( i.hasNext( ) ){
Object tse = i.next( );
System.out.print( tse + " " );
}
}
}
82
Programa spausdina TreeSet objekto ts HOHPHQWXV LãULNLXRWXV DWYLUNãþLD
tvarka:
baKFBA
2.20.3. MapOHQWHO¡V
6VDMÐNODV¡MHMapDSLEU¡åWLSDJULQGLQLDLPHWRGDL
6VDMÐ NODV
Map LãSOHþLD VVDMÐ NODV¡V SortedMap – UÌãLXRWDL OHQWHOHL EHL
Map.Entry OHLGåLDQWL PDQLSXOLXRWL OHQWHO¡V ³¡MLPDLV âLRV VVDMÐ NODV¡V SDSLOGR
PLQ¡WXRVLXVPHWRGXVGDUNHOLDLVQDXGLQJDLVPHWRGDLV'DOLVMÐ\UD
83
Object getKey( ) –JUåLQDGDEDUWLQLROHQWHO¡V³¡MLPRUDNW
HashMap( )
HashMap( Map m )
HashMap( int capacity )
HashMap( int capacity, float fillRatio )
TreeMap( )
TreeMap( Comparator comp )
TreeMap( Map m )
TreeMap( SortedMap sm )
2.20.4. CollectionsNODV¡VDOJRULWPDL
.ROHNFLMRPVLUOHQWHO¡PVJDOLPDWDLN\WLDOJRULWPXV³IRUPLQWXVNDLSNODV¡V
CollectionsVWDWLQLDLPHWRGDLýLDSDPLQ¡WLWLNNHOLLãMÐ
84
%DLJLDPRVLRV SDVWDERV .ROHNFLMÐ LU OHQWHOLÐ SDVLULQNLPDV JDQD GLGHOLV
3DWDUVLPHNDGDLUNRNLSDVLULQNWLNROHNFLM
1. -HL Y\NGDQW SURJUDP WHNV GDXJ NDUWÐ Lãrinkti bet kuriuos sekos elementus,
efektyviausia naudoti ArrayListNODV¡VREMHNW
2. -HL WHNV GDXJ NDUWÐ ³ VHN ³WHUSWL DU LãPHVWL HOHPHQWXV QDXGRWLQDV LinkedList
objektas.
3. Rinkiniai Set saugo tik unikalius sekoje elementus. HashSetJDUDQWXRMDSDþL
JUHLþLDXVLHOHPHQWÐSDLHãN
4. -HLULQNLQ\VWXULEÌWLLãUÌãLXRWDVQDXGRWLQDVTreeSet objektas.
5. 3ULPLW\YLRPVGXRPHQÐED]¡PVNXUWLXåWHQNDOHQWHOLÐMapJDOLP\ELÐ
85
3. J A V A T E C H N O L O G I J O S
3.1.1. %HQGURVLRVåLQLRVDSLHNOLHQWLQHVSURJUDPDV
.OLHQWLQLÐSURJUDPÐSDOHLGLPRWRNLXEÌGDL
1DUã\NOHSHUåLÌU¡WLZZZSXVODS³NXULR+70/NRGH\UDVDNLQLDL<applet>
arba <embed> QXURGDQW\V Lã NXU UHLNLD SDUVLVLÐVGLQWL NOLHQWLQ¡V SURJUDPRV NRG
86
$WVLÐVWD NOLHQWLQ¡ SURJUDPD DXWRPDWLãNDL SDOHLGåLDPD 'DEDU HVDQW GDXJHOLXL
QDUã\NOLÐ YHUVLMÐ LU NHOHWXL Java -'. DU 6'. YHUVLMÐ \UD GLGHO¡ WLNLP\E¡ NDG
NOLHQWLQ¡ SURJUDPD QDUã\NO¡MH QHYHLNV *DOL SULUHLNWL SO¡WLQLÐ plug-ins) Netscape
Navigator naršyklei arba Active-X PRGXOLÐ Internet Explorer naršyklei. Kompanija
JavasoftJDUDQWXRMDWRNLXVSO¡WLQLXVLUQHPRNDPDLMXRVSODWLQD²+70/NRGJDOLPD
³G¡WL VDNLQLXV <object> ir <embed> VX LQIRUPDFLMD DSLH WXRV SO¡WLQLXV 5HLNLDPÐ
SO¡WLQLÐ YDUGDL ³YDLULRPV -90 YHUVLMRPV SDWHLNWL
java.sun.com/products/plugin/version.html.
Sakiniuose <applet> arba <embed>WXULEÌWLWU\VSULYDORPLSDUDPHWUDL
LUJDOLEÌWLQHSULYDORPLSDUDPHWUDL
Visas HTML dokumento pavyzdys yra 1.9 skyriuje. Beje, nesvarbu, ar HTML
VDNLQLDLUDãRPLGLGåLRVLRPLVDUPDåRVLRPLVUDLG¡PLV-ÐSDUDPHWUÐLãG¡VW\PRWYDUND
sakinyje-NRQWHLQHU\MH \UD QHVYDUEL 6DNLQLÐ SDUDPHWUDL VNLULDPL YLHQDV QXR NLWR
WXãþLDLV WDUSDLV 3DUDPHWUÐ UHLNãP¡V WHLNLDPRV DUED WDUS NDEXþLÐ ³ ³ DUED EH MÐ R
NOLHQWLQ¡V SURJUDPRV VXNRPSLOLXRWDL ULQNPHQDL SULHVDJ class galima praleisti.
'DXJHOLV GDEDUWLQLÐ QDUã\NOLÐ +70/ GRNXPHQW DWSDå³VWD LU EH VWDUWLQLÐ VDNLQLÐ
<HTML>, <HEAD> ir <BODY>,WDLJLJDOLPDMÐLUQHUDã\WL3ODWHVQLXVSDDLãNLQLPXV
apie kai kuriuos HTML sakinius rasite šioje dalyje, serverLQLÐ SURJUDPÐ VN\ULXMH
YLHQDPHLãVHUYHULQLÐSURJUDPÐSDY\]GåLÐ
appletviewer HTML_rinkmenos_vardas
LU³UDQNLXSDOHLVWLNOLHQWLQ
SURJUDPWDip:
87
appletviewerNOLHQWLQ¡VSURJUDPRVBSUDGLQ¡BULQNPHQD.java
3.1.2. .OLHQWLQ¡VSURJUDPRVDUFKLWHNWÌUD
.OLHQWLQ¡SURJUDPD–SURJUDPDGLUEDQWLVXODQJXLUMDPHLãG¡VWRPDLVYDOG\PR
HOHPHQWDLV WRG¡O MRV DUFKLWHNWÌUD VNLULDVL QXR NLWÐ SURJUDPÐ – WDL ijY\NLÐ YDOGRPD
sistema“ (event-driven system ,ã HVP¡V WDL SDQDãX ³ LãLPþLÐ DSGRURMLPR
mechani]P NOLHQWLQ¡ SURJUDPD ODXNLD NRNLR QRUV ³Y\NLR M³ ÄVXJDXQD³ ³Y\NLR
DSGRURNOLV WDGD NOLHQWLQ¡ SURJUDPD DWOLHND UHLNLDPXV YHLNVPXV R SDVNXL NOLHQWLQ¡
SURJUDPDODXNLDNLWгY\NLÐâLHYHLNVPDLWXULEÌWLDWOLNWLJUHLWDLUHDOLDPHODLNHWRG¡O
kartais juosWHQNDY\NG\WLDWVNLUXY\NG\PRVUDXWX.LWDVNOLHQWLQ¡VSURJUDPRVHVPLQLV
VNLUWXPDV QXR ³SUDVWRV SURJUDPRV – GDUE VX NOLHQWLQH SURJUDPD LQLFLDOL]XRMD
YDUWRWRMDVNDLMDPWRUHLNLDSDVSDXVGDPDVSHO¡VNODYLãDQWUHLNLDPRJUDILQLRODQJR
elemento ar pan.). 7RNVYDUWRWRMRYHLNVPDVJHQHUXRMD³Y\N³³NXU³UHDJXRMDNOLHQWLQ¡
programa.
.OLHQWLQ¡ SURJUDPD SDYHOGL JApplet NODV¡V VDY\EHV LU PRGLILNXRMD UHLNLDPXV
PHWRGXV 0HWRGDL YDOGDQW\V NOLHQWLQ¡V SURJUDPRV J\YDYLP ZZZ SXVODS\MH \UD
(visi – public void) šie:
7DLJLLããLÐNOLHQWLQ¡VSURJUDPRVJ\YDYLPSDODLNDQþLÐPHWRGÐGDåQDLXåWHNV
tik perrašyti initPHWRGRNLWXVSDOLNWLWRNLXVNRNLHMLHDSLEU¡åWLJAppletNODV¡MH'DU
NHOLPHWRGDLNXULXRV WHNV GDåQDL SHUUDã\WL VDYR NOLHQWLQ¡VH SURJUDPRVH– iš metodo
88
void repaint( )NYLHþLDPDVPHWRGDVvoid paint( Graphics g). Šiaip paint automatiškai
NYLHþLDPDV NDL UHLNLD SHUSLHãWL NOLHQWLQ¡V SURJUDPRV JHQHUXRMDP ODQJ 7DLJL MHL
NOLHQWLQ¡V SURJUDPRV GDUER PHWX SDY\]GåLXL UHDJXRMDQW ³ NXULR QRUV P\JWXNR
SDVSDXGLP UHLNLD NDLS QRUV SDNHLVWL NOLHQWLQ¡V SURJUDPRV ODQJR YDL]G – teks
LãUHLNãWDLNYLHVWLPHWRGrepaint, šis automatiškai kvies paint, o perrašytame metode
paintWHNVQXURG\WLNLUNDLSQXSLHãWL0HWRGDVpaintWXULYLHQJavaNODV¡VGraphics
WLSRDUJXPHQWSHUNXU³JDXQDYLVJUDILQ³NOLHQWLQ¡VSURJUDPRVNRQWHNVW
.OLHQWLQ¡V SURJUDPRV NXUL WLN ODQJH VXNXULD GX P\JWXNXV EHW QLHNDLS
nHUHDJXRMD³MÐSDVSDXGLPXVSDY\]G\V9LVLPHWRGDLLUNODV¡VEXVSDDLãNLQWLY¡OLDX
import javax.swing.*;
import java.awt.*;
.OLHQWLQ
SURJUDP SDOHLVWL JDOLPD VXNRPSLOLDYXV ãL SURJUDP LU
NRPDQGLQ¡MHHLOXW¡MHVXULQNXV
appletviewer Buttons.java
3.1.3. ²Y\NLÐDSGRURMLPRVLVWHPD
89
'DEDUVPXONLDXDSLH³Y\NLÐGHOHJDYLPRPRGHOLRHOHPHQWXV
²Y\NLDL – REMHNWDL DSUDãDQW\V ãDOWLQLR EÌNO¡V SRN\þLXV .DLS PLQ¡WD WDL JDOi
EÌWL YDUWRWRMR YHLNVPÐ VXNHOWL ³Y\NLDL JUDILQ¡MH VVDMRMH DUED ODLNPDþLR QXURG\PX
JHQHUXRMDPDV ³Y\NLV DUED WDP WLNURV VNDLWLNOLR UHLNãP¡V SDVLHNLPDV YHLNLDQW
NOLHQWLQHL SURJUDPDL LU SDQ 3URJUDPXRWRMDV SDWV QXVWDWR ³Y\NLXV NXULXRV DSGRURV
NOLHQWLQ¡ SURJUDPD ²Y\NLÐ NODVLÐ YDUGDL SDNOÌVWD JULHåWDL ³YDUGLMLPR VFKHPDL
TypeEvent, kur vietoje pirmosios vardo dalies Type \UD åRGåLDL Mouse – SHO¡V
³Y\NLDPVKey –NODYLDWÌURV³Y\NLDPVAdjustment –VODQNLNOLR³Y\NLDPVLUWW9LVRV
ãLRV ³Y\NLÐ NODV¡V \UD SDkete java.awt.event. 9LVÐ MÐ VXSHUNODV¡ – EventObject,
NXULRMHDSLEU¡åWLWLNGXPHWRGDL
þLDType –³Y\NLRREMHNWRYDUGDV
.DLNXULHãDOWLQLDLOHLGåLDUHJLVWUXRWLWLNYLHQLQWHO³NODXV\WRMMLHVXNHOLDLãLPW³
java.util.TooManyListenerException.
âDOWLQLDL NDLS LU UHJLVWUDFLMDL WXUL DQDORJLãNXV NODXV\WRMXV SDãDOLQDQþLXV
metodus
9LVLUHJLVWUDFLMRVLUSDãDOLQLPRPHWRGDL\UDDWLWLQNDPRVH³Y\NLÐNODV¡VH
²Y\NLÐNODXV\WRMDL –REMHNWDLJDXQDQW\VSUDQHãLPXVDSLH³Y\NLXV%HPLQ¡WRV
³Y\NLÐUHJLVWUDFLMRVNODXV\WRMDVSULYDORUHDOL]XRWLSUDQHãLPÐSUL¡PLPRLUDSGRURMLPR
PHWRGXV QXURGRPXV NODXV\WRMXV DWLWLQNDQþLRVH VVDMÐ NODV¡VH HVDQþLRVH SDNHWe
java.awt.eventâLÐVVDMÐNODVLÐYDUGDLVXIRUPXRWLWDLSSDWJULHåWDLTypeListener.
90
3.1 lHQWHO¡ ²Y\NLÐVLVWHPD
²Y\NLRNODV¡
.ODXV\WRMRVVDMRVNODV¡ ²Y\NLRDSLEÌGLQLPDV ²Y\NLÐãDOWLQLÐNODV¡V
Klausytojo registracijos
ir pašalinimo metodai
addAdjustmentListener Adjustable
removeAdjustmentListener
91
WindowEvent Generuojamas, kai langas Window LUYLVRVMRVVXENODV¡V
WindowListener aktyvuojamas,
addWindowListener deaktyvuojamas, atidaromas,
removeWindowListener XåGDURPDVVXWUDXNLDPDV³
SLNWRJUDPLãSOHþLDPDVLã
piktogramos
actionPerformed( ActionEvent ae )
mouseClicked(MouseEvent me )
mouseEntered( MouseEvent me )
mouseExited(MouseEvent me )
mousePressed( MouseEvent me )
mouseReleased(MouseEvent me )
ir metodus
mouseDragged( MouseEvent me )
mouseMoved( MouseEvent me )
.DGDQJLNODXV\WRMÐVVDMÐNODV¡VGDåQLDXVLDLWXULSRNHOLVSDVNHOEWXVPHWRGXV
R NXULDQW JUDILQ
VVDM GDåQDL WHUHLNLD WLN YLHQR NXULR PHWRGR – UHDOL]XRWL VVDMÐ
NODVHV QH YLVDGD SDWRJX 7RNLHPV DWYHMDPV VNLUWRV NODV¡V-DGDSWHULDL WXULQþLRV YLVXV
DWLWLQNDPRVH VVDMÐ NODV¡VH SDVNHOEWXV WDþLDX ÄWXãþLXV³ PHWRGXV 7DGD JHULDX QH
realizXRWLVVDMÐNODV
RSO¡VWLNODV
-DGDSWHU³SHUUDãDQWWLNGRPLQDQW³PHWRGDUNHOLV
PHWRGXV âLÐ NODVLÐ YDUGDL NRQVWUXRMDPL SDJDO W SDþL YDUGÐ VFKHP SDY\]GåLXL
VVDMÐNODV
MouseListenerDWLWLQNDNODV¡MouseAdapter ir t. t.
3DWHLNVLPH³Y\NLÐNODV¡VSDY\]G³–NDGEÌWÐDLãNXNJDOLPDJDXWLLã³Y\NLR
NODV¡V REMHNWR NDLS LãSO¡VWL NODV
UDãDQW VDY DQDORJLãN NODV
7DLJL NODV¡
ActionEvent turi konstruktorius:
92
ActionEvent( Object source, int type, String cmd )
ActionEvent( Object source, int type, String cmd, int modifiers )
String getActionCommand( )
String setActionCommand( )
int getModifiers( )
.OLHQWLQLÐSURJUDPÐSDY\]GåLDL
93
Container c = getContentPane( );
c.setLayout( new FlowLayout( ) );
c.add( b1 );
c.add( b2 );
c.add( tf );
}
}
2 pavyzdys.äHPLDXSDWHLNLDPDNOLHQWLQ¡SURJUDPDUHDOL]XRMDWSDþLJUDILQ
VVDM GHPRQVWUXRGDPD VNLUWLQJDV JDOLPDV VLQWDNVHV NODXV\WRMXL NRQVWUXRWL EHYDUG
YLGLQ
NODV
LU NODXV\WRMR REMHNWR NRQVWUDYLP WRMH NRGR YLHWRMH NXU MLV
registruojamDVâLIRUPDEÌWÐSDWRJLWDGDNDLNXULDPQRUVNRPSRQHQWXLNOLHQWLQ¡MH
programoje registruojamas vienintelis toks klausytojas. Demonstruojamos ir
VNLUWLQJRVNRPSRQHQWÐLãG¡VW\PRWYDUN\NO¡V
94
ActionListener al = new ActionListener( ){ // 2nd syntax' alternative;
public void actionPerformed( ActionEvent e ){ // to be preferred
String buttonName = ( (JButton)e.getSource( ) ).getText( );
tf.setText( buttonName );
}
}; // ;! “:” inherited from constructor
public void init( ){
b1.addActionListener( al );
b2.addActionListener( new ActionListener( ){ // 3rd syntax' alternative; to be
public void actionPerformed( ActionEvent e ){ // preferred for a single addition
String buttonName = ( (JButton)e.getSource( ) ).getText( );
tf.setText( buttonName );
}
} );
Container c = getContentPane( );
c.add( BorderLayout.EAST, b1 );
c.add( BorderLayout.WEST, b2 );
c.add( BorderLayout.CENTER, tf );
}
}
95
}
}
96
public void mouseExited( MouseEvent me ){
i++;
x = 10;
y = i*10;
xa = me.getX( );
ya = me.getY( );
message = "Mouse exited" + xa + " " + ya;
repaint( );
}
97
LU QRULQW LãNDUW PDW\WL SRN\þLXV EÌWLQDV UDLãNXV NYLHWLPDV 9LVD SLHãLPR PHWRGÐ
NYLHWLPRJUDQGLQ¡\UDrepaintNYLHþLDupdate, o šis – paint.
7DLJL VSUHQGLPDV NOLHQWLQ¡V SURJUDPRV ODQJXL SHUSiešti akimirksniu yra toks:
VXIRUPXRWLLULãVDXJRWLLGHQWLILNDWRULXMHREMHNWNXU³UHLN¡VSHUSLHãWLNDLUHLNDOLQJDV
objekto perpiešimas – kviesti repaint SHUUDã\WL PHWRG paint QXPDWDQW UHLNLDPÐ
REMHNWÐLãYHGLP0HWRGDVpaintWXULYLHQNODV¡VGraphicsWLSRDUJXPHQWNXULDPH
VDXJRPDVYLVDVJUDILQLVNOLHQWLQ¡VSURJUDPRVNRQWHNVWDV
Metodo repaint yra keturi variantai:
7DþLDX MHL G¡O VLVWHPLQLÐ SULHåDVþLÐ PHtodas update QHJDOL EÌWL NYLHþLDPDV
QXURG\WDLV LQWHUYDODLV PHWRGDV LãYLV QHNYLHþLDPDV LU QHJHQHUXRMDPD MRNLD LãLPWLV –
NOLHQWLQ¡VSURJUDPRVYHLNLPDVãLXRDWYHMXWDPSDYLVLãNDLQHVXSUDQWDPDV
98
java.awt
Object
Component
Container
Panel
Window
java.applet
Applet Frame
java.swing
JButton
JScrollPane JLabel
JFileChooser
JTextField JTextArea
SDY3DNHWÐNODVLÐKLHUDUFKLMD
99
1. Grafiniai komponentai (graphical widgets);
2. Tekstiniai komponentai;
3. Konteineriai.
Container c = getContentPane( )
3.1..RPSRQHQWÐLãG¡VW\PRNRQWHLQHU\MHWYDUN\NO¡V
BorderLayout
BoxLayout
CardLayout
FlowLayout
GridBagLayout
GridLayout
OverlayLayout
ScrollPaneLayout
ViewportLayout
100
.ODV¡ Container WXUL PHWRG setLayout QXVWDWDQW³ NRQWHLQHULXL QRULP
WYDUN\NO
5RG\NO¡ ³ Container REMHNW JDXQDPD PHWRGX getContentPane. Grafiniai
NRPSRQHQWDL OHLGåLD KLHUDUFKLQ
MÐ VDQGDU SDY\]GåLXL JPanel – objekte galima
VXG¡WL NLWXV åHPHVQLRMR O\JLR JPanel objektus ir t. t â³ LãG¡VW\P WDLS SDW YDOGR
WYDUN\NO¡V
3DJDO QXW\O¡MLP NOLHQWLQ¡V SURJUDPRV QDXGRMD WYDUN\NO
BorderLayout. Ji
NRPSRQHQW GHGD ³ NRQWHLQHULR FHQWU LU ÄLãWHPSLD³ LNL NRQWHLQHULR PDWPHQÐ
.RPSRQHQWDV ³GHGDPDV ³ NRQWHLQHU³ PHWRGX add(Component c) arba
add(BorderLayout.CONSTNAME, Component c þLD static final int konstanta
CONSTNAME QXVWDWR YLHW NXU SDGHGDPDV NRPSRQHQWDV <UD WRNLRV NRQVWDQWRV
UHLNãP¡V IL]LQ¡ MÐ SUDVP¡ DLãNL Lã SDYDGLQLPÐ NORTH, SOUTH, EAST, WEST,
CENTER.
7YDUN\NO¡ FlowLayout G¡VWR NRPSRQHQWXV HLOXWH Lã NDLU¡V ³ GHãLQ
SDVNXL ³
NLW HLOXW
LU W W 1DXGRMDPDV YLHQRGDV DUED UHLNLDPDV – MHL W QXVWDWR SDY\]GåLXL
XåUDãDVDQWP\JWXNRNRPSRQHQWÐG\GLV
7YDUN\NO¡GridLayoutLãG¡OLRMDNRPSRQHQWXVOHQWHO¡VIRUPD/HQWHO¡VHLOXþLÐ
iUVWXOSHOLÐNLHNLVQXVWDWRPDVNRQVWUXNWRULXMHGridLayout( int rows, int columns ).
BoxLayout DWVNLUDL VNLUVWR NRPSRQHQWXV YHUWLNDOLMD LU KRUL]RQWDOLMD
NU\SWLPLV*DOLPDVSHFLDOLDLVPHWRGDLVQXURG\WLUHLNLDPXVWDUSHOLXVWDUSNRPSRQHQWÐ
(vadinamieji strut ir glue).
3DWL VXG¡WLQJLDXVLD WYDUN\NO¡ – GridBagLayout. Jos aprašas pateikiamas tik
specializuotose Swing paketui skirtose knygose.
JTextField( )
JTextField( int columns )
JTextField( String s, int columns )
JTextField( String s ).
JScrollBar( Component c )
JScrollBar( Component c, int VERTSB, int HORSB ).
VERTICAL_SCROLLBAR_ALLWAYS
VERTICAL_SCROLLBAR_AS_NEEDED
101
VERTICAL_SCROLLBAR_NEVER
HORIZONTAL_SCROLLBAR_ALLWAYS
HORIZONTAL_SCROLLBAR_AS_NEEDED
HORIZONTAL_SCROLLBAR_NEVER
1 pavyzdys./DQJHLãG¡VWRPLGXP\JWXNDLLUWHNVWRVULWLV9LHQDVP\JWXNDV³
WHNVWLQ
VULW³ ³NHOLD WHNVW HVDQW³ hash-OHQWHO¡MH åU NROHNFLMÐ VN\ULÐ NLWDV – WHNVW
WULQD 7HNVWLQ¡ VULWLV ³YLONWD ³ VODQNLNO³ WDþLDX VODQNLNOLV EXV SDURG\WDV WLN WDGD NDL
UHLN¡V–MHLYLVRWHNVWRWHNVWLQ¡MHVULW\MHMRSDURG\WLQHJDOLPD
102
} );
b2.addActionListener( new ActionListener( ){
public void actionPerformed( ActionEvent ae ){
ta.setText( "" ); //ie, deletes text
}
} );
Container c = getContentPane( );
c.setLayout( new FlowLayout( ) );
c.add( new JScrollPane( ta ) ); //text area wrapped into a scrollbar
c.add( b1 );
c.add( b2 );
}
}
103
/*Applet with some new components:
JTable, JPanel, tool-tip-text.
Input file on the same directory as code:
collection of lines, each of 3 String-type
elements divided by space. Later on first two elements
of each line are put to the array1 while the third one to array2.
array1 makes the model for the table; array2 plays role of
explanatory text.
Name of file may be supplied in the text field.
All errors from error stream are put to the text area. */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
104
array1[count][1] = line.substring( line.indexOf( " " )+1,
line.lastIndexOf( " " ) );
count++;
}
} catch( ArrayIndexOutOfBoundsException e ){
ta.append( "Dimensions of table only until 20 rows allowed" );
} catch( Exception e ) {
ta.append( "Error reading data: "+ e );
}
table = new JTable( array1, colHeads );
showStatus( "Data added" );
repaint( );
}
}
105
Langai JFrame, JDialog -HL NOLHQWLQ¡MH SURJUDPRMH UHLNLD SDSLOGRPR ãDOLD
NOLHQWLQ¡VSURJUDPRVODQJRSDVLURGDQþLRODQJRSDSUDVþLDXVLDVXNXUWLJFrame REMHNW
QRUV NDLS PLQ¡WD ãLRV NODV¡V REMHNWDL SLUPLDXVLD VNLUWL VDYDUDQNLãNRPV Java
aplikacijoms). JFrame langas jau neprikODXVRQXRQDUã\NO¡V7RNLHPVODQJDPVJDOLPD
SULVNLUWL VDYXV DWVNLUXV ³Y\NLXV 7RNLXV ODQJXV XåGDUDQW NOLHQWLQ¡ SURJUDPD GDUER
QHEDLJLDWLNDWODLVYLQDPLãLDPODQJXLEXY
SDVNLUWLLãWHNOLDLPHWRGDVwindowClosing,
R MDPH NYLHþLDPDV PHWRGDV dispose). Galima tokius langus padaryti matomus arba
nematomus metodu setVisible su argumentais atitinkamai true arba false.
Panašiai darbas organizuojamas ir su dialogo langais – NODV¡V JDialog
objektais.
3 pavyzdysNOLHQWLQ¡SURJUDPDVXJFrameODQJX.OLHQWLQ¡SURJUama sukuria
SDSLOGRP ODQJ NODV¡ Boxes SDGDO\W ³ DWVNLUXV ODXNHOLXV LU NLHNYLHQ ODXNHO³
nuspalvina atsitiktine spalva (metodas gettingColor, o šiame jau naudojamas vienas iš
Java VSDOYRV NÌULPR NRQVWUXNWRULÐ /DXNHOLV VSDOYLQDPDV Graphics NODV¡V PHtodu
fillRect QXURG\WD VSDOYD XåSLOGDQþLX QXURG\WR G\GåLR VWDþLDNDPS³ 1XURG\WX
LQWHUYDOX YLVL ODXNHOLDL NHLþLD VDYR VSDOY .LHNYLHQDV WRNV ODXNHOLV SDOHLGåLDPDV
J\YXRWLDWVNLUXVUDXWXWRG¡OãLDNOLHQWLQHSURJUDPDJDOLPDQXVWDW\WLNLHNNRPSLXWHULV
realLDL JDOL SDODLN\WL DWVNLUÐ VUDXWÐ 'XRPHQÐ ODXNHOLÐ NLHNLV QXURGRPDV GYLHP
G\GåLDLV HLOXþLÐ LU VWXOSHOLÐ VNDLþLDLV PLUNV¡MLPR GDåQLV QXURGRPDV SDX]H
PLOLVHNXQG¡PLV ³YHGLPR RSHUDFLMRV DWOLHNDPRV DWLGDO\WRMH QXR OLNXVLRV SURJUDPRV
GDOLHVJUDILQ¡MHVVDMRMHMDXåLQRPRPLVWHFKQRORJLMRPLV
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
106
public void paintComponent( Graphics g ){ //painting the colored box
super.paintComponent( g );
g.setColor( clr );
Dimension d = getSize( );
g.fillRect( 0, 0, d.width-1, d.height-1 );
}
107
JTextArea ta = new JTextArea( 3,20 );
JButton b1 = new JButton( "Start" ),
b2 = new JButton( "Reenter" );
JFrame boxes;
108
p11.add( l3 ); p11.add( ta );
c.add( p11,BorderLayout.NORTH );
c.add( p12,BorderLayout.SOUTH );
}
}
.OLHQWLQLÐSURJUDPÐDUFK\YDYLPDV
.DLSPDW\WLLãDQNVWHVQLÐSDY\]GåLÐNOLHQWLQ¡VSURJUDPRVJDOLEÌWLQHPDåRV
DSLPWLHV DSLPWL GDXJLDO\S¡V WHUS¡V HOHPHQWXV 7RNLDV NOLHQWLQHV SURJUDPDV UHLN¡WÐ
DUFK\YXRWL³Java archyvus – jar rinkmenas. Juose yra viVRVUHLNLDPRVNODV¡VNDUWXVX
GDXJLDO\S¡VWHUS¡VULQNPHQRPLV
$UFK\YDYLPRNRPDQGRVSDSUDVþLDXVLDIRUPD
109
3.2. Java Beans technologija
110
// Java Bean: figure of random color
//
package figureBean; //CLASSPATH must point to the directory of figureBean!
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public Figure( ){
addMouseListener( new MouseAdapter( ){
public void mousePressed( MouseEvent me ){
change( );
}
} );
rectangular = false; //the oval will be drawn for the first
setSize( 200, 100 );
change( ); //for the first coloring
}
111
Taigi komponentas – nesavarankiška programa, MDPHQ¡UDQHLPHWRGRinit, nei
metodo main.RPSRQHQWRSDOHLGLPXSDVLUÌSLQDJUDILQLRSURJUDPDYLPR³UDQNLV
7ROHVQ¡GDUERVXNRPSRQHQWXHLJD
1. Kompiliavimas.
2. Vadinamosios manifesto rinkmenos sudarymas komponentui:
9LVÐNRPSRQHQWRULQNPHQÐDUFK\YDYLPDV
þLD c –NRPDQGDVXNXUWLQDXMDUFK\Y
f – komanda, nurodanti, kad pirmasis vardas bus archyvo vardas;
m – kad antrasis vardas yra manifesto rinkmenos vardas.
figureBean –DSODQNRNXULDPHUHLNLDLHãNRWLYLVÐNLWÐUHLNLDPÐNODVLÐYDUGDV
$UFK\YDWRULXVVXSDNXRV³DUFK\YYLVDVULnkmenas, kurias ten ras.
*UDILQLDL³UDQNLDLNRPSRQHQWÐVDY\E¡PVQXVWDW\WLQDXGRMDVDYLDQDOL]¡VVLVWHP–
tiria komponento class REMHNWXV 3DQDãLHPV GDO\NDPV DQNVþLDX SDUDã¡PH VDYR
SURJUDP 3DNHWH java.beans tam yra ir Java ³UDQNLV – NODV¡ Introspector, o ši turi
PHWRG static BeanInfo getInfo( Class c ), NXU NODV¡V BeanInfo REMHNWDV WXUL LãVDPL
LQIRUPDFLMDSLHNRPSRQHQWRclass oEMHNWc.
5\ã\VWDUSGYLHMÐNRPSLXWHULÐWLQNOH
112
atlieka speciali Java NODV¡ ServerSocket, kurios darbo rezultatas (faktiškai – jos
objekto metodo accept GDUER UH]XOWDWDV JDOL EÌWL MXQJWLV WDUS PDãLQÐ – Socket. Iš
NOLHQWR SXV¡V MXQJW³ VWHQJLDVL VXNXUWL NODV¡V Socket objektas. Socket konstruktoriui
UHLNLDQXURG\WLVHUYHULR,3DGUHVLUSULHYDGRQXPHU³.DLMXQJWLVV¡NPLQJDLVXGDU\WD
skirtumo tarp VHUYHULRLUNOLHQWRQHEHOLHNDDWOLHNDPLSDSUDVWLGXRPHQÐPDLQDL7DP
naudojami metodai getInputStream ir getOutputStream, sukuriantys baitinius srautus
InputStream ir OutputStreamQRULQWJDOLPDMXRV³YLONWL³VLPEROLQLXVVUDXWXV
.DLSPLQ¡WDNOLHQWDVNDGSULVLMXQJWÐSULHVHUYHULRWXULåLQRWLVHUYHULR,3DGUHV
Tai – VNDLþLDL QXR LNL DWVNLUWL WDãNDLV â³ DGUHV MHL åLQRPDV NRPSLXWHULR-
VHUYHULRYDUGDVDUEDMR'16DGUHVDVJDOLPDJDXWLVWDWLQLXNODV¡VInetAddress metodu
getByName( String computerName ) arba getByName( String DNSAddress ).
6DYR NRPSLXWHULR ,3 DGUHV LU YDUG JDOLPD VXåLQRWL QDXGRMDQWLV 26
SULHPRQ¡PLV 7LQNOLQ¡PV SURJUDPRPV WHVWXRWL QXPDW\WD JDOLP\E¡ VLPXOLXRWL WLQNO
vien tik savo kompiuteriu. Tam naudojamas specialus IP adresas, atitinkantis
YDGLQDPM localhost PDãLQ âLV DGUHVDV JDOL EÌWL JDXWDV WRNLDLV EÌGDLV
InetAddress.getByName( “localhost” ) arba InetAddress.getByName( null ).
ServerSocket VHUYHULR SXV¡MH LU Socket NOLHQWR SXV¡MH REMHNWDPV NXUWL GDU
UHLNLDåLQRWLMXQJWLHVSULHYDGRQXPHU³3ULHYDGDV–SURJUDPLQ¡DEVWUDNFLMDQDXGRMDPD
DWOLHNDQWåHPHVQ³DQWURMRO\JLRDGUHVDYLPMXNNLHNYLHQDVNRPSLXWHULVJDOLSDODLN\WL
GDXJHO³VHUYHULÐWRG¡OYLHQWLNMRV,3DGUHVRMXQJþLDLVXNXUWLQHSDNDQND.LHNYLHQDV
serveris tam tikrame prievade gali teikti tam tikras paslaugas klientui. Prievadai nuo 1
LNLUH]HUYXRWL26UHLNP¡PVSDY\]GåLXL-as prievadas skirtas FTP protokolui,
25-as – elektroniniam paštui, 80-as – HTTP protokolui.
import java.io.*;
import java.net.*;
113
new BufferedWriter(
new OutputStreamWriter(
s.getOutputStream( ) ) ),true );
while( true ){ //server will be closed after
String str = in.readLine(); //client's message "END"
if( str.equals( "END" )) break;
System.out.println( "Got from client: " + str );
out.println( str );
}
} finally{ //socket must be closed!
System.out.println( "Disconnecting client" );
s.close( );
}
} finally{ //socket must be closed!
System.out.println( "Closing server" );
ss.close( );
}
}
}
114
finallyNRQVWUXNFLMRVEORNQHVVHUYHULXLEDLJXVGDUEVXNOLHQWXEÌWLQDM³DWMXQJWL–
XåYHUWLMXQJW³7DGDLãMXQJLDPDVLUVHUYHULV–XåYHULDPDVServerSocket objektas.
Klientas:
import java.io.*;
import java.net.*;
.OLHQWDVEDQGRSULVLMXQJWLSULHVHUYHULRHVDQþLRWRPHSDþLDPHNRPSLXWHU\MH
kaip ir serveris – localhostWRG¡OMRDGUHVDVQXVWDWRPDVPHWRGXLgetByName teikiant
DUJXPHQWnull. SocketREMHNWXLIRUPXRWLEÌWLQDVNLWDVDUJXPHQWDV– prievado numeris
nurodomas static final int lauku PORTDSLEU¡åWXVHUYHULRSURJUDPRMH.DGãLUHLNãP¡
EÌWÐSULHLQDPDNOLHQWRSURJUDPDLDELSURJUDPRVWXULEÌWLWDPHSDþLDPHSDNHWH1RUV
MRNV SDNHWDV QHGHNODUXRWDV WDLS LU EXV MHL DEL SURJUDPDV ³G¡VLPH ³ W SDW³ DSODQN
115
.DLS åLQLD YLVRV DSODQNH HVDQþLRV ULQNPHQRV SULNODXVR EHYDUGåLDP SDNHWXL SDJDO
QXW\O¡MLP
3ULVLMXQJ
V SULH VHUYHULR NOLHQWDV QXVLXQþLD VHUYHULXL SUDQHãLPÐ LU HLOXW
END6HUYHULVNOLHQWXLDWJDOSHUVLXQþLDWRNLXVSDWSUDQHãLPXV
9LVRVNOLHQWRIXQNFLMRV³YLONWRV³try-finallyEORNNDGEHWNRNLXDWYHMXEDLJXV
GDUENOLHQWRREMHNWDVEÌWÐXåGDU\WDV
$ELãLDVSURJUDPDVUHLNLDSDOHLVWLLãDWVNLUÐSXOWÐ3LUPDSDOHLGåLDPDVVHUYHULV
Y¡OLDX – NOLHQWDV 3LUPLDX SDOHLGXV NOLHQW EXV VXJHQHUXRWD LãLPWLV
java.net.ConnectException.
3R VHUYHULR LU NOLHQWR SDOHLGLPR VHUYHULR SXOWH PÌVÐ NRPSLXWHU\MH PDW¡PH
pranešimus:
Kliento pulte:
116
(localport = 2000LUSULHYDGRNXU³XåLPDNOLHQWDV4496QXPHU³âLVDGUHVDVQXRODW
GLGLQDPDVSUDGHGDQWQXRLNLNROEXVSHUNUDXWD267RNLSDþLLQIRUPDFLMDSLH
VXNXUW MXQJW³ VSDXVGLQD LU NOLHQWR SURJUDPD WLN NLWRNLD WYDUND MXN QDJULQ¡MDPDL
programai port yra taikinys, o localport – šaltinis. Tai, kas klientui yra port, serveriui
bus localportLUDWYLUNãþLDL
6HUYHULV SULYDOR DSWDUQDXWL QH YLHQ EHW GHãLPWLV NOLHQWÐ WRG¡O DQNVWHVQ¡
SURJUDPDDLãNXQHWLQNDPD-LWLNGHPRQVWUDYRNDLSVLÐVWLLUJDXWLSUDQHãLPXV³NLW
PDãLQ LU Lã NLWRV PDãLQRV 5HDOHVQLV VHUYHULV VXNXULDPDV YLHQDV ServerSocket
REMHNWDV LU NYLHþLDPDV PHWRGDV accept .DL WLN MLV JUåLQD Socket REMHNW –
sukuriamas srautas šio kliento aptarnavimui, o ServerSocket toliau laukia kito kliento,
LUWW9HLNVPDLWDUSVHUYHULRLUNOLHQWÐDWOLHNDPLO\JLDLWRNLHSDWNDLSLUDQNVWHVQLDPH
pavyzdyje.
Serverio programa:
import java.io.*;
import java.net.*;
117
} finally{
try{
System.out.println( "Disconnecting client " + id );
s.close( );
} catch( IOException ioe ){
System.err.println( "Error while closing socket" );
}
}
}
}
import java.io.*;
import java.net.*;
118
class OneClient extends Thread{
private Socket s;
private BufferedReader in;
private PrintWriter out;
private static int counter = 0;
private int id = counter++; //id-number of client
private static int threadCount = 0; //number of "living" clients
public static int threadCounting(){
return threadCount;
}
public OneClient( InetAddress ia,int PORT ){
System.out.println( "Creating client No " + id );
threadCount++; //count in this client
try{
s = new Socket( ia, PORT );
} catch( IOException ioe ){
System.err.println( "Error while creating socket No " + id );
}
try{
in = new BufferedReader(
new InputStreamReader(
s.getInputStream( ) ) );
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
s.getOutputStream( ) ) ),true );
start();
} catch( IOException ioe1 ){
try{
s.close( );
} catch( IOException ioe2 ){
System.err.println( "Unable to close socket No " + id );
}
}
}
public void run( ){
try{
for( int i=0; i<10; i++ ){
String msg = "Client's No " + id + " message " + i;
out.println( msg );
System.out.println( "Sent to server: " + msg );
String str = in.readLine( );
System.out.println( "Got from server: " + str );
}
out.println( "END" );
} catch( IOException ioe ){
System.out.println( "I/O error" );
} finally{
try{
s.close( );
119
System.out.println( "Disconnecting socket No " + id );
} catch( IOException ioe ){
System.out.println( "Unable to close socket No " + id );
}
threadCount--; //client is closed; decrease the number of clients
}
}
}
9LHQXPHWXãLSURJUDPDOHLGåLDJ\YXRWLLNLMAX_CLIENTSNOLHQWÐ3URJUDPD
bando kurti naujus klientus 20 NDUWÐ 3DJULQGLQLV SURJUDPRV Y\NG\PR VUDXWDV
pristabdomas kuriam laikui metodu sleepNDGSHUã³ODLNGDOLVNOLHQWÐVXVS¡WÐDWOLNWL
VDYRGDUELUEÌWÐXåGDU\WLRWDGDYLHWRMHMÐEXVNXULDPLQDXMLNOLHQWDL
9¡O SLUPLDXVLD UHLNLD SDOHLVWL VHUYHULR SURJUDP SDVNXL – NOLHQWR .DG EÌWÐ
SDSUDVþLDXVHUYHULRSURJUDPD\UDEHJDOLQ¡LUMVXVWDEG\WLJDOLPDWLNNODYLãDLV
Ctrl-C 3URJUDPÐ OHLGLPR UH]XOWDWDL SULNODXV\V QXR YLHQX PHWX ÄJ\Yг NOLHQWÐ
VNDLþLDXV SDX]¡V ODLNR LU NRPSLXWHULR SDM¡JXPR 3DHNVSHULPHQWDYXV su šiais
GXRPHQLPLVSURJUDPÐYHLNLPDVWDSVYLVLãNDLDLãNXV
'DåQLDXVLDLSURWRNRORSDYDGLQLPLUSULHYDGRQXPHU³JDOLPDSUDOHLVWLLUOLHND
SDY\]GåLXLwww.nba.com/index.html .
120
<UD NHOL 85/ DGUHVÐ NÌULPR NRQVWUXNWRULDL 9LVL MLH JDOL VXNHOWL LãLPW³
MalformedURLException. 6HUYHU\MH HVDQþLR QRULPR DSODQNR LU QRULPRV ULQNPHQRV
DGUHVXLNXUWLUHLN¡WÐQDXGRWLãLDVNRQVWUXNWRULDXVIRUPDV
3LUPRMLIRUPDQXVWDWR85/DGUHVRGDO³VHUYHULRDSODQNXLNXULDPH\UD+70/
GRNXPHQWDV VX QXRURGD ³ NOLHQWR SURJUDP R DQWURML – aplankui, kuriame yra pats
kliento programos kodas.
7ROLDXJDOLEÌWLDWLGDU\WDVEDLWLQLV³YHGLPRLãVHUYHULRVUDXWDVRMLV–³YLONWDV³
EXIHUL]XRW VLPEROLQ³ VUDXW NDLS PDW¡PH YLHQDPH Lã DQNVWHVQLÐ NOLHQWR SURJUDPÐ
SDY\]GåLÐ
...
InputStream is = url.openStream( );
BufferedReader in = new BufferedReader(
new InputStreamReader( is ) );
...
Java DSOLNDFLMRPV NXULRV JDOL MXQJWLV VX EHW NXULD WLQNOR PDãLQD GHU¡WÐ
QDXGRWLNLWNRQVWUXNWRULDXVIRUP
...
URL url = . . .
URLConnection urlcon = url.openConnection( );
System.out,println( “Date” + new Date( urlcon.getDate( ) ) );
System.out,println( “Type of content” + urlcon.getContentType( ) );
System.out,println( “Period of storage” + urlcon.getExpiration( ) );
System.out,println( “Last modified” + new Date( urlcon.getLastModified() ) );
System.out,println( “Length, bytes” + urlcon.getContentLength( ) );
InputStream is =urlcon.getInputStream( );
...
.LWDV GDåQai reikalingas dalykas – SDURG\WL Lã NOLHQWR SURJUDPRV NLW +70/
GRNXPHQW–SHUDGUHVXRWLQDUã\NO
³NLWSXVODS³7DPUHLNLDDWOLNWLYHLNVPXV
6XIRUPXRWLQRULPRGRNXPHQWR85/DGUHVurl MDXåLQRPDLVPHWRGDLV
121
.YLHVWLPHWRGshowDocument:
6HUYHULQ¡VSURJUDPRV
%HQGURVLRVåLQLRVDSLHVHUYHULQHVSURJUDPDV
6HUYHULQ¡VSURJUDPRVservlets)–PDåRVSURJUDPRVY\NGRPRVZZZMXQJWLHV
VHUYHULR SXV¡MH 3DQDãLDL NDLS NOLHQWLQ¡V SURJUDPRV GLQDPLãNDL LãSOHþLD QDUã\NOLÐ
IXQNFLQHV JDOLP\EHV VHUYHULQ¡V SURJUDPRV GLQDPLãNDL LãSOHþLD ZZZ VHUYHULR
IXQNFLQHVJDOLP\EHVâLRVSURJUDPRV³GLHJLDPRV³WLQNORVHUYHU³SDODLNDQW³Java.
,QVWUXPHQWDL VHUYHULQ¡PV SURJUDPRPV NXUWL \UD SDNHWH -6'. Java Servlet
Development Kit 7DUS LQVWUXPHQWÐ \UD LU ³UDQNLV VHUYHULQHL SURJUDPDL WHVWXRWL
servletrunner 9LVDV LQVWUXNFLMDV -6'. LQVWDOLXRWL NRPSLXWHU\MH åU
www.javasoft.com âLXR PHWX ãLV QHVXG¡WLQJDV QDXGRWL SDNHWDV MDX ³WUDXNWDV ³
DUFK\YÐ WDUS YLHWRM MR UHNRPHQGXRMDPD SDUVLVLÐVWL WLHVLRJ Java WLQNOR DSOLNDFLMÐ
VHUYHU³ Application Server HVDQW³ SDNHWH -(( Java 2 Enterprise Edition). Serveris
nemokamas. Windows SODWIRUPDL MR DSLPWLV WUXSXW³ YLUãLMD 0% ,QVWDOLDYLPR
insWUXNFLMRV DWHLQD NDUWX VX SDNHWX 6HUYHULQLÐ SURJUDPÐ WHVWDYLPDV VHUYHULX
naudojant localhost,3DGUHV\UDVXG¡WLQJHVQLVQHLservletrunner³UDQNLX
Abiejuose siuntos paketuose yra vadinamasis Servlet API (Applied
Programming Interface NXULDPH VXG¡WL GX SDNHWDL VX YLVRPLV NODV¡PLV
SDODLNDQþLRPLV YLVDV VHUYHULQLÐ SURJUDPÐ JDOLP\EHV javax.servlet ir
javax.servlet.http.
.DVO¡P¡VHUYHULQLÐSURJUDPÐWHFKQRORJLMRVVXNÌULP"7UDGLFLQ¡ZZZWLQNOR
veikimo schema informacijai gauti yra tokia.
1. www-serverLV JDXQD LQIRUPDFLM Lã NOLHQWR-QDUã\NO¡V 5HLNLDPR VHUYHULR
85/ DGUHV QXURGR QDUã\NO¡V YDUWRWRMDV R QDUã\NO¡ VXJHQHUXRMD VHUYHULXL XåNODXV
+70/ NDOED 5HLNLDPD LQIRUPDFLMD XåNODXVRMH \UD VDNLQLXRVH <form>. 8åNODXVD
VLXQþLDPDSURWRNROX+773WRG¡OGDåQDLGDUYDGLQDPD+773XåNODXVD
6HUYHULVDQDOL]XRMDXåNODXVLUDSGRURMDJDXWLQIRUPDFLMâLXRVYHLNVPXV
atlieka serverio dalis CGI (Common Gateway InterfaceJDOLQWLVYHLNDXWLVXNLWRPLV
SURJUDPRPLV VHUYHULR NRPSLXWHU\MH GXRPHQÐ ED]¡PLV HOHNWURQLQ¡PLV
VNDLþLXRNO¡PLVLUSDQ&*,JDOLEÌWLUHDOL]XRWDEHWNXULDSURJUDPDYLPRNDOEDWDþLDX
122
GDåQLDXVLDL WDP QDXGRMDPD SLUPLDXVLD WHNVWXL DSGRURWL VNLUWD NDOED Perl. Programa
PerlNDOED\UDLQWHUSUHWXRMDPDWRG¡OGDåQDL&*,VVDMRVGDUYDGLQDPL&*,VFHQDULMais
arba tiesiog CGI scripts. Jei CGI programa negali reikiamai apdoroti gautos
XåNODXVRVMLVDYRUXRåWXJHQHUXRMDXåNODXVNRPSHWHQWLQJDLSURJUDPDLSDWHLVLQGDPD
VDYRSDYDGLQLPgateway – šliuzas.
3. Sukuriamas (ar tiesiog kopijuojamas – jei reikalingas statinis dokumentas)
NOLHQWR SUDã\WDV +70/ GRNXPHQWDV LU SHUVLXQþLDPDV NOLHQWXL-naršyklei. Šio HTTP
DWVDN\PRSUDGåLRMHQXURGRPDVDWVDN\PRWXULQLRWLSDV0,0(Multipurpose Internet
Mail Extension IRUPDWX 3DY\]GåLXL text/plain UHLãNLD $6&,, VLPEROLÐ WHNVW
text/html –+70/WHNVWLUWW
&*, SURJUDPRV SULNODXVR QXR NRPSLXWHULR DUFKLWHNWÌURV %H WR MRV Q¡UD
pakankamai efektyvios, kadangi, aptarnaujant kelis klientus, kiekvienam sukuriamas
atskiras procesas (ne srautas!). Pakeitus CGI programas serverLQ¡PLVSURJUDPRPLVMÐ
SUDQDãXPDLEÌWÐ
6HUYHULQ¡V SURJUDPRV Y\NGRPRVL VHUYHULR DGUHVÐ HUGY¡MH .LHNYLHQDL
DWVNLUDLNOLHQWRXåNODXVDLDSGRURWLJDOLPDVXNXUWLDWVNLUY\NG\PRVUDXW
6HUYHULQ¡VSURJUDPRVQHSULNODXVRPRVQXRNRPSLXWHULRWLSRSun, Netscape,
06 WLQNOR DSOLNDFLMÐ VHUYHULDL SDODLNR Servlet $3, WRG¡O SURJUDPRV VXNXUWRV Java,
JDOLEÌWLODLVYDLSHUNHOLDPRVLãYLHQRVHUYHULR³NLW
6HUYHULQ¡VSURJUDPRVJDOLQDXGRWLWXUWLQJDVJavaNODVLÐELEOLRWHNDV
4. Java saugumo mechanizmas palaiko WDP WLNUXV VHUYHULQLÐ SURJUDPÐ
DSULERMLPXVNDGEÌWÐDSVDXJRWLVHUYHULRPDãLQRVLãWHNOLDL
7DLJLVHUYHULQ¡VSURJUDPRV\UDWDUSLQLQNDLWDUSNOLHQWRLUVHUYHULRSHULPGDPL
GDXJHO³ IXQNFLMÐ WLHN Lã NOLHQWR WLHN Lã VHUYHULR 3DY\]GåLXL EHQGUDXGDPRV VX
kliHQWLQ¡PLV SURJUDPRPLV VHUYHULQ¡V SURJUDPRV JDOL DWOLNWL MÐ proxy-serverio
YDLGPHQ³ MHL NOLHQWLQ¡ SURJUDPD WXUL NUHLSWLV ³ GXRPHQÐ ED]
NLWRMH PDãLQRMH NDV
NOLHQWLQ¡PVSURJUDPRPVXåGUDXVWDãLXRVYHLNVPXVXåNOLHQWLQ
SURJUDPJDOLDWOLNWL
VHUYHULQ¡SURJUDPD7DLSSDWVHUYHULQ¡VSURJUDPRVJDOLSUDWXUWLQWLVHUYHULRJDOLP\EHV
SDODLN\GDPRV NRN³ VHUYHULXL QHSDå³VWDP XåNODXVÐ LU DWVDN\PÐ SDJULQGX YHLNLDQW³
SURWRNRO SDY\]GåLXL 6073 323 )73 'DåQLDXVLDL YLV WLN VHUYHULQ¡V SURJUDPRV
naudojamos kartu su HTTP protokolu dinaminiams HTML puslapiams generuoti,
WRG¡OWDPVXNXUWDVLUVSHFLDOXVSDNHWDV+773SURWRNROXLSDODLN\WLjavax.servlet.http.
.DLSVHUYHULQ¡VSURJUDPRVSDVLHNLDPRVNOLHQWXL".HOLDLVEÌGDLV
.DLYDUWRWRMDVQDUã\NOHLWHLNLD85/DGUHVNXULV\UDVHUYHULQ¡VSURJUDPRV
adresas.
2. Iš HTML dokumento sakinio <form>.
3. Iš HTML dokumento sakinio <servlet>. 7RNLXV VDNLQLXV SDå³VWD QH YLVL
serveriai.
,ã+70/GRNXPHQWÐVSHFLDOLÐNRPDQGЖ SSI (Server-Side Includes).
123
EÌWLODLNLQRVDUEDSDVWRYLRVW\YHLNVNROYHLNVSDWVVHUYHULV–WDLSULNODXV\VQXRMÐ
³GLHJWLHVVHUYHU\MH
6HUYHULQ¡VSURJUDPRVJ\YDYLPRFLNODV
124
-HLVHUYHULQ¡SURJUDPDEXVWHVWXRMDPD³UDQNLXservletrunner, teks atlikti šiuos
veiksmus:
6HUYHULQ
SURJUDP VXNRPSLOLXRWL LU ³G¡WL ³ DSODQN &\JSDK2.0\examples
(tik tada servletrunnerJDO¡VDSWLNWLVHUYHULQ
SURJUDP
2. Paleisti servletrunner.
3DOHLVWLQDUã\NO
LUQXURG\WLMDL85/DGUHV
http://localhost:8080/servlet/SimplestServletýLDlocalhost –
PÌVÐNRPSLXWHULRDGUHVDVR8080 – prievadas, kurio „klauso“
servletrunner.
1DUã\NO¡WXULSDURG\WLSUDQHãLPSimplest Servlet.
3.4.3. Servlet$3,VVDMÐNODV¡VNODV¡VLUPHWRGDL
ServletRequest –VNHOELDPHWRGXVNOLHQWRXåNODXVRVGXRPHQLPVVNDLW\WL
ServletResponce –VNHOELDPHWRGXVDWVDN\PRNOLHQWXLGXRPHQLPVXåUDã\WL
.DLNXULRVSDNHWRNODV¡V
'DEDUDSLHVVDMÐNODVLÐLUNODVLÐSDJULQGLQLXVPHWRGXV6VDMÐNODV¡MHServlet
\UDWU\VVHUYHULQ¡VSURJUDPRVJ\YDYLPRFLNORLUNHOLNLWLPHWRGDL
125
VHUYHULR ²UDQNLXL servletrunner MLH WXUL EÌWL ULQNPHQRMH servlet.properties, o ši –
aplanke C:\JSDK2.0\examples. Rinkmenos turiniui keliami tam tikri reikalavimai,
NXULÐþLDQHQDJULQ¡VLP
6VDMÐNODV
ServletRequest UHDOL]XRMDVHUYHULV6VDMÐNODV¡VPHWRGDLOHLGåLD
JDXWLLQIRUPDFLMDSLHNOLHQWRXåNODXV.DLNXULHLãWÐPHWRGÐ\UD
126
$QDORJLãND VVDMÐ NODV¡ +773 DWVDN\mams generuoti yra ServletResponce.
Kai kurie jo metodai:
<HTML>
<BODY>
<CENTER>
<FORM NAME = “FORM”
METHOD = POST
ACTION =
“http://localhost:8080/servlet/PostParametersServlet”>
<TABLE>
<TR>
<TD><B> Employee</B></TD>
<TD><INPUT TYPE = TEXTBOX NAME =”e”
SIZE = “25” VALUE = “ “></TD>
</TR>
<TR>
<TD><B> Phone </TD>
<TD><INPUT TYPE =TEXTBOX NAME = “p”
SIZE = “25” VALUE = “ “></TD>
</TR>
</TABLE>
<INPUT TYPE = SUBMIT VALUE = “Submit”>
</FORM>
</BODY>
</HTML>
127
programa (kaip šiuo atveju) arba kokia nors CGI programa. Parametras METHOD
QXVWDWRGXRPHQÐSHUVLXQWLPRPHWRG0HWRGÐ\UDWU\VGET, POST ir HEAD. GET,
kaip sako vien jo vardas, pirmiausia skirtas informacijai iš serverio pareikalauti
SDY\]GåLXL NRNLRV QRUV ULQNPHQRV VHUYHULQ¡V SURJUDPRV DU NLWRV SURJUDPRV
LãYHVWLHV VUDXWR VHUYHULR NRNLR QRUV ³UHQJLQLR LãYHVWLHV VUDXWR GET duomenys
VLXQþLDPL NDUWX VX XåNODXVD PDåGDXJ WRNLX IRUPDWX SRURPLV parametro vardas =
UHLNãP¡0HWRGDVWXULJULHåWXVDSULERMLPXVGDXJXPDVHUYHULÐQHOHLGåLDSHUVLÐVWLMXR
GDXJLDX NDLS NHOLV ãLPWXV EDLWÐ ² GET panašus ir HEAD metodas: juo serveris
SHUVLXQþLD WLN WLWXOLQ
LQIRUPDFLM POST metodas pirmiausia skirtas kliento
GXRPHQLPV VLÐVWL ³ VHUYHU³ 'XRPHQ\V VLXQþLDPL NDLS ³YHVWLHV VUDXWDV WRG¡O Q¡UD
GXRPHQÐLOJLRDSULERMLPÐ
<TABLE> –OHQWHO¡VVDNLQ\V<TR> –MRVDWVNLURVHLOXW¡VVDNLQ\VR<TD> –
HLOXW¡V DWVNLURV OVWHO¡V VDNLQ\V 3LUPRMRMH GRNXPHQWR OVWHO¡MH SDU\ãNLQWX ãULIWX W
nustato <B>EXVVSDXVGLQDPDVXåUDãDVEmployee.
Sakinys-konteineris <INPUT> WXUL GX EÌWLQXV SDUDPHWUXV TYPE nurodo
ODXNRWLSTEXTBOX), o NAME –WRODXNRYDUGQDUã\NO¡YDUGRQHURGR3DUDPHWUDV
SIZEQXVWDWRODXNRLOJ³RVALUEVXWHLNLDODXNXLUHLNãP
.DGDQJLãLVVDNLQ\V³G¡WDV
³VDNLQ³<TD> – jis nustato OHQWHO¡VHLOXW¡VOVWHO¡VSDYLGDOäHPLDXWRNLDPHVDNLQ\MH
parametrui INPUT WHLNLDPD UHLNãP¡ SUBMIT – WDL VXNXULD GXRPHQÐ SHUGDYLPR
P\JWXN NXU³ QXVSDXGXV GXRPHQ\V SHUVLXQþLDPL VHUYHULXL VALUE šiuo atveju
QXVWDWR XåUDã DQW P\JWXNR 3DQDãLDL TYPE = RESET VXNXULD GXRPHQÐ DWPHWLPR
P\JWXN
6HUYHULQ¡ SURJUDPD GXRPHQLPV Lã SDUDã\WR +70/ GRNXPHQWR ³YHVWL LU MXRV
SHUVLÐVWLDWJDOQDUã\NOHL
128
Darbas su šia serverine programa:
1. Paleisti servletrunner.
3DURG\WL QDUã\NO¡MH GRNXPHQW PostParameters.htm ³YHVWL IRUPRMH
prašomus duomenLVLUSDVSDXVWLP\JWXNSubmit.
1DUã\NO¡ WXUL SDURG\WL VHUYHULQ¡V SURJUDPRV PostParametersServlet
DWVDN XåUDã Your data pavadinimo sakinio <H2> IRUPDWX SDYDGLQLPÐ
VDNLQLÐ \UD QXR H1 iki H6 GLGåLDXVLDV MÐ – H1 LU WROLDX ³YHVWÐ GXRPHQÐ
vardus bei reikšmes.
6VDMÐNODV¡HttpServletResponce WXULPHWRGÐWDUSMÐ
129
IllegalStateException – MHL PHWRGR NYLHWLPR PHWX VHDQVDV MDX SDVLEDLJ
V 6VDMÐ
NODV¡MH\UDPHWRGDL
.ODV¡MHWDLSSDW\UDDQDORJLãNÐPHWRGÐUHLNãPLÐSULHVN\UDLset.
130
void service(HttpServletRequest request, HttpServletResponce responce)
throws IOException, ServletException
<HTML>
<BODY>
<CENTER>
<FORM NAME = “FORM2”
METHOD = POST
ACTION =”http://localhost:8080/servlet/AddCookieServlet”>
<B> Enter a value for MyCookie: </B>
<INPUT TYPE = TEXTBOX NAME =”data”
SIZE = “25” VALUE = “ “>
<INPUT TYPE = SUBMIT VALUE = “Submit “>
</FORM>
</BODY>
</HTML>
131
PrintWriter pw = responce.getWriter( );
pw.println( “<B> MyCookie has been set to:” );
pw.println( data );
pw.close( );
}
}
3DOHLVWL³UDQN³servletrunner.
1DUã\NO¡MH SDURG\WL GRNXPHQW AddCookie.htm ²YHVWL IRUPRMH SUDãRP
GXRPHQ³LUSDVSDXVWLP\JWXNSubmit.
'DEDU VHUYHULQ¡ SURJUDPD NXUL VXDNW\YLQV GRNXPHQWDV AddCookie.htm,
DWJDOSDUVLÐV³YHVWGXRPHQVUHLNãP
VXSaaiškinamuoju tekstu.
1DUã\NO¡MH³YHVWLNLW85/DGUHV
http://localhost:8080/servlet/GetCookiesServlet.
132
3.4.4. JSP technologija
<HTML>
<BODY>
<H1> The time is:
<% = System.currentTimeMillis( ) / 1000 %>
</H1>
</BODY>
</HTML>
.DLSPDW\WL-63VDNLQ\VSUDGHGDPDVLUEDLJLDPDVSURFHQWRåHQNOXRO\J\E¡VåHQNODV
QXVWDWR DWVNLU VDNLQLR WLS – LãUDLãNRV VDNLQ³ .OLHQWXL SLUPNDUW SDUHLNDODYXV 85/
adreso – ãLRV ULQNPHQRV DGUHVR WLQNOR VHUYHULV SHUVLÐVWÐ XåNODXV -63 NRQWHLQHULXL
ãLVVXNRPSLOLXRWÐ-63SXVODS³³VHUYHULQ
SURJUDPâLRMHVHUYHULQ¡MHSURJUDPRMHEÌWÐ
kodas, naudojantis klases HttpServletResponse, PrintWriter ir String (rezultatui –
ODLNXLVDXJRWLLUJHQHUXRMDQWLV+773DWVDN\PNOLHQWXLVXHVDPXODLNXVHNXQG¡PLV
DWVDN\PDVEÌWÐSDURG\WDVIRUPDWXH1.
7UXPSDL DSLH -63 VLQWDNV
<UD -63 VDNLQLDL-direktyvos, skirti tik JSP
kRQWHLQHULXL LU QLHNR QHUDãDQW\V ³ LãYHVWLHV VUDXW PrintWriter, bei sakiniai-VFHQDULMÐ
elementai. Direktyvos pavyzdys:
Direktyva JSP konteineriui praneša, kad toliau naudojama Java kalba, ir prašo
GLQDPLãNDL³NHOWLQXURG\WRSDNHWRNODVHV.LWRVGLUHNW\YRVextends, buffer, autoFlush,
info, isThreadSafe ir t.t.
6DNLQLÐ-VFHQDULMÐ HOHPHQWÐ \UD WU\V WLSDL VNHOELPDL YDGLQDPLHML scriplets ir
LãUDLãNRV 6NHOELPDL DSUDãR VFHQDULMÐ HOHPHQWXV DQWULHML \Ua kodo fragmentai, o
LãUDLãNRVSDY\]G³MDXPDW¡PHDQNVWHVQLDPHSDY\]G\MH-ÐVDNLQLDLDWLWLQNDPDL\UD
133
<%! %>, <% %>, <%= %>. Sakinys <%-- --%> yra JSP
komentaras.
JSP kuriamo www puslapio pavyzdys: puslapyje bus parodyta puslapio
³N¡OLPR GDWD ãLRV GLHQRV GDWD NLHN ODLNR SXVODSLV URGRPDV LU NLHN NDUWÐ SXVODSLV
DSODQN\WDV3DVNXL³SXVODS³LãYHGDPDVWHNVWDVGood bye. JSP rinkmenos tekstas:
134
NYLHþLDPDVDXWRPDWLãNDL7UHþLRMLULQNPHQD–WDLSSDWVHUYHULRSURJUDPRVWXULQþLRV
VWDUWLQ³ main PHWRG âL SURJUDPD WDLS SDW SULYDOR XåUHJLVWUXRWL VXNXUWM³ QXWROXV³
REMHNW YDGLQDPDMDPH 50, UHMHVWUH VHUYHU\MH PHWRGX Naming.rebind. Ketvirtoji
rinkmena – SURJUDPD NOLHQWR NRPSLXWHU\MH -RMH UHLNLD JDXWL Lã VHUYHULR URG\NO
³
QXWROXVL VVDMÐNODV
WRV SDþLRVNODV¡V Naming metodu lookup, o toliau jau su šiuo
REMHNWX HOJLDPDVL ³SUDVWDL O\J VX HVDQþLX ORNDOLRMH PDãLQRMH %H ãLÐ SURJUDPÐ
NRPSLOLDYLPR LU SDOHLGLPR GDU WHNV SDVLWHONWL ³UDQN³ 50, UHMHVWUXL SDOHLVWL VHUYHU\MH
EHL³UDQN³SURJUDPRPV-NDPãþLams (stubsWXULQþLRPVO\JLDLWRNLDVSDþLDVNODVHVNDLS
QXWROXVLRV VVDMÐ NODV¡V LU HVDQþLRPV NOLHQWR NRPSLXWHU\MH WDLS SDW SURJUDPRPV-
karkasams (skeletons HVDQþLRPV VHUYHULR NRPSLXWHU\MH JHQHUXRWL 3URJUDPRV-
NDPãþLDL LU SURJUDPRV-NDUNDVDL UÌSLQDVL visais ryšiais tarp kliento ir serverio;
SURJUDPXRWRMXL WXR XåVLLPWL QHUHLNLD -HL UHLNLD SHUVLÐVWL REMHNWXV ãLH VLXQþLDPL
serializuoti, o paskirties vietoje automatiškai atkuriami.
9LVXV ãLXRV UHLNDODYLPXV LOLXVWUXRVLPH SDSUDVþLDXVLX XåGDYLQLX WDUNLPH,
QRULPH VXG¡WL GX double IRUPDWR VNDLþLXV 3DUDã\VLPH VXG¡WLHV PHWRG add, o šis
metodas bus vykdomas nutolusiame kompiuteryje. Duomenis – abu sudedamus
VNDLþLXV WDLS SDW VHUYHULR 85/ DGUHV ³YHVLPH NOLHQWLQ¡MH SURJUDPRMH SHU
NRPDQGLQ¡VHLOXW¡VDUJXPHQWus.
1. 1XWROXVLVVDMÐNODV¡DWLWLQNDQWLPLQ¡WXRVLXVUHLNDODYLPXV
import java.rmi.*;
public interface ServerInterface extends Remote{
double add( double d1, double d2) throws RemoteException;
}
2. 6HUYHULRSURJUDPDUHDOL]XRMDQWLQXWROXVLVVDMÐNODV
import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
135
public class ServerProgram{
import java.rmi.*;
import java.rmi.registry.*;
9LVDVãLVSURJUDPÐSDNHWDVSDOHLGåLDPDVWDLS
9LVRVSURJUDPÐULQNPHQRVVXNRPSLOLXRMDPRV
2. Suformuojamos programos-NDPãþLDLLUSURJUDPRV-NDUNDVDL³UDQNLXrmic:
rmic ServerImplementation
136
3. Aplanke kliento kompiuteryje sudedamos rinkmenos ClientProgram.class,
ServerInterface.class, ServerImplementation_Stub.class.
Aplanke serverio koPSLXWHU\MHWXULEÌWLULQNPHQRVServerProgram.class,
ServerInterface.class, ServerImplementation.class, ServerImplementation_Stub.class,
ServerImplementation_Skel.class.
7DLJLGDOLVULQNPHQÐWXULEÌWLLUVHUYHU\MHLUNOLHQWRNRPSLXWHU\MH
4. Serveryje palHLGåLDPDV50,UHMHVWUR³UDQNLVrmiregistry:
start rmiregistry
3DOHLGåLDPDVVHUYHULV
java ServerProgram
3DOHLGåLDPDV NOLHQWDV -HL QRULPH SDWLNULQWL YLVÐ SURJUDPÐ YHLNLP EH
VHUYHULRW\NDGWDVSDWVNRPSLXWHULVDWOLNWÐLUVHUYHULRLUNOLHQWR vaidmenis, vietoje
VHUYHULR85/DGUHVRNRPDQGLQ¡MHHLOXW¡MHQXURGRPHVSHFLDOÐ,3DGUHVåU
VN\ULÐ DSLH ED]LQ³ WLQNOLQ³ SURJUDPDYLP %H WR EÌWLQL GDU GX NRPDQGLQ¡V HLOXW¡V
DUJXPHQWDLDQWUDVLVEXVSLUPDVVXGHGDPDVVNDLþLXVRWUHþLDVLV– antras:
3URJUDPÐÌNLRVSDXVGLQLPDLEXVWRNLH
Numbers to be added 1 2
Result 3
%HQGURVLRVåLQLRVDSLH&25%$WHFKQRORJLM
-HL50,ELEOLRWHNDUHDOL]XRMDVYHLNWDUSQXWROXVLÐJavaREMHNWÐWDL&25%$
t SDW³ OHLGåLD SDGDU\WL WDUS EHW NRNLRPLV SURJUDPDYLPR NDOERPLV SDUDã\WÐ REMHNWÐ
CORBA –WDLLQWHJUDFLQ¡WHFKQRORJLMDNXULRVVSHFLILNDFLMSDUHQJ¡20*NRPLWHWDV
(Object Management Group, www.omg.org ).
Specifikacija VXVLGHGD Lã GYLHMÐ GDOLÐ SDJULQGLQLR REMHNWÐ PRGHOLR Core
Object Model LU REMHNWÐ YDOG\PR DUFKLWHNWÌURV Object Management Architekture,
20$20$QXVWDWREÌWLQDVREMHNWRFKDUDNWHULVWLNDVVVDMRVRSHUDFLMRVVDY\EHVLU
pan. –QXVWDWRPHFKDQL]PÐOHLGåLDQþLÐREMHNWDPVVYHLNDXWLLQIUDVWUXNWÌU-RMHWDLS
SDW DSLEU¡åWRV REMHNWDPV WHLNLDPRV SDVODXJRV Object Services) ir vadinamasis
XåNODXVÐREMHNWDPVWDUSLQLQNDVObject Request Broker, ORB).
Java&25%$JDOLP\E¡VUHDOL]XRWRVNODVLÐSDNHWXRVH&25%$IDNWLškai jame
\UDNODV¡25%org.omg. CORBA, org.omg. CosNaming,
org.omg.CosNaming.NamingContextPackage ir keliuose kituose CORBA paketuose
ir subpaketuose.
137
.OLHQWLQ¡MH ãLRV WHFKQRORJLMRV SURJUDPRMH PHWRGDL NYLHþLDPL ³SUDVWX EÌGX
WDþLDX SDWV NYLHWLPR PHFKDQL]PDV VXG¡WLQJDV UHLNLD SDVLWHONWL 25% NDG EÌWÐ
VXVLMXQJWD VX VHUYHULX SDVNXL PHWRGÐ DUJXPHQWDL VXSDNXRMDPL ³ GYHMHWDLQLXV
GXRPHQLVLUSHUVLXQþLDPLåHPRMRO\JLRSURWRNROXVHUYHU\MHGXRPHQ\VGHNRGXRMDPL³
UHLNLDP IRUPDW LU NYLHþLDPL UHLNLDPR SURFHVR Ueikiami metodai. Visos šios
SDVODXJRVDSLEU¡åWRV20*NRPLWHWRQXVWDW\WRVHVVDMRVH
.DGDQJL ³PDQRPD VNLUWLQJRPLV NDOERPLV SDUDã\WÐ REMHNWÐ VVDMD EÌWLQD GDU
YLHQDVWDQGDUWL]XRWDNDOEDPLQ¡WRVLRPVVVDMRPVSDWHLNWL7DLVVDMÐDSLEU¡åLPRNDOED
IDL (Interface Definition Language.DOEDQXVWDWRNDLSWXULEÌWLDSUDã\WLGXRPHQÐ
WLSDL RSHUDFLMRV DUJXPHQWDL VVDMÐ NODV¡V PHWRGDL .DOERV VLQWDNV¡ SDQDãL ³ Java
VLQWDNV
WLN YLHWRMH Java SDNHWR VYRNRV ,'/ NDOERMH QDXGRMDPD PRGXOLR module)
VYRND
IDL kalba parašyta programa kompiliuojama kompiliatoriumi IDL/Java³Java
NRG.RPSLOLDWRULXVWDLSSDWVXJHQHUXRMDSURJUDPDV-NDPãþLXVLUSURJUDPDV-karkasus
åU50,WHFKQRORJLM
.DG VXVLGDU\WÐ ³VSÌGLV DSLH WHFKQRORJLM QHVLJLOLQGDPL ³ GHWDOHV SDWHLNVLPH
viHQSDY\]G³%(FNHOLVNXULDPDVQXWRO
VVHUYHULVWHLNLDQWLVNOLHQWDPVWLNVOÐODLN
$ELSURJUDPRVGDO\VþLDSDUDã\WRV JavaQRUVJDOLPDEÌWÐQDXGRWLLUVNLUWLQJDVNDOEDV
3DY\]GåLXL UHDOL]XRWL SDVLWHONWL -(( LQVWDOLDFLQLDPH SDNHWH HVDQW\V LQVWUXPHQWDL
Java'/25%URG\NOLÐ-REMHNWÐLGHQWLILNDYLPRWDUQ\ED
3LUPLDXVLD,'/NDOEDUHLNLDSDUDã\WLEÌWLQDVVVDMDV
module remotetime{
interface ExactTime{
string getTime( );
};
};
idltojava remotetime.idl
6XIRUPXRMDPRVPLQ¡WRVLRVSURJUDPRV_ExactTimeStub.java ir
_ExactTimeImplBase.javaEHLVVDMÐNODV¡ Java kalba ExactTime.java.
DabDU ³ YLHQ SURJUDP ³GHGDPDV VHUYHULV ExactTimeServer LU MR REMHNW
UHDOL]XRMDQWL NODV¡ RemoteTimeServer âL GDU WXUL W REMHNW SDQDãLDL NDLS 50,
WHFKQRORJLMRMH XåUHJLVWUXRWL WLN þLD – VX 25% 7DUSLQLQNR 25% PHWRGÐ þLD
neaiškinsime, tai galima rasti Javasoft ir OMG internetiniuose puslapiuose.
Programa:
import remotetime.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage*;
import org.omg.CORBA.*;
import java.util.*;
import java.text.*;
138
// Server
class ExactTimeServer extends _ExactTimeImplBase{
public String getTime( ){
return DateFormat. getTimeInstance( DateFormat.FULL ).
format( new Date( System.currentTimeMillis( )));
}
}
// Implementation and registry of server
public class RemoteTimeServer{
public static void main( String args[ ] ) throws Exception{
ORB orb = ORB.init( args, null );
ExactTimeServer ets = new ExactTimeServer( );
orb.connect( ets );
org.omg.CORBA.Object obj = orb.resolve_initial_references(
“NameService” );
NamingContext nct = NamingContextHelper.narrow( obj );
NameComponent nc = new NameComponent( “ExactTime”, “ “ );
nct.rebind( path, ets );
java.lang.Object sync = new java.lang.Object( );
synchronized( sync ){
sync.wait( );
}
}
}
-HL ãL SURJUDPD EÌWÐ SDOHLVWD EÌWÐ VXNXUWDV VHUYHULV LU MLV ODXNWÐ NOLHQWÐ
XåNODXVÐ
.OLHQWR SURJUDPD 6VDM ³ REMHNW VHUYHU\MH SURJUDPD JDXQD WDLS SDW SHU
WDUSLQLQN25%
import remotetime.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
139
Kad YLVDVSURJUDPLQLVÌNLVYHLNWÐEÌWLQDSDQDãLDLNDLS50,WHFKQRORJLMRMH
VXDNW\YLQWLVHUYHU³NOLHQWVVDMÐNODV
SURJUDP-NDPãW³LUSURJUDP-NDUNDVEHLGDU
Java'/LGHQWLILNDYLPRWDUQ\ENXULSDJDOQXW\O¡MLPNODXVR-ojo prievado.
Šiame pavyzdyjeLUVHUYHULVLUNOLHQWDV\UDWDPHSDþLDPHNRPSLXWHU\MHWDþLDX
MLHUHDOL]XRMDPLGYLHMÐVNLUWLQJÐ-90
140
/,7(5$7Ë5$
6. www.java.sun.com arba
java.sun.com arba
www.javasoft.com
7. www.omg.org
.
8. GhjlhgI.,KlZg_d B. Ijh]jZfbjh\Zgb_gZJava.l.KDIj_kk, 1998.
∼ 900 c.
141
PRIEDAI
3URJUDPÐSDY\]GåLDLLUVDYDUDQNLãNRGDUERXåGXRW\V
1–2 programos
class FirstApp {
public static void main ( String args[ ] ) {
System.out.println( "My first application." );
}
}
.OLHQWLQ¡VSURJUDPRVSDY\]G\V
import java.awt.*;
import java.applet.*;
142
3 programa
import java.applet.*;
<HTML>
<HEAD>
<TITLE>First Java Applet</TITLE>
</HEAD>
<BODY>
<APPLET CODE="ArithmTest" WIDTH=500 HEIGHT=100></APPLET>
</BODY>
</HTML>
143
4 programa
import java.applet.*;
public class ArithmTest2 extends Applet{
int x = 2;
int y = 3;
int z = 0;
int tripleAndAdd( int a ) {
System.out.println( "Beginning of tripleAndAdd:" +
"x =" + x + " a = " + a );
x = x + a;
System.out.println( "End of tripleAndAdd:" +
"x =" + x + " a = " + a );
return x * a;
}
public void init( ) {
int x = 5;
x ++;
System.out.println( "x=" + x + " y=" + y + " z=" + z );
x += y;
System.out.println( "x=" + x + " y=" + y + " z=" + z );
z = x + tripleAndAdd( y );
System.out.println( "x=" + x + " y=" + y + " z=" + z );
x += tripleAndAdd( y );
System.out.println( "x=" + x + " y=" + y + " z=" + z );
}
}
144
5–6 programos
import java.applet.*;
145
import java.applet.*;
146
7–8 programos
0HWRGÐ-NRQVWUXNWRULÐY\NG\PRWYDUND0HWRGÐSHUNURYLPDV.VSDXVGLQV
SURJUDPRV"3DVLWLNULQNLWHY\NG\GDPLSURJUDP
class Card{
Tag t1 = new Tag( 1 ); // before constructor !
Card( ){
System.out.println( "Inside constructor Card" );
t3 = new Tag (33 );
}
Tag t2 = new Tag( 2 );
void m( ){
System.out.println( "Finish" );
}
Tag t3 = new Tag( 3 ); // after constructor !
}
147
// Overloading
//
void testChar( ){
char x ='x';
prt( "char argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
148
void testByte( ){
byte x =1;
prt( "byte argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
void testShort( ){
short x =1;
prt( "short argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
void testInt( ){
int x =1;
prt( "int argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
void testLong( ){
long x =1L;
prt( "long argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
void testFloat( ){
float x =1F;
prt( "float argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
void testDouble( ){
double x =1;
prt( "double argument" );
m1( x ); m2( x ); m3( x ); m4( x ); m5( x ); m6( x ); m7( x );
}
149
9 programa
PaveldimuPDV.VSDXVGLQVSURJUDPD"3DVLWLNULQNLWHY\NG\GDPLSURJUDP
// Inheritance
//
class Class1 {
private String s = "Class1: ";
public void append( String ss ) { s += ss; }
public void m1( ) { append( "m1( ) " );}
public void m2( ) { append( "m2( ) " );}
public void m3( ) { append( "m3( ) " );}
public void print( ) { System.out.println( s );}
public static void main( String [ ] args ) {
Class1 c1 = new Class1( );
c1.m1( ); c1.m2( ); c1.m3( ); c1.print( );
}
}
150
10 programa
3DYHOGLPXPDV3DYHOGLPXPXVXVLHWÐNODVLÐNRQVWUXNWRULÐY\NG\PRWYDUND
.VSDXVGLQVSURJUDPD"3DVLWLNULQNLWHY\NG\GDPLSURJUDP
// Inheritance: constructors
//
class Class3 {
Class3( int i ) {
System.out.println( "Constructor of Class3 "+i );
}
}
151
11 programa
3ROLPRUIL]PDV*HUHVQHLSROLPRUIL]PRLOLXVWUDFLMDLSHUUDã\NLWHSURJUDPNDG
³PDV\YShapeHOHPHQWDLEÌWÐVXGHGDPLDWVLWLNWLQHWYDUNDQDXGRNLWHMath.random
PHWRG
152
12 programa
11SURJUDPDSHUUDã\WDQDXGRMDQWDEVWUDNþLDVNODVHV
153
13 programa
154
s[ i ].erase( );
}
Polygon.print( );
}
}
155
14 programa
.OLHQWLQ¡SURJUDPD*UDILQLÐNRPSRQHQWÐLãG¡VW\PRNRQWHLQHU\MHWYDUN\NO¡
3DEDQG\NLWHNRPSRQHQWXVLãG¡VW\WLVDYRQXRåLÌUD,ãEDQG\NLWHNLWDVLãG¡VW\PR
tvarkykles (BorderLayout, GridLayout ir kt.).
156
15–17 programos
.OLHQWLQ¡SURJUDPD6NLUWLQJRV³Y\NLÐUHDOL]DYLPRVLQWDNV¡V3DEDQG\NLWH
SHUUDã\WLSURJUDPDVQDXGRGDPLVNLUWLQJDV³Y\NLÐUHJLVWUDYLPRVLQWDNVHV
157
// 3rd example: buttons and event, inner classes, other layouts
//
//<applet code = Button3 width = 300 height = 200>
//</applet>
//
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
158
// 4th example: buttons and event, alternative listening to the events
//
//<applet code = Button31 width = 300 height = 200>
//</applet>
//
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
159
18 programa
160
}
161
19 programa
162
public void actionPerformed( ActionEvent ae ){
ta.setText( "" ); //ie, deletes text
}
} );
Container c = getContentPane( );
c.setLayout( new FlowLayout( ) );
c.add( new JScrollPane( ta ) ); //text area wrapped into a scrollbar
c.add( b1 );
c.add( b2 );
}
}
163
20 programa
.OLHQWLQ¡SURJUDPD'XRPHQÐVNDLW\PDVLãULQNPHQRVDSODQNHHVDQþLDPHWHQ
SDW Lã NXU ³NUDXQDPDV SURJUDPRV NRGDV ,ãQDJULQ¡NLWH NRG LU SDUHQNLWH VNDLWRP
GXRPHQÐ ULQNPHQ SDJDO NRGH UHLNDODXMDPDV VSHFLILNDFLMDV 3DOHLVNLWH SURJUDP
3DSLOG\NLWHSURJUDPLãYHVWLPL³SXOW3DO\JLQNLWHVDYRSURJUDPVXSURJUDPD
164
c.add( b1 );
c.add( tf );
c.add( b2 );
}
}
165
21 programa
20SURJUDPDSDSLOG\WDLãYHVWLPL³SXOW
166
public void actionPerformed( ActionEvent ae ){
PrintWriter out = new PrintWriter( System.out, true );
out.println( s );
}
}
167
22 programa
//
// Utility: list of methods for the indicated class
// [ possessing indicated substring ]
// to the screen and
// to the file "List.out" in the same directory
//
168
}else { //ie, length==2; list of methods containing substring given
count = 0; //in args[1]
for ( int i = 0; i < m.length; i++ ) {
String ms = m[ i ].toString( );
if( ms.indexOf( args[ 1 ] )!= -1 )
ls[ count++ ]= "method "+ removeName( ms );
}
for ( int i = 0; i < cr.length; i++ ) {
String ms = cr[ i ].toString( );
if( ms.indexOf( args[ 1 ] )!= -1 )
ls[ count++ ]= "constructor "+ removeName( ms );
}
}
} catch( ClassNotFoundException e ) {
System.err.println( "Class "+e+" does not exist" ); //errors to the screen
}
try{ //output to the screen and file
PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter(
"List.out" ))),
con = new PrintWriter( System.out, true ); //true: empty
for( int i=0; i<count; i++) { //the buffer
out.println( i + " " + ls[ i ] );
con.println( i + " " + ls[ i ] );
}
out.close( );
} catch( Exception e ){
System.err.println( e.toString( ) ); //errors to the screen
}
}
}
169
23 programa
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
170
int count = 0;
while( ( line=in.readLine( ))! = null ){
array2[ count ] = line.substring( line.lastIndexOf(" ")+1,line.length( ) );
array1[ count ][ 0 ] = line.substring( 0, line.indexOf(" ") );
array1[ count ][ 1 ] = line.substring( line.indexOf(" ")+1,
line.lastIndexOf(" ") );
count++;
}
} catch( ArrayIndexOutOfBoundsException e ){
ta.append( "Dimensions of table only until 20 rows allowed" );
} catch( Exception e ) {
ta.append( "Error reading data: "+ e );
}
table = new JTable( array1, colHeads );
showStatus( "Data added" );
repaint( );
}
}
171
24 programa
SURJUDPDVXVSDXVGLQLPRJDOLP\E¡PLV
//
//<applet code = Tabpr width =600 height=500>
//</applet>
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.awt.print.*;
import javax.swing.table.*;
172
System.err.println( "Dimensions of table only until 20 rows allowed" );
} catch( Exception e ) {
System.err.println( "Error reading data: " + e );
}
table = new JTable( array1, colHeads );
showStatus( "Data added" );
repaint();
}
}
173
JScrollPane sp = new JScrollPane( table );
JPanel p = new JPanel( );
p.setLayout( new FlowLayout( ) );
p.add( tf );
p.add( b1 );
p.add( b2 );
p.add( b3 );
c.add( sp,BorderLayout.NORTH );
c.add( p,BorderLayout.SOUTH );
}
}
174
25 programa
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
175
}
}
}
176
26 programa
177
class Consumer implements Runnable{
Q q;
Consumer( Q q ){
this.q = q;
new Thread( this,"Consumer" ).start( );
}
public void run( ){
while( true ) q.get( );
}
}
class InfiniteQueue{
public static void main( String [ ] args ){
System.out.println( "Ctrl-C for finish" );
Q q = new Q( );
new Producer( q );
new Consumer( q );
}
}
178
27 programa
.OLHQWLQ¡SURJUDPDSDOHLGåLDQWLQRULPNLHN³QHSULNODXVRPÐY\NG\PRVUDXWÐ
3HUWYDUN\NLWH SURJUDP NDG YLHQDPH VUDXWH EÌWÐ YDOGRPRV NHOLÐ ODXNHOLÐ VSDOYRV
3DåLÌU¡NLWHNLHNVUDXWÐSDM¡JLDSDOHLVWLMÌVÐNRPSLXWHULV
3DNHLVNLWHNOLHQWLQ
SURJUDPWDLSNDGYLHQXPHWXEÌWÐNHLþLDPDVSDOYDYLVRV
HLOXW¡VODXNHOLDPV
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
179
repaint( );
try{
t.sleep( pause ); //<pause> milisec
} catch( InterruptedException ie ){}
}
}
}
180
String s = t1.getText( );
try{
grid = Integer.parseInt( s );
} catch( NumberFormatException nfe ){
ta.append( "Erroneous input for number of rows."+
" Re-enter or use default: 5 \n" );
grid = 5;
}
if( grid<1 ) {
ta.append( "Erroneous input for number of rows \n"+
"Using default: 5 \n" );
grid = 5;
}
ta.append( "Entered: number of rows "+grid+"\n" );
}
});
t2.addActionListener( new ActionListener( ){
public void actionPerformed( ActionEvent ae ){
ta.setText("");
String s = t2.getText( );
try{
pause = Integer.parseInt( s );
} catch( NumberFormatException nfe ){
ta.append( "Erroneous input for pause."+
" Re-enter or use default: 100 milisec \n" );
pause = 100;
}
if( pause<1 ) {
ta.append( "Erroneous input for pause \n"+
"Using default: 100 milisec \n" );
pause = 100;
}
ta.append( "Entered: pause (milisec) "+pause+"\n" );
}
});
p11.add( l1 ); p11.add( t1 ); p11.add( l2 ); p11.add( t2 );
p11.add( l3 ); p11.add( ta );
181
repaint( );
}
});
p12.add( b1 );
p12.add( b2 );
c.add( p11,BorderLayout.NORTH );
c.add( p12,BorderLayout.SOUTH );
}
}
182
28 programa
.OLHQWLQ¡SURJUDPDLOLXVWUXRMDQWLSULRULWHWгWDNY\NGDQWVUDXWXV3DEDQG\NLWH
³YDLULXVSULRULWHWXV³YDLULDPVNDLWLNOLÐDXJLQLPRODLNXLWLNDtsiminkite, kad skaitiklio
formatas – int).
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
int count;
Thread t;
volatile boolean running;
public Counter( int priority ){
count = 0;
t = new Thread( this );
t.setPriority( priority );
}
Counter c1,c2;
JButton b1 = new JButton( "Start threads" ),
b2 = new JButton( "Stop threads " );
183
JTextArea ta = new JTextArea( 3,50 );
Container c = getContentPane( );
c.setLayout( new FlowLayout( ) );
c.add( b1 );
c.add( b2 );
c.add( ta );
}
}
184
29–30 programos
6HUYHULRLUNOLHQWRSURJUDPRV6HUYHULVDSWDUQDXMDWLNYLHQNOLHQW3DOHLVNLWH
SURJUDPÐÌN³
import java.io.*;
import java.net.*;
185
//The simplest client: sending messages to
//server and getting messages from server
//
import java.io.*;
import java.net.*;
186
31–32 programos
import java.io.*;
import java.net.*;
187
}
}
188
//Code generates simplest clients: sending messages to
//server and getting messages from server.
//Until MAX_CLIENTS clients may exist simultaneously.
//One thread for one client
//
//Results of code depend exclusively on the period
//pause. Experiment on it!
//
import java.io.*;
import java.net.*;
189
String msg = "Client's No "+id+" message "+i;
out.println( msg );
System.out.println( "Sent to server: "+msg );
String str = in.readLine( );
System.out.println( "Got from server: "+str );
}
out.println( "END" );
} catch( IOException ioe ){
System.out.println( "I/O error" );
} finally{
try{
s.close( );
System.out.println( "Disconnecting socket No "+id );
} catch( IOException ioe ){
System.out.println( "Unable to close socket No "+id );
}
threadCount- -; //client is closed; decrease the number of clients
}
}
}
190
5LPDQWDV%HOHYLþLXV
JAVA TECHNOLOGIJOS
Mokomoji knyga
5HGDNWRU¡/DLPD.HUWHQLHQ¡