You are on page 1of 1217

Misliti

na

Javi
Prevod četvrtog izdanja

Bruce Eckel
MindVievv, Inc., p re d s e d n ik Preveo Miljenko Šućur

P R E N T IC E H ALL

M isliti na Javi, prevod četv rto g izdanja
G lavn i u re d n ik R e d a k to ri T ehnički u re d n ik L e k to r i k o re k to r R ealizacija k o ric a P relom tek sta i o b r a d a slika O lg a M ila n k o Stela Spasić S n ežan a B isenić S an ja Tasić Vesna Đ u k ić N ataša Pavlov San ja Tasić M iiica D ečan sk i N ataša Pavlov Izdavač D ire k to r š ta m p a M ik ro k n jig a , B eo g rad D ra g a n T anaskoski P u b lik u m , B eograd

A ko im a te p ira n ja ili k o m e n ta re , ili a ko želite d a d o b ije te b e s p la ta n k atalo g , p išite n a m ili se javite: M ik ro k n jig a P. fah 20 -87 11030 B eog rad tel: 01 1/3 5 4 0 -5 4 4 pi sma@mi k ro k n j i g a . r s A u to riz o v a n p re v o d sa e n g le sk o g jezika k n jig e T h in k in g in Java, F o u rth l'd itio n . llo p v rig h t • 2 007 M ik ro k n jig a . Sva p rav a z a d rž a n a . N ije d o z v o lje n o d a ije d a n d eo ove knjige b u d e re p ro d u k o v a n ili e m ito v a n n a bilo koji n a č in , e le k tro n sk i ili m e h a n ič k i, u k lju ć u iu ć i fo to k o p ira n je , s n im a n je ili b ilo koji d ru g i sistem za beležen je, b ez p r e th o d n e p ism e n e d o z v o le izdavača. T ra n sla tio n c o p v rig h t H a ll, In c, a C o m p a n y . 2007 by M ik ro k n jig a , T h in k in g in Java, F o u r th E d itio n b y B ru ce Eckel, C o p y rig h t

< 0

2006,

All R ights Reserved. P u b lish e d by a rra n g e m e n t vvith th e o rig in a l p u b lish e r, P earso n F d u c a tio n , Inc., p u b lish in g as P re n tic e

H a p o n n a r*n6.nii(vrcKa C p n iijc . lic o i pa;i

004.438JAVA 001.42:00-4.738.5

EK EJl. Bpvc
M isliti n a Javi / B ru ee Eckel ; p rev o d 4. izd. M iljenko Šueur. - B eograd : Mikro knjiga, 2007 (B e o g ra d : P ub lik u m ) XIII, 1201 s tr . graf. prikazi : 24 cn i P re v o d d ela: T hink in g in Java. - T iraž 500. - Bibliografija: 1170-1171. R egistar. ISBN 978-86-7555-308-3
a ) PlporpaMCKH jc u ik "Java" b) H iircpiicT - flporpaMnpaibc

COBISS.SK - ID 141670412

MNI4/289/290069M 19Q8P101S16 1K76 5 4

Kratak sadržaj
Predgovor U vod 1: U poznavanje sa objektim a 2: Sve je objekat 3: O p erato ri 4: K ontrolisanje izvršavanja 5: Inicijalizacija i čišćenje 6: K ontrola p ristupa 7: Ponovno korišćenje klasa 8: Polim orfizam 9: Interfejsi 10: U nutrašnje klase 11: Čuvanje objekata 12: O b rad a grešaka pom oću izuzetaka 13: Znakovni nizovi 14: Podaci o tip u 15: G enerički tipovi 16: Nizovi 17: D etaljno razm atranje kontejnera 18: Javin ulazno-izlazni sistem 19: N abrojani tipovi 20: A notacije 21: Paralelno izvršavanje 22: Grafička korisnička okruženja A: D odaci B: Resursi Spisak term in a korišćenih u knjizi Indeks 1 8 15 42 65 99 115 159 180 211 239 266 302 345 392 432 484 593 628 719 805 845 885 1045 1166 1170 1175 1177

Sadržaj
Predgovor 1
Paralelni r a d ...................................34
Ja v a i I n t e r n e t ....................................... 34 Sta je W eb?............................................ 34 Programiianje s klijentske stra n e .. . . 36 Programiranje sa serverske strane . . . 40 S a ž e ta k .......................................................41

Java SE5 i S E 6 ...................................2 Java SE6..........................................2 Četvrto izdanje.................................3
I z m e n e ..........................................................3

N apom ena o dizajnu k o r ic a .........4 Z ahvalnice......................................... 5 U vod 8

2: Sve je objekat
R a d sa o b je k tim a

42

p r e k o r e f e r e n c i .................................... 42

P reduslovi......................................... 8 Učenje Ja v e .......................................9 C ilje v i................................................9 Poučavanje na osnovu ove k n jig e .......................................10 D okum entacija na W ebu............. 11 V ežbe................................................11 Javini tem elji.................................. 11 lzvorni k o d .....................................12
Način pisanja korisćen u knjizi............13

M o r a te d a n a p r a v ite sve o b je k te . 43
G de se nalazi skladište............................43 Specijalan slučaj: p rosti tip o v i............44 Nizovi u Javi.............................................. 46

N ik a d a n e m o r a te d a u n i š t i t e o b j e k a t ...................................................... 46 Oblast važenja......................................46 Oblast važenja o b je k a ta ..................... 47 P ra v lje n je n o v ih tip o v a p o d a t a k a : k l a s a .................................... 48 Polja i m e to d e ..................... ................ 48 M e to d e , a r g u m e n t i i p o v r a t n e v r e d n o s t i ................................................. 50
Lista a rg u m e n a ta .....................................51 P r a v l j e n j e p r o g r a m a n a J a v i . . . .5 2 Vidljivost i m e n a .....................................52 Koriščenje d rugih k o m p o n e n a ta . . . . 52 Rezervisana reć s t a t i c ............................53 V a š p r v i p r o g r a m n a J a v i ................. 5 4 Prevodenje i iz v ršav a n je ....................... 56 K o m e n ta ri i u g ra đ e n a d o k u m e n t a c i j a ........................................ 5 7 D okum entacioni k o m e n ta ri................ 58 S in ta k s a .....................................................58 U gradeni H T M L .....................................59 P rim eri o z n a k a ....................................... 60 P rim er d o k u m e n ta c ije ......................... 62 S til p r o g r a m i r a n j a ............................... 6 3 S a ž e t a k ........................................................... 6 3 V e ž b e .............................................................. 6 3

G re šk e ............................................. 14 1: U p o z n a v a n j e s a o b j e k t i m a 15

Razvoj apstrakcije..........................15 O bjekat im a in te rfe js................... 17 O bjekat pruža u slu g e................... 19 Skrivena realizacija........................20 Ponovno korišćenje realizacije.. .21 N asleđivanje...................................22 Relaeije !!• i IE-KAO.......................25 Virtuelizacija objekata preko p o lim o rfiz m a................................ 26 H ijerarhija s jedinstvenim k o r e n o m ......................................... 29 K ontejneri.......................................29 Paramctri/uvani (generieki) tipuvi .. 30 O brada izuzetaka: postupanje s greškam a.......................................33

vi

Misliti na Javi

3: O p e r a t o r i

65

N a r e d b a s w i t c h ................................ 112 S a ž e ta k .................................................... 114

Jednostavnije naredbe za ispisivanje.................................. 65 Korišćenje operatora u Jav i.........66 P rio rite ti.........................................66 Dodela v re d n o s ti..........................67 Pojava pseudonima pri pozivanju metode.....................68 Matematički o p erato ri................. 69 Unarni operatori minus i plus.........71 Automatsko uvećanje i um anjenje.....................................72 O peratori poređenja......................73 Ispitivanje jednakosti objekata.........73 Logički o p e r a to ri..........................75
N ep o tp u n o iz ra č u n a v a n je ...................76

5: I n i c i j a l i z a c i j a

i č iš ć e n je

115

G a r a n t o v a n a in ic ija liz a c ija p o m o ć u k o n s t r u k t o r a .................. 115 P r e k l a p a n je m e t o d a ........................ 117
Razlikovanje preklopljenih m etoda ..1 1 9 Preklapanje i prosti t i p o v i ................ 120 Preklapanje p o v ra tn ih v re d n o s ti. . . 123

I’o d r a z u m e v a n i k o n s t r u k t o r i .

.124

R e z e r v is a n a r e č t h i s ........................125
Pozivanje k o n stru k to ra iz k o n s tr u k to r a ..................................... 127 Z naćenje rezervisane reči s t a t i c . . . . 129

Ć iš ć e n je : f in a liz a c ija i s a k u p l ja n je s m e ć a .......................... 129
Č em u služi m etoda fin a liz e ()? ......... 130 M o rate da čistite s a m i......................... 131 Stanje o k o n ć a n ja ................................... 131 Kako radi sakupljač s m e ć a ? .............. 133 I n i c i j a l i z a c i j a č l a n i c a ....................... 136 Z adavanje in ic ija liz a cije ..................... 137 I n i c i j a l i z a c i j a k o n s t r u k t o r i m a . .1 3 9 Redosled in ic ija liz a cije ....................... 139 Inicijaiizacija statićnih elem enata .. 140 I:ksplicitna inicijalizacija statićnih e le m e n a ta ................................................. 143 Inicijaliz.acija nestatićn ih instanci .. 144

Literali............................................. 77
E ksponencijalni z a p i s ............................78

O peratori nad bitovim a............... 79 O peratori p om eranja................... 80 Ternarni operator uslovljavanja. .84 O peratori + i += za znakovne n iz o v e ............................................. 85 Česte greške prilikom korišćenja operatora......................86 Eksplicitna konverzija tipova . . .87 Odsecanje i zaokruživanje..............88 Unapredenje tipova........................ 89 Java nema operator za određivanje velićine................. 89 Sažet pregleđ o p e ra to ra ............... 89 Sažetak............................................. 98 4: K o n tr o lis a n je i z v r š a v a n j a 99

I n ic ija liz a c ija n i z o v a ........................ 145 E.iste promenljivih param etara........ 150 N a b r o ja n i t i p o v i ............................... 155 S a ž .e ta k .................................................... 158

6:

K o n tro la p r is tu p a

159

Logičke v red n o sti.......................... 99 Naredba if-e ise .............................. 99 P e tlje ............................................. 100
Petlja do-vvhile....................................... 101 Petlja f o r ...................................................101 O p e ra to r z a r e z ....................................... 103

P a k e t: b i b l i o t e ć k a j e d i n i c a .......... 160
O rg anizacija k o d a ................................. 10 1 PravI jenje jedinst ven i h im en a p a k e ta .......................................... 1^2 Lićna bihlioteka sa a la tk a m a ............ 166 K orišćenje tivoženja za p ro m e n u po n ašan ja p ro g r a m a ............................ 16S U pozorenje pri rad u s pakelim a . . . 168

Foreach sin tak sa.......................... 103 Rezervisana reč r e tu r n ............... 106 Rezervisane reči break i c o n tin u e .....................................107 Cuveni s;oto...................................108

S p e c if ik a to ri p r i s t u p a u Javi . .

.168

Paketni p r i s t u p ..................................... 169 p u b lic: intertejs za p r i s t u p ................ 169 p riv a te : to ne sm e da se d ir a ! ............ 171 p ro te c te d . „pristup nasledi\'anjem “ . . 172

Sadržaj

v ii

Interfejs i realizacija....................174 Pristup k la s a m a ..........................175 Sažetak........................................... 178 7: P o n o v n o k o r i š ć e n j e k la s a 1 80

Projektovanje pom oću n asleđ iv an ja ................................ 2 3 3
P oredenje zam ene i proširivanja . . . 235 Svođenje naviše i podaci o tip u p rilikom iz v rša v a n ja ............................236

Sažetak........................................... 2 3 8

S i n t a k s a k o m p o z i đ j e .......................1 8 0 S i n t a k s a n a s l e đ i v a n j a ....................... 1 8 3 Inicijalizacija osn ov ne k la s e ..............185 D e l e g i r a n j e ..........................< .................. 1 8 8 K o m b in o v a n je k o m p o z ic ije i n a s l e đ i v a n j a ........................................1 8 9 G aran to v an je prav ilno g čišćenja . . . 191 Sakrivanje im e n a .................................. 194 I z b o r iz m e đ u k o m p o z ic ije i n a s l e đ i v a n j a ........................................1 9 6 R e z e r v i s a n a r e č p r o t e c t e d ............1 9 7 S v o đ e n j e n a v i š e ..................................... 1 9 8 Z ašto „svođenje naviše“ ? .....................199 Ponovo o hiran ju izm eđu kom pozicije i n a sle đ iv a n ja................ 200 R e z e r v i s a n a r e č f i n a l .......................2 0 0 Finalni p o d a c i .......................................200 Finalne m e t o d e .....................................204 Finalne klase............................................206 Fažljivo sa f i n a l .....................................207

9: Interfejsi

239

Apstraktne klase i m e to d e .........239 In te rfe jsi....................................... 242 Potpuno razd v ajan je................. 246 Višestruko nasleđivanje u Javi. .251 Proširivanje interfejsa nasleđivanjem .............................. 253 Sukobljavanje imena prilikom kombinovanja interfejsa................255 Prilagođavanje interfejsu...........256 Polja u in te rfe jsim a ....................258
Inicijalizacija polja u interfejsim a . . 259

Ugnežđivanje in terfejsa............. 260 Interfejsi i Proizvođači............... 262 Sažetak........................................... 265

10: Unutrašnje klase

266

Inicijalizađja i učitavanje klasa................................................208
Inicijalizacija i n a sle d iv a n je ..............208

Sažetak........................................... 210 8: P o l i m o r f i z a m 211

Ponovo o svođenju naviše.........211
Z an em ariv an je tipa o b jc k ta ..............213

Pravljenje unutrašnjih klasa .. .266 Veza ka spoljnoj k lasi................. 268 U potreba sintaksi .this i .new . .270 Unutrašnje klase i svođenje naviše..............................................271 Unutrašnje klase u m etodam a i oblastim a važenja......................273 A nonim ne unutrašnje klase . . .275
Ponovo o p ro izvodnim m e to d a m a . 279

Z ačko ljica.....................................214
Vezivanje poziva m e to d a .....................214 D obijanje p ravilnog ponašanja . . . . 215 P r o š ir iv o s l..............................................218 ( 'ireška: ,,redel l n isan je“ priv atn ih m e to d a .................................. 221 Cireška: polja i statićne m e to d a ......... 222

Ugneždene klase.......................... 2 8 2
Klase u n u ta r in te rf e js a ....................... 283 P ristu p an je spoljašnjosti iz višestruko ugnežđenih k la s a .................................. 284

Zašto unutrašnje k lase?............. 285
Zaključci i p o v ra tn i p o z iv i................ 287 U nu trašn je klase i kosturi u p ra v lja n ja .............................................. 290

K onstruktori i p olim orfizam .. .224
Redosled po/.iva k o n s tr u k to r a ......... 224 N asledivanje i čišćenje......................... 226 Ponašanje po lim o rfn ih m etoda u n u ta r k o n s tr u k to r a ............................230 K o v a r i j a n t n i p o v r a t n i t i p o v i . . .2 3 2

Nasleđivanje unutrašnjih klasa................................................296 Da li unutrašnja klasa može da se redefiniše?.......................... 297

v iii

Misliti na Javi

Lokalne unutrašnje klase...........299 Identifikatori unutrašnjih klasa.300 Sažetak...........................................301
11: Č u v a n je o b je k a ta 302

Č i š ć e n j e o d r e d b o m f i n a l l y . . . .3 6 7 Č em u služi o d red b a finally?..............368 U potreba bloka finally tokom p o v ratk a iz m e to d e p o m o ć u rezervisane reči r e t u r n ....................... 371 M ana: izgubljeni iz u z e ta k ...................372 O g r a n i č e n j a i z u z e t a k a .................... 3 7 4 K o n s t r u k t o r i ........................................... 3 7 7 P r o n a l a ž e n j e s l i ć n i h i z u z e t a k a . .3 8 2 D r u g i p r i s t u p i ........................................ 3 8 3 I s t o r i j a ..................................................... 384 Perspektive.............................................. 386 Prosleđivanje izuzetaka na k o n z o lu . .387 P retvaranje pro v eren ih izuzetaka u n e p ro v e re n e ....................................... 388 U p u t s t v a z a i z u z e t k e ..........................3 9 0 S a ž e t a k ......................................................... 3 9 1

Generičke klase i kontejneri za bezbedan rad s tipovim a. .. .303 Osnovni p o jm o v i........................306 Dodavanje grupa elemenata .. .307 Ispisivanje sadržaja kontejnera. .309 L iste............................................... 311 I t e r a t o r i .......................................315 Listlterator.................................318 Ulančana lis ta .............................. 319 Pravljenje steka od ulančane liste................................................. 320 Funkcionalnost s k u p a ............... 322 Funkcionalnost m ape................. 326 Pravljenje reda za čekanje (od ulančane lis te ) ......................329
Prioritetni red čekanja (P rio rity Q u e u e )............................... 330

13: Znakovni nizovi

392

Poređenje kolekcija i Iteratora .332 Foreach i iteratori........................336 Adapterska metoda.......................338 Sažetak...........................................341
12: O b r a d a g re ša k a p o m o ć u iz u z e ta k a 345

Nepromenljivi znakovni nizovi .392 Poređenje preklapanja operatora + i StringB uildera . .393 N enam erna rekurzija................. 397 Operacije sa znakovnim n izov im a....................................... 398 Formatiranje izlaza......................400
M etoda p r in t f ( ) ..................................... 400 S y s te m .o u t.fo rm a t()............................400 Klasa F o r m a t t e r ...................................401 Specifikatori f o r m a t a ......................... 402 Konverzije klase F o r m a t t e r ..............403 S tr in g .f o rm a t() ..................................... 406 R e g u l a r n i i z r a z i ..................................... 4 0 8 O s n o v e .....................................................408 Pravljenje regiilarnih i / r a z a ..............411 K v antilikatori..........................................413 C h a rS e q u e n c e ....................................... 414 Klase P a tte rn i M a tc h e r .....................414 M etoda s p l i t ( ) ....................................... 422 O p eracije z a m e n e ................................ 422 M etoda r e s e t( ) ....................................... 424 R egularni i/.ra/.i i Javin ula/.no i/Iazni s iste m ............................425

K o n c e p t i .............................................. 34 5 O s n o v n i i z u z e c i ............................... 3 4 6 Argumenti izuzetku........................... 347 H v a t a n j e i z u z e t k a ............................ 3 4 8 Blok trv ................................................ 34S Blokovi za obradu izuzetaka...............348 P ra v lje n je s o p s t v e n i h iz u z e ta k a .3 4 9 Izuzeci i zapisivanje........................... 352 S p e c if ik a c ija i z u z e t a k a .................. 3 5 5 H v a t a n j e b ilo k o g iz u z e tk a . . . .3 5 6 Položaj nastanka izuzetka na steku izvršavanja..........................................358 Ponovno generisanje izu z e tk a ........ 359 Ulančavanje izuzetaka....................... 362 S t a n d a r d n i iz u z e c i u J a v i .............3 6 5 Specijalan slučaj klase R untim eE xcep tio n........................... 305

Leksičko analiziranje ulaza . . . .427
C ran ičnici k la se S c a n n e r .................. 42l> l.eksička anali/a p om oću reg u larnih i / r a / a ...................................430

Klasa S tringT okenizer............... 431 Sažetak........................................... 4 3 1

Sadržaj

ix

14: Podaci o tipu

432

P roblem s b ris a n je m ............................517 Šta se zbiva na g ra n ic a m a ...................518 K o m p e n z a c i j a z a b r i s a n j e ............5 2 2 Pravljenje instanci tip o v a ...................523 Nizovi generičkih tip o v a .....................526 G r a n i c e ...................................................... 531 D ž o k e r s k i a r g u m e n t i ....................... 5 3 5 Koliko je prevodilac p a m e ta n ? ......... 537 K o n tra v a rija n sa ..................................... 539 N eograničeni džokerski a rg u m e n ti................................................ 541 Konverzija h v a ta n je m ..........................547 N e d o s t a c i ................................................... 5 4 9 P rosti tipovi ne m o g u biti p a ra m e tri t i p a ....................................... 549 Realizacija p aram etrizo v an ih in terfeisa...................................................551 E ksplicitna konverzija tipova i u p o z o re n ja ............................................551 P r e k la p a n je ............................................553 O snovna klasa o tim a in te r f e js ......... 554 S a m o o g r a n i č e n i t i p o v i .................... 5 5 5 G enerički ko d koji se neobično p o n a v lja ...................................................555 S a m o o g ra n ič e n je ...................................557 K ovarijansa a rg u m e n a ta .....................559

Potreba za prepoznavanjem tipa tokom izvršavanja............... 432 Objekat tipa Class........................434
Literali k la se ........................................... 439 G eneričke reference k la s a .................. 441 Nova sintaksa za konverziju tipova . 444

Provera pre konverzije tipa . . . .445
Korišćenje literala ld ase....................... 451 D inam ićki in sta n ce o f . . : ...................453 Rekurzivno b r o ja n je ............................454

Registrovane proizvodne m etode...........................................456 Poređenje instanceof sa ekvivalencijama klase............. 459 Refleksija: informacije o klasi u vreme izvršavanja....................461 Čitanje metoda klase.....................462 Dinamički posređnici................. 465 Null o b jek ti...................................469 Lažni objekti i vezivne funkcije . . . . 476 Interfejsi i podaci o tip u ............. 476 Sažetak........................................... 482

15: Generički tipovi

484

D in a m ič k a b e z b e d n o s t t ip o v a .

.562

I z u z e c i .................................................... 563 M i k s i n i ................................................. 565
M iksini u jeziku C + + ......................... 566 M ešanje p o m o ć u interfejsa................ 567 K orišćenje obrasca D e c o r a to r ......... 568 M iksini s d inam ičkim p o s re d n ic im a ..........................................570

Poređenje sa C + + - 0 1 1 1 ............... 485 Jednostavni generički tipovi . . .485
Bihlioteka n - t o r k i ................................ 487 Klasa s t e k a ..............................................490 N a s u in ic n a L is ta .................................. 491

Generički interfejsi..................... 492 Generičke m etode........................496
Korišćenje zakljućivanja o tipu a r g u m e n ta ..............................................497 A rgum enti prom enljive d u /in e i generičke m e to d e ................................499 G enerićka m etoda za u p o treh u s G e n e r a to r im a .....................................500 G e n e ra to r opšte n a m e n e .................. 501 Pojednostavljenje u p o tre h e n - to r k i. 502 U služna m eto da za S e t .......................504 A n o n i m n e u n u t r a š n j e k la s e . . . .5 0 8 P r a v l j e n j e s l o ž e n i h m o d e l a . . . .5 0 9 T a j a n s t v e n o b r i s a n j e ..........................5 1 2 P ristup u G + + - u .................................. 513 M igracijska k o m p a tih iln o s t..............516

L a t e n t n i t i p o v i .................................. 572 K o m p e n z a c ija za n e p o s t o ja n je l a t e n t n i h t i p o v a ............................... 576 R elleksija........ ................................... 576 Priinena m etode na se k v e n c u ........ 577 Kada sltićajno neinate odgovarajuc'i interfejs....................... 580 Simuliranje latentnih tipova pom ocu a d a p te r a ............................. 582 U p o t r e b a f u n k c ijs k ih o b j e k a t a k a o s t r a t e g i j a .................. 585 S a ž e ta k : d a li je e k s p l ic it n a k o n v e r z ija t ip o v a z a is ta ta k o lo š a ? ............................................... 590
Pročitajte i o v o ....................................... 592

x

Misliti na Javi

1 6 :N iz o v i

593

I z b o r r e a l i z a c i j e ..................................... 6 8 3 S tru k tu ra za ispitivanje p e rfo rm a n s i............................................684 Perform anse razlićitih L is ta ..............688 O p asn o sti od m ik roporedenja p e rfo r m a n s i............................................694 Iz b o rsk u p a (realizacije interfejsa S e t ) .................. 696 Izb or m apa (realizacija interfejsa M a p )................ 698 U s l u ž n e m e t o d e .................................. 7 01 U redivanje i p retraživanje lista (realizacija interfejsa L i s t ) ................ 705 Kako kolekciju ili m a p u ućiniti n e p ro m e n ljiv o m .................................. 706 Sinhronizovanje kolekcije ili m a p e . .708

Šta to nizove čini p o se b n im .. . .593 Nizovi su prvorazredni objekti. .595 Vraćanje niza v re đ n o sti............. 597 Višedimenzionalni n iz o v i.........599 Nizovi i generički tipovi............. 603 Pravljenje podataka za testiran je...................................605 Arrays.fill()................................. 605 Generatori podataka..................... 606 Pravljenje nizova od Generatora... 612 M etode klase A rrays....................616 Kopiranje niza..............................617 Poređenje nizova.......................... 618 Poređenje elemenata niza..............619 Uređivanje niza............................ 623 Pretraživanje uređenog niza.......... 624 Sažetak........................................... 626 17: D e t a l j n o r a z m a t r a n j e k o n te jn e ra 628

Čuvanje referen ci ............................... 7 0 9
K ontejner W e a k H a s h M a p ................ 712

Kontejneri Jave

1 . 0 / 1 . 1 ....................7 1 3

V ector i E n u m e r a t i o n .......................713 Klasa H a s h t a b l e .................................. 714 Klasa S ta c k ..............................................714 Klasa B itS e t........................................... 716

Sažetak .........................................................7 1 8
18: J a v in u la z n o - iz la z n i s is te m 719

Potpuna taksonomija kontejnera.....................................628 Popunjavanje k ontejnera...........629
G en erato rsk o rešen je............................630 G en erato ri m a p a .................................. 632 K orišćenje a p strak tn ih k la sa ..............635

Klasa File ................................................... 7 1 9
Listanje d ir e k to r iju m a ....................... 719 U služne m eto d e za d ire k to riju m e . . 723 l’rovera postojanja i pravljenje d ire k to riju m a ......................................... 72S U la z i i / . I a z ................................................ 7 3 0 Vrste ukr/nih to k o v a ............................730 Vrste iz la/nih tokova (O u tp u tS tre a m .................................. 732 D o d a v a n je a tr ib u ta i k o ris n ih i n t e r f e j s a ................................................... 7 3 2 I iltriranje u la /n o g t<.»kd.....................733 I iltriranje i/la /n o g t o k a .....................734 K la s e z a ć i t a n j e i u p i s i v a n j e . . . .7 3 4 I/vori i p o n o ri p o d a ta k a .....................735 M enjanje ponašanja t o k a .................. 736 Klase koje nisu p ro m e n je n e ..............736 P o s e b a n s lu č a j: k la s a R a n d o m A c c e s s F i l e ..........................7 3 7 T i p i č n e p r i m e n e U / I t o k o v a . . .7 3 7 Baferisana u la /n a d a to te k a ................ 738 ('ita n je i/ m e m o rije .............................. 739

Funkcije interfejsa C ollection. .643 O pcione o p e ra c ije ......................646
N ep o d rzan e o p e ra c ije ......................... 647

Funkcije liste.................................649 Skupovi i redosled skladištenja. .652
S o r te d S e t................................................ 656 R e d o v i z a č e k a n j e ................................6 5 7 Redovi za ćekanje s p rio rite to m . . . . 658 D vostrani redovi za ć e k a n je ..............660 I s c r p n i j e o M a p a m a ..........................6 6 1 F e rfo rm a n se ............................................663 S o r te d M a p .............................................. 666 L in k e d H a sh M a p ...................................667 T r a n s f o r m i s a n j e k lj u č e v a i k l j u č e v i z a h e š i r a n j e .......................6 6 8 N aćin rada m eto d e h a sh C o d e ( ) . . . 671 Transform isanje kljućeva zbog h r z i n e ....................................................... 674 Kedefinisanje m etode h a s h C o d e ( ) . . 678

Sadržaj

xi

F o rm atiran ulaz iz m e m o r ije ............739 O snove pisanja u d a to te k u ................ 740 Č uvanje i rek on stru isan je p o d atak a. .742 C itan je i upisivanje d ato tek a s n a su m ičn im p r is tu p o m ...................744 C ev o v o d i................................................... 745 U s lu ž n e k la s e z a č ita n je i p i s a n j e ...................................................... 7 4 5 Č itan je b in a rn ih d a to te k a ...................748 S t a n d a r d n i U / I t o k o v i .................... 7 4 9 Č itan je s ta n d a rd n o g u lazn o g toka . . 749 O m o ta v a n je to k a S y ste m .o u t u P r in tW rite r..........................................750 P reu sm erav an je stan d a rd n o g u laza/izlaza.............................................. 751 U p r a v l j a n j e p r o c e s i m a .................... 7 5 2 N o v e U / I k l a s e ..................................... 7 5 3 Konverzija p o d a ta k a ............................757 Pribavljanje p ro stih tip o v a ................ 759 Baferi p rik a z a ..........................................761 Rad s p o d acim a p o m o ć u b a f e r a .. . . 765 D etaljno o b a te rim a .............................. 766 D atoteke preslikane u m e m o riju . . . 769 Z akljućavanje d a to te k a ....................... 772 K o m p r i m o v a n j e .................................. 7 7 5 Ied n o slav n o k o m p i im ovanje u lo rm a tu G Z I P ..................................... 776 K om prim ovanje većeg broja dato tek a u ib rm atu Z i p ....................... 777 lava arbive ( IA IO ...................................779 S e r i j a l i z o v a n j e o b j e k a t a ................. 7 8 0 Pronalaženje k la s e ................................ 78 1 U pravljanje s e rija liz o v a n je m ............785 Korišćenje tr a jn o s ti .............................. 793 X M L ................................................................ 7 9 9 P r e f e - r e n c e s ..............................................8 0 2 S a ž e t a k ......................................................... 8 0 4

Misterija m etode v a lu e s().........810 Realizuje, ne nasleđuje............... 813 Nasumičan iz b o r ........................814 U potreba interfejsa za organizovanje..........................815 Skup Enum Set urnesto in d ik a to ra .....................................819 Korišćenje m ape E num M ap . . .821 M etode koje se menjaju u zavisnosti od k o n sta n te ............. 823 Stvaranje lanca ođgovornosti pomoću nabrojanih tipova............ 826 Mašine stanja s nabrojanim tipovima...................................... 830 Višekratno otkrivanje tip a .........836 Otkrivanje tipa pomoću nabrojanih tipova........................ 838 Korišćenje metoda koje se menjaju u zavisnosti od konstante nabrojanog tipa............................840 Otkrivanje tipa pomoću mapa EnumMap...................................842 Korišćenje 2-D niza.......................843 Sažetak........................................... 844

20:

A n o ta c ije

845

Osnovna sin tak sa........................846
Detinisanje anotacije......................... 846 M etaano tacije....................................848 P is a n je p r o c e s o r a a n o t a c ij a . . . .848 Elementi anotacija............................. 849 Ogra n ičenj a pod razu meva n ih v re d n o s ti............................................ 850 Generisanje spoljnih d ato te k a ........ 850 Anotacije ne podržavaju nasleđivanje........................................ 854 Realizacija procesora......................... 854

19: N a b ro ja n i tip o v i

805

O snovne mogućnosti nabrojanih tip o v a........................805 Uvoz slalićnih članovii u nabrojani tip............................ . H06 Dodavanje metoda nabrojanom t i p u ........................807 Kedolinisanie t'iuini mcloda.......... S0S Nabrojani tipovi u naredbam a sv v itch ............................................809

apt za obradu an o tacija............. 857 Upotreba obrasca Visitor sa alatkom a p t.............................. 861 Jedinično testiranje pom oću a n o ta c ija .......................................864 Testiranje generičkih tipova alatkom @Unit............................873 ,,Svite“ nisu potrebne................... 874 Realizaciia interfejsa (®Unit...........875 Uklanjanje koda za testiranje.........881 Sažetak........................................... 883

xii

Misliti na Javi

2 1 : P a ra le ln o iz v rš a v a n je

885

Svi aspekti paralelnog izvršavanja.....................................886
Brže iz v ršav a n je .....................................886 Poboljšan d izajn k o d a ......................... 889 O s n o v e v iš e n itn o g p r o g r a m i r a n j a ........................................ 8 9 0 Definisanje z a d a ta k a ............................890 Klasa T h r e a d ......................................... 891 U p o treb a izvršilaca (interfejsa E x e c u to r)............................893 D obijanje p o v ra tn ih v redn osti o d z a d a ta k a ............................................896 S p a v a n je ...................................................897 P r i o r i t e t ...................................................899 P rep u šta n je .............................................. 901 Servisne n i t i ............................................901 V arijante p ro g ra m ira n ja .....................906 T erm inologija..........................................911 Kako se p rid ru žiti postojećoj n i t i . . . 912 Korisničko o k ruženje koje brzo re a g u je ............................................913 G ru p e n iti................................................ 914 H vatanje iz u z e ta k a .............................. 915

Uzajam na b lo k a d a ......................978 Nove kom ponente biblioteke . .983
C o u n tD ovvnL atch - brava sa o d b ro ja v a n je m ................................ 983 C y c lic B a rrie r..........................................986 D e Ia y Q u e u e ............................................ 988 P rio rity B lo c k in g Q u e u e ..................... 991 K ontroler staklenika napravljen po m o ču S c h e d u le d E x e c u to ra ......... 994 S e m a f o r ................................................... 997 E x c h a n g e r............................................ 1001

S i m u l a c i j a ..........................................1003 Sim ulacija šalterskog službenika . . 1003 Sim ulacija r e s to r a n a ......................... 1008 R aspodela p o s la .................................. 1013 O p t i m iz a c ij a p e r f o r m a n s i . . . .1 0 1 8
Poređenje tehnologija u zajam no isključivih brava ( m u t e x a ) .............. 1018 K ontejneri bez z a k lju č a v a n ja ......... 1027 O p tim ističk o z a k lju č a v a n je ............1034 R ea d W rite L o c k .................................. 1036

A k tiv n i o b j e k t i ............................... 1039 S a ž e t a k ................................................. 1042 L iteratura za dalje usavršavanje . . . 1044

Deljenje r e s u r s a .......................... 918
N epravilno p ristu p a n je resursim a . . 918 R azrešavanje takm ičenja za deljene re s u rse ...................................921 A tom ske operacije i tre n u tn a v id ljiv o st...................................................926 A tom ske k l a s e ....................................... 932 K ritični o d e ljc i....................................... 933 S inhronizacija s d ru g im o b je k tim a ................................................ 939 Lokalno skladište n i t i ......................... 940 G a š e n j e z a d a t a k a ............................... 9 4 2 U krasna b a šta ......................................... 942 G ašenje blo kiran ih z ad a ta k a ..............945 Prekidanje izv rsav anja......................... 946 Provera postoji li p r e k id .....................954 M e đ u s o b n a s a ra d n ja z a d a t a k a ...................................................... 9 5 6 w ait() i n o tity A lI() ..............................957 n o tify () u o d n o su na n o tify A ll(). . . 962 Proizvođači i p o tr o š a č i....................... 965 Proizvodači, p otrošači i redovi za č e k a n je ................................................ 971 Cevi za ulazno/izlazne operacije izm edu z a d a ta k a .................................. 976

22: Grafička korisnička okruženja

1045

A pleti........................................... 1047 Osnove Svvinga..........................1047
Alatka za p rik aziv an je....................... 1050

Pravljenje d ugm eta................... 1051 I Ivatanje d o g a d a ja ................... 1052 Višeredna polja za te k s t...........1054 Raspoređivanje elem enata. . . .1056
1056 1057 1058 1058 A p solutno p o z ic io n ira n je ................ 1059 R asporedivać B o x I,a y o u t................ 1059 Koji je p ristu p najbolji?..................... 1059
R asporedivać R asporedivać R asporedivać R asporedivać B o r d e r L a y o u t......... F lo w L a y o u t.............. G r id L a y o u t.............. G ridB agL avout . . . .

Model događaja grafičke biblioteke Svving.........1059
T ipovi dogadaja i p rije m n ik a ......... 1060 Praćenje vi.še d o g a d a ja ..................... 1066

Primeri Svving kom ponenata. . 1068
D u g m a d ................................................ IO (->9 Ik o n ic e ................................................... 1071

Sadržaj

x iii

P riru čn i s a v e ti..................................... 1073 Jed n o redn a polja za t e k s t ................ 1073 Ivice..........................................................1075 Mali program za u redivanje te k sta . . 1076 Polja za p o tv rd u ...................................1077 R a d io -d u g m a d ..................................... 1078 K om hinovane liste (pad aju će liste)..................................... 1080 G rafičke liste..........................................1081 O k n o s je z ič c im a ................................ 1083 O k v iri za p o r u k e ................................ 1083 M e n iji...................................! ................1085 Iskačući m e n iji..................................... 1091 C r t a n j e ...................................................1092 O kviri za d i j a l o g .................................1095 D ijalozi za rad s d a to te k am a ............1099 H T M I. u k o m p o n en tam a biblioteke Svving...................................1101 Klizači i linije n a p re d o v a n ja ............1102 B iranje izgleda i p o n a ša n ja .............. 1103 Stabla, tabele i đ ip b o a r d ...................1105 J N L P i J a v a W e b S t a r t ................. 1105

I z r a d a SVVT a p l i k a c i j a ..................1 1 5 0 Instaliranje S W T - a ............................1150 Z dravo, S W T ....................................... 1150 Izbegavanje re d u n d a n tn o sti............1153 M e n iji..................................................... 1155 O kna s k articam a, d u g m ad i d o g a đ a ji..............................................1156 G ra fik a ...................................................1160 Paralelno izvršavanje u SW T-u . . . 1162 Poredenje SW T-a i Svvinga.............. 1164 S a ž e t a k ...................................................... 1 1 6 4 R e s u rs i.................................................. 1165

A: Dodaci

1166

Paralelno izvršavanje i Svving. .1110
D u g o trajn i z a d a c i .............................. 1111 V izuelno višenitno p ro g ram iranje ..1 1 1 8

Vizuelno program iranje i zrna J a v e ................................. 1120
Šta je z rn o ? ............................................ 1121 Ispitivanje zrna klasom I n t r o s p e c t o r ....................... 1123 N apred n ije z r n o ...................................1128 Z rna J.ne i s in h ro n iz a c ija ................ 1131 Pakovanje z r n a ..................................... 1135 Složenija podrška za z r n a ................ 1137 V'iše o z r n im a ....................................... 1137 A l t e r n a t i v e z a S v v in g .................... P r a v l j e n j e F la s h VVeb k l i j e n a t a p o n i o ć u F l e x a .................................. 1138 Z dravo, h lc x ..........................................1139 Prevodenje M X M l.-a......................... 1 140 M XM L i A c tio n S c rip t....................... 1141 K ontejneri i k o n tro le ......................... 1141 Hfekti i s tilo v i....................................... I 143 l )o g a d a ji..................................... : . . . . 1 144 Povezivanje ,s lav o m ............................I 144 M odeli podataka i povezivanje p o d a ta k a .................................................1147 Izgradnja i p rim e n a ............................1 148 1 13 7

Dodaci koji se mogu preuzeti sa Interneta................. 1166 Misliti na jeziku C: osnova za J a v u .......................... 1166 Seminar Thinking in Java . . . . 1166 CD sa sem inarom H ands-O n Java.......................... 1167 Seminar Thinking in O bjects.. 1167 Thinking in Enterprise fav a .. .1167 T hinking in Patterns (vvith Java)...................................1168 Seminar Thinking in P atte rn s.. 1168 Konsultacije i revizije dizajn a.. 1169

B: Resursi

1170

S oftver......................................... 1170 Programi za uređivanje teksta i alatke za pravljenje aplikacija.....................................1170 K n jig e ......................................... 1171 Analiza i projektovanje................ 1171 Jezik Python............................... 1173 Spisak rnojih knjiga.......... ......... 1174

Spisak termina korišćenih u knjizi Indeks

1175 1177

Predgovor
Na počctku satn prišao Javi kao „jošjednom programskom jeziku“ , što ona umnogome ijeste.
A
li, k a k o je v r e m e o d m i c a l o

I St

o

s a m

je v i Se p r o u č a v a o

,p

o

C

e o s a m

d a

u v i đ a m

d a

je osnovna nam ena Jave drugačija od nam ene svih drugih jezika koje sam sretao. Program iranje je snalaženje u složenosti: složenost problem a koji želite da rešite dodaje se na složenost računara na kome se problem rešava. Zbog ove složenosti većina naših programskih projekata propadne.- Pa ipak, za gotovo nijedan program ski jezik za koji znam nije odlučeno da bi njegov glavni cilj trebalo da bude savladavanje složenosti razvoja i ođržavanja program a.1Naravno, mnoge odluke pri stvaranju program skih jezika donete su sa složenošću na umu, ali u nekom trenutku uvek bi se našle neke druge stvari za koje se smatralo da su neophodne u mešavini. Te druge stvari neizbežno prouzrokuju da program er koji koristi dati jezik na kraju udari glavom o zid. Na primer, C ++ je m orao da bude kom patibilan sa starijim jezikom C (da bi se omogućio lak prelazak C program erim a), a pri tom i efikasan. I jedno i drugo su veoma korisni ciljevi i um nogom e zaslužni za uspeh jezika C++, ali takođe unose dodatnu složenost zbog koje neki projekti ne bivaju završeni (naravno, možete kriviti program ere i upravu, ali, ako jezik može da pom ogne tako što će otkrivati vaše greške, zašto to ne bi i radio). Evo još jednog prim era. Visual Basic (VB) je bio vezan za BASIC, koji baš nije bio proširiv jezik, tako da su sva proširenja nagom ilana u VB-u proizvela zaista zastrašujuću sintaksu koja se veoma teško održava. Perl je vertikalno kom patibilan sa Avvkom, Sedom, Grepom i drugim Unixovim alatima koje je trebalo da zameni, a posledica je bila da je često optuživan kako proizvodi ,,kod sam o za pisanje" (tj. posle nekoliko meseci ne možete ga više čitati). S druge strane, pri stvaranju jezika kao što su C++, VB, Perl i Smalltalk, deo napora je usmeren na rešavanje problem a složenosti, pa oni veoma uspešno izlaze na kraj sa određenom vrstom problema. Dok sam ućio Javu, čini mi se da je na m ene najviše uticalo to što je Sun m eđu svojim ciljevima pri projektovanju imao i princip smanjenja složenosti zaprograrnera. Kao da su rekli: „Važno nam je da ubrzam o i pojednostavim o pravljenje robusnog koda“. U ranim danim a, ovaj princip je rezultovao kodom koji se nije brzo izvršavao (iako se to s vremenom popravilo), ali je zaista zadivljujuće skratio vreme potrebno za pisanje program a - za izradu program a na lavi potrebno je upola m anje vrem ena nego za pravijenje odgovarajućeg C ++ programa. Ovaj rezultat sam po sebi može da uštedi m nogo vrem ena i novca, ali lava se tu ne zaustavlja. O na nastavlja da pakuje sve važne i složene zadatke, kao što su višenitni rad i mrežno program iranje, u svojstva jezika ili bibliotcke koji pojednostavljuju te zadatke. Najzad, latila se nekih zaista veoma složenih problem a kakvi su meduplattonnsko programiranje, dinamička prom ena koda, čak i pitanja zaštite —od kojih se svaki na vašoj lestviei složenosti može svrstati od „prepreka'1do „potpuno nemoguće". Stoga, uprkos problem ima s perform ansam a koje smo susreli, Java silno obećava: može od nas da napravi znatno produktivnije programere.

Misiim da je programski jc/ik l ’vthon najbliži t o m cilju. I’ oglodajte ivw w .P yth o n .o rg

2

Misliti na Javi

Java na sve načine povećava opseg komunikacije tneđu Ijudima: stvaranjem program a, tim skim radom na stvaranju program a, izgradnjom korisničkog okruženja kao veze izm eđu program a i l<orisnika, izvršavanjem program a na različitim tipovim a računara i lakšim pisanjem program a kojima se pristupa preko Interneta. Mislim da ogrom na količina inform acija koje putuju Internetom nije najvažniji pokazatelj značaja kom unikacione revolucije; prava revolucija je u tom e što ćemo moći m nogo lakše da razgovaramo - pojedinačno, u grupam a, i sa celom planetom . Priča se da bi naredna revolucija iznedrila svojevrstan globalni um proizašao iz iskustva više ljudi i njihove m edusobne povezanosti. Java može ali i ne m ora, biti alat koji će podstaći tu revoluciju - i zbog same takve m ogućnosti, osećam kako je značajno da i drugi nauče ovaj jezik.

Java SE5 i SE6
Ovo izdanje knjige m nogo duguje poboljšanjim a Jave koja je Sun prvo nazvao JDK 1.5, a kasnije to izmenio u JDK5 ili J2SE5, te najzad ispustio zastarelo „2“ i proglasio verziju Java SE5. D obar deo izm ena u jeziku Java SE5 trebalo je da poboljšaju iskustvo program era. Kao što ćete videti, projektanti Jave nisu u tom e potpuno uspeli, ali su, uopšte uzev, napravili veliki korak u pravom smeru. Jedan od važnih ciljeva ovog izdanja bio je potpuno obuhvatanje poboljšanja Jave SE5/6 - da se ona objašnjavaju i upotrebljavaju u celoj knjizi. To znači da je ovo izdanje, donekle hrabro, „samo za Javu SE5/6“ i da se d obar deo koda u knjizi neće prevesti pom oću ranijih verzija Jave; ukoliko pokušate, sistem će se pobuniti i zaustaviti. Mislim ipak da su prednosti ovog pristupa vredne tog rizika. Ako ste prim orani da se služite ranijim verzijama Jave, na www.MindView.net možete besplatno preuzeti prethodna izdanja ove knjige. Zbog mnogih razloga, odlučio sam da u besplatnom elektronskom obliku ne ponudim tekuće izdanje knjige, nego samo prethodna.

Java SE6
Ova knjiga je bila ogrom an projekat koji je zahtevao mnogo vremena, i pre nego što je izašla, pojavila se beta verzija Jave SE6 (pod radnim im enom mustartg). lako je lava SF.6 donela nekoiiko manjih izmena koje su poboljšale neke prim ere u knjizi, uglavnom nije uticala na sadržaj ove kniige; glavna obeležja Jave SE6 su povećanje brzine izvršavanja i novi elementi biblioteka, koja nisu tem a ove knjige. Program i navedeni u knjiz.i uspešno su testirani na kandiđatskoj verziji Jave SF.6, pa ne oćekujem da će ona doneti izmene koje bi uticale na sadržaj ove knjige. Ukoliko u vreme objavljivanja zvanične verzije Jave SE6 bude važnih iz.mena, njih ćemo uvažiti u izvornom kodu knjige koji se može preuzeti na adresi www.MiiidVicw.nct. Na koricama knjige piše da je ona ,,za Javu SE5/6", što znači „napisana za |avu SF.5 i veoma važne iz.mene koje je ta verzija unela u jezik, ali jednako primenljiva i na Javu SE6“.

Predgovor

3

Četvrto izdanje
Zadovoljstvo pisanja novog izdanja knjige donosi činjenica se stvari m ogu „uraditi kako treba“, u skladu sa onim što sam saznao od izlaska poslednjeg izdanja. Ćesto su ti uvidi tipa „Kada ne dobiješ ono što si hteo, dobiješ pouku" a za m ene je to prilika da popravim ono što je pogrešno ili prosto zamorno. fednako tako, pisanje novog izdanja dovodi do fascinantnih novih zamisli, a stid zbog pogrešaka m nogo je manji od uživanja u otkriču i m ogućnosti da se zamisli izraze bolje nego pre. Tu je i izazov da knjigu napišem tako da i vlasnici prethodnih izdanja požele da je kupe. To me tera da poboijšavam ,prerađujem i premeštam sve što mogu da bi knjiga postala novo i vredno iskustvo za posvećene čitaoce.

Izmene
U ovom izdanju nem a CD-a. Osnovni deo tog CD-a, m ultim edijski sem inar Thinking in C (koji je za MindVievv napravio Chuck Allison), sada se može preuzeti u obliku Flash prezentacije. Polaznici tog seminara koji nedovoljno poznaju sintaksu C-a obučavaju se da ovladaju m aterijalom iz ove knjige. Iako dva poglavlja ove knjige daju pristojan uvod u sintaksu, ona m ožda neće biti dovoljna osobam a bez adekvatnog predznanja, a prezentacija Thinking in C upravo njima pomaže da dostignu potreban nivo. Poglavlje Paralelno izvršavanje( ranije„Višenitno izvršavanje1 1 ) potpuno je prerađeno da bi odraziio velike izmene u odgovarajućim bibliotekama Jave SE5, ali još uvek pruža temelj za osnovne koncepte paralelnog izvršavanja. Bez tog jezgra, teško ćete razumeti sioženije oblasti paralelnog izvršavanja. Mnogo sam meseci radio na tome, uronjen u taj drugi „paralelan“ svet, i na kraju je ispalo da to poglavlje daje ne samo osnovu, nego i naprednije uvide. Znaćajnim novim m ogućnostim a Jave SE5 posvećena su nova poglavlja, a ostale su utkane u izmene postojećeg materijala. Pošto ja neprestano proučavam projektne obrasce, povećan je i njihov broj u knjizi. U knjizi je biio m nogo premeštanja, u dobroj meri nadahnutih predavačkom praksom i sa/.nanjem da bi se moje poimanje onoga što treba da stane u je d n o poglavlje moglo razborito kritikovati. I5io sam sklon nepromišljenom verovanju da tema m ora biti „dovoljno velika" kako bi zaslužila sopstveno poglavlje. Ali, naročito tokom predavanja projektnih obrazaca, uvideo sam da polaznici seminara najbolje shvataju kada uvodim jedan po jedan obrazac i odm ah uradim odgovarajuću vežbu, čak i ako zbog toga tek nakratko govorim . (Otkrio sam da je taj tempo prijatniji i za m ene kao predavača.) Zato sam u ovoj verziji knjige pokušao da pođelim poglavlja na teme i da ne brinem koliko su duga. Čini m i se da je tako bolje. Uvideo sani i kolika je važnost testiranja programa. Ukoliko nem ate ugrađen sistem za testiranje, u kojem se testiranjeobavlja svaki put kada generišete program, ne možete znati koliko je vaš program pouzdan. Da bih izbegao tu nesigurnost, napravio sam sistem za testiranje koji prikazuje i vrednuje rezultate svakog programa. (Sistem je napisan na Pvthonu; naći ćete ga u kodu ove knjige koji se može preuzeti na lokaciji www.MindView.net.) Testiranje uopšte razm otreno je u dodatku objavljenom na adresi http://M indView.net/ Books/Bctterjavn; tu su objašnjene osnovne veštine kojima bi, po m om mišljenju, svi program eri trebalo da vladaju.

4

Misliti na Javi

Pored toga, pročešljao sam sve prim ere u knjizi i zapitao se: „Zašto sam to uradio baš ovako?" U većini slučajeva nešto sam izm enio i poboljšao, da bi prim eri bili dosledniji i da bih pokazao ono što sm atram najboljom praksom u pisanju Java koda (koliko se to može u tekstu uvodnog nivoa). Dizajn i realizacija m nogih postojećih prim era, značajno su izmenjeni. Uklonjeni su prim eri koji su izgubili smisao i dodati novi.’ Čitaoci su imali zaista divne kom entare na prva tri izdanja ove knjige što mi je bilo veoma drago. Tu i tamo, poneko bi im ao i prim edbu i iz nekog razloga, periodično se javljala ista prim edba „knjiga je preobimna". Po m eni, ako čitaocu smeta samo obim dela, to i nije tako strašno (prisetim o se prim edbe austrijskog cara o M ocartovom delu: „Previše nota!“, iako se ja ni na koji način ne poredim s M ocartom ). M ogu sam o da pretpostavim kako takvu prim edbu upućuje onaj ko će se tek upoznati sa širinom Jave i ko nije video ostale knjige o ovom jeziku. Ipak, pokušao sam da u ovom izdanju skratim delove koji su postali nepotrebni ili barem ne previše značajni. Po praviiu, pokušao sam da uklonim sve što više nije potrebno, ubacim izmene i poboljšam sve što sam mogao. Mislim da sam to mogao slobodno da uradim , jer je originalni m aterijal i dalje na Internetu (na adresi www.MindView.net), u obliku prva tri izdanja koje se m ogu besplatno preuzeti, i dodataka za ovu knjigu. Iskreno se izvinjavam svima koji još uvek ne mogu da podnesu veličinu ove knjige. Verovali ili ne, naporno sam radio da bih je smanjio.

Napomena o dizajnu korica
Korice knjige Misliti na Javi inspirisala je am erička varijanta pokreta um etnost i zanatstvo (American Art & Crafts Movement) koji se javio poćetkom 20. veka i dostigao zenit između 1900. i 1920. Nastao je u Engleskoj kao reakcija na mašinsku proizvodnju, industrijsku revoluđiu i veoma izražen dekorativni stil viktorijanskog doba. Pokret se zalagao za um eren dizajn i prirodne form e koie je prom ovisao um etnićki pravac art nuvo (fr. l'art nouveau). Isticana je važnost um etnika kao pojedinca, a nije odbacivano korišćenje modernih alata. Postoje velike slićnosti s današnjom situacijom: prelazak u novi vek, napredak od korena računarske revolucije do nečega plemenitijeg i značajnijeg za pojedinca, isticanje veštine pisanja soltvera um esto ćiste proizvodnje koda. Javu vidim kao pokušaj uzdizanja program era iznad nivoa tehničara operativnog sistema, u pravcu „softverskog majstora". I autor i dizajner korica (koji su prijatelji od detinjstva) nalaze inspiraciju u ovom pokretu i obojica su okruženi nam eštajem, lam pam a i drugim predm etim a koji ili potiću iz tog perioda, ili su njime inspirisani. T3rugi detalj na ovim koricam a je kutija za prikupljanje prirodnjaćkih eksponata - u ovom slučaju insekata. Ti insekti su objekti stavljeni u kutije kao objekte. Same kutije su stavljene u objekat ,,korica“, što ilustruje osnovni koncept kom binovanja u objektno orijentisanom program iranju. Program eru se lako nameće asocijacija na ,,bubice“; bubice su
Vecina p rim e ra je p re v e d e n a , pa je in o g u c e d a su se p u tk ra le i greške. U k o lik o u o c ite g re šk u , m o lim o vas d a p o šaljete p o ru k u n a rctlakcijci@ tnikrokiijiga.co.yit. O rig in a ln e verzije svih p rim e r a naci cete na w w w .in iiic iv icw in c .c o m /ril4 /C o c icln stritc tio iis.litiiil.

Predgovor

5

ovde uhvaćene i, po svoj prilici, ubijene u tegli za uzorke i smeštene u male izložbene kutije: sve ovo nagoveštava Javinu sposobnost da pronalazi, prikazuje i obuzdava bubice (što je zbilja jedan od njenih najjačih aduta). Za ovo izdanje naslikao sam akvarel prikazan na koricama, ispod stilizovane kutije.

Zahvalnice
Prvo, hvala saradnicim a koji su radili sa m nom na sem inaru, u konsultacijam a i pri ostvarivanju nastavnih projekata. To su: Dave Bartlett, Bill Venners, Chuck Allison, Jeremy Meyer i Jamie King. Cenim vaše strpljenje, dok i dalje pokušavam da napravim najbolji model za m eđusobnu saradnju nezavisnih ljudi kao što smo mi. O dnedavno, bez sum nje zaslugom interneta, povezao sam se sa iznenadujuće velikim brojem ljudi koji m i pom ažu u poslu, uglavnom radeći u svojim kućnim kancelarijama. U prošlo vreme, m orao bih da iznajmim prilično veliki kancelarijski prostor gde bih smestio sve te ljude, ali zahvaljujući Mreži, ekspres pošti i telefonu, koristim njihovu pomoć bez tih dodatnih troškova. Tokom m ojih pokušaja da naučim da se „lepo igram sa ostalima“ svi vi ste bili veom a susretljivi, i nadam se da ću i dalje bolje raditi svoj posao uz tuđu pomoć. Paula Steuer je neprocenjiva zato što je preuzela m oju ofrlje poslovnu praksu i postavila je na zdrave temelje (hvala Paula, što mi ne daš mira kada me mrzi da nešto uradim ). Jonathan Wilcox, Esq. pročešljao je struk turu mog preduzeća, prevrnuo svaki kamen ispod kojeg se m ožda kriju škorpioni i naterao nas da prođem o kroz postupak pravno valjanogorganizovanja. Hvala ti na staranju i upornosti. Sharlynn Cobaugh je napravila od sebe stručnjaka za obradu zvuka i postala je bitan deo tim a za pravljenje multimedijskih kurseva, kao i za rešavanje drugih problema. Hvala na upornosti koju pokazuješ suočena s nepredvidivim računarskim problem im a. Ljudi iz praške firme Amaio izvukli su m e iz neprilika u nekoliko projekata. Daniel W ill-Harris me je prvi upoznao s radom preko Interneta, a i glavni je dizajner svih grafićkih rešenja. Tokom mnogih godina, Gerald VVeinberg je putem svojih konferencija i radioriica postao moj nezvanični trener i m entor, na čemu mu zahvaljujem. Ervin Varga mi je izuzetno m nogo pom ogao svojim tehničkim ispravkama 4. izdanja - iako su drugi pomagali u pojedinim poglavljima i prim erim a, Ervin je bio osnovni tehnički recenzent cele knjige, a preradio je i vodič s rešenjima za 4. izdanje. Ervin je pronašao greške i uneo poboljšanja u knjigu koja su nemerljiv doprinos ovom tekstu. Njegova temeljnost i pažnja koju obraća na pojedinosti začuđujuće su, i on je najbolji recenzent kog sam imao. Hvala ti, Ervine. Moj blog na lokaciji www.Artiiiia.coin Bila Vennersa bio je izvor pom oći kada sam tražio tuđa mišljenja. Hvala ćitaocima koji su mi slali kom entare na osnovu kojili sam razjasnio pojmove - to su James VVatson, Hovvarđ Lovatt, Michael Barker i drugi, posebno oni koji su pomogli s generićkim tipovima. Hvala Marku VVelshu na njegovoj stalnoj pomoći. Evan Cofskv mi stalno pruža veliku podršku svojim poznavanjem (napamet!) svih zam ršenih pojedinosti o podešavanju i održavanju Web servera na Linuxu. On se stara da MindVievvov server bude podešen i bezbedan.

6

Misliti na Javi

Posebno hvala m om novom prijatelju, kafi, koja mi je ulila gotovo neogranićen entuzijazam za ovaj projekat. Kafić Camp4 u gradu Crested Butte u Koloradu bio je stalno sastajalište ljudi koji su dolazili na MindVievvove seminare, a tokom sem inarskih odm ora pružao nam je najbolju opskrbu hranom i pićem koju sam ikada dobio. Hvala mom drugaru Alu Smithu što ga je stvorio i od njega napravio tako zanimljivo i zabavno mesto. I svim barm enim a kafića koji tako veselo toče piće. Hvala ljudima u Prentice Hallu na tolerantnosti i ogrom nom strpljenju kojim mi obezbeđuju sve što tražim. Određene alatke su se pokazale nezamenljivim tokom procesa razvoja program a i ja osetim veliku zahvalnost prema njihovim stvaraocima svaki put kada ih upotrebim . Cygwin ( www.cygwin.com) rešio mi je bezbroj problem a koje W indows neće/ne može, svakog dana sam m u sve više privržen (da sam ga sam o imao pre 15 godina kada je moj mozak još bio ,,zalemljen“ za GNU Emacse). IBM-ov Eclipse ( www.eclipse.org) zaista je divan doprinos zajedniđ projektanata softvera, pa očekujem da će i ubuduće davati velike rezultate, pošto se i dalje razvija. (Od kad je to IBM postao kul? M ora da mi je nešto promaklo.) JetBrains IntelliJ Idea nastavlja da krči nove kreativne puteve m eđu razvojnim alatkama. Na ovoj knjizi počeo sam da koristim Sparxsystemsov Enterprise Architect i on je brzo postao m oja omiljena UML alatka. U raznim prilikam a dobro je poslužio form ater koda Jalopy Marca Hunsickera ( www.triemax.com ), a Marco je bio veoma susretljiv i konfigurisao ga prem a mojim specifičnim potrebam a. Katkada je bio koristan i JEdit Slava Pestova ( www.jedit.org ) sa svojim softverskim dodacim a, i to je sasvim dobar editor za početnike na seminarima. 1 naravno, ako to nisam već dovoljno puta rekao na svim mogućim mestim a, za rešavanje problem astalnokoristim Pvthon ( www.Pytlion.org). On je delo m o g drugara Guida Van Rossuma i grupe uvrnutih genija s kojima sam trćao nekoliko divnih dana (Tim e Petersu, uram io sam miša kojeg si pozajmio i zvanićno ga nazvao „TimBotM iš"). Vi, m om ci, treba da nadete neko zdravije mesto za ručak. (Takođe, hvala celoj Pvthon zajednici, oni su fenom enalna gomila ljudi.) Mnogi su mi slali ispravke i svima sam dužnik, ali posebnu zahvalnost zaslužuju (za prvo izdanje): Kevin Raulerson (koji je pronašao obilje sjajnih bubica), Bob Resendes (zaista neverovatan), (ohn Pinto, Joe Dante, Joe Sharp (sva trojica su bili ćudesni), David Combs (tnnoge gramatičke ispravke i razjašnjenja), dr Robert Stephenson, John Cook, Franklin Chen, Zev Griner, David Karr, Leander A. Stroschein, Steve Clark, Charles A. Lee, Austin Maher, Dennis P. Roth, Roque Oliveira, Douglas Dunn, Dejan Ristić, Neil Galarneau, David B. Malkovsky, Steve VVilkinson i mnogi drugi. Prot. dr Marc Meurrens uložio je veliki n ap o rd a u Evropi objavi i učitii dostupnom elektronsku verziju prvog izdanja knjige. Hvala svitna koji su mi pomogli da ponovo napišem prim ere uz korišćenje biblioteke Swing (za 2. izđanje) i za svu drugu pomoć. To su Jon Shvarts, Thom as Kirsch, Rahim Adatia, Rajesh Jain, Ravi M anthena, Banu Rajamani, Jens Brandt, Nitin Shivaram, Malcolm Davis i svi koji su tni daii podršku. U 4. izdanju, Chris G rinđstaff je m nogo pom ogao tokom razvoja odeljka o SVVT-u, a Sean Neville je za mene napisao prvu verziju odeljka o Flexu.

Predgovor

7

Kad god pomislim da sam najzad sve naučio o program iranju za paraleleno izvršavanje, otvore se neka nova vrata i pokaže se da im a još planina koje m oram preći. Hvala Brianu Goetzu što mi je pom ogao da savladam sve prepreke u novoj verziji poglavlja Paralelno izvršavanje i što je otkrio (nadam se!) sve greške. Nije iznenađenje što mi je poznavanje Delphija pom oglo da razum em Javu, budući da ta dva jezika imaju puno zajedničkih koncepata i dizajnerskih rešenja. Moji prijatelji koji se bave Delphijem pom ogli su mi da proniknem u unutrašnjost tog sjajnog programskog okruženja. To su Marco Cantu (još jedan Italijan: da li dobro poznavanje latinskog doprinosi sklonosti ka program skim jezicima?), Neil Rubenking (koji se bavio jogom, vegetarijanstvom i zenom dok nije-otkrio računare) i, naravno, Zack Urlocker (prvi direktor projekta Delphi), stari prijatelj s kojim sam proputovao svet. Svi mi sm o dužnici briljantnom A ndersu Hejlsbergu, koji se i dalje muči sa C#-om (a taj jezik je bio glavni uzor za Javu SE5, u šta ćete se uveriti u knjizi). Moj pronicljivi prijateij Richard Hale Shaw pružio mi je vrlo korisnu podršku (i Kim takođe). Richard i ja smo proveli više meseci zajedno, držeći seminare, pokušavajući da osm islim o savršen m etod učenja za polaznike. Dizajn knjige, dizajn korica i sliku na koricam a uradio je moj priiatelj Daniel WillHarris, priznati autor i dizajner ( www.Will-Harris.com ), koji se igrao sa samolepljivim slovima u osnovnoj školi dok je čekao da računari i stono izđavaštvo budu otkriveni, i koji se žalio na moje gunđanje zbog algebarskih problem a. Ipak, knjigu sam složio sam tako da sve greške u slaganju idu na moj račun. Pisao sam u M icrosoftovom W ordu XP, a fotoslog je priprem ljen u Adobeovom Acrobatu. Desilo se da sam bio u inostranstvu oba puta kada sam pravio finalnu verziju knjige - prvo izdanje sam slao iz Kejptauna u Južnoj Africi, a drugo iz Praga (što je moj doprinos eri elektronike). Treće i četvrto sam poslao iz Cresteđ Butta u Koloradu. Font korišćen na koricam a je ITC Rennie Mackintosh. Posebno zahvaljujem svojim učiteljima i svim svojim studentim a (koji su istovremeno i moji učitelji). Dok sam radio na ovom izdanju, u krilu mi je često ležala mačka Mollv i tako davala svoju toplu, krznenu podršku. Listu prijatelja koji su me podržavali ćine izmedu ostalih i: Patty Gast (izvanredna maserka), Andrew Birnstock, Steve Sinofskv, (D Flildebrandt, Tom Keffer, Brian McElhinney, Brinklev Barr, Liill Gates iz časopisa M idnight Engineering, Larry C onstantine i Lucv Lockvvood, Gene Wang, Dave Mayer, David Intersim one, Chris i Laura Strand, porodica AImquist, Brad Jerbic, Marilvn Cvitanic, M ark Mabry, porodice Robbins, porodice Moelter (i McMillan), Michael Wilk, Dave Stoner, porodica Cranston, Larry Fogg, Mike Sequeira, Cary Entsminger, Kevin i Sonda D onovan, Joe Lordi, Dave i Brenda Bartlett, Patti Gast, Blake, Annette i Jade, porodica Rentschler, porodica Sudek, Dick, Patty i Lee Eckel, Lvnn i Todd i njihove porodice. I, naravno, moji m ania i tata.

Uvod
„Čoveku je dao jezik, a jezik je stvorio misao, koja jc mera Univerzuma “ —Oslobođeni Prometej, Šeli Ljudska bića... sasvim su pod vlašću određenog jezika koji je postao sredstvo izražavanja u njihovotn društvu. U zabludi je ko misli da u prilagodavanju pojedinca stvarnosti jezik ne igra znaćajnu ulogu i da je jezik samo slućajno sredstvo rešavanja specifićnih problema opštenja i mišljenja. Činjenica je da je „stvarni svet“ u velikoj meri nesvesno izgraden na osnovu jezičkih navika grupe. Status lingvistike kao nauke, Edvard Sapir 1929.
K A O I BILO KOJI LJU D SK IJEZIK , JAVA O M O G U Ć U JE ISKAZIVANJE PO JM O V A . S NARASTANJEM I

usložnjavanjem problem a, ovaj način izražavanja biće vam znatno lakši i fleksibilniji od bilo kojeg drugog, ukoliko bude uspešan. Ne m ožete gledati na Javu samo kao na gom ilu mogućnosti, jer neke m ogućnosti nemaju smisla same za sebe. Celinu svih delova možete da 'koristite sam o ako razmišijate o projektovanju, a ne o pisanju koda. Da biste razumeli Javu na ovaj način, m orate razumeti i problem e koji se pri tom e javljaju, kao i pri program iranju uopšte. Ova knjiga razm atra problem e pri program iranju, objašnjava zbogčega oni predstavljaju problem e i pokazuje postupke kojima ih Java rešava. Zato se skup m ogućnosti koje objaŠnjavam u svakom poglavlju zasniva na načinu rešavanja pojedine vrste problem a pom oću Jave. Na taj način, trudim se da vas dovedem, korak po korak, do tačke kada Java postaje vaš m aternji jezik. Od početka do kraja, moj stav počiva na tom e da vi želite sebi da predoćite model koji će vas dovesti do dubokog razumevanja jezika; ako naiđete na zagonetku, moći ćete da je ubacite u svoj model i pronađete odgovor.

Preduslovi
U ovoj knjizi podrazumeva se da koliko-toliko poznajete programiranje: shvatate da je program skup naredaba, poznajete princip potprogram a/tunkcije/m akroa, kontrolnih struktura kao što je ,,if“ konstrukcija za petlje kao što je „vvhile" itd. Sve ovo ste mogli naućiti na raznim mestima, recimo pri program iranju na nekom makro-jeziku ili pri radu sa alatom kao što je Perl. Bez obzira na to koliko ste u dosadašnjem programiranju ovladali osnovnim idejama, moći ćete da radite po ovoj knjizi. Naravno, kniiga će biti lakša C programerima, i još više C ++ program erim a, ali ne otpisujte sebe ako nemate iskustva u ovim jezicima samo budite sprem ni da naporno radite. Takode, uz pomoć multimedijalnog seminara Thinking in Ckoji možete preuzeti s Iokacije mvw.MiudView.net, ovladaćete u potpunosti osnovama potrebnim za ućenje Jave. Kroz knjigu ću postepeno uvoditi koncepte objektno orijentisanog program iranja (OOP) i osnovnih Javinih kontrolnih ntehanizama. Cesta pozivanja na osobine jezika C i C ++ ni.su kom entari poznavaoca, već su pomoć program erim a da uporede Javu s tim jezicima iz kojih je potekla. Trudiću se da ta poređenja budu jednostavna i objasniću svešto mislim da ne zna neko ko ne koristi C/C++.

Uvod

9

Učenje Jave
O tprilike u isto vreme kada se pojavila moja prva knjiga, Using C++ (Osborne/McGravvHill, 1989), počeo sam da predajem taj jezik. Predavanje program skih jezika postala je m oja profesija: gledao sam glave koje klimaju, bele pogleđe i zbunjene izraze u publici širom sveta još od 1987. Kada sam počeo privatno da obučavam m anje grupe Ijudi, tokom vežbi sam otkrio da mnoga pitanja zbunjuju čak i one koji su se smešili i klimali glavom. Više godina predsedavao sam na odseku za C ++ na Konferenciji za razvoj softvera (kasnije i na odseku za Javu), i prim etio sam kako sm o i ja i drugi govornici sldoni da prosečnoj publici serviramo p reV iše informacija za kratko vreme. Zbog različitih nivoa publike i načina na koji sam predstavljao materijal, na kraju bih izgubio deo slušalaca. M ožda previše tražim , ali pošto osećam otpor prem a tradicionalnom načinu predavanja (a verujem da većina slušalaca takav otpor oseća zbog dosade), pokušao sam da učinim da m oja predavanja nikom e ne budu dosadna. Jedno vreme sam pravio dosta raznih prezentacija u relativno kratkom periodu. Tako sam došao u situaciju da učim „m etodom pokušaja i pogrešaka" (što je dobar način i za projektovanje program a). Na kraju sam iskoristio sve što sam naučio kao predavač- i napravio kurs koji bih rado držao duže vreme. Sada ovaj kurs držim na javnim i privatnim sem inarim a o Javi; to je moj glavni uvodni seminar, koji pruža osnovu za naprednije sem inare. O tim sem inarim a možete saznati više na adresi www.MindView.net. (Uvodni sem inar je dostupan i u obliku CD-a Hands on Java. Podaci o njem u su na istoj Web lokaciji.) Povratne informacije koje dobijam na svakom sem inaru pom ažu mi da m enjam i prerađujem materijal sve dok nc zakliučim da je podesan kao sredstvo poučavanja. Ovu knjigu ne čine samo beleške sa seminara: u nju sam pokušao da spakujem što više inform acija i spojio sam ih tako da vas vode od jednog do drugog predmeta. Zamislio sam da ova knjiga služi usam ljenom ćitaocu koji se bori s novim program skim jezikom.

Ciljevi
Kao i moja prethodna knjiga, Misliti na jczikit C++, i ova knjiga je pisana u skladu s naćinom na koji Ijudi uče jezik Java. Poglavlje u knjizi zamišljao sam kao jednu dobru lekciju na sem inaru. Povratne intormacije od slušalaca na sem inarim a pom ogle su mi da otkrijem koji su delovi teži i zahtevaju dodatna objašnjenja. U oblastim a gde sam bio pream biciozan i uvrstio previše novih pojmova odjednom , spoznao sam - kroz proces prikaza materijala - da više novih pojmova zahteva više objašnjavanja, a to lako zbunjuje slušaoca. Cilj svakog poglavlja je da savladate jedan pojam , ili m anje grupe povezanih pojmova, bez obzira na sve ostalo što se tu pominje. Na taj način možete da prihvatite svaki đelić teorije, u zavisnosti od vašeg dotadašnjeg znanja, pre nego što produžite dalje.

10

Misliti na Javi

Ciljevi koje sam hteo da ostvarim u ovoj knjizi jesu: 1. Da predstavim materijal u jednostavnim koracima, tako da lako savladate svaki koncept pre nego što nastavite. Da pažljivo odaberem redosled pojmova koje objašnjavam, tako da ne naiđete na nešto s čim se ranije niste susreli. Naravno, to nije uvek moguće; u takvim situacijama, dat je kratak uvodni opis. 2. Da koristim što jednostavnije i kraće primere. To me ponekad sprečava da se uhvatim u koštac sa ,,stvarnim“ problem im a, ali sam prim etio da su početnici obično srećniji kada mogu da shvate svaki detalj prim era, i nisu im presionirani obim om problem a koji se rešavaju. Takođe postoji ozbiljno ograničenje količine koda koji m ože da se razum e u učionici. O ni kojima se to ne dopada, neka ga prihvate kao pedagoški ispravniji pristup. 3. Da pružim ono što sm atram bitnim za razumevanje jezika, a ne sve što znam. Verujem u hijerarhiju inform acija, kao i da postoje činjenice koje 95% program era nikada neće imati potrebe da zna, a koje samo zbunjuju i povećavaju složenost jezika. Da uzm em prim er iz C-a: ako zapam tite tabelu prioriteta operatora (ja nikada nisam), možete da pišete efikasan, ali nečitljiv kod. Ali ako malo promislite o takvom stilu pisanja, shvatićete da zbunjuje onoga ko čita/održava kod. Stoga zaboravite na prioritete i koristite zagrade svuda gde stvari nisu potpuno jasne. 4. Da svaki odeljak bude đovoljno usredsređen, tako da vreme izlaganja i pauza između iziaganja i vežbe budu kratki. To slušaoca drži budnim i aktivnim tokom seminara, a čitaocu pruža osećanje da brže ovladava materijom . 5. Da vam dam čvrst temelj, kako biste mogli dobro da razum ete teoriju i đa sami nastavite da proučavate Javu.

Poučavanje na osnovu ove knjige
Prvo izdanje ove knjige nastalo je na osnovu jednonedeljnog seminara. Dok je Java bila u povojima, to je bilo dovoljno vremena za savladavanje ovog jezika. Kako je Java rasla i obuhvatala sve više mogućnosti i biblioteka, ja sam tvrdoglavo nastojao da sve to ispređajem za sedmicu dana. U jednom trenutku, neki naručilac je od mene zatražio da predajem „sam o osnove“, i radeći to otkrio sam da je sabijanje svega u jednu sedmicu postalo mućno i za mene i za polaznike. Java više nije bila „jednostavan" jc/.ik koji se može ispredavati za nedelju dana. To iskustvo i spoznaja potakli su me da reorganizujem knjigu, koja je sada napisana tako da može da se ispredaje za dve sedmice na sem inaru ili dva semestra na fakultetu. Uvodni deo se završava s poglavljem Obrada grešakn pomoću izuzetnkn , čenut biste mogli da dodate uvod u JDBC, servlete i serverske Java stranice. To saćinjava osnovni kurs i jezgro CD-a Hands-On Javn. O statak knjige obuhvata kurs srednjeg nivoa i nalazi se na CDu Intermedinte Thinking in Javu. O ba CD-a možete kupiti na w w w .M ind\r icw.nct. Ukoliko vam trebaju informacije o dodatnom materijalu za predavaće, obratite se Prentice-Hallu na lokaciji www.prenludlprojessiouul.coin.

Uvod

11

Dokumentacija na Webu
Jezik Java i njegove biblioteke iz Sun Microsystemsa (besplatno se preuzim aju s Weba) im aju đokum entaciju u elektronskom obliku, kojoj možete pristupati koristeći čitač Weba; gotovo svaka druga nezavisna distribucija Jave ima takav ili sličan sistem dokum entacije. U većini knjiga o Javi kopira se taj sistem. Stoga takvu dokum entaciju ili već imate, ili je m ožete preuzeti s Weba, i ukoliko to zaista nije neophodno, u ovoj knjizi je nećemo ponavljati. O bično m nogo brže možete da nađete opis neke klase pom oću čitača Weba, nego da ga tražite po knjizi (a dokum entacija na Webu je verovatno ažurnija). Jednostavno ću vas uputiti na„dokum entaciju JDK-a“. O vaknjiga će obezbediti dodatne opise klasa samo kada je neophodno dopuniti dokum entaciju da biste shvatili odredeni prim er.

Vežbe
Prim etio sam da jednostavne vežbe pom ažu studentim a da shvate seminarsko gradivo, pa dajem nekoliko vežbi na kraju svakog poglavlja. Veći broj vežbi može relativno lako i u razum nom roku da se uradi u učionici, pod nadzorom instruktora koji proverava da li su svi studenti usvojili izloženu m ateriju. Neke vežbe su malo izazovnije, a li nijedna nije nerešiva. Rešenja izabranih vežbi nalaze se u elektronskom dokum entu pod im enom Thc Thinking iu java Annotatcd Solution Guide, koji se može kupiti na lokaciji www.MindVicw.com.

Javini temelji
Sa ovom knjigom dobijate i besplatan m ultim edijalni sem inar koji možete preuzeti sa w w w .M in dV iew .L O in . To je sem inar T h i n k in g in C, koji vas uvodi u sintaksu, operatore i funkcije jezika C na osnovu kojih je Java napravljena. U prethodnim izdanjima ove knjige na engleskom, to se nalazilo na CD-u Foundations for Java, ali sada se može besplatno preuzeti. Prvobitno sam od Chucka Allisona naručio da napravi Thinking in C k ao nezavisan proi/.vod, aii sam odlućio da ga priložim uz drugo izdanje knjige Thinkingin C++ i drugo i treće izdanje knjige Thinking in Java, pošto su mi na sem inar stalno dolazili Ijudi bez dovoljnog poznavanja osnovne sintakse C-a. Izgleda da takva osoba misli: ,,Ja sam pam etan program er i neću da ućim C, nego C ++ ili Javu, pa ću C preskočiti i odm ah preći na C + + / Javu“. Po dolasku na seminar, ljuđi polako shvataju da sam imao veoma dobar razlog što sam poznavanje C-a proglasio za preduslov za pohađanje. Tehnologije se menjaju, i bilo je bolje preraditi Thinking in C u Flash prezentaciju koja se može preuzeti sa Interneta, nego prilagati ga na CD-u. Pošto je taj seminar na Internetu, svi mogu dobro da se priprem e prc nego što dođu na moj seminar. Sem inar Thinking in C i ovoj knjizi pribavlja veću publiku. Iako njena poglavlja Operalori i Kontrolisanjc izvršavanja obuhvataju osnove Jave koje potiču iz C-a, mrežni seminar postepenije uvodi ćitaoca, a za njega je potrebno još manje program erskog predznanja nego za knjigu.

12

Misliti na Javi

Izvorni kod
Kompletan izvorni kod iz ove knjige dostupan je kao slobodan softver zaštićen autorskim pravom, u jednom paketu, na adresi www.MindView.net. Ovo je zvanična Web lokacija za distribuciju koda i elektronskog izdanja knjige, pa m ožete biti sigurni da ćete tu uvek naći najnoviju verziju. Kod m ožete deliti i koristiti u učionicam a i u druge obrazovne nam ene. Osnovni cilj zadržavanja autorskog prava jeste da se poreklo koda ispravno navede i da se spreči objavljivanje koda u štam panim medijim a bez dozvole. (Ukoliko je poreklo koda ispravno navedeno, prim eri iz knjige m ogu se navoditi u većini medija.) U svakoj datoteci sa izvornim kodom naći ćete sledeću napom enu o autorskim pravima (obično na engleskom):
//:! A u t o r s k a P r a v a . t x t Ovaj Inc. Sva pra v a zadržana. D o z v o l j a v a se b e s p l a t n a u p o t r e b a , ovog r a č u n a r s k o g i z v o r n o g koda p r a v i m a , ovaj kopiranje, kod) prepravljanje i distribuiranje i njegove dokumentacije, u dole poruku o autorskim iz j e d n e raču n a r s k i iz vorni kod z a š t i ć e n j e a u t o r s k i m p r a v i m a (c)2006 MindView,

(Izvorni

n a v e d e n e s v r h e i b ez p i s m e n o g o d o b r e n j a , n j e g o v e kopije. 1. D o z v o l j a v a formatu. 2. Neizmenjen Izvorni se p r e v o d e n j e Izvornog

ukoliko gornju

i s l e d e ć i h pet n u m e r i s a n i h p a s u s a ne u k l o n i t e ni

koda.

Preveden

Izvorni ali

kod s m e t e da samo u izvršnom

uključite u privatne i komercijalne softverske programe,

kod s m e t e da u p o t r e b l j a v a t e za p o t r e b e n a s t a v e u k o l i k o n a v e d e t e da j e p o t e k a o

i u

m a t e r i j a l i m a za p r e z e n t a c i ju, ,,Mi sl i ti na J a v i " . 3. D o z v o l u za k o r i š ć e n j e

iz k n j i g e

I z v o r n o g ko da u š t a m p a n i m m e d i j i m a m o ž e t e pr i b a v i t i

ako se o b r a t i t e na adresu: MindView, Inc. 5343 V a l l e V i s t a La M es a , C a l i f o r n i a 9 1 9 4 1 W a y n e @ M i n d V i e w . n e t Izvornog koda i dokumentacije. se ne d o b i j a g a r a n c i j u o proMindView, bez u vezi i kod raditi

4. Mi n d V i e w , Izvorni daji,

Inc. j e z a š t i t i o a u t o r s k a p ra v a ili implicitna garancija, p r o g r a m koji Inc.

kod j e d o s t u p a n u o b l i k u u k o j e m j e d a t za o d r e đ e n u u p o t r e b u MindView,

i uz n j e g a

nikakva eksplicitna pogo d n o s t i Inc. ne jamči prekida

uključujući Izvorni Izvorni

ili n e k r š e n j u n e č i j i h prava. sadrži da j e snosi

da će b i l o koji

ili greš a k a .

ne tvrdi

kod ili b i l o koji riz i k , I z v o r n o g koda. istraživanja ga s a d r ž i . s v e tro-

s o f t v e r koji ga o b u h v a t a p o d e s a n za b i l o ko ju na m e n u . s kvalitetom i performansama ovog softvera, K o r i s n i k I z v o r n o g koda r a z u m e da j e Izvorni nasta v e , o s l a n j a i s k l j u č i v o na A k o se ispostavi da j e šk o v e s e r v i s i r a n j a , Izvorni Izvorni kod, niti

Celokupan

sam korisnik

kod n a p r a v l j e n radi

pa mu se s a v e t u j e da se ni u koju s vr h u niti na b i l o koji kod n e i s p r a v a n , isp ra vk i.

iz b i l o ko j e g r a z l o g a ne p r o g r a m koji

s a m k o r i s n i k snosi

o p r a v k e ili

koristio sam je. INC. NIKAKVU GARANCIJU. BILI U P O Z O R E N I N A M O G U Ć N O S T T A K V I H Š T ETA . O B L I K U U K O J E M J E D AT I UZ N J E G A SE NE D O B I J A N I K A K V A U S L U G A O D M I N D V I E W . Način pisanja korišćen u knjizi U ovoj knjizi identifikatori (metode. Programi u ovoj knjizi ubačeni su u tekst direktno iz datoteka koje su prevođene i ispitivane na jednom autom atskom sistemu. POSLOVANJA. M o lim. UKLJUČUJUĆI ZA O D R E Đ E N U U P O T R E B U ALI NE O G R A N I Č A V A J U Ć I KOJI N E M A NITI AŽURIRANJA.Uvod 13 5. POSLEDIČNU INC. možete se poslužiti alatkom kao što je Jalopy (www.com ) —dok sam pisao knjigu. Č A K I K A D A BI M I N D V I E W . održava Web lokaciju http://www. Ako ste čitali moje druge radove. Pošto je Java program ski jezik slobodne forme.com.MindJ e d i n o se o d a t l e m o g u pr eu ze ti e le k - (i n j e n e z v a n i č n e d u p l i k a t e ) . prom enljive i im ena klasa) ispisani su polucrno. MINDVIEW.MindView. PODATAKA. ILI M O D I F I K A C I J A . možete da koristite bilo koji stil koji vam ođgovara. INC. Većina rezervisanih reči takode je napisana polucrno. P R E U Z I M A B I L O K A K V E O B A V E Z E ZA P R U Ž A N J E U S L U G A . Stoga bi izvorni kod štam pan u knjizi trebalo da radi bez grešaka pri prevođenju. koda. osim onih koje se toliko koriste da bi njihovo naglašavanje postalo zam orno.coin/docs/codcconr/indcx. iako ja s tim e (koliko znam ) nisam imao nikakve veze. NIT I NJE60V I Z D A V A Č N E Ć E BITI ZA D I R E KT NU . Da biste form atiranje doterali kako vam odgovara i rešili pitanje stila. . Ovo mi je drago. prim etili ste takođe da se stil pisanja program a koji koristi Sun pođudara s m ojim stilom. ZA B I L O KA K A V P R E K I D ILI B I L O KA K A V DRUGI IZVO R- ODGOVORNI B EZ O B Z I R A N A B I L O K A K V U POSLOVNIH PRAVNU TEORIJU. pa ću samo reći da kroz moje prim ere ne želim da nam ećem pravilan stil.siin. View.triem ax. On odgovara stilu koji se koristi u kom paniji Sun za praktično sve program e koje možete naći na njihovoj Web Iokaciji (pogledajte http://jiiva. ILI S L U Č A J N U ŠTE T U. tronske kopije Izvornog k o j e se p o d p r e t h o d n o n a v e d e n i m u s l o v i m a m o g u Ako m i s l i t e da s te u I z v o r n o m kodu p r o n a š l i pošaljete preko sistema povratnih www. NI U J E D N O M S L U Č A J U NI M I N D V I E W . POSE B N U . dokle god zadržavate poruku o autorskim pravim a koja se pojavljuje u svakoj izvornoj datoteci. POBOLJŠANJA i m a j t e u vidu da M i n d V i e w . BILO KOME. INDIREKTNU.net preu z e t i I I M P L I C I T N U G A R A N C I J U 0 PR O D A J I IZ V O R N I KOD JE D O S T U P A N U PO DRŠKE. SE NA TO. nego imam Iične razloge za korišćenje takvog stila. Za pisanje prim era u knjizi koristim odreden stil.html) i koji podržava većina razvojnih okruženja za favu. Inc. besp l a t n o . Pitanje stila može biti predm et višečasovnih rasprava. g r e š k u . G U B I T A K P R O F I T A ILI N O V Č A N I G U B I T A K O D N O S N O T E L E S N U O Z L E D U K O J E SU I Z A Z V A N E U P O T R E B O M O V O G N OG K O D A I N J E G O V E D O K U M E N T A C I J E KO J E G R E Z U L T U J U Ć E G PR O G R A M A . m o l i m v as da i s p r a v k u koji m o ž e t e pr onaći na lo ka ci ji informacija ///:Kod možete koristiti u svojim nastavnim projektim a (uključujući i vaše materijale za prezentaciju). ILI SU P O S L E D I C A N E M O G U Č N O S T I U P O T R E B E BI LO ILI N J E G O V I Z D A V A Č P O S E B N O NE D A J E I POGODNOSTI INC.

MindView.net.14 Misliti na Javi Ova knjiga se zasniva na Javi SE5/6. Greške Bez obzira na to koliko trikova pisac koristi da otkrije greške. . m olim vas da iskoristite hipervezu za ovu knjigu na lokaciji www. drugo i treće izdanje knjige (na engleskom) možete besplatno preuzeti s lokacije www. prijavite grešku i pošaljete predlog za ispravku. prvo. i na njoj je i testirana. a to nije obuhvaćeno ovim izdanjem.MindView. Ako hoćete da naučite nešto o ranijim varijantama jezika. Ako otkrijete bilo šta što sm atrate greškom.net. a nov čitalac ih često odm ah primeti. neke se uvek provuku. Ceniću vašu pomoć.

Moglo bi se raspravljati o tom e da li je složenost problema koje ste u stanju da rešite direktno povezana s vrstom i kvalitetom apstrakcije. uopštc nc možetnogovoriti ukoliko se nepridržavamo organizacije i klasifikacije podataka koje taj dogovorpropisuje .“ Benjamin Lee W h o rf ( 1897-1941) R a č u n a r s k a REVOLUCIj'A je n a s t a l a u m a S in i.. anim iranje i snim anje filmova. slobodno preskoćite ovo poglavlje .MitidView. Ali raćunari nisu toliko mašine koliko pojačala um a („točkovi za um “ kako Steve Jobs voli da kaže) i drugi način izražavanja. . u računaru) i modela problem a koji se rešava (u „prostoru problema" koji predstavlja mesto gde problem postoji. na prim er. Mašinski jezik je mala apstrakcija mašine na kojoj se programi izvršavaju.Upoznavanje sa objektima „Prirodu parcelišemo i razvrstavamo u koncepte kojima pripisujemo značenja. uključivši i pregled m etoda razvoja. Mnogi takozvani . a kao sporedni elekat nastaje celokupna industrija „program skih metoda". i na druge oblike izražavanja. ali njihova prim arna apstrakcija ipak zahteva od vas da razmišljate iz ugla strukture računara um esto iz ugla probiem a koji rešavate. kakvi su pisanje. uz pretpostavku da imate iskustva s program iranjem . RASIC i C) bili su apstrakcija mašinskog jezika. vajanje. a sve više na delove našeg uma. slikanje. Ako pripadate toj grupi i žetjni ste da otkrijete specifićnosti jezika.. Stoga je ovde dat bogat pregled koncepata OOP-a. Ovi jezici su veliki napredak u odnosu na mašinski jezik. koji možete preuzeti na adresi mvw. M eđutim. O bjektno orijentisano program iranje (OOP) deo je ovog pom eranja ka korišćenju računara kao sredstva izražavanja. Program er mora da uspostavi vezu izmedu modela tnašine (u „prostoru rešenja“ koji predstavlja mesto gde realizujete rešenje problem a. Drugi ne mogu da shvate glavne principe dok prvo ne upoznaju barem neke mehanizme.net. M nogi se ne osećaju prijatno u svetu ol>iektno orijentisanog program iranja ako pre toga ne razum eju celinu.u ovom trenutku to vas neće sprečiti da pišete program e ili naučite jezik.proceduralni“ jezici koji su sledili mašinski (kao FORTRAN. Razvoj apstrakcije Svi programski jezici obezbeđuju apstrakoiju. Pod „vrstom" mislim na to „šta apstrahujete“. proučite multimedijski sem inar Thinking in C. Ovo pogtavlje je i podloga i dodatni materijal. N a S i p r o g r a m s k i je z ic i s t o g a t e ž e d a izgledaju kao ta mašina. Ovo poglavlje vas uvodi u osnovne koncepte OOP-a. Zbog toga ti alati sve m anje liče na mašine. poželećete da se vratite na ovaj deo knjige da biste dopunili svoje znanje i shvatili zašto su objekti važni i kako da ih koristite pri pisanju programa. iako to ne m ora biti na jeziku C.. recimo poslovanje). Ako mislite da treba da se još priprem ate za program iranje pre nego što se uhvatite u koštac sa ovom knjigom. uglavnom zato što se držimo dogovora koji važi u našoj jezičkoj zajednici i kodifikovan je u obrascima našeg jczika . Napor koji iziskuje ovo preslikavanje i činjenica da je ono nebitno za programski jezik proizvode program e koji se teško pišu i čije je održavanje skupo.

Da biste uputili zahtev objektu. Teoretski. oni postaju nezgrapni. pri čem u su .. P rogram je skup objekata koji jed ni d ru g im a poru k am a saopštavaju šta da rade.klasa“ i . Svaki objekat ima tip.16 Misliti na Javi Alternativa m odelovanju m ašine je m odelovanje problem a koji pokušavate da rešite. AJan Kay je naveo pet osnovnih obeležja Smalltalka. Međutim. 2. 1. Sve je objekat. Svaki ovaj p ristu p može biti dobro rešenje za određenu klasu problem a kojoj su nam enjeni. vi „šaljete poruku“ tom objektu. Svaki objekat im a svoj m em orijski p ro sto r koji se sastoji od d ru g ih objekata.objekti“.) i predstaviti je kao objekat u svom program u. ovo i nije tako loša analogija sa objektima u stvarnom svetu . Stoga možete da usložnjavate program koji će biti skriven iza jednostavnih objekata. ali kada istupite iz tog dom ena. (Trebaće vam i drugi objekti koji nemaju svoj par u prostoru problem a. on čuva podatke. loš uvek postoji povratna veza ka računaru: svaki objekat izgleda posve kao mali računar . Prolog prebacuje sve problem e u korake odlučivanja. P o g le d a jte M iiltipiiratligm l’ro g rtunm ing in Lctlti. um esto iz ugla računara na kom e će se to rešenje izvršavati. Konkretnije. možete uzeti bilo koju idejnu kom ponentu problem a koji rešavate (pse. Drugačije rečeno. Stručno rečeno.. . p a su p o d rž a v a liu k o m b in o v a n je ra z lič itih p ris tu p a k ro z m u ltis ta n đ a r d m ' p ro g ra m s k e jezike. Posmatrajte objekat kao poboljšanu promenljivu. Elemente u prostoru problem a i njihovo predstavljanje u prostoru rešenja nazivamo . u isto vreme čitate i reči koje izražavaju problem . vi stvarate novu vrstu objekta praveći paket koji sadrži neke postojeće objekte. obezbeđujući alate pom oću kojih program er predstavlja elemente u prostoru problem a. Ovo je mnogo fleksibilnija i snažnija apstrakcija od pretho d ne. prvog uspešnog objektno orijentisanog jezika. 3.1Stoga O O P dozvoljava da opišete problem iz ugla problem a.on ima unutrašnje stanje i operacije koje m ožete zahtevati da izvrši. 4. Ta obeležja predstavljaju čist i neiskvaren pristup objektno orijentisanom program iranju. svaki objekat je instanca (primcrak) neke klase. Rani jezici kao LISP i APL odražavali su pojedine predstave o svetu („Svi problem i se na kraju svode na liste“ ili „Svi problem i su algoritamske prirode“).tip“ sinonim i. O bjektno orijentisani pristup ide korak dalje.) Ideja je da se program u dozvoli da se prilagodi nerazumljivom jeziku problem a tako što će se dodati novi tipovi objekata. usluge itd. Ovo predstavljanje u principu ne ograničava program era na jednu vrstu problem a. Stvoreni su jezici zasnovani na ograničenom program iranju i program iranju isključivo m anipulacijom grafičkim sim bolim a (što se pokazalo kao previše restriktivno). i jednog od jezika na kom e je Java zasnovana. zgrade.. Tim o th y B u d d (A d d iso n -W e sle y 1995).svi im aju svoje karakteristike i osobeno se ponašaju. Najvažnija odlika klase glasi: „Koje poruke joj možete poslati?“ N eki a u to ri p r o g r a m s k ih jezika su s m a tra li d a o b je k tn o o rije n tis a n o p ro g r a n iira n jc n ije d o v o ljn o da o m o g u ć i lak o re ša v a n je sv ih p ro g r a m s k ih p ro b le m a . te kada čitate kod koji opisuje rešenje. možete zamisliti da je poruka zahtev da se pozove m etoda koja pripada određenom objektu. ali možete i da mu „postavite zahteve“ koje ispunjava vršeći operacije nad tim podacima.

class“. pomislite na .. transakcija i novčanih jedinica . a m o g u b iti s n im lje n i i na ciisk.' O v o jc z a p ra v o p rcv išc usko. a n c p o m o ć u n jegove a d rc se u m e m o riji. Apstraktni tipovi podataka rade gotovo isto kao ugrađeni tipovi: možete stvarati promenljive datog tipa (koje se nazivaju objekti ili instance u term inologiji objektno orijentisanog program iranja) i raditi s tim promenljivama (što se naziva slanje poruka ili zahteva: vi pošaljete poruku a objekat sam odredi šta će s njom da uradi). svaki blagajnik može da prim i depozit itd. Ovo je.govorio je o „klasi riba i klasi ptica“. transakcije itd.. U tom problem u imate više blagajnika. id e n tite t o b je k ta se m o ra u tv rd iti na neki d ru g i n a č in . Simula. To znači da objekat m ože imati interne podatke (koji definišu njegovo stanje) i m etode (koje definišu njegovo ponašanje). klijenti. istovrem eno pripadaju klasi objekata sa zajedničkim karakteristikam a i ponašanjem .puno . i da je svaki objekat jedinstven (razlikuje se od svih drugih objekata) . svi objektno orijentisani program ski jezici koriste rezervisanu reč. Stvaranje apstraktnih tipova podataka (klasa) osnovna je ideja u objektno orijentisanom program iranju. raćuni. Dakle. računa. krug će zasigurno moći da prim a poruke za oblik. To znači da možete da napišete kod koji kom unicira sa oblicima i autom atski podržava i sve drugo što potpada pod opis oblika.. iako mi u objektno orijentisanom program iranju stvaram o nove tipove podataka. prem da jedinstveni.tip“. p o što o b jc k ti m o g u p o sto ja ti u ra z n im r a č u n a r im a i a d re s n im p ro s to rim a . svaki član ima vlastito stanje: svaki račun ima drugačiji salđo. direktno je iskorišćena u prvom objektno orijentisanom jeziku. d o k jc k lasa p o s e b n a realizacija to g in te rfejsa . Njegova osnovna rezervisana reč class uvodi novi tip u program . projektovana je za razvoj simulacija poput klasičnog problem a „bankarskog blagajnika". grupisani su u„klase objekata" i odatle potiče rezervisana reč class. U tim slu ča jc v im a . Ti entiteti su objekti. N ek i Ijudi p rav e ra z lik u i tv rd e d a tip o d re d u je in te rfejs. Kada vidite reč . svaki objekat im a jedinstvenu adresu u m em oriji. Svi objekti određenog tipa m ogu da primaju iste poruke. . Booch daje još kraću definiciju objekta: O bjekat im a stanje.oblik“.Poglavlje !: Upoznavanje sa objektima 17 5.. kao što joj im e govori. Simula-67. pojedinačno mogu biti predstavljeni jedinstvenim entitetom u raćunarskom program u. klijenata. ponašanje i identitet. svaki blagajnik ima ime. Ideja da svi objekti. Objekti koji su identični po svemu osim po stanju tokom izvršenja program a. Stoga blagajnici.2 Objekat ima interfejs Aristotel je verovatno prvi počeo da pažljivo proučava podelu na tipove . u stvari.objekata“. Kako je objekat tipa . višeznačna izjava.konkretno. Istovremeno.. a svaki objekat pripada određenoj klasi koja definiše njegove karakteristike i ponašanje. Ćlanovi (elementi) svake klase imaju neke zajedničke osobine: svaki raćun ima saldo. Ova zamenljivost je jedna od najm oćnijih osobina OOP-a.klasu“ i obrnuto.krug“ istovremeno objekat tipa ... kao što ćete kasnije videti.

O bjektno orijentisan pristup ne ograničava se sam o na pravljenje simulacija. Prost prim er bi mogla biti sijalica: Ime tipa Interfejs S i j a l i c a sj = n ew S i j a l i c a ( ) . a zahtevi koje m ožem o postaviti objektu Sijalica su uključi se.ukl juci (). sj . koji je određen tipom . ime posebnog objekta tipa Sijalica je sj. o njim a vodi računa i proverava tipove. O O P-a veliki skup problem a lako se može da svesti na jednostavna rešenja. Tip uz svaki mogući zahtev ima pridruženu m etodu i kada napravite ođređeni zahtev. takođe im a skup karakteristika i ponašanja. Objekat tipa Sijalica pravite kada definišete njereniu (sj) na dati objekat i . Naravno. Zahtevi koje možete da postavite objektu đefinisani su preko njegovog interfcjsa. iscrta nešto na ekranu ili uključi prekidač. Kada se klasa ustanovi. Zaista. a objekat odreduje šta će s porukom da uradi (izvrši kod). S taćke gleđišta proceduralnog program iranja to i nije tako komplikovano. isključi se. jer i broj u form atu pokretnog zareza. ne gde m ora postojati kod koji će zađovoljiti taj zahtev. Programski jezik proširujete dodavanjem novih tipova podatka. jedan od izazova objektno orijentisanog program iranja jeste ostvarivanje jednoznačnog preslikavanja izm eđu elemenata u prostoru problem a i objekata u prostoru rešenja. specifičnih za vaše potrebe.18 Misliti na Javi Pošto klasa opisuje skup objekata koji imaju identićne karakteristike (elementi s podacima) i jednako se ponašaju (funkcionalnost). ćini implementaciju (realizaciju ili prim enu interfejsa). upotrebom tehnika. Razlika je u tom e što program er definiše klasu koja odgovara problem u. na prim er. Bez obzira na to da li se slažete sa stavom da je svaki program simulacija sistema koji projektujete. da završi transakciju. Za ovaj proces obično se kaže da sm o „poslali poruku" (postavili zahtev) objektu. um esto da bude prinuđen da koristi postojeći tip koji predstavlja m em orijsku jedinicu unutar računara. a zatim da radite s tim objektim a kao da su elementi u problem a koji pokušavate da rešite. 'Iaj kod. ime tipa/klase je Sijalica. zajedno sa skrivenim podacima. pojačaj svetlo ili priguši svetlo. Kako da naterate objekat da uradi koristan posao? M ora postojati način da postavite zahtev objektu da nešto uradi. možete da napravite koliko god želite objekata te klase. poziva se odgovarajuća metoda. Interfejs odreduje koje zahteve možete da postavite odredenom objektu. A svaki objekat može da zadovolji samo izvesne zahteve. U našem prim eru. klasa ie zaista tip podatka. na prim er. kao što radi i sa ugrađenim tipovima. Programski sistem prihvata nove klase.

A treći objekat može koristiti usluge prethodna dva da bi obavio posao. podaci članovi koje treba opisati nalaze se u srednjem delu. i to pom oću usluga koje pružaju drugi objekti. nem a potrebe da prikazujete ni donji deo. razdvajajući ih tačkom. i objekat koji štam pa čekove i račune na svirn mogućim vrstam a štampača. koji zna sve o raznim vrstam a štampača (ali ništa o knjigovodstvu . Vaš cilj je da napravite (ili još bolje. Da biste poslali poruku objektu. navedite ime objekta i povežite ga s porukom . UML). pronađete u bibliotekam a koda) skup objekata koji pružaju idealne usluge koje rešavaju vaš problem. iako isto važi i za m ctodu iii biblioteku objekata) m edusobno „dobro uklopIjeni“. Mogli biste zamisliti ođređene objekte koji sadrže unapred definisane slike ekrana za unos podataka. Verovatno će vas iskustvo naućiti da je to previše za jedan objekat i da vam treba tri ili višeobjekata. Gornja slika je napravljena u skladu s form atom koji koristi unifikovani jezik za modelovanje (engl. To je racionalan naćin razlaganja problem a na skup objekata.Poglavlje I : Upoznavanje sa objektima 19 pozovete nevv.Da ih mogu čarobnim štapićem izvući iz šešira.taj je kandidat za kupovinu.zahtevom. koje prim aju poruke koje šaljete tom objektu). Neki od tih objekata m ožda već postoje? Kako bi izgledali oni koji ne postoje? Koje usluge bi ti objekti davali i koji bi im objekti bili potrebni za izvršavanje zadataka? Ako tako budete radili. . objekat interfejsa štampača). um esto da ga sami pišete). stiće se još jedna prednost: time se povećava usklađenost objekta. doći ćete do taćke kada možete reći: „Ovaj objekat izgleda dovoljno jednostavno da se može napisati“ ili „Mora da postoji ovakav objekat“. To biste mogli postići ako se zapitate: . pretpostavim o da pišete program za knjigovodstvo. Ne samo da se tako mogu pronaći objekti koje treba kupiti (recimo. svaki objekat dobro radi jedan posao. to je skoro sve što vam treba da biste program irali sa objektima. Velika u$kladenost\e jedan od temeljnih kvaliteta projektovanja softvera: to /. I vaš program će pružati usluge korisniku. Unified Modeling Languagc. Tako bi svaki objekat imao uskladen skup usluga koje pruža. Kada se objekat sm atra davaocem usluga. Ćesto se u UML dijagramima prikazuju sam o im e klase i javne m etode. koji objekti bi odm ah rešili moj problem?" Na primer. a srednji deo ne —tako je i na prethodnoj slici. Jedan olijekat bi mogao biti katalog svih mogućih izgleda čekova. Ako vas zanim a sam o ime klase. čime zahtevate novi objekat tog tipa. Kada se radi o pom enutom m odulu za štam panje ćeko\ra. kojem se mogu slati upiti radi podataka o tom e kako odštam pati odredeni ćek. ali ne pokušava da radi više poslova. program eri ćesto trpaju previše funkcionalnosti u jedan objekat. a u donjem delu pravougaonika su metode (funkcije koje pripadaju tom objektu. Jedan objekat ili skup objekata može biti opšti (generički) interfejs za štam panje.naći da su razni aspekti softverske kom ponente (kao što je objekat. U dobrom objektno orijentisanom dizajnu.. nego se proizvode i novi objekti koji se m ogu ponovo upotrebljavati na drugim mestima (katalog izgleda čekova). bilo bi dobro da objekte sm atrate „davaocima usluga“. drugi skup objekata koji obavljaju knjigovodstvene proračune. možete odlučiti da vam treba objekat koji zna sve o form atiranju i štam panju. S tačke gledišta korisnika unapred definisane klase. Prilikom projektovanja objekata. Objekat pruža usluge D ok pokušavate da razvijete ili shvatite stru kturu nekog program a. Svaka klasa je predstavljena pravougaonikom . ime tipa je u gornjem delu.

. U svakom odnosu je važno da sve uključene strane poštuju granice. a o čemu ne treba da misle. Ako su interfejs i realizacija jasno razdvojeni i zaštićeni. Na primer. nego i drugim a koji b u d u pokušavali da razum eju vaš kod ili upotrebe neki od vaših objekata. da bi. Cilj program era kJijenta je da sakupi klase u „kutiju sa alatom". možete realizovati neku klasu na jednostavan način. možda. jer lako rnogu da razluče šta je za njih važno. public (javni) znači da je naredni elem ent dostupan svakome. Ako bi svi članovi klase bili dostupni svakome. Skrivena realizacija Vrlo je korisno podeliti polje delatnosti na autore klasa (one koji prave nove tipove podataka) i programere klijente4 (korisnike klasa koji te tipove upotrebljavaju u svojim aplikacijama). vi stvarate odnos sa kJijentom koji je takođe program er. Stoga je prvi razlog za uvođenje kontrole pristupa onem ogućavanje program era klijenta da pristupa delovima koje ne sme da dira. a kasnije otkriti da je treba ponovo napisati kako bi radila brže. Cilj autora klasa je da napravi klasu koja otkriva sam o ono što je neophodno program eru klijentu. To će koristiti ne sam o vama tokom procesa projektovanja. onda bi program er klijent mogao da uradi bilo šta s klasom i ne bi postojao način da se nam etnu pravila. koju će koristiti za brzi razvoj aplikacija. Ako b u d u mogli da utvrde vrednost objekta na osnovu usluge koje on pruža. Ovi specifikatoripristupa određuju ko može da koristi definicije koje slede iza njih. Kontrolu pristupa treba uvesti i da bi se dozvolilo projektantu biblioteke da prom eni način na koji klasa interno radi. Kada pravite biblioteku. ovo možete lako da izvedete. Zašto? P rogram er Idijent ne može da koristi sakrivene delove. ' Z a h v a lju je m sv o m p rija te lju S c o ttu M ey ersu n a o v o m te rm in u . Jako biste vi voleli da program er Jdijent ne radi direktno s nelcim članicama vaše klase. ne razmišljajući da li će se to odraziti na ostale. private predstavlja zid između autora i program era klijenta. Rezervisana reč private (privatni) znači da tom elementu ne može da pristupi niko sem autora klase. Onaj ko poku ša da pristupi članici označenoj kao private. unutar me toda tog tipa. pa sakrivanje realizacije sm anjuje m ogućnost da se pojave greške u program im a. a koji su neophodni za interni rad s tipom podataka. a da ne m ora da brine kako će se to odraziti na programere klijente.20 Misliti na Javi Jako ćete pojednostaviti sebi život ako objekte budete sm atrali davaocima usluga. a sve ostalo drži sakriveno. ali koji sastavlja aplikaciju koristeći vašu biblioteku. biće im m nogo lakše da ga uklope u svoje projekte. Ovo je u isto vreme usluga program erim a klijentima. private i protected. Skriveni deo obično predstavlja osetljivu unutrašnjost objekta koju lako može da ošteti neobazriv ili neobavešten program er ldijent. Java koristi tri rezervisane reči da postavi granice un u tar klase: public. Sve bi bilo izloženo javnosti. što znači da autor klase m ože da prom eni skriveni deo kad god hoće. Ti delovi nisu deo interfejsa koji je potreban korisnicim a za rešavanje njihovih problem a. napravio veću biblioteku. izazvaće grešku prilikom prevodenja. bez kontrole pristupa ne bi postojao način da to sprečite.

Pošto je nasledivanje veoma bitno.. Novu klasu sastavljate od postojećih klasa. Vaša nova klasa m ože biti sastavljena od m a koiiko drugih objekata. O nasleđivanju ćemo govoriti uskoro. što se naziva kompozicija (ako se dešava dinam ički. on moli da bude ponovo iskorišćen. program će biti čistiji. Objekti članovi vaše nove klase obično su privatni.)1 Kompozicija je vrlo fleksibilna. prvo treba videti da li pri pravljenju novih klasa može da se iskoristi kompozicija. m eđutim . i nov program er može pom isliti da nasleđivanje treba koristiti svuda. s tom razlikom što klase naslednice im aju pristup zaštićenim članicama. pošto je ona jednostavnija i fleksibilnija. objekat te klase možete da stavite i u novu klasu. Ali kada ga napišete. Možete m enjati objekte članove i u vreme izvršavanja da biste dinamički menjali ponašanje svog program a. Ako prim enite ovaj pristup. Umesto toga. ma kojeg tipa i u bilo kojoj kombinaciji koja vam je potrebna da biste postigli željenu funkcionalnost svoje nove klase. Ponovno korišćenje realizacije Kada se klasa napravi i testira. na p rim er„au to im a m o to r“. jer klase m ogu da pristupe članicama drugih klasa u istom paketu. Java ima i . Ponovno korišćenje koda je jedna od najvećih prednosti objektno orijentisanih program skih jezika. obično ću koristiti jednostavniji oblik: sam o liniju. Kada steknete nešto iskustva. Ovo omogućava da izmenite te članove ne remeteći postojeći klijentski kod. Ispostavlja se da ponovno korišćenje ni izbliza nije tako lako ostvarljivo kako se mnogi nadaju. Najjednostavniji način da ponovo iskoristite klasu jeste da direktno koristite objekat te klase. potrebno je iskustvo i pronicljivost da bi se napisao višekratno upotrebljiv objekat.ima“. Ovo se naziva „pravljenje objekta člana“ (engl. onda obično agregacija).. što ih čini nedostupnim program erim a Idijentima koji koriste klasu. ona bi (u idealnom slučaju) trebalo da predstavlja korisnu jedinicu koda. biće vam očigledno kada treba da koristite nasleđivanje. Kad označavam spajanje. Kaii rezultat može se dobiti veoma nezgrapan i veoma složen program . Kompozicija se često poredi s relacijom . (Na ovom UML dijagram u kompoziciju označava popunjen romb. Ovo se obično naziva paketskipristup. Nasleđivanje koje malo dalje opisujemo. O v o jc u p r in đ p u d o v o ljn o d e ta ljn o za v e ćin u d ija g ra m a i n e tre b a d a p re c iz ira te d a li k o ris tite a g re g a đ ju ili k o m p o /ic iju . bez rom ba. nem a ovu fleksibilnost pošto prevodilac m ora da ugradi ograničenja za prevođenje u klase stvorene nasleđivanjem. member object).podrazum evani“ pristup koji se koristi ako ne zadate nijedan od navedenih specifikatora.Poglavlje I : Upoznavanje sa objektima 21 Rezervisana reč protected (zaštićeni) deluje kao private. u objektno orijentisanom program iranju često se veoma naglašava. ali ne i privatnim članicama. ali izvan tog paketa te iste članice vide se kao privatne. koji kazuje da postoji jedan auto.

tako da možete pređstaviti odgovarajuću ideju u prostoru problem a. obriše. Ta hijerarhija opisuje problem koji pokušavate da rešile preko tipova koji se u problem u pojavljuju. Ponašanja mogu biti različita (vrednost papira zavisi od njegove vrste i stanja). um esto da budete prinuđeni da koristite izraze računara na kome radite. Computer-Aided Design) ili u nekoj kom pjuterskoj igri. inheritance ). čelične konzerve privlači magnet). Dva tipa m ogu imati neke zajedničke karakteristike i jednako se ponašati.) Tip ne označava samo ograničenja skupa objekata. engl. trougao i druge .oblik“ koji može da se koristi u CAD sistemu (engi.. oboji itd.. On omogućava da podatke i funkcionalnost grupišete po konceptu . Na prim er. Drugi prim er je klasičan .oblik“ a svaki oblik ima veličinu. on ima odnose i s drugim tipovima.od .22 Misliti na Javi Nasleđivanje Sam po sebi. ova sličnost između tipova se izražava preko koncepta osnovnih i izvedenih tipova. Bilo bi jednostavnije da uzmem o postojeću klasu.krug. Osnovni tip je . Iz osnovnog tipa izvodimo posebne vrste otpada s dodatnim karakteristikama (boca im a boju). Koristeći nasledivanje možete izgracliti hijerarhiju tipova. a zatim dopunjujem o i m enjam o kloniranu klasu. Bila bi šteta da se nam učite i napravite neku klasu a da onda budete prim orani da pravite p otpuno novu klasu koja im a sličnu funkcionalnost. izražavate suštinu svojih ideja o nekim objektim a u sistemu. derived class). Svaki oblik može da se iscrta.. te ideje su izražene kao osnovne jedinice u ovom program skom jeziku. koncept objekta je veoma koristan. boju. Odavde izvodimo (nasledujem o) pojedine vrste oblika . ili ponašanjim a (alum inijum ska konzerva može da se zdrobi. da je kloniram o. ali pri tom jedan tip može imati još neke dodatne karakteristike i može obrađivati više poruka (ili ih drugačije obradivati). Kao što ćete videti. mašina za recikliranje raspoređuje komadiće otpada. osim kada se originalna klasa (koja se naziva osnovna klasa ili natklasa ili klasa roditelj) izmeni.. može da postoji više izvedenih klasa. (Strelica u ovom UML dijagram u polazi od izvedene klase ka osnovnoj klasi. Kod nasleđivanja. istopljen ili rastavljen. vrednost itd. Osnovni tip sadrži sve karakteristike i ponašanja koja su zajednička za tipove izvedene iz njega. Iz osnovnog tipa izvodite ostale tipove i pokazujete različite načine realizacije ove suštine.otpad “ a svaki pojedini otpadak ima težinu.klonu“ (koji se naziva izvedena ili nasleđena klasa ili potklasa ili klasa naslednik . Kada se prim eni rezervisana reč class. i može biti isečen. Ovo se zapravo postiže nasleđivanjem (engl. kvadrat. Praveći osnovni tip. a te izmene se odraze i na . Osnovni tip je . poziciju itd. pom era.

H ijerarhija tipova objedinjuje sličnosti i razlike između oblika. m etode interfejsa osnovne klase će preći i u izvedenu klasu. Kod objekata. Ako nasledite klasu i ništa više ne uradite. Kada iskoristite nasleđivanje iz postojećeg tipa. stvarate novi tip. takođe možete poslati i objektim a izvedene klase. već. Ovaj jednostavan način korišćenja nasledivanja ponekad je savršeno rešenje problem a. Neka ponašanja m ogu biti drugačija. U prethodnom prim eru „krug je oblik“. to znači da je izvedena klasa istog tipa kao i osnovna klasa. M edutim. Znači. što i nije previše korisno. mora postojati kod koji se izvršava kada objekat prim i određenu poruku. što znači da osnovna klasa nije radila sve ono što ste hteli. Pošto i osnovna klasa i izvedena klasa imaju isti osnovni interfejs. Taj novi tip ne samo da sađrži sve članice postojećeg tipa (iako su privatne članice sakrivene i neđostupne). . pažljivo proučite da li su i vašoj osnovnoj klasi potrebne te dodatne metode. Predstavljanje rešenja i problem a u istom obliku veoma je korisno jer vam ne treba veliki broj m eđum odela da biste od opisa problem a došli do opisa rešenja. Um treniran da traži složena rešenja često spočetka zbunjuje ova jednostavnost. pa ste joj zato dodali još m etoda. Jedna od teškoča sa objektno orijentisanim program iranjem jeste ta da je previše jednostavno stići od početka od kraja. recimo kada želite da izračunate površinu oblika. Ekvivalencija tipova dobijena nasledivanjem je osnovni korak na p utu ka razum evanju smisla objektno orijentisanog program iranja. m ogu da se okreću. Prvi je jasan: izvedenoj klasi dodate potpuno nove metode. kopira interfejs osnovne klase.Poglavjje 1: Upoznavanje sa objektima 23 kojih svaki može imati dodatne karakteristike i ponašanje. Postoje dva načina da napravite raziiku između svoje nove izvedene klase i osnovne klase. Neki oblici. Znači. na prim er. što je mnogo važnije. Te nove m etode nisu deo interfejsa osnovne klase. Pošto se tip klase odreduje na osnovu poruka koje joj m ožem o poslati. hijerarhija tipova je osnovni model tako da sa opisa sistema u realnom svetu direktno prelazite na opis sistema kodom. m ora da postoji realizacija koja ide uz taj interfejs. To znači da objekti izvedene klase imaju i isti tip i isto ponašanje. sve poruke koje možete da pošaljete objektima osnovne klase. Ovaj proces otkrivanja i iteracije program a redovna je pojava u objektno orijentisanom program iranju.

overriding). To se naziva redefinisanje metode (engl.24 Misliti na Javi Iako nasleđivanje ponekad može da nagovesti (posebno u Javi. gde rezervisana reč koja označava nasledivanje glasi extends . Da biste redefinisali m etodu. Drugi i važniji način da napravite razliku u novoj klasi jeste da promcnite ponašanje postojeće m etode osnovne klase.1 ' . ali želim da ona u m om novom tipu radi nešto drugo. napravite novu definiciju te m etode u izvedenoj kiasi.proširuie) kako ćete dođavati nove m etode interfejsu. Vi kažete: „Koristim ovde istu m etodu interfejsa. to nije uvek istina.

lako možete pomisliti da je taj pristup (čista supstitucija) jedini način da se nešto uradi. ili princip supstitucije. Pretpostavim o da su po kući razvedene kontrole za hlađenje. jer nove m etode nisu dostupne iz osnovnog tipa. kuća im a interfejs koji om ogućava da kontrolišete hlađenje. ovo je idealan način prim ene nasleđivanja. čista supstitucija ..Da li nasleđivanje treba da redefiniše samo m etode osnovne klase (i da ne dodaje nove m etode koje ne postoje u osnovnoj klasi)?“ To bi značilo da je izvedena klasa potpimo istog tipa kao osnovna klasa. trebalo bi da bude prilično očigledno o kojem se od ta dva slučaja radi. ali supstituđja nije savršena.eoblik“. Ovo se može opisati kao relacija je-kao (moj term in). Novi tip ima interfejs starog tipa ali sadrži i druge m etode. Nakon što ispitate problem . Pošto je kontrolni sistem vaše kuće projektovan sam o da kontroliše hlađenje. on je ograničen na kom unikaciju s delom za hlađenje novog objekta. a postojeći sistem ne poznaje ništa drugo osim originalnog interfejsa. Novi tip i dalje m ože biti sveden na osnovni tip. Ponekad m orate da dodate nove elemente u interfejs izvedenog tipa i tim e proširite postojeći interfejs. Pokušaj da utvrdim o da li m ožem o da uspostavim o relaciju je izm edu klasa. jer ima istovetan interfejs. Ovaj dijagram prikazuje šta u stvarnom svetu može da se desi tokom projektovanja. Cim proučite ovaj plan. U ovom slučaju. . predstavlja svojevrstan test nasleđivanja. jer m ožem o reći„krug. Interfejs novog objekta je proširen. Ali shvatićete da u interfejs izvedene klase ponekad m orate da dodate nove metode. i zaista jeste dobro da program napravite na taj način. ali ona može i više. Ovo je tzv. m i se često pozivamo na relaciju izm eđu osnovne i izvedene klasekao na relaciju je. postaće jasno da osnovna klasa „sistem za hlađenje" nije dovoljno opšta i da treba da se preim enuje u „sistem za kontrolu temperature". Unekoliko. tako da se ne može reći kako je potpuno isti.nakon čega bi princip supstitucije važio. Toplotna pum pa je kao uređaj za hlađenje. Kada upoznate princip supstitucije. objekat izvedene klase može se svesti na tip objekta osnovne klase. odnosno. kako bi m ogla da sadrži i grejanje . Zamislite da se uređaj za klimatizaciju pokvari i da ga zam enite toplotnom pum pom koja može i da greje i da hladi. Kao rezultat.Poglav[je 1: Upoznavanje sa objektima 25 Relacije JE i JE-KAO Može se postaviti jedno pitanje o nasledivanju: . Uzmimo za prim er uređaj za klimatizaciju. a da to ima smisla.

To vam omogućava da pišete kod koji ne zavisi od specifičnog tipa. program er ne želi da zna koji deo koda će biti izvršen. bez menjanja m etoda koje rade samo s generičkim oblicima. Problem nastaje pri pokušaju da se objekti izvedenog tipa tretiraju kao generički osnovni tipovi (krugovi kao oblici. tako da te m etode samo pošalju poruku objektu tipa oblik i ne brinu kako će objekat izaći na kraj s tom porukom. korm orani kao ptice itd. Ako ne m orate znati koji će deo koda biti izvršen. a dodavanjem novih tipova najčešće se proširuju objektno orijentisani program i kada treba da se savlada neka nova situacija. Kako se događa da se.). Svi oblici mogu biti iscrtani. Znači. dodajte nov podtip. prim eni pravilno ponašanje (Guska hoda. ili kakvo je ponašanje te određene Ptice. obrisani i pom erani. možete da izvedete novi podtip oblika. M etoda za crtanje može podjednako da se prim eni na krug ili na kvadrat ili na trougao. kod koji će taj novi tip izvršavati može biti drugačiji a da pri tom ne m crate ništa da menjate u metodi koja ga poziva. kvadratima. bicikli kao vozila.kada je poruka poslata. M ogućnost da se program lako proširi izvođenjem novih podtipova jeste jedan od osnovnih načina da se kapsuliraju promene. Šta onda radi? Na primer. pod im enom petougao. Ovo je pogodno iz perspektive K ontroleraPtica jer ne treba pisati poseban kod koji bi odredio s kojim se tačno tipom Ptice radi. a Pingvin hoda ili pliva)? . već kao osnovni tip. a objekat će izvršiti odgovarajući kođ u zavisnosti od svog specifičnog tipa. To i jeste poenta . Time se znatno unapređuje program i istovrem eno sm anjuju troškovi održavanja softvera. Takav kod se ne menja ni nakon dodavanja novih tipova. Ako metoda naredi generičkom obliku da se iscrta ili generičkom vozilu da sm ota volan ili generičkoj ptici da se pom eri. m etode m anipulišu generičkim tipovim a (oblicima) bez obzira na to da li se radi o krugovima. u sledećem dijagram u objekat K o ntrolerP tica radi samo s generičkim objektim a tipa Ptica i ne zna kog su oni tipa. često objekat ne tretirate kao specifičan tip. kada se pozove metoda pom eriSe() uz ignorisanje specifičnog tipa Ptice. prevodilac ne zna tačno koji će deo koda biti izvršen. prevodilac prilikom prevođenja ne može tačno da zna koji deo koda će biti izvršen. trouglovim a ili čak obliđm a koji još nisu definisani. leti ili pliva. U prethodnom prim eru sa oblicima.26 Misliti na Javi Virtuelizacija objekata preko polimorfizma Ukoliko imate posla s hijerarhijom tipova. Na primer.

u skladu sa sadržajem svakog pojedinog specijalnog delića koda. program ne može da odredi adresu koda sve do trenutka izvršavanja. Dijagram porodice klasa (koje su zasnovane na istom u niform nom interfejsu) dat je ranije u ovom poglavlju. Alco napišete m etodu u Javi (što ćete uskoro naučiti): v oid r a d i N e s t o ( O b l i k oblik) o b 1 i k. radiNesto(trougao).) Tako svaki objekat može da se ponaša različito. tako da je neophodna neka druga šema kada se poruka šalje generičkom objektu.Poglav[je 1: Upoznavanje sa objektima 27 Odgovor leži u osnovnoj začkoljici objektno orijentisanog program iranja: prevodilac ne može da pozove funkciju na tradicionalan način. jer o pozivanju funkcija niste razmišljali ni na koji drugi način. (Ovaj proces je detaljno opisan u poglavlju o polim orfizm u. Linija radiNesto(krug). Ako u nekom drugom delu program a pozovemo funkciju radiN esto(): K rug krug = n e w Krug(). kod koji se poziva ne biva određen sve do trenutka izvršavanja. m etode se podrazum evano Hepovezuju dinamički. Da bi rešili ovaj problem . Prevodilac ipak proverava da li telo specifične m etode postoji te koji su tipovi argum enata i povratne vrednosti. linija = n ew L i n ija(). Prevodilac koji nije objektno orijentisan izaziva rano vezivanje (engl. ta m etoda se obraća bilo kom O bliku. Da bi razrešila kasno povezivanje. Ako pom oću nasleđivanja dodam o nov tip . Ovaj term in m ožda niste ranije čuli. early binding). radi Nes t o ( 1 i n i j a ) . program je proširiv. Znači.te naredbe radiće jednako dobro s novim tipom O blika kao što su radile sa već postojećim tipovim a. bez obzira na tačan tip objekta.. late binding). a izvršni sistem kasnije razreši ovaj poziv ubacivanjem apsolutne ađrese koda koji treba da se izvrši. Da bism o prikazali polim orfizam. napisaćemo naredbe koje ignorišu specifične detalje tipova i obraćaju se samo osnovnoj klasi. Kada pošaljete poru ku objektu. To znači da prevodilac generiše poziv funkcije određenog im ena. objektno orijentisani jezici koriste koncept kasnog vezivanja (engl. pozivi m etode radiN esto() autom atski rade ispravno. { II } . obli k. na prim er . Te naredbe nisii povezane sa inform acijam a specifičnim za pojedine tipove. um esto apsolutnog poziva Java koristi specijalan delič koda koji adresu tela m etode izračunava pom oću inform acija ugrađenih u konkretan objekat.obri si S e ( ) . pa ne zavisi od specifičnog tipa objekta koji se iscrtava i briše. Posm atrajm o prim er oblika. ali ne zna koji če kod izvršiti.i s c r t a j S e ( ) . pa se stoga jednostavnije pišu i lakše razumevaju.. Kada pošaljete poruk u objektu. tako da ne m orate dodavati posebne rezervisane reči da biste dobili polimorfizam. U Javi se dinam ičko povezivanje podrazum eva. U tim jezicima. U OO P-u. on sam odlučuje šta će s njom da uradi. . U nekim jezicima m orate izričito navesti da određenu m etodu treba kasno povezati (u jeziku C ++ to se radi pom oću rezervisane reči v irtu al).Sestougaonik. T r o u g a o t r o u g a o = n ew T r o u g a o ( ) .

Zato je gornji poziv p o tp u n o siguran i logičan.. Ovo je dobra osobina. a up potiče od načina na koji se obično organizuje dijagram nasleđivanja. jer pri tom ne morate znati tačan tip s kojim radite. kažemo: .obri s i S e ( ) ." Tako napisan kod koji proverava sve moguće tipove koje O blik može da pokrije prljav je i m orate da ga m enjate svaki put kada dodate novu vrstu O blika. O dnosno. funkcija radiNesto() može tako da ga tretira. Stoga bismo obično očekivali da on pozove verziju m etoda obrisiSe() i iscrtajSe() za osnovnu klasu O blik. jer kada prevodilac prevodi m etodu radiN esto(). II . on ne zna tip s kojim radi. npcasting). radi ovo. casting into a tnold -ubacivan je u kalup). ako si Kvadrat radi onoitd. is c r t a j S e f ) . Krug može da prihvati. Prema tome. Važno je da se naredbe u funkciji rađiN esto() izvršavaju na pravi način. sa osnovnim tipom na vrhu i izvedenim klasama koje se lepezasto šire naniže. o b l ik . dobija se ispravno ponašanje. zasnovano na stvarnom tipu Oblika. Ako si Krug. Sam poziv m etode iscrtajSe() za K rug prouzrokuje izvršavanje drugačijeg koda nego kada pozivamo m etodu iscrtajSe() za Kvadrat ili Liniju..28 Misliti na Javi Ovo je prilično zadivljujući trik. Kvadrat .. U našem slučaju. U objektno orijentisanom program u uvek postoji svođenje naviše. bilo koju poruku koju m etoda radiNesto() m ože da pošalje Obliku. a ne za određeni Krug. Proces pri kome izvedeni tip tretiram o kao osnovni tip. Pošto Krug jeste Oblik. Ovde je Krug prosleden metodi koja očekuje Oblik.Ti si oblik. ja znam da možeš da se iscrtaš i obrišeš. i sam vodi računa o detaljima". Posmatrajte red: radiNesto(krug). Ime castje iskorišćeno zato što označava ubacivanje u kalup (engl. ali kada poruku iscrtajSe() pošaljemo nepoznatom O bliku. O bratite pažnju na to da se nigde ne govori:. nazivamo svođenje naviše (engl.. Pogledajte funkciju radiN esto(): o b l i k. kao što je ranije pom enuto. to i uradi. konverzija u osnovni tip je penjanje uz dijagram nasleđivania: svođenje naviše ili upcasting.

ova knjiga će se . Takođe. ne možete znati koliko objekata će vam biti potrebno za rešavanje nekog zadatka. Postoji i druga m ogućnost (koju nudi C + + ). uz stvaranje dinamičkih objekata.Poglavjje 1: Upoznavanje sa objektima 29 ili Liniju. kako da odredite količinu memorijskog prostora za njihovo skladištenje? Rešenje većine problem a u objektno orijentisanom program iranju ponekad deluje neozbiljno: stvoriti još jedan tip objekta.zato što ste p u no uložili u C . što jeje d n a od temeljnih prednosti Jave nad jezikom C++. Treba uložiti napor (i verovatno višestruko nasleđivanje) da biste ugradili taj novi interfejs u svoj program . objekat će uraditi šta treba. Ukoliko počinjete od nule. drugi jezici. Ako pre izvršavanja program a ne znate ni broj objekata ni njihov vek trajanja.znate da možete da izvršite određene osnovne operacije nad svakim objektom u svom sistemu. i obezbeđuje veću fleksibilnost pri program iranju. Ispostavlja se da postoje brojne prednosti hijerarhije s jedinstvenim korenom . biće korišćen neki drugi nekom patibilni interfejs. Kontejneri Po pravilu. Po vertikalnoj kom patibilnosti ovo više odgovara m odelu jezika C i može se sm atrati manje restriktivnim.fleksibilnost“ C + + -a vredna toga? Ako vam treba . Hijerarhija s jedinstvenim korenom Jedno od pitanja u O O P-u koje je postalo veoma značajno od uvođenja C + + -a glasi: da li sve klase treba da b u d u izvedene iz jedinstvene osnovne klase. Novi tip objekta koji rešava pom enuti problem čuva reference na druge objekte. poput lave.prilično je vredna. da svi objekti ne budu istog osnovnog tipa. nikada nećete naići na objekat ćiji tip ne m ožete da utvrdite. Naravno. To je naročito važno kod operacija na sistemskom nivou. svi su istog osnovnog tipa. Ali taj novi objekat. kao što je obrada izuzetaka. ali kada želite da se bavite objektno orijentisanim program iranjem u celini. u svakoj novoj biblioteci klasa koju nabavite. m orate napraviti svoju hijerarhiju da biste obezbedili istu fleksibilnost koja je već ugrađena u druge O O P jezike.. Kada pošaljete poru k u objektu. obično pod im enom kontejner (naziva se i fcolekcija. Zbog polim orfizm a se sve ipak ispravno odvija. niti koliko dugo oni treba da postoje u m emoriji. to isto možete da uradite i pom oću nizova . Ne znate ni kako da uskladištite te objekte. Svi objekti u hijerarhiji s jedinstvenim korenom (kakvu obezbeđuje Java) zasigurno imaju određenu zajedničku funkcionalnost . Da li je dodatna . ali pošto Javine biblioteke koriste taj term in u drugom smislu. koji postoje u većini jezika. Hijerarhija sa jedinstvenim korenom olakšava realizaciju sakupljača smeća. U Javi (i gotovo svim ostalim O O P jezicima) odgovor je potvrdan. Hijerarhija s jedinstvenim korenom . veoma pojednostavljuje prosleđivanja argum enata. Pošto je pri izvršavanju u svim objektim a garantovano postojanje informacija o tipu. Zasađ je dovoljno da znate da polim orfizam funkcioniše i kako da pišete program e koristeći taj pristup. prem a tome. Svi objekti u hijerarhiji s jedinstvenim korenom im aju zajednički interfejs i. Ova osnovna klasa se naziva Object. čak i kada treba svoditi naviše. Prevodilac i sistem za izvršavanje vode računa o svim detaljima. često rnogu biti mnogo produktivniji.

M eđutim. kontejneri su mogli da sadrže samo jedini univerzalni tip eleinenata koji postoji u Javi: Object. Izbor treba da vam bude ponuđen iz dva razloga. koji se razlikuje od skupa ili liste. različiti kontejneri obavljaju iste operacije s različitom efikasnošću. U nekim bibliotekama jedan ili dva generička kontejnera dovoljni su za sve potrebe. a kasnije ih tražite nazađ. kontejneri obezbeđuju različite tipove interfejsa i načina rada. U jeziku C ++ on je deo standardne C ++ biblioteke i često se naziva standardna biblioteka šablona (engl. S druge strane. Na primer. kada dodate referencu na svoj N e m o ž e da ću v a p ro s te tip o v e . Standard Template Library. načine rada. H ijerarhija s jedinstvenim korenom znači da je sve tipa Object. Ako kontejner jednog tipa zadovoljava vaše potrebe. đodajte u njega reference na objekte. dok u drugim bibliotekama (na prim er u Javi) postoje različiti tipovi kontejnera za različite potrebe: više različitih klasa spiskova (tipova Lista) za čuvanje sekvenci. postoje dve osnovne vrste lista: ArrayList i LinkedList. U fazi pisanja program a.." Ovo pojednostavljuje ponovno korišćenje kontejnera. spolja gledano. I jedna i druga su jednostavne sekvence koje mogu imati identične interfejse i. tipova skupova (Set) za čuvanje po jednog prim erka raznih tipova objekata i druge kom ponente m eđu kojima su redovi čekanja.30 Misliti na Javi držati im ena . postoji bitna razlika u trajanju i zahtevima odredenih operacija nad njima. nem a razloga da uvodite druge. Sa stanovišta program a. prebacivanje iz jedne strukture 11 drugu imaće minim alan uticaj na vaš kod. Da biste koristili takav kontejner. No. to je mnogo jednostavnije i brže u iisti LinkedList. dobar OOP jezik sadrži skup kontejnera kao deo paketa. stekovi itd. ali a u to m a ts k o p a k o va n je (en g l. O to m e če još biti reči u ovoj knjizi. nego u ArrayList. može da čuva bilo šta. STL). za vas je važan kontejner s kojim možete da radite i rešite problem. što zavisi od strukture koja se nalazi u osnovi pojedine sekvence. Stek ima interfejs i način rada različit od reda čekanja. Srećom. Prvo. potrebno je isto vreme. Samo napravite kontejnerski objekat i prepustite njemu da se stara o detaljima. nasum ično pristupanje elementima kontejnera ArrayList je operacija s konstantnim vremenom izvršavanja. Drugo.kontejner“). Za rešenje vašeg problem a jedan od njih je obično bolji od ostalih. Stoga ne m orate da znate koliko ćete objekata čuvati u kontejneru. pošto kontejner čuva samo tip Object. ako želite da ubacite element usred sekvence. bez obzira na to koji element izaberemo. Smalltalk ima prilično dobar skup kontejnera. Parametrizovani (generički) tipovi Pre Jave SE5. širiće se po potrebi da bi prim io sve što u njega stavite. I Java ima m nogo kontejnera u svojoj standardnoj biblioteci. prebacite se na kontejner ArrayList. tipova M apa (koje neki nazivaju asocijativni tiizovi) zapridruživanje jednih objekata drugim a. Prim era radi. Ove i druge operacije nisu jednako efikasne. Međutim. Zahvaljujući apstrakciji preko interfejsa List.5 g o to v o d a p o tp u n o u k la n ja to o g ra n ič e n je . stabla. pom eranje kroz listu LinkedList do nasum ično izabranog elementa je komplikovanije i treba više vremena da se pristupi elementim a što su oni dalje od početka liste. . možete krenuti od kontejnera LinkedList a kada budete popravljali perform anse. <iumboxitig) koje je d o n e la Java SF. tako da kontejner koji može da čuva Object.

a zatim napravite novi avion i stavite ga u kontejner svaki put kada avion uđe u zonu kontrole vazdušnog saobraćaja. na primer. ali ovog p u ta se ne penjete uz hijerarhiju nasleđivanja do opštijeg tipa. m eđutim . m orate obezbediti neki naćin da zapam tite na šta se te reference odnose kako biste mogli da izvršite pravilno svođenje naniže. osim ako znam o s čim im am o posla. ona se svodi naviše na O bject i gubi identitet. počistite iz m em orije odgovarajući objekat avion. on m ora da se počisti kako bi se resursi oslobodili i ućinili dostupnim za ponovno korišćenje. Svođenje naniže i provere pri izvršavanju zahtevaju dodatno vreme za izvršavanje program a i dodatni napor za program era. Da bi se generićki tipovi dobro iskoristili. koje u Javi nazivamo generički tipovi. U jednostavnim program skim situacijama pitanje kako očistiti objekat ne čini se previše komplikovanim: napravite objekat.izuzetak (engl. da pišete program za upravljanje vazdušnim saobraćajem na nekom aerodrom u. pa svođenje naniže nije baš sigurno. a ne referencu na tip koji ste stavili unutra. exception). Na prim er. generički tipovi su uticali na dobar deo koda u ovoj knjizi. pa možete slobodno da izvršite svođenje naviše. čime se isključuje potreba za svođenjem naniže kao i m oguće greške. Pretpostavim o.) Na prvi pogled. dovvncasting). ovako se može napraviti ArrayList koji sadrži Oblik: A r r a y L i s t < 0 b l i k > oblici = new A r r a y L i s t < 0 b i i k > ( ). Pravljenje objekata i njihov životni vek Jedan od najvažnijih činilaca jeste način na koji se objekti stvaraju i uništavaju. ili na smeštaj za kućne ljubimce. Ovo i nije previše opasno: ako izvršite pogrešno svođenje naniže. a onda neka se uništi. Prepoznaćete ih po uglastim zagradam a u n u tar kojih se navode. Ovo se rešava pom oću parametrizovanih tipova. Kada je izvadite iz kontejnera. (Isti model bi mogao da se prim eni i na rukovanje sanducim a u skladištu. dobijate referencu na Object. ili na sistem i/. Da bi m ogao da postoji. već se spuštate niz hijerarhiju do određenijeg tipa. recimo. o kome uskoro govorimo.najmljivanja video kaseta. ovo izgleda jednostavno: napravite kontejner za čuvanje aviona. koristite ga koliko vam je potreban. L)a biste očistili sistem kada avion napusti zonu. param etrizovani kontejner prevodilac bi mogao da prilagodi tako da prihvata i vraća sam o klasu Oblik. neki O bject nije obavezno K rug ili O blik. na primer. svakom objektu su neophodni neki resursi.Poglavlje I : Upoznavanje sa objektima 31 objekat u kontejner. znate da je K rug tipa O blik. izmenjene su i mnoge standardne kom ponente bibilioteke. moguce su i složenije situacije. ledna od velikih prom ena koje je donela Java SE5 jesu param etrizovani tipovi. Kada iz kontejnera uzim ate reference. Pri svođenju naviše. . a to su klase koje prevodilac autom atski može da prilagodi tako da rade sa određenim tipom . Ovaj naćin eksplicitne konverzije naziva se svođenje naniže (engl. Kada objekat više nije potreban. M eđutim. Zar ne bi bilo logično da nekako napravim o kontejner tako da on zna koje tipove čuva. prvenstveno m em orija. Kao što ćete videti. Kako onda da tu referencu vratite u nešto što ima konkretan tip objekta koji ste stavili u kontejner? Ovde se ponovo koristi eksplicitna konverzija (pretvaranje) tipova. javlja se greška pri izvršavanju .

Pošto se oblašću za čuvanje upravlja dinamički. trebao bi vam drugi kontejner za male avione i kad god napravite objekat aviona. tako da dodatni režijski troškovi za nalaženje prostora i njegovo oslobađanje neće bitno uticati na stvaranje objekata. stavili biste ga takođe i u ovaj drugi kontejner. M eđutim . U jezicima koji dozvoljavaju da se objekti stvaraju na steku. napravite ga u dinamičkoj memoriji. ne znate koliko vam objekata treba. zavisi od dizajna m ehanizm a za skladištenje. Zatim bi neki pozadinski proces obavljao operacije nad objektim a iz tog kontejnera kada računar ne radi ništa drugo. Ako pokušavate da rešavate opštiji problem . tako što se objekti stavljaju na stek (oni se ponekad nazivaju i automatske ili vidljive. ova m etoda je previše restriktivna. ako je to mali avion. nekom drugom delu sistema m ožda je još uvek potreban.32 Misliti na Javi Možda imate i neki drugi sistem za zapisivanje podataka o avionim a o kojima ne treba neposredno voditi računa. Isti problem se može pojaviti i postati vrlo složen u m nogim drugim situacijam a i u program skim sistemim a (kao što je C++) u kojima m orate izričito da obrišete objekat kada s njim završite. upravljanje skladištem ili kontrolu vazdušnog saobraćaja. Sada je problem nešto teži: kako uopšte možete znati kada da uništite objekte? Kada završite sa objektom. pa je kontrola nad njim a veoma značajna u nekim situacijama. Znači. trajanje i tip objekata prilikom pisanja program a. scoped -pro m enljive) ili u statičku oblast za čuvanje. Veća fleksibilnost dinam ičkog pristupa je neophodna za rešavanje opštijih program skih problem a. . Java obezbeđuje tzv. Ako vam zatreba novi objekat. u trenutku kada vam je zatrebao. Vreme za koje se odvoji prostor u dinamičkoj m em oriji. p re đ s ta v lja ju sp ec ija la n slučaj. Odvajanje prostora na steku često se postiže samo asem blerskom naredbom da se pokazivač steka pom eri naniže i da se vrati nazad. heap). o k o iitn a ćete k a sn ije s a z n a ti više. Nameće se još i pitanje trajanja objekata. Drugi pristup je dinamičko stvaranje objekata u dinamičkoj oblasti memorije (engl. pa program eru prepušta izbor. Ta mesta im aju viso k p rio ritet i prostor se u njim a brzo zauzima i oslobađa. koristite rezervisanu reč new da biste napravili dinam ički prim erak tog objekta. sakupljač smeća (engl. Sve se to određuie kada program već radi (ovakav način pravljenja objekata zove se dinam ički). sve dok ne počne izvršavanje. niti kog su tipa. prevodilac određuje koliko dugo objekti traju i može automatski da ih uništi.engl. kada objekat stvorite dinamički. što može dovesti do„curenja" m em orije ako se to ne uradi ispravno (to je čest problem u program im a pisanim na C + + -u). zauzimanje memorijskog prostora traje znatno duže od odvajanja prostora na steku. P ro sti tip o v i. Pri ovom pristupu.' Svaki p u t kada želite da stvorite objekat. Gde se nalaze podaci iz objekta i kako se kontroliše trajanje objekta? C ++ zauzima stav da je najvažnija efikasnost. Međutim. prevodilac nema informacije o njegovom životnom veku. tim e žrtvujete fleksibilnost jer m orate da znate tačan broj. Dinamički pristup se zasniva na najčešće opravdanoj pretpostavci da su objekti složeni. Da bi se postigla maksimalna brzina izvršavanja. koliko će trajati. U jeziku kao što je C ++ m orate programski da odredite kada ćeteda uništite objekat. na prim er projektovanje pom oću računara (CAD). prilikom izvršavanja. Java isključivo koristi drugi pristup. garbage collector) koji automatski otkriva koji se objekat više ne upotrebljava i uništava ga. čuvanje i trajanje m ogu biti određeni prilikom pisanja program a. M ožda je to evidencija o planovim a leta malih aviona koji napuštaju aerodrom .

Javina obrada izuzetaka se izdvaja od drugih program skih jezika jer je ugradena od početka.dinam ički .uhvati“ (engl. Sakupljač smeća . To. paralelni put izvršavanja. kao i da postoji samo jedan način za pravljenje objekata ..te šeme lako može ispustiti iz vida. M nogo je m anje odluka koje treba da donesete i prepreka koje m orate da prevaziđete. Konačno. ali koje se lako mogu zaobići. iako su u objektno orijentisanim jezicima izuzeci obično predstavljeni objektima. sakupljač smeća vodi računa o problem u oslobađanja m em orije'(iako u to ne spadaju drugi aspekti čišćenja objekta).. po tom e što oni mogu da se ignorišu. Sem toga. Obrada izuzetaka: postupanje s greškama Još od prvobitnih program skih jezika. Izuzetak se ne može ignorisati i garantuje se da će biti obrađen u nekom trenutku. Izuzetak je objekat . često ste u prilici da sredite stvari i nastavite sa izvršavanjem. bačen izuzetak se razlikuje od vrednosti greške koja je vraćena iz m etode i od indikatora stanja koji ukazuje na grešku. To je jedini prihvatljivi način prijavljivanja grešaka. koji odgovarajući upravljač izuzecima koji obrađuje ođređeni tip grešaka. Projektanti biblioteka su iznašli polovične mere prim erene m nogim situacijama. O snovni problem sa svim šemam a za obradu grešaka je to što se oslanjaju na obazrivost program era. Pošto je teško napraviti dobru šem u za obradu grešaka. može da . Pošto ne morate stalno da proveravate da li je biio grešaka.zna“ kada se objekat više ne koristi i autom atski oslobađa m em oriju koju je zauzim ao taj objekat.bačen“ (engl. obrada izuzetaka ne m ora da se meša s vašim kodom koji se norm alno izvršava. obrada grešaka je bila jedna od najtežih oblasti. Kao da je obrada izuzetaka drugi. u m nogim jezicima zanemarena je ta oblast i to pitanje. U Javi. Još je bitnije što sakupljanje smeća obezbeđuje m nogo viši nivo zaštite od podm uklih problem a sa „curenjem" m em orije (koje je mnoge projekte pisane na jeziku C++ oborOo na kolena). thrown) s mesta greške. obično ignorisanjem. kojim može da se krene kada stvari pođu naopako. Ako program er nije obazriv . jer sm anjuje broj stavki na koje m orate da mislite i količinu koda koji m orate da napišete. pa ste prinuđeni da je koristite. izuzeci obezbeđuju da se pouzdano izvučete iz loše situacije. . catch). uz činjenicu da su svi objekti izvedeni iz jedne osnovne klase O bject. pisanje koda će najčešće biti jednostavnije. O brada izuzetaka ugrađuje obradu grešaka direktno u program ski jezik i ponekad čak i u operativni sistem. O brada izuzetaka je postojala i pre objektno orijentisanih jezika.. a problem se prepušta projektantim a bibJioteka. javiće se greška pri prevođenju. Ako ne napišete kod tako da pravilno obrađuje izuzetke.što se često dešava kad žuri . Zato što koristi poseban put za izvršavanje. Treba napom enuti da obrada izuzetaka nije sam o objektno orijentisana mogućnost. Umesto da samo izađete iz progrania.Poglavlje I : Upoznavanje sa objektima 33 Sakupljanje smeća je veoma korisno. i na ugovorene konvencije koje nisu nam etnute jezikom. Ova garantovana doslednost katkada znatno pojednostavljuje obradu grešaka.čini proces program iranja u Javi m nogo jednostavnijim od program iranja na jeziku C ++. čime dobijate mnogo robusnije program e.

Ako se sim ultano izvršava više niti koje očekuju da pristupe istom resursu. resursi koji mogu biti deljeni. Postoji ipak jedna začkoljica: deljeni resursi. . ali za to m orate da razumete sisteme klijent/server. jer je prebacivanje program a na novi tip računara bilo sporo i skupo. Odgovor nije odmah očigledan. ako operativni sistem podržava višeprocesorski rad. Ponekad su za obradu zadataka koji se m oraju odm ah izvršiti prekidi rada neophodni. pozabavi se nekim drugim problem om a zatim se vrati glavnom procesu. Na prim er. a ceo koncept paralelni rad (engl. umesto da bude prinuđen da čeka dok program ne završi tren u tn i zadatak. završi zadatak. Na početku. i tada one zaista m ogu da rade paralelno.. Znači. Program je logički podeljen na niti i ako računar ima više od jednog procesora. nit zaključa resurs. paralelni rad zvuči prilično jednostavno. program će se brže izvršavati. N itim a se obično raspodeljuje vreme jednog (i jedinog) procesora. Delovi koji se zasebno izvršavaju unutar program a nazivaju se niti (engl. m oraju biti zaključani dok se koriste. Paralelni rad je ugrađen u Javu. još jedan aspekt računarske obrade koji je pun zbunjujućih tema. korisnik m ože da pritisne dugm e i da dobije brz odziv. ali postoji velika klasa poslova u kojoj problem pokušavam o da izdelimo na više delova koji se izvršavaju zasebno i paralelno.34 Misliti na Javi Paralelni rad Osnovni koncept u računarskom program iranju jeste obrada više od jednog zadatka istovremeno. program eri koji su poznavali računar do najsitnijih pojedinosti. Iako je Java veoma korisna za rešavanje uobičajenih zasebnih program skih problem a. Java i Internet Ako je Java zapravo samo još jedan računarski program ski jezik. Šta je Web? Isprva Web može da deluje pom alo tajanstveno.prisustvu“ i „Iičnim prezentacijama“. pisali su prekidne servisne rutine. posle čega neko drugi može da ga koristi. Korisno je malo se udaljiti i sagledati šta Web zaista jeste. a Java SE5 ga d odatno podržava svojom bililiotekom. svaka nit može biti dodeljena različitim procesorima. Zbog podele program a na niti. pojaviće se problem. dva procesa ne mogu istovrem eno da šalju podatke istom štampaču. Nakon svega ovoga. ukoliko se posm atra iz tradicionalne program erske perspektive. M eđutim . Jedna od korisnih osobina paralelnog rada na nivou jezika jeste sledeća: program er ne m ora da brine postoji li jedan ili više procesora. a zatim otključa resurs. Mnogi programski poslovi zahtevaju da program može da zaustavi rad. Iako je sve to dobro radilo. bez ikakvih posebnih prilagođavanja. Da bi se rešio problem . Problem u se pristupalo na više načina. concurrency). bilo je teško i neprenosivo. Tipičan p rim er paralelnog rada je korisničko okruženje. još je važnije to što pom oću nje možete rešiti i program ske probleme koji se tiču Weba. m ožete se zapitati zašto je toliko važna i zašto se predstavlja kao revolucionarni korak u računarskom programi ranju. da bi ceo program brže reagovao. kao što je štam pač. a suspenzija glavnog procesa je inicirana preko hardverskog prekida. thread). uz celu priču o „krstarenju“. .

Ali. što je u stvarnosti znatno komplikovanije i skuplje nego što mislite. šta god vam padne na pam et. pa do slanja raznih vrsta podataka .uravnotežava“ raspored podataka u tabelama da bi postigao optim alno korišćenje. on m ora da se prevede. O na je zadužena za sve. pa je i najmanje zakašnjenje problematično. Bilo je teško osmisliti ih. Osnovni koncept klijent/server obrade. tu je i veoma bitno pitanje perform ansi: stotine klijenata mogu da postavljaju zahteve vašem serveru u bilo kom trenutku. middleware). znači. Konačno. i nešto više od toga. grupi ljudi ili računara. obrađuje ih i prikazuje na udaljenom računaru. Kada klijentski softver treba izmeniti.slanja informacija . preuzim a informacije. naučnih. Da bi se kašnjenje svelo na najm anju m eru. svaki put sm o smišljali novo rešenje. Skladište inform acija. Posebno je problem atično podržati više tipova računara i operativnih sistema. tako da program er . transaction processitig).Poglavlje I : Upoznavanje sa objektima 35 Klijent/server obrada O snovna ideja sistema klijent/server jeste postojanje centralnog skladišta inform acija neke vrste podataka. nazivaju se server. prebacujući deo obrade na klijentski računar. U konceptu klijent/server ključno je to što je skladište inform acija centralizovano tako da informacije m ogu da se m enjaju i da se te prom ene prenose svim korisnicima informacija. po zahtevu. softver koji šalje informacije i računar (računari) gde se softver i inform acije nalaze. nije previše složen. U početku je to bio jeđnostavan jednosmerni proces. To ne m orate da znate jer u datom trenutku brinete samo o povezivanju i interakciji s jednim serverom (iako možda pri tom lutate Mrežom tražeći odgovarajući server). ubrzo su ljudi poželeli da rade više od čistog prosleđivanja . sarađuje sa serverom. Uglavnom se koristi sistem za upravljanje bazam a podataka. I pored toga je veoma bitna: klijent/ server obrada nosi otprilike polovinu svih program skih aktivnosti. Ceo klijent/server problem trebalo bi sveobuhvatno da se reši. naziva se klijent. počev od uzimanja narudžbina. ili da se ti podaci ne izgube u procesu dodavanja u bazu. transakcija s kreditnim karticama. (Ovo se zove obrada transakcija .toliko je slojevita i složena da ceo problem đeluje beznadežno zagonetno. Softver koji se nalazi na korisničkom računaru. očisti od grešaka i instalira na klijentskim računarim a. To znači da m orate obezbediti da novi podaci jednog klijenta ne „pregaze'" nove podatke drugog klijenta. državnih. U prošlosti sm o se suočavali sa individualnim rešenjima individualnih problema.) Realizacija tako jednostavnog postupka . koristeći takozvane posrednike (engl. obično u bazi podataka . Vi ste ispostavljali zahtev serveru i on vam je prosleđivao datoteku koju je softver za čitanje (klijent) prevodio i formatirao na vašem lokalnom računaru. (Posrednici se takođe koriste da bi se olakšalo održavanje.koje hoćete da šaljete. a ponekad i na druge računare na serverskoj strani. Web kao džinovski server Web je u suštini jedan džinovski sistem klijent/server. teško su se upotrebljavala i korisnik ie m orao da uči nov interfejs za svako od tih rešenja. Problemi se javljaju jer im ate jedan server koji pokušava da opsluži više klijenata u isto vreme..engl. jer svi serveri i svi klijenti postoje zajedno i u isto vreme 11 samo jednoj mreži. program eri naporno rade da rasterete procesne zadatke.berzanskih. Sistemi često dozvoljavaju klijentim a i da dodaju informacije na server.

na primer. zato što je jači i jednostavniji. u direktorijum u koji se obično zove . a uz to se interpretira. bez o b /ira na procesor ili operativni sistem.iva.Python. Common Gateway Interface). da pretražuje baze na serveru. submit) podatke iz obrasca nazad serveru.) Prim enjeno je više pristupa rešenju ovog problema. Ti čitači su ipak bili prilično prim itivni i ubrzo su se zaglibili u zahtevima koji su im ispostavljani. Najčešća akcija je da se pokrene program koji se nalazi na serveru. održavanje Web stranica izgrađenih na CGI program im a može brzo da postane suviše složeno. Tekst koji se nalazi u poslatom paketu kazuje serveru šta s tim paketom da uradi. Elem entarni jezik za označavanje hiperteksta (HTML) ima jednostavne m ehanizm e za prikupljanje podataka: polja za tekst. To se naziva programiranje s klijentskestrane (engl. nije m ogao da izvrši ni najjednostavnije zadatke obrade.) Ti program i mogu biti napisani na skoro svim jezicima. client-sideprogramming). bio je po tp un o bezbedan. dakle ni da m u potencijalno donese grešku ili virus. Ovo slanje se obavlja preko interfejsa CGI (engl. jer na vašem računaru nije mogao da izvrši nijedan program . Odziv CGI program a zavisi od toga koliko podataka se šalje. kao i od opterećenja servera i Interneta. Za početak. kao i dugm e koje može biti program irano samo da obriše podatke u obrascu ili da pošalje (engl.. Često se pisalo na Perlu. dodaje nove informacije na server. ali je celokupnu interaktivnost obezbeđivao server. (Uz to. a postoji i problem s vrem enom od/. liste i padajuće liste. skoro je nem oguće dosledno ostvariti bilo koju vrstu dinamičkog crtanja grafika jer za svaku verziju grafika m ora da se napravi GIF slika a zatim prenese sa servera do klijenta. pokretanje CGI program a um e da bude sporo. Moglo je da prođe više sekundi ili m inuta dok ne otkrijete da ste nešto pogrešno otkucali. Oni nisu bili previše interaktivni. Drugi deo problema mogao je biti rešen samo ugrađivanjem u čitač mogućnosti za pokretanje program a na klijentskoj strani.. Bili smo svedoci tih prom ena u razvoju Weba. svaki p u t kada je trebalo uraditi nešto što zahteva program iranje. (Ako budete gledali adresno polje na vrhu svog čitača kada pritisnete neko dugm e na Web stranici. Na primer. Čitač Weba je označio veliki korak napred . ili da ostavi narudžbinu (što je sve zahtevalo posebne bezbednosne mere). Server je pravio statičke stranice za klijentski čitač koji ih je tum ačio i prikazivao.uveo je m ogućnost da se delići inform acija neizm enjeni prikazuju na bilo kom tipu računara.) Prvi projektanti Weba nisu predvideli koliko brzo će njegova propusnost da postane premala za nove vrste aplikacija.org ).cgi-bin“ negde u nu tar sveg onog zamešateljstva. Želeii su punu klijent/server kompatibilnost kako bi klijent bio u mogućnosti da vraća podatke mogućnost na server. pa može biti instaliran na bilo koji server. radio-dugm ad. Ipak. koji postoji na svim Web serverima. polja za potvrdu. (S druge strane.36 Misliti na Javi stranica sa servera. jer je on napravljen za rad s tekstom. Danas se sve više koristi Python ( www. m orali da vraćate informacije serveru na obradu. zagušivali su server i sam Internet jer ste. (GIF je akronim od Graphic Interchange Format.cgi-bin“. Pošto je čitač bio predviđen samo za pregled. poboljšani su grafički standardi da bi omogućili bolju animaciju i video prikaz u čitačima. form at za razmenu . ponekad ćete videti . M noge današnje m oćne VVeb stranice izgrađene su isključivo na CGI program im a. Programiranje s klijentske strane Početni dizajn Weba (server-čitač) om ogućavao je interaktivne sadržaje. s kojima možete da uradite gotovo sve.

Skript-jezici se obično prilično lako shvataju i pošto se pišu u delu HTML stranice. U principu. (D odatak treba da preuzm ete sam o jednom . a zatim vam vrati tu stranicu. Pritisnete dugm e za slanje na stranici. bez sum nje ste stekli neposredno iskustvo s proverom ispravnosti podataka na ulaznom obrascu. server pokrene CGI program koji otkrije grešku. Rešenje je program iranje s klijentske strane. Vrednost đodataka za program iranje s klijentske strane jeste to što oni omogućavaju stručnjaku da pravi nova proširenja i da ih dodaje čitaču bez odobrenja proizvođača čitača. ali je raznim čitačima trebalo m nogo vrem ena da dođu do . Dodaci Razvoj dodataka (engl. ipak ne pravite neke sofisticirane stvari pom oću skript-jezika. većina čitača Weba je svoju podršku za JavaScript realizovala na svoj jedinstveni način. dodaci predstavljaju „zadnja vrata“ koja om ogućavaju stvaranje novih jezika za program iranje s klijentske strane (iako nisu svi jezici realizovani kao dodaoi). Na kraju. Program iranje s klijentske strane znači da čitač Weba radi sav posao koji može da obavi. učitavaju se veoma brzo. Ovo ne samo da je sporo već je i zam orno. Param etri su gotovo isti. opet m orate da program irate. U daljem tekstu dajem o pregled pitanja i pristupa pri program iranju klijentske strane. Taj kod govori čitaču: . Postoji jedan skript-jezik koji većina čitača Weba podržava i bez ikakvog dodatka . Većina stonih računara na kojima rade čitači Weba sposobni su da urade ogrom an posao. ali je platform a drugačija: čitač Weba je sličan ograničenom operativnom sistemu. pa čak i od ostalih svojih verzija. Pomoću skript-jezika ugradujete izvorni kod program a za klijentsku stranu direktno u HTML stranicu. plug-ins) predstavlja jedan od najdužih koraka napred u program iranju s klijentske strane. form atira HTML stranicu obaveštavajući vas o grešci. Skript-jezici Dodaci su prouzrokovali razvoj skript-jezika za čitače. a s prvobitnim statičkim HTM L pristup om sam o su stajali i besposleno čekali da server isporuči sledeću stranicu. Stoga. pa ovaj nedostatak i nije neki problem . Nešto je popravila standardizacija JavaScripta u obliku ECMAScipta. jednim pristupom serveru na kome se nalazi ta stranica.to je JavaSoript (koji ima tek prolaznu sličnost s Javom. ali pisanje dodataka nije jednostavan zadatak i nije nešto što biste želeli da radite u okviru izgradnje odredene stranice. korisnik m nogo brže dobija rezultat a osećaj zajedništva p ri radu s Web stranicom je potpuniji. i m oraćete ga učiti zasebno). a dodatak koji tumači taj jezik autom atski se aktivira pri prikazivanju HTML stranice.Od sada možeš da obavljaš i ovu novu aktivnost“. i zato program iranje s klijentske strane povlači vrtoglav niz problem a i rešenja.) Preko dodataka su čitačima pridodata brza i m oćna proširenja.. Nažalost. drugačije od ostalih čitača. O nda vi m orate da se vratite na p reth o d n u stranicu i pokušate ponovo.) Pored toga. Program er dodaje novu funkcionalnost čitaču tako što korisnik u potrebnom trenutku preuzme deo koda koji se ugradi na odgovarajuće m esto u čitaču. Rasprave o program iranju s klijentske strane malo se razlikuju od rasprava o program iranju uopšte. Tako je nazvan sam o da bi prigrabio deo Javinog marketinškog uzleta.Poglavlje 1: Upoznavanje sa objektima 37 grafika. Nedostatak je to što je vaš kod izložen i svako može da ga vidi (i ukrade).

38

Misliti na Javi

tog nivoa (tom e je doprineo i M icrosoft, gurajući svoj VBScript koji pomalo liči na JavaScript). Da bi program m ogao da se izvršava na svim čitačim a,po pravilu ga m orate pisati koristeći najm anji zajednički imenilac svih postojećih verzija JavaScripta. Programska obrada grešaka, kao i otkrivanje i otldanjanje grešaka u toku pisanja program a, mogu se opisati sam o kao mučenje. Dokaz tili poteškoća je činjenica da je na JavaScriptu tek nedavno napisan zaista složen program (to je Googleov GMail), što je zahtevalo veliki trud i stručnost. Ovim se naglašava da su skript-jezici koji se koriste u nutar čitača Weba predviđeni da reše određene vrste problem a, prvenstveno da se naprave bogatija i interaktivnija grafička korisnička okruženja. Skript-jezik m ože da reši i do 80 procenata problem a koje srećemo pri program iranju s klijentske strane. Vaši problem i verovatno spadaju u tih 80 procenata, a kako skript-jezici om ogućuju lakši i brži rad, trebalo bi da razmislite o njim a pre nego što se upustite u m nogo zapetljanija rešenja, kao što je program iranje na Javi.

Java
Ako skript-jezici mogu da razreše 80 procenata problem a pri klijentskom program iranju, šta je s preostalih 20 procenata „zaista teških stvari“? Java je popularno rešenje za tih 20%. Pre svega, to je m oćan program ski jezik, siguran, m eđuplatform ski i internacionalan. Java se neprekidno širi: dodaju se nove m ogućnosti jezika i biblioteke koje mogu elegantno da reše problem e teške i u tradicionalnim program skim jezicima, kao što su istovremeni rad, pristup bazama, m režno program iranje i distribuirana obrada. Java dopušta program iranje s klijentske strane preko apleta i pom oću lava Web Starta. Aplet je mali program koji može da se izvršava samo unutar ćitača VVeba. Aplet se autom atski preuzim a kao deo Web stranice (kao što se, na prim er, automatski preuzima grafika). Kada se aplet aktivira, on izvršava program . Deo njegove pogodnosti je to što omogućava da autom atski distribuirate klijentski softver sa servera tek u trenutku kada je korisniku klijentski softver potreban, a ne ranije. Korisnik bespogovorno dobija najnoviju verziju klijentskog softvera i to bez složene ponovne instalacije. Zbog načina na koji je Java projektovana, program er treba da napravi samo jedan jedini program, a taj program autom atski radi na svim računarim a koji imaju čitače s podrškom za Javu. (Ovo, bez ikakve brige, obuhvata ogrom nu većinu računara.) Pošto je Java potpun programski jezik, možete uraditi sav posao koji je m oguć na klijentskoj strani, pre i posle postavljanja zahteva serveru. Na prim er, nem a potrebe da šaljete obrazac sa zahtevom preko Interneta kako biste otkrili da li ste pogrešili pri upisivanju datum a ili nekog drugog param etra; vaš računar može brzo da iscrtava grafike na osnovu podataka, um esto da čeka da ih server iscrta i vrati sliku. Pored trenutnog poboljšanja brzine i odziva, sm anjuju se ukupni mrežni saobraćaj i opterećenje servera i sprečava usporavanje celog Interneta.

Druge mogućnosti
Pošteno rečeno, Java apleti nisu opravdali velika početna očekivanja. Kada se Java tek pojavila, najviše se govorilo upravo o apletim a, jer je trebalo da oni najzad omoguće ozbiljno program iranje na klijentskoj strani, povećaju brzinu odziva i smanje protok podataka potreban Internet aplikacijama. Predviđale su se ogrom ne mogućnosti.

Poglavlje 1: Upoznavanje sa objektima

39

Na Webu se zaista m ogu naći i veoma pam etni apleti, ali do sveopšteg prelaska na aplete nije došlo. Verovatno je najveći problem bila veličina Javinog izvršnog okruženja (Java Runtim e Environm ent, JRE) od 10 MB, koje je trebalo preuzeti s Weba i instalirati, što je uplašilo prosečnog korisnika. Sudbinu im je m ožda zapečatila činjenica da je Microsoft odlučio da JRE ne isporučuje kao deo svog Internet Explorera. U svakom slučaju, Java apleti se nisu proširili posvuda. Bez obzira na to, u nekim situacijama Java aplete i Java Web Start aplikacije još uvek vredi imati. Ukoliko upravljate računarim a korisnika, recimo unutar preduzeća, bilo bi p am etno da distribuciju i ažuriranje klijentskih aplikacija obavljate pom oću ovih tehnologija, jer ćete tim e uštedeti znatnu količinu vrem ena, tru d a i novca, naročito ako m orate često da ažurirate njihov softver. U poglavlju Grafička korisnička okruženja upoznaćem o Flex, novu Adobeovu tehnologiju koja obećava - u njom e se prave Flash apleti. Pošto više od 98 procenata svih čitača Weba im a Flash Player (na W indowsu, Linuxu i M acu), m ožem o sm atrati da je on usvojen standard. Flash Player se instalira i ažurira lako i brzo. Jezik ActionScript je napravljen na osnovu ECMAScripta i stoga je prilično poznat, ali Flex omogućava program iranje bez brige o specifičnostima raznih čitača - zato je daleko privlačniji od JavaScripta. Pri program iranju na klijentskoj strani, ovu m ogućnost vredi razm otriti.

.NETi C#
Neko vrem e je glavni konkurent Java apleta bio Microsoftov ActiveX, iako samo na W indovvs računarim a. O tad je M icrosoft napravio prvog pravog konkurenta celoj Javi u liku platform e .NET i program skog jezika C#. Platform a .NET je približno isto što i Javina virtuelna mašina (Java Virtual Machine , JVM) plus Java biblioteke. JVM je softverska platform a na kojoj se izvršavaju java program i, a C# ima velike sličnosti s Javom. Bez sum nje, radi se o dosad najboljem Microsoftovom proizvodu na području program skih jezika i program skih okruženja. Naravno, Microsoft je imao veliku prednost jer je mogao da uči na tuđim greškama, ali je bogami naučio. Prvi put od svog nastanka, Java je dobila pravu konkurenciju. Zato su projektanti Jave u Sunu dobro pogledali C#, dobro razmislili o tom e zašto bi program eri hteli da pređu na C#, i odgovorili: načinili su fundam entalna poboljšanja Jave - Javu SE5. T renutno je najveća siabost .NET-a važno pitanje da li će Microsoft dozvoliti njegovo potpm io prenošenje na đruge platforme. Microsoft tvrdi da se to može napraviti bez problema, i već postoji delimična realizacija .NET-a koja radi na Linuxu (projekat Mono, www.gomono.com ), ali dok se ne napravi potpuna realizacija iz koje M icrosoft nije ništa izbacio, .NET je rizično sm atrati rešenjem za sve platforme.

Internet i intranet
Wcl> je najopštije rešenje problem a klijent/server, pa je logično da istu tehnologiju upotrebite i da biste rešili podgrupu tog problem a, posebno klasični problem klijent/server um itar preduzeća. Pri tradicionalnom pristupu klijent/server, postoji problem zbog raznih tipova računara kao i problem zbog teškog instaliranja novog klijentskog softvera. Oba problem a dobro su rešena pom oću čitača Weba i program iranja s klijentske strane.

40

Misliti na Javi

Kada se tehnologija Weba koristi za inform acionu m režu ograničenu na određeno preduzeće, to nazivamo intranet. Intranet obezbeđuje m nogo veću sigurnost nego Internet jer pristup serverima u preduzeću možete fizički da kontrolišete. Izgleda da korisnici, kadajednom shvate osnovni princip rada čitača, m nogo lakše izlaze na kraj s različitim izgledima stranica i apleta, pa brže uče nove sisteme. Problem s bezbednošću svrstava nas u jednu od grupa koje se obrazuju, čini se, po autom atizm u, u svetu klijent/server program iranja. Ako se vaš program izvršava na Internetu, ne znate na kojoj platform i će on raditi i želite da budete sasvim sigurni da ne širite neispravan kod. Treba vam nešto nezavisno od platform e i bezbeđno, kao što su skript-jezik ili Java. Ako radite na intranetu, pred vas se postavljaju drugačija ograničenja. Nije neuobičajeno da svi računari budu platform e Intel/W indows. Na intranetu ste sami odgovorni za kvalitet svog program a i možete da otklanjate greške kako se koja otkriva. Pored toga, možda već imate dosta nasleđenog koda koji ste koristili za tradicionalniji klijent/server pristup, pri čemu m orate fizički da instalirate ldijentske program e svaki p u t kada radite na poboljšanju. Vreme protraćeno na instaliranje poboljšanja pruža razlog više da pređem o na čitače gde su poboljšanja nevidljiva i autom atska. (Ovaj problem rešava i Java Web Start.) Ako imate posla s takvim intranetom , najrazboritiji pristup je da krenete najkraćim putem koji vam omogućava da koristite postojeću bazu koda, um esto da ponovo pišete program e na novom jeziku. Kada se suočite sa ovim zbunjujućim nizom rešenia za program iranje s klijentske strane, najbolji plan napada je analiza isplativosti. Razm otrite ograničenja koja vaš problem nameće i najkraći put do rešenja. Pošto je program iranje s Jdijentske strane ipak programiranje, uvek je dobro odabrati pristup koji omogućava najbrži razvoj u određenoj situaciji. Ovo je hrabar stav koji vas priprem a za neizbežne susrete s problem im a u razvoju programa.

Programiranje sa serverske strane
Do sada je pitanje program iranja sa serverske strane bilo zanem areno, a baš tu je po mišljenju mnogih Java imala najveće uspehe. Šta se dešava kada pošaljete zahtev serveru? Najčešće zahtevi glase: „Pošalji mi ovu datoteku". Vaš čitač zatim tum ači tu datoteku na odgovarajući način: kao HTML stranicu, sliku, Java aplet, skript itd. U složenije zahteve serveru obično spadaju i transakcije s bazama podataka. O bično se zahteva kompleksna pretraga baze podataka, koju server zatim form atira u HTML stranicu i šalje kao rezultat. (Naravno, ako je klijent inteligentniji, zato što sadrži kod na Javi ili skript-jeziku, mogu se slati neobrađeni podaci, a potom form atirati na strani klijenta, što bi bilo brže i manje bi opterećivalo server.) M ožda biste poželeli da registrujete svoje ime u bazi podataka kada pristupate nekoj grupi ili ostavljate narudžbinu, što će izazvati prom ene u toj bazi. Pisanje program a koji obrađuju takve zahteve na serveru naziva se program iranje sa serverske strane (engl. server-side programming). Program iranje sa serverske strane obavlja se na Perlu, Pythonu, C + + -u ili nekom drugom jeziku za pisanje CGI program a, ali pojavili su se i napredniji sistemi. M eđu njim a su i Web serveri zasnovani na Javi, koji omogućavaju pisanje takozvanih servleta. Kompanije koje razvijaju Web

Poglav[je 1: Upoznavanje sa objektima

41

stranice prelaze na Javu zbog tehnologije servleta i iz njih izvedenih JSP strana, najviše zato što se tim e isključuju problem i pri radu sa čitačima različitih m ogučnosti. Programiranje sa scrverske strane razm otreno je u knjizi Thitikingin Enterprise Java, koju možete nači na adresi www.MindView.net. Uprkos tom e što se o Javi priča sam o u vezi sa Internetom , ona je programski jezik opšte nam ene pom oću kogae možete rešiti bilo koji tip problem a, kao i pom oću drugih jezika. Tu Javina snaga nije samo u prenosivosti, već i u lakoći program iranja, robusnosti, velikoj standardnoj biblioteci i brojnim bibliotekama drugih proizvođača koje se stalno razvijaju.

Sažetak
Znate kako izgleda proceduralni program : definiciie podataka i pozivi funkcija. Da biste pronašli svrhu takvog program a, m orate malo da se pom učite i pregledate pozive funkcija i koncepte niskog nivoa kako biste stvorili m odel u glavi. Zbog toga nam treba posredno predstavljanje kada projektujem o proceduralni program : sami za sebe, ti program i m ogu da zbunjuju jer su načini izražavanja usm ereni više ka računaru nego ka problem u koji rešavamo. Pošto OOP dodaje m noge nove ideje onim a koje nalazite u proceduralnim jezicima, možda mislite da će Java program biti m nogo komplikovaniji nego ekvivalentni C program. Bićete prijatno iznenađeni: dobro napisan Java program je uglavnom daleko jednostavniji i m nogo razumljiviji od ekvivalentnog C program a. Imaćete definicije objekata koji predstavljaju ideje u vašem prostoru problem a (um esto pitanja računarskog prikaza) i poruke poslate tim objektima koje predstavljaju aktivnosti u tom prostoru. D obra strana u objektno orijentisanom program iranju jeste ta što je uz dobro projektovan program lako razumeti kod pri čitanju. O bično ima i znatno m anje koda, jer ćete m noge svoje probleme rešiti ponovnim korišćenjem postojećeg koda iz biblioteka. O O P i Java ne m oraju da budu za svakoga. Važno je da procenite svoje potrebe i odlučite da li će ih lava optim alno zadovoljiti ili bi bilo bolje da radite s nekim drugim programskim sistemom (uključujući onaj koji tren u tno koristite). Ako znate da će vaše potrebe biti usko specijalizovane u bliskoj budućnosti i ako imate specifična ograničenja koja Java m ožda ne može da zadovolji, onda ispitajte ostale raspoložive m ogućnosti. Konkretno, preporučujem da razm otrite Python; posetite www.Python.org. Ako ipak izaberete Javu, barem ćete znati koje ste m ogućnosti imali i zašto ste baš nju izabrali.

Sve je objekat
,,Da govorimo drugačiji jezik, percipirali bismo tiešto drugačiji svet.“ Ludwig Witgenstein (1889-1951) Iako je zasnovana na C++-U, Javaje čistiji objektno orijentisani jezik.
JAVA I C ++ SU H IB R ID N IJE Z IC I ALI SU PROJEKTANTI JAVE SMATRALI DA HIBRID IZA CIJA NIJE toliko bitna kao u C++-U. U h ibridnom jeziku može se koristiti više program skih stilova; C++ je hibridan da bi obezbedio povratnu kom patibilnost s jezikom C. Pošto je C++ nadskup jezika C, on sadrži i m noge nepoželjne nasleđene osobine koje previše komplikuju neke aspekte C++-a. Jezik Java je napravljen za one koji žele da se bave samo objektno orijentisanim program iranjem . Pre nego što se uopšte upustite u program iranje, m orate početi da razmišljate objektno-orijentisano (osim ako već ne razmišljate tako). Ovaj početni napor će vam se isplatiti jer ćete biti sposobni da program irate na jeziku koji se uči i koristi jednostavnije od mnogih drugih O O P jezika. U ovom poglavlju razm atraćem o osnovne delove Java program a i naučićemo da je u Javi (gotovo) sve objekat.

Rad sa objektima preko referenci
Svaki program ski jezik ima svoje načine za rad sa elem entim a u m emoriji. Program er često ne sme da gubi iz vida način rada koji se primenjuje. Da li sa elem entom radite direktno ili preko posrednog predstavljanja (pokazivač u C-u ili C + + -u ), koje se opisuje posebnom sintaksom? Sve ovo je pojednostavljeno u Javi. Sve tretirate kao objekat, istom doslednom sintaksom koju koristite svuda. Iako vi sve tretirate kao objekat, identifikator s kojim radite je, u stvari, ,,referenca“ na objekat.1Zamislite televizor (objekat) s daljinskim upravljačem (referenca). Sve dok držite tu referencu, imate vezu s televizorom, ali kada neko kaže da promenite kanal ili da utišate zvuk, vi radite s referencom koja menja objekat. Ako želite da se šetate po sobi, a da i dalje podešavate televizor, ponećete daljinski/referencu, a ne televizor.
O v d e m o že d o ć i d o n esu g lasica. Im a lju d i koji k ažu : „ O čito , to jc pokazivač", ali tak av iskaz već sadrži p re tp o s ta v k e o realizaciji. Po svojoj s in ta k si, Java refe re n c e su m n o g o s ro d n ije C + + re fe re n c a m a nego p o k a ziv ač im a . U p rv o m iz d a n ju ove k n jig e o d a b ra o sa m n o v te rm in „ id e n tifik a to r (en g l. hnm U c )“ jcr iz m e đ u re fe re n c i u C + + - u i re fe re n c i u Javi p o s to je b itn e razlike. Izlazio sa m iz C + + - a i n isa m želeo d a z b u n ju je m p ro g ra m e re u C + + - u , za k oje sa m s m a tra o d a će b iti n a jb ro jn iji k o risn ic i Jave. Pre n e g o što sam p rip re m io d ru g o iz d a n je, v id e o sa m d a je češće k o rišć en te rm in re fe re n c a, p o š to svako ko p relazi sa C + + - a m o ra d a savlada m n o g c d ru g e p o jm o v e p o rc d te rm in o lo g ije re fe re n c i, još jc d a n p o ja m neće p rev iše s m e ta ti. M e d u tim , neki se n e slažu č ak ni sa te rm in o m re fe re n c a. U je d n o j knjizi tv rd i se kak o je „ p o tp u n o p o g re š n o rcći d a Java p o d rž a v a p ro s le d iv a n je p re k o rc fe re n c i1 1je r su id e n tifik ato ri o b je k a ta u Javi (p o to m a u to r u ) u s /iw /„ o b je k ti re fe re n c i“. A p o š to se svc (k a k o d aljc tv rd i) u stva ri p ro s le d u je p o v re d n o s ti, vi n e o b a v lja te p ro s le d iv a n je p re k o rc fc rc n c i već „ p ro s le đ u jc te o b je k te re fe rc n c i p o v re d n o s ti“. M o že se d is k u to v a ti o p re c iz n o sti ta k o z a m rše n ih o b ja šn je n ja , ali sm a tra m d a m o j p ris tu p p o je d n o sta v lju je s h v a ta n je k o n c e p ta , bcz ik akvih g u b ita k a (p a , te o re tič a ri jezika m o g u d a tv rd e d a vas Iažem , ali ja ć u reći d a o b e z b e d u je m o d g o v a ra ju ć u a p s tra k c iju ).

Poglavjje 2: Sve je objekat

43

Daljinski upravljač može da postoji sam za sebe, bez televizora. O dnosno, to što imate referencu, ne znači da obavezno im ate i objekat povezan s njom . Ako želite da čuvate reč ili rečenicu, treba da napravite referencu na objekat ldase String:
String

s;

Ali, ovim ste napravili satno referencu, ne i sam objekat. Ako pokušate u ovom trenutku da pošaljete poruku preko s, dobičete grešku pošto s u stvari nije povezano ni sa čim (nem a televizora). Zato je sigurnije da uvek inicijalizujete referencu kada je pravite:
String s = "asdf";

Ovde se koristi posebna osobina Jave: znakovni niz se m ože inicijalizovati tekstom pod navodnicim a. Obično, za objekte m orate da koristite opštiji tip inicijalizacije.

Morate da napravite sve objekte
Kada napravite referencu, želite i da je povežete s novim objektom . Po pravilu, to radite pom oču rezervisane reči new kojom se kaže: „Napravi m i ovakav nov objekat“. Znači, u gornjem prim eru možete napisati:
String

s =

n ew S t r i n g

("asdf");

Ovo ne samo da znači: „Napravi mi nov objekat klase S trin g “, več daje i inform aciju o tom e kako da se taj objekat napravi, tako što se navodi početni znakovni niz. Pored tipa String Java ima obilje drugih unapred definisanih tipova. M nogo je važnije da možete napraviti svoje tipove. U stvari, to je osnovna aktivnost u program iranju na Javi i o tome čete učiti u ovoj knjizi.

Gde se nalazi skladište
Korisno je predstaviti neke aspekte izvršavanja program a, a posebno kako je organizovana memorija. Postoji pet različitih mesta za skladištenje podataka: 1. Registri: Tu se najbrže skladište pođaci jer su registri ođvojeni od ostalih skladišta: nalaze se unutar procesora. M eđutim, broj registara je veoma ograničen, pa se registri automatski dodeljuju u skladu s potrebam a. Vi nem ate direktnu lcontrolu, niti u vašem program u vidite ijedan dokaz da registri uopšte postoje. (S druge strane, C i C ++ omogućavaju da prevodiocu sugerišete dodelu registara.) 2. Stek: Naiazi se u radnoj m emoriji, ali ga procesor direktno kontroliše preko pokazivača stcka (engl. stack pointer). Pokazivač steka se pom era naniže da bi zauzeo novu m emoriju, a pom era se naviše da bi tu m em oriju oslobodio. Ovo je veoma brz i efikasan način za dodeljivanje skladišta, od koga su brži samo registri. )ava sistem mora da zna, dok pravi program , tačan životni vek svih stavki koji se čuvaju na steku. Ovo ograničenje omeđava fleksibilnost vašeg program a, pa dok se neka Javina skladišta nalaze na steku - posebno reference na objekte - sami objekti se ne ćuvaju na steku.

44

Misliti na Javi

3. Dinamička memorija: To je oblast m em orije opšte nam ene (takođe u radnoj mem oriji) gde obitavaju svi objekti. D obra strana dinamičke m em orije jeste to što, za razliku od steka, prevodilac ne m ora da zna koliko dugo dodeljeno skladište m ora da ostane u dinamičkoj m em oriji. Stoga im am o veliku fleksibilnost pri korišćenju dinam ičke memorije. Kad god vam zatreba neki objekat, napišite kod za njegovo pravljenje koristeći new, i skladište će se napraviti u dinamičkoj memoriji. Naravno, m orate platiti ovu fleksibilnost: skladište u dinamičkoj m em oriji duže se pravi nego skladište na steku (kad biste uopšte mogli da napravite objekte na steku u Javi, kao što možete u C + + -u). 4. Konstantno skladište: K onstantne vrednosti često se um eću direktno u kod program a što je bezbedno jer se one nikad ne m ogu prom eniti. Ponekad se konstante izdvojeno grupišu kako bi opciono mogle da se stave u ROM m em oriju (m em orija samo za čitanje; engl. read-only memory), što se radi u računarim a ugrađenim u druge uređaje.2 5. Skladišta van radne memorije: Ako su podaci p otpuno izvan program a, oni mogu da postoje i kada se program ne izvršava, izvan kontrole program a. Dva osnovna prim era za ovo su objekti u tokovima podataka (engl. streamed objects), što su objekti pretvoreni u tok bajtova, obično da bi se poslali na drugu m ašinu, i trajni objekti (engl. persistent objects), što su objekti stavljeni na disk da bi sačuvali svoje stanje čak i kada se program završi. U ovim skladištima teško je pretvoriti objekte u nešto što može da postoji na drugom m edijum u, a što može da postane regularni m em orijski objekat kada je potrebno. Java obezbeđuje podršku za laku trajnost (engl. lightvveight persistencc), a m ehanizm i kao što su JDBC i Hibernate obezbeđuju sofisticiraniju podršku za skladištenje i preuzim anje inform acija o objektima u bazama podataka.

Specijalan slučaj: prosti tipovi
Jedna grupa tipova koji se često koriste u program iranju ima poseban tretm an; možete ih sm atrati osnovnim tipovima. Taj poseban tretm an je neophodan iz sledećeg razloga: ako napravite objekat operatorom new - posebno malu, jednostavnu promenljivu - to neće biti baš efikasno jer new postavlja objekte u dinam ičku mem oriju. Za ove tipove Java se vraća na pristup koji imaju C i C++: um esto da napravi promenljivu korišćenjem operatora new, pravi autom atsku prom enljivu koja nijc referenca. Promenljiva direktno čuva vrednost i rad s njom je m nogo efikasniji jer se čuva na steku. Java unapred odreduje veličinu svakog prostog tipa. Ove veličine se ne menjaju od jednog do drugog računara, kao što je slučaj u većini jezika. Nepromenljivost veličina je jedan od razloga zbog kog su program i na Javi prenosiviji nego oni na većini drugih jezika.

P r im e r za to je sk lad ište z n a k o v n ih n izo v a. U p o s e b n o m d e lu m e m o rije s n e p ro m e n ljiv o m (statičk o m ) a d re so m , a u to m a ts k i se s ld a d ište svi lite ra ln i z n a k o v n i nizovi i k o n s ta n tn i izrazi ćiji je re z u lta t zn ak o v n i niz.

Poglavlje 2: Sveje objekat

45

Prost tip

Veličina u bitovima

M inimum

Maksimum

Om otački tip

boolean char byte short int long float double void

16 8 16 32 64 32 64 -

Unicode 0 -128 -2'5 -23' -26 3 IEEE754 IEEE754 -

Unicode 2'6 -l + 127 +2I5 -I +23 '-l +26 3 -l IEEE754 IEEE754 -

Boolean Character Byte Short Integer Long Float Double Void

Svi num erički tipovi su označeni (sadrže i pozitivne i negativne vrednosti), stoga ne tražite neoznačene tipove. Veličina tipa boolean nije izričito definisana; zadato je samo da može da im a vrednosti true ili false. Om otačkc klase za proste tipove podataka omogućavaju da u dinamičkoj m em oriji napravite objekat koji predstavlja određen prost tip. Na primer:
char c = 'x 1;

C h a r a c t e r ch = n e w C h a r a c t e r ( c ) ;

Možete takođe da koristite:
C h a r a c t e r ch = n e w C h a r a c t e r ( 'x ');

Java SE5 automatskim pakovanjem pretvara (omotava) proste tipove u objekte:
C h a r a c t e r ch = 'x ';

i automatskim raspakivanjem ponovo ih pretvara u proste tipove: char
c

= ch;

Razlozi za om otavanje (pretvaranje) prostih tipova u objekte biće prikazani dalje u knjizi.

Brojevi visoke preciznosti
Java sadrži dve klase za obavljanje aritm etičkih operacija visoke preciznosti: B iglnteger i BigDecimal. Iako one otprilike potpadaju pod istu kategoriju kao i om otačke klase, nijedna nema analogni prost tip. O be klase imaju m etode koje obezbeduju operacije analogne onim a koje obavljate nad prostim tipovima. O dnosno, s klasama B iglnteger i BigDecimal možete uraditi sve što i sa tipovim a in t ili float, samo m orate koristiti m etode umesto operatora. A pošto je zađatak komplikovaniji, operacije će liiti sporije. Brzinu zamenjujete tačnošću.

46

Misliti na Javi

Biglnteger podržava celobrojne vrednosti proizvoljne veličine. To znači da možete tačno predstaviti celobrojne vrednosti bilo koje veličine, a da pri operacijam a ne izgubite informacije. BigDecimal služi za brojeve s pokretnim zarezom proizvoljne veličine; njih možete, na primer, koristiti za precizna novčana izračunavanja. U dokum entaciji JDK potražite pojedinosti o konstruktorim a i m etodam a ove dve klase.

Nizovi u Javi
Praktično svi program ski jezici podržavaju neku vrstu nizova. Korišćenje nizova u C -u i C + + - U rizično je jer su ti nizovi samo blokovi m em orije. Ako program pristupi nizu izvan njegovog m em orijskog bloka ili koristi m em oriju pre inicijalizacije (što su česte greške u program iranju), doći će do nepredvidljivih situacija. Jedan od osnovnih ciljeva Jave je sigurnost; u njoj se uopšte ne pojavljuju m nogi problemi koji muče program ere u C-u i C + + -u. U Javi je niz garantovano inicijalizovan i ne može m u se pristupiti van njegovog opsega. Opseg se proverava po cenu male količine dodatnog utroška m em orije u svakom nizu, kao i uz proveru indeksa pri izvršavanju, ali se pretpostavlja da su sigurnost i povećana produktivnost vredni toga (a Java katkada može da optim izuje te operacije). Kada pravite niz objekata, vi, u stvari, pravite niz referenci, i svaka od tih referenci autom atski se inicijalizuje na posebnu vrednost. Za tu vrednost koristi se rezervisana reč null. Kada Java naiđe na null, ona prepoznaje da dotična referenca ne pokazuje na objekat. Pre nego što je upotrebite, svakoj referenci m orate da dodclite objekat, i ako pokušate da koristite referencu koja još uvek ima vrednost null, problem će biti prijavljen pri izvršavanju. Na taj način su tipične greške s nizovima predupređene 11 Javi. Možete da napravite i niz prostih tipova. Ponovo, prevodilac garantuje ispravnu inicijalizaciju jer m em oriju za taj niz puni nulama. Nizovi će biti detaljnije objašnjeni u narednim poglavljima.

Nikada ne morate da uništite objekat
Ostvarenje koncepta životnog veka prom enljive u većini program skih jezika vrlo je naporno. Koliko dugo traje promenljiva? Ako treba da je uništite, kada bi to trebalo da uradite? Konfuzija zbog životnog veka prom enljive može da đovede do mnogih grešaka, a u ovom odeljku pokazujem o da Java znatno pojednostavljuje ovo pitanje, obavljajući umesto vas sve čišćenje.

Oblast važenja
Većina proceduralnih jezika počiva na oblasti važcnjn (engl. scope). O na određuje vidljivost i životni vek imena definisanih u n u tar te oblasti. U C-u, C + + -u i Javi oblast važenja je određena vitičastim zagradam a { }. Na prim er:

Poglavjje 2: Sveje objekat

47

{
int X = 12; / / d o s t u p n a j e s am o p r o m e r l j i v a x

{
int q = 96; // d o s t u p n e su i x i q / / d o s t u p n a j e sa mo x / / q j e " i zvan ob l a s t i važenja"

} Promenljiva definisana unutar oblasti važenja dostupna je samo do kraja te oblasti. Sav tekst nakon ’/ / ’ pa do kraja reda predstavlja komentar. Uvlačenje pom aže da se program pisan u Javi lakše čita. Pošto je Java jezik slobodne forme, dodatni razmaci, tabulatori i novi redovi ne utiču na rezultujući program. U Javi ne tnožete da uradite sledeće, iako je to dozvoljeno u C-u i C++-u: {
int x = 12;

{
int x = 96; // n e p r o p i s n o

} } Prevodilac će ol)javiti da je prom enljiva x već definisana. Stoga mogućnost C-a i C++a da sakrije promenljive u većoj oblasti nije dozvoljena, je rsu projektanti Jave mislili da to vodi do program a koji zbunjuju.

Oblast važenja objekata
O bjekti u (avi nem aju isti životni vek kao prosti tipovi. Kada napravite objekat u Javi koristeći operator new, on postoji i nakon kraja oblasti važenja u kojoj je napravljen. Stoga, ako koristite: {
S t r i n g s = n ew S t r i n g } // kraj oblasti ("neki znakov ni niz"); važenja

referenca s će nestati na kraju oblasti važenja. M eđutim, objekat klase String na koji je s ukazivala još uvek zauzima mem oriju. U ovom deliću koda neina načina da pristupite objektu nakon oblasti važenja, jer je jedina referenca na njega nedostupna izvan oblasti važenja. Dalje u knjizi videćete kako reference na objekte mogu da se prosleđuju i um nožavaju celim tokom programa. Pošto se objekti napravljeni pom oću operatora new zadržavaju dokle god su vam potrebni, ispostavlja se da mnoštvo problem a u program iranju u C + + -u ne postoji u Javi. U C + + -u se m orate pobrinuti ne sam o za to da objekti postoje đolde god su vam potrebni, nego ih m orate i uništiti kada s njim a završite.

48

Misliti na Javi

Zbog toga se postavlja važno pitanje. Ako Java ostavlja objekte da leže unaokolo, šta ih sprečava da prepune m em oriju i zaustave program? Upravo bi se ta vrsta problem a pojavila u C ++-u. Na ovom mestu deluje malo magije. Java ima sakupljač smeća (engl. garbage collector); on vodi računa o svim objektima koji su napravljeni operatorom new i otkriva one na koje više nema referenci. Zatim oslobađa m em oriju koju su zauzimali ti objekti, pa ta m em orija može da se koristi za nove objekte. To znači da nikada ne m orate sami da se brinete o oslobađanju memorije. Samo napravite objekte, a kada vam više nisu potrebni, oni će sami otići. Ovo eliminiše jednu klasu program skih problem a, takozvano curenje memorije (engl. memory leak), pri kome program er zaboravi da oslobodi m em oriju.

Pravljenje novih tipova podataka: kfasa
Ako je sve objekat, šta određuje kako određeni objekti izgledaju i kako se ponašaju? D rugim rečima, šta uspostavlja tip objekta? Možete očekivati da postoji rezervisana reč ,,tip“, i to bi svakako imalo smisla. H ronološki posm atrano, većina objektno orijentisanih jezika koristila je rezervisanu reč class da naznači: „Upravo ću ti reći kako novi tip objekta izgleda“. Tii rezervisanu reč (koja je toliko česta da neće biti pisana polucrno dalje kroz knjigu) prati ime novog tipa. Na primer:
class NekoImeTipa { /* t e l o kl a s e ide o v d e */ }

Ovo uvodi nov tip, iako se telo klase sastoji samo od kom entara (zvezdica i kosa crta i ono što je izm eđu tih znakova, o čem u će biti reči đalje u ovom poglavlju), pa malo šta možete s njom da uradite. M eđutim, rnožete da napravite objekat ovog tipa koristeći new:
NekoI m e T i p a a = new N e k o I m e T i p a ( ) ;

Ali klasi ne možete reći da mnogo toga uradi (tj. ne možete joj poslati neke važne poruke) sve dok ne definišete neke njene metode.

Polja i metode
Kada definišete lclasu (a sve što radite u Javi jeste definisanje klasa, pravljenje objekata tih klasa i slanje poruka tim objektim a), u nju možete staviti dve vrste elemenata: polja (koja se ponekad nazivaju i podaci članovi) i metode (koje se katkada nazivaju fimkcije članice). Polje je neki od prostih tipova ili objekat bilo kog tipa, s kojim možete da se povežete putem njegove reference. Reference na objekte m orate da indjalizujete (koristeći new, kao što ste videli ranije), da biste ih povezali sa stvarnim objektima. Svaki objekat ima zasebno skladište za svoja polja; obično se polja ne dele između objekata iste klase. Evo prim era klase s nekim poljima:
cla s s S a m o P o d a c i int i ; d o u b l e d; b o o l e a n b; {

I

Poglavlje 2 : Sve je objekat

49

Ova klasa ne radi ništa, sem što čuva neke podatke. Ali ovako možete da napravite objekat: SamoPodaci podaci = new SamoPodaci(); Poljima možete dodeliti vrednosti, ali prvo m orate da znate kako da se obratite članu nekog objekta. To se postiže tako što se navede im e reference na taj objekat, zatim sledi tačka pa im e člana u nu tar objekta:
r e f e r e n c a N a O b j e k a t .polj e

Na prim er:
podaci .i = 4 7 ; p o d a c i . d = 1.1; p o d a c i . b = false;

Vaš objekat može da sadrži i druge objekte koji sadrže podatke. Samo nastavite da ,,nadovezujete tačke“. Na prim er:
m o j A v i o n . l e v i R e z e r v o a r . k a p a c i t e t = 100;

Klasa SamoPodaci ne može skoro ništa da uradi osim da čuva podatke, jer nem a metode. Da biste shvatili metode, prvo m orate da naučite šta su argumenti i povratne vrednosti (ubrzo će biti opisani).

Podrazumevane vrednosti za podatke prostog tipa
Ako podatak prostog tipa ne inicijalizujete, on će dobiti podrazum evanu vrednost:
Prost tip Podrazumevana vrednost

boole<an char byte short mt long float double

talse "\u0000" (nullj |byte)0 (short)O 0 0L O.Of O.Od

Dobro obratite pažnju na to da Java jamči dodelu podrazum evanih vrednosti samo kada se promenljiva koristi kao članica klase. To obezbeđuje da prom enljive članice prostog tipa uvek budu inicijalizovane (to C ++ ne radi), čime se sm anjuje izvor grešaka. Ipak, ova početna vrednost ne m ora da bude ispravna niti odgovarajuća za program koji pišete. Najbolje je da uvek izričito inicijalizujete svoje promenljive.

50

Misliti na Javi

O va garan cija se ne o d n o si na lokalne pro m en ljiv e - o n e koje nisu polja klase. Stoga, ako u n u ta r definicije m eto d e im ate:
in t x;

x će im ati p ro izv o ljn u v red n o st (kao i u C -u i C + + -u ) i neće au to m a tsk i biti inicijalizovan n a nulu . Pre nego što u p o treb ite x, sam i m u m o ra te d o d e iiti o d g o v araju ću v red n o st. Ako ste zaboravili, Java je uvela pob o ljšan je u o d n o su na C + + : d o b ićete grešku p ri p rev o đ en ju koja vam govori da p ro m en ljiv a m o žd a nije bila inicijalizovana. (M n o g i C + + prevodioci će vas u p o z o riti na neinicijalizovane prom enljive, ali u Javi se o n e sm a tra ju greškam a.)

Metode, argumenti i povratne vrednosti
U m n o g im jezicim a (recim o, C -u i C + + -u ), term in fu n kcija o p isu je im en o v an i p o tp ro g ram . U Javi se češće k o risti te rm in m etoda , kao „n ačin da se nešto u ra d i“. A ko želite, m o žete nastaviti da razm išljate o „funkcijam a", ali će se u ovoj knjizi nad alje k o ristiti u Javi u običajen te rm in ,,m eto d a“. M etode u Javi o d re đ u ju p o ru k e koje objekat m ože da p rim i. O sn o v n i delovi m eto d e su im e, a rg u m en ti, p o v ra tn i tip i telo. O sn o v n i oblik ovako izgleda:
Po vratn iT ip imeMetode( /* l i s t a argumenata */ ) { /* te lo metode */

} P ovratni tip opisuje tip vred n o sti koja se vraća kao rezu ltat m eto d e koju ste pozvali. Lista a rg u m en ata zadaje tipove i im ena inform acija koje želite da p rosledite m etodi. Im e m etode i lista a rg u m en ata (koji zajedno čine njen potpis) jed in stv en o id entifikuju m etodu. M etode u Javi m o g u biti nap rav ljen e sam o kao deo klase. M etoda m ože da se poziva sam o za neki o b je k a t,’ i taj objek at m o ra da b u d e sp o so b an da izvrši poziv. Ako po k u šate da pozovete p ro g re šn u m e to d u objekta, d obićete p o ru k u o grešci p rilik o m prevođenja. M eto du objekta pozivate tako što navedete im e olijekta iza koga je tačka, zatim im e m etod e i n jenu listu a rg u m en ata, recim o ovako:
imeObjekta. im eMetode(argl, arg2, arg3);

Na p rim er, p re tp o stav im o da im ate m eto d u f() koja nem a arg u m e n te i vraća v red n o st tip a in t. Z atim , ako im ate o b jek at pod im en o m a koji im a m eto d u f(), m ožete napisati sledeće:
in t x = a . f ( ) ;

T ip p o v ra tn e v red n o sti m o ra da b u d e kom patib ilan s tip o m p rom enljive x. O vo p ozivanje m eto d e često se naziva i slartjeporuke objektu. U p re th o d n o m p rim e ru , p o ru k a je f() i olijekat je a. O b je k tn o o rijen tisan o p ro g ra m ira n je često se uk ratk o p red stavlja kao je d n o sta v n o „slanje p o ru k a objektim a".

sta tic m etode, o kojim a ćete uskoro učiti, rnogu hiti pozvauezd klnsii, bez objekta.

Poglavlje 2: Sveje objekat

51

Lista argumenata
Lista arg u m en ata m etode o dreduje koje inform acije pro sled u jete m etodi. Kao što p re tp o stavljate, te inform acije - kao i sve d ru g o u Javi - im aju fo rm u objekata. Stoga u listi argum en ata m o ra te da navedete tipove objekata koji se p ro sleđ u ju i im en a koja će se ko ristiti za svaki od njih. Kao i u d ru g im situacijam a u Javi gde se čini da rad ite sa o b jektim a, vi, u stvari, prosleđujete reference.4 Tip reference m o ra da b u d e ispravan. A ko a rg u m e n t treba da b u d e objekat klase String, o nda m o rate da prosledite objek at tip a String ili će prevodilac prijaviti grešku. R az m o trim o m e to d u čiji arg u m en t je objek at tip a String. Sledi definicija m eto d e koja m o ra biti postavljena u n u ta r definicije ldase d a bi bila prevedena:
in t s k la d is te (S trin g s) { return s .le n g th () * 2;

} O va m eto d a pokazuje koliko bajtova je p o tre b n o za ču vanje in fo rm acije u o d re đ e n o m o b jek tu tip a String. (Svaki znak u o b jek tu tip a String d u gačak je 16 b itova, o d n o sn o dva bajta, zbog p o d ržavanja stan d ard a U nicode.) A rg u m en t je o b jek at tip a String p o d im en o m s. Kada se s prosledi u m eto d u , m ožete ga tre tirati kao i svaki d ru g i objekat. (M ožete m u slati p o ru k e.) O vde se poziva m eto da length(), kao jed n a o d m eto d a klase String; ona vraća bro j znakova u znakovnom nizu. O b ra tite pažnju na u p o tre b u rezervisane reči return koja obavlja dva zadatka. Prvo, o n a znači „napusti m e to d u , završio sam “. D rugo, ako m etod a proizvodi v red n o st, ta vrecJn o st se stavlja o d m a h iza rezervisane reči return. U ovom slučaju, p o v ra tn a v red n o st se proizvodi izračun avanjem izraza s.length() * 2. M ožete da vratite p o d ata k bilo kog tipa, ali ako ne želite n išta da v ratite, o n d a n azn ačite da m eto d a vraća void. Evo p rim era:
boolean in d ik a to r() { return tru e; } double osnovaPrirodnogLog() { return 2.718; } void n is t a () { retu rn ; } void n is ta 2 () { }

Kada je po vratni tip void, rezervisana reč re tu r n se koristi sam o da bi se nap u stila m etoda i stoga je n ep o treb n a kada se d o đ e do kraja m etode. Iz m eto d e se m ožete vratiti iz bilo koje tačke, ali ako ste naveli p ovratni tip koji nije void, prevodilac će vas, bez o bzira na m esto sa kog vraćate, naterati (p o ru k am a o greškam a) da v ratite odgovarajući tip vred n o sti. U ovom tre n u tk u m ožda izgleda da je p ro g ram sam o gom ila o bjekata sa m e to d a m a čiji sli arg u m en ti dru gi objekti i koji šalju po ru ke tim d ru g im o bjektim a. To se uglavnom i dešava, ali u nared n o m poglavlju naučićete kako da urad ite posao niskog nivoa, d o n o šen jem o dluk a u n u ta r m etode. Ako u ovom poglavlju savladate slanje p o ru k a - biće dovoljno.

1

Uz uobičajeno izuzim anje ranijc pom en utih prostih tipova podataka boolean, char, byte, short, int, iong, float i double. I’o pravilu, vi prosleđtijete objekte, što znači da prosleđujete reference na objekte.

52

Misliti na Javi

Pravljenje programa na Javi
Postoji još nekoliko oblasti koje m o ra te savladati p re nego što sastavite svoj prvi p ro gram u Javi.

Vidljivost imena
K ontrola im en a je p ro b le m u svim p ro g ra m sk im jezicim a. Ako k o ristite im e u je d n o m delu p ro g ra m a, a d ru g i p ro g ra m e r k o risti isto im e u d ru g o m delu, kako da razlikujete je d n o im e o d d ru g o g i sprečite d a se „ su d a re “? O vo je p o seb n o ozbiljan p ro b lem u C -u jer p ro g ram često sadrži m o re im en a n e p o d e sn ih za rad . C + + klase (n a k o jim a su zasnovane Java klase) funkcije u g n ežđ u ju u n u ta r Idasa, pa zato i ne m o g u da se su dare sa im enim a funkcija u g n ežđ en im u n u ta r d ru g ih ldasa. M eđ u tim , u C + + -u se i dalje koriste globalni p o d a ci i g lobalne funkcije p a je su d a ra n je još uvek m oguće. D a bi se rešio taj p ro blem , u C + + je p o m o ć u d o d a tn ih rezervisan ih reči uveden itnenski prostor (engl. namespace). Z ahvaljujući n ov o m p ristu p u , Java je sve to m ogla da izbegne. Za p ravljenje je d n o zn ačn ih im en a za biblioteke, p ro je k ta n ti Jave žele d a ko ristite im e vašeg In te rn e t d o m ena u o b rn u to m p o retk u , p o što su ta im en a sig u rn o jedinstvena. Pošto je im e m og d om en a MindView.net, m oja u slu žn a b ib lio tek a za o tld an jan je n ed o statak a dobila bi im e net.m indview.utility.foibles. Iza o b rn u to g im en a d o m e n a , ostale tačke treba da predstavljaju p o d d irek to riju m e. U Javi 1.0 i Javi 1.1, oznake d o m e n a com, edu, org, net itd. po konvenciji su pisane velikim slovim a, pa bi se b ib liotek a zvala: NET.mindview.utility.foibles. Tokom razvoja Jave 2 o tk riv en o je da to izaziva pro b lem e, pa se sada celo im e paketa piše m alim slovim a. O vaj m eh an izam znači da sve vaše dato teke au to m atsk i žive u svojim im enskim prosto rim a i da svaka klasa u n u ta r d ato tek e g aran to v an o im a jed in stv en iden tifikator - o to m e se jezik b rin e u m esto vas.

Korišćenje drugih komponenata
Kad god želite da ko ristite u n a p red d efin isan e klase u svom p ro g ram u , prevodilac m ora znati da ih p ro n ađ e . N aravno, klase m o g u već da postoje u istoj datoteci i/ koje se i pozivaju. U to m slučaju, sam o k o ristite klasu - čak i ako se o n a defim še tek kasnije u datoteci. Java elim iniše p ro b le m s tak o zv an im istu ren im referencam a. Šta ako klasa p ostoji u nekoj d ru g o j datoteci? Pom islićete kako bi p revodilac trebalo da b u d e dovoljno p a m eta n i da k rene i n ađ e je, ali tu postoji prob lem . Z am islite da hoćete da koristite klasu o d re đ e n o g im en a, ali za nju postoji više od jed n e definicije (p od pretp ostavkom da su različite). Ili još gore, zam islite da pišete p ro g ram i u svoju biblioteku dodajete novu klasu, čije se im e sukobljava sa im en o m neke postojeće klase. Da biste rešili ovaj p ro b lem , m o rate da elim inišete sve potencijalne dvosm islenosti. To se postiže tako što p o m o ć u rezervisane reči import, Java prev od io cu saopštite koje klase želite da koristite. im port govori prev o d io cu da uveze p a ket (engl. package) koji predstavlja b iblioteku klasa. (U d ru g im jezicim a, biblioteka p o red klasa m ože da sadrži funkcije i pod atke, ali setite se da u Javi sav ko d m o ra biti pisan u n u ta r klasa.)

Poglavlje 2: Sve je objekat

53

N ajčešće ćete k o ristiti k o m p o n e n te iz sta n d a rd n ih biblioteka koje se isp o ru ču ju zajedn o s p rev o diocem . Uz njih, ne m o ra te d a b rin e te o dugačkim , inv erto v an im im e n im a d o m en a; sam o napišete, n a p rim er:
import j a v a . u t i l, A r r a y L is t ;

kako b iste saopštili p rev o d io cu da želite d a k o ristite Javinu klasu ArrayList. M e đ u tim , p aket util sadrži više kJasa i m o žete poželeti da ko ristite nekoliko n jih a d a ih p ri to m izričito ne deklarišete. To se lako p ostiže o zn ak o m * za slo b o d an izbor:
import j a v a . u t i l

Skupove klasa češće ćete uvoziti na ovaj n ačin nego p o jed in ačn o .

Rezervisana reč static
Kada n ap ra v ite klasu, o b ič n o opisu jete kako o bjekti te klase izgledaju i kako će se p o n a šati. O b jek a t zapravo ne d o b ijate sve d o k ga ne n ap rav ite o p e ra to ro m n e w - u toj tački se o b je k tu d o d eljuje p ro s to r u m e m o riji (sldadište) i tek tad a m eto d e p o staju d o stu p n e . Postoje dvc situacije u ko jim a ovaj p ristu p nije dovoljan. Jedna je ako želite da im ate isto skladište za o d re d e n o polje, Liez o b zira na to koliko o bjekata te ldase n ap rav ite, ili čak želite da skladište p ostoji iako nije nap ravljen nijedan objekat. D ru g a je ako vam treba m e to d a koji nije p rid ru ž e n a n ijed n o m o d re đ e n o m o b jek tu te klase. O d n o sn o , tre b a vam m eto d a koju m ožete da pozovete iako n ijedan o bjek at nije napravljen. O b a ova efekta m o žete postići p o m o ć u rezervisane reči static. Kada nešto o značite kao static, to znači da o d re d e n o polje ili m e to d a nisu povezani ni s je d n im o b jek to m te Jdase. Stoga m ožete da pozovete m e to d u static ili da p ristu p ite polju static, iako nik ad a niste n aprav ili objekat te klase. U slučaju uob ičajen ih , n estatičn ih polja i m eto d a, m o ra te da n ap ra v ite objekat i da ga ko ristite za p ristu p po lju ili m e to d i.’ U n ekim o b je k tn o o rijen tisa n im jezicim a koriste se te rm in i podaci klase 'i m etode klase, što znači da podaci i m e to d e posto je sam o za klasu u celini, a ne i za o d ređ en e objekte klase. P onekad se u litera tu ri o Javi tak o đ e koriste ti term in i. l)a biste polje ili m eto d u proglasili za statičn e, stavite rezervisanu reč static p re definicije. Na p rim er, sledeći oblik proizvodi i inicijalizuje statičn o polje:
c la s s S ta tic T e s t { s t a t i c i n t i = 4 7;

} Cak i ako posle ovoga n ap rav ite dva objekta klase StaticTest, i dalje će posto jati sam o je d a n p rim e ra k skladišta za p ro m en ljiv u StaticTest.i. O ba objekta će deliti istu p ro m e n Ijivu i.
N aravno, pošto sta tic m etode nc zalitcvaju da ijedan objekat bude napravljen pre nego što će se koristiti, one ne m ogu iliivkliu) da pristupe nestatičnim članicam a ili m etodam a. Pošto nestatični članovi i m etode m oraju biti povezani sa odgovarajućim objektom , iz statičnih m etoda m ožete pristupati nestatičnim članovim a sam o preko nekog im en ovanogobjekta.

54

Misliti na Javi

R azm o trim o sledeće:
S ta tic T e s t s t l = new S t a t i c T e s t ( ) ; S ta tic T e s t st2 = new S t a t ic T e s t O ;

U ovom tre n u tk u i stl.i i st2.i im aju istu v red n o st, 47, p o što se o d n o se na isti deo inem orije. Postoje dva način a za p ristu p statičn o j p ro m en ljiv o j. Kao što je po k azan o u p re th o d n o m p rim e ru , m o žete joj p ristu p a ti p rek o objekta, n a p rim e r st2.i. M ožete joj p ristu p a ti i d ire k tn o preko im en a klase, što ne m o žete d a u rad ite sa n e statič n o m članicom .
StaticT e st.i+ + ;

O p e ra to r + + uvećava p ro m en ljiv u za 1. U o v o m tre n u tk u i stl.i i st2.i im aće i v red n o st 48. N avođenje im en a klase je poželjniji n ačin za p ristu p a n jc statičnim članovim a. Ne sam o d a se tim e naglašava n jih o v a sta tičn a p riro d a , n ego se u n ek im slučajevim a prevod io c u daje veća m o g u ćn o st za o p tim izo v an je. Slična logika se p rim en ju je i n a statičn e m eto d e. S tatičnoj m e to d i m ožete da p ristu p a te bilo p rek o objekta kao i svakoj m eto d i, ili p o m o ć u p o seb n e d o d a tn e sintakse ImeKlase.metoda(). Statična m eto d a se definiše na sličan način:
class MozeSeUvecati ( s t a t ic void u ve c a j() { S ta tic T e s t.i+ + ; )

} O b ra tite pažn ju na to da u klasi MozeSeUvecati m eto d a uvecaj() p o m o ću o p erato ra + + uvećava statičan p o d atak i. M eto d u uvecajf) m ožete pozvati na uobičajen način, preko objekta:
MozeSellvecati sp = new MozeSeUvecati ( ) ; s p .u v e c a j( ) ;

Pošto je uvecaj() statična m eto d a, m o žete je pozvati d ire k tn o p rek o njene klase:
MozeSeUvecati. u ve caj( ) ;

Iako rezervisana reč static, p rim e n je n a na polje, defin itiv n o m enja način na koji se p o d a tak stvara (po jed an za svaku klasu u o d n o su na po jedan nestatičan za svaki objekat), kada se p rim en i na m eto d u , p ro m e n e nisu tako velike. M etode se označavaju rezer visan o m rečju static kako bi se m ogle pozvati iako nije naprav ljen objekat. O vo je veom a važno, kao što ćem o videti, za đ efinisanje m eto d e main() koja je p o četn a tačka za pokretan je svih aplikacija.

Vaš prvi program na Javi
K onačno, evo prv o g p o tp u n o g p ro g ram a. O n počinje ispisivanjem znakovnog niza, i datu m a, koristeći klasu Date iz sta n d a rd n e |ava biblioteke.

Poglavlje 2: Sve je objekat

55

// Zdravo.java import ja v a . u t i l p ub lic c lass Zdravo { public s t a t ic void m a in (S trin g [] args) { S y ste m .o u t.p rin tln ("Z d ra v o , danas j e : " ) ; System .o ut.p rin tln(new D a t e ());

} } N a p o četk u svake dato tek e s p ro g ra m o m , m o ra te da navedete sve p o tre b n e n ared b e

im port d a biste uvezli sve p o tre b n e d o d a tn e klase. O b ra tite p a žn ju n a to da sam rekao
,,do d atne“ je r po sto ji je d n a b ib lio tek a klasa koja se au to m a tsk i uvozi u svaki Java p ro gram : java.lang. P ok ren ite svoj W eb čitač i p o g led ajte d o k u m en tac iju o Javinom razvojn o m o k ru ž en ju (JD K ). (Ako d o k u m e n ta c iju o JD K -u n iste već preuzeli s lokacije h ttp :// java.sun.com , u ra d ite to sada.6 Im ajte u vid u da se ova d o k u m en tac ija ne isp o ru ču je zajed n o s JD K -om , p a je m o rate zasebno p reu zeti.) U listi p aketa videćete razne biblioteke klasa koje se isp o ru č u ju u p ak etu s Javinim razv o jn im ok ru žen jem . Izaberite p ak et java.Iang i dob ićete listu svih klasa koje su deo te biblioteke. Pošto je paket java.lang im plicitn o uključen u svalcu d a to tek u s Java k o d o m , te klase su a u to m atsk i d o stu p n e. Klasa Date nije deo paketa java.lang, što znači da je m o ra te uvesti kako biste je koristili. Ako ne zn ate u kojoj se biblioteci o d re đ e n a klasa nalazi, ili ako želite da v idite sve klase, o d ab erite ,,Tree“ u d o k u m en taciji o Javi. Sađa ćete videti sve klase Javine sta n d a rd n e biblioteke. Z atim m ožete iskoristiti funkciju čitača ,,find“ da p ro n a đ ete klasu Date. Kada to urad ite, videćete da se o n a na listi nalazi kao java.util.Date, što znači d a je u pak etu util i da m o rate da zadate im p o rt java.util.* kako biste koristili klasu Date. Ako se v ratite na početak, izaberete java.lang i zatim System, videćete da ldasa Systern im a nekoliko poija, a ako o d ab erete out, o tk rićete da je to statičan objekat ldase PrintStream. Pošto je on statičan , ne m o ra te ništa da p rav ite p o m o ć u new. O bjekat out je uvek tu i m ožete ga jednostavno k oristiti. O n o što m ožete da rad ite sa ovim objektom out, o dređeno je njegovim tip o m : PrintStreani. P rak tičn o sti radi, PrintStream je u opisu p rikazan kao hiperveza, stoga ako ga p ritisn ete, videćete listu svih m eto d a koje m ožete pozvati za tu klasu. Njih im a relativno m n o g o i biće o b jašn jen e dalje u knjizi. Zasad nas zan im a sam o println(), što znaći „ispiši o n o što ti dajem na konzoli i p red i u novi re d “. Dakle, kad god u bilo kojem p ro g ram u nešto želite da ispišete na konzoli, m o žete napisati:
System .out. p r in t ln ( "Znakovni niz za iz la z " )

im e klase i im e datoteke su isti. Kada pravite nezavisan p ro g ra m kao što je ovaj, jeđ n a od klasa m ora da ima isto im e kao datoteka. (Prevodilac se b u n i ako tako ne uradite.) Ta klasa m ora da sadrži m etodu pod im en o m main() sa sledećim p o tp iso m i p o v ratn im tipom :
p ublic s t a t ic void main (S tr in g G args) {

Prevodilac za Javu i Suiiova dokum t’ntacija stalno se m enjaju i najbolje ih je preuzim ati neposredno od Suna. Ako je sam i preuzm etc, dobićete najnoviiu verziju.

56

Misliti na Javi

R ezervisana reč public označava d a je m e to d a jav n o d o stu p n a (što je d etaljn o o p isan o u poglavlju Kontrola pristupa). A rg u m e n t m eto d e main() jeste niz objek ata ldase String. A rg u m ente args ne ko ristim o u ovom p ro g ra m u , ali prevodilac in sistira da se tu nalaze jer se u njih sm eštaju arg u m e n ti p ro sleđ en i s k o m a n d n e linije. Red sa ispisom d a tu m a p riličn o je zanim ljiv:
System .ou t.p rintln (n ew Date( ) ) ;

A rg u m en t je objekat klase Date koji se p rav i sam o da bi poslao svoju v re d n o st (koja se au to m atsk i p retv ara u objekat tip a String) m eto d i println(). Č im se ovaj izraz završi, taj objek at više nije p o tre b a n i sakupljač sm eča m ože da p ro đ e i p o k u p i ga u bilo kom tren u tk u . M i ne m o ra m o d a v o d im o raču n a o njeg o v o m čišćenju. K ada p ro u č ite d o k u m e n ta c iju o JD K -u sa lokacije http://java.sun.com , videćete d a Syste m im a m n o g e d ru g e m eto d e koje om o gu ćavaju izvođenje zan im ljiv ih efekata. (Jedna o d najvećih p red n o sti Jave jesu njene b ro jn e stan d a rd n e biblioteke.) Na p rim er:
//: object/Show Properties.java pu b lic c la s s ShowProperties { public s t a t ic void m a in (S trin g [] args) { Syste m .g etPro p erties() .1 is t(S y s te m .o u t); System .out.pri n tl n(System .getProp erty("user.nam e")) ; Sy ste m .o u t.p rin tln ( System .getProperty( " j a v a . 1i b ra ry .p a th ")) ;

) } ///:-

Prvi red u m eto d i m a in () p rikazu je sva svojstva (engl. properties) sistem a na kojem izvršavate p ro g ram , dakle daje p o d atk e o o k ru ž en ju . M etoda list() šalje te rezu ltate svom a rg u m e n tu S y stem .o u t. V idećete u n astavku knjige da ih m ožete poslati i na d ru g a m esta, recim o u neku d ato tek u . M ožete zatražiti i o d re đ e n o svojstvo - u ovom slučaju, korisnićko im e (engl. user nam e) i p u ta n ju (engl. path) do Javine biblioteke (engl. library). (M alo kasnije o b jasnićem o n eo b ićn e k o m en tare na p o četk u i na kraju.)

Prevođenje i izvršavanje
Da biste preveli i po k ren u li ovaj p ro g ram , kao i sve d rug e u ovoj knjizi, prvo m o ra te da im ate razvojno o k ružen je za Javu. Postoji više nezavisnih razvojnih o k ru žen ja, ali p retp o stavićem o d a koristite b esp latn o razvojno ok ru žen je JDK, k o m p an ije Sun M icrosystem s. Ako koristite neki dru g i razvojni sistem ,' m o raćete da pogledate d o k u m en ta ciju za taj sistem d a biste saznali kako da p rev o d ite i pokrećete p ro g ram e. Povežite se na In te rn et i p o gledajte W eb lokaciju http://iava.suii.coin. Tam o ćete naći in form acije i veze koje će vas voditi kroz proces p reu zim an ja i in staliran ja )D K -a za vašu p latfo rm u .
O bičn o je to IBM -ov prevodilac jikes, koji je zn atn o brži od Sunovog javac (iako razlika nije velika kada p o m o ću Anta pravite grupe datoteka). Postoje i progranii otvorenog koda za pravljenje Java prevodilaca, izvršnih okruženja i biblioteka.

Poglav[je 2: Sve je objekat

57

Kada instalirate JDK i podesite p u tan je na svom ra č u n a ru tako da p ro g ra m i javac i java b u d u d o stu p n i, preu/.m ite i rasp ak u jte izvorni ko d za ovu knjig u (m o žete ga naći na adresi w w w .M indV iew .net). Tako ćete n ap rav iti p o d d ire k to riju m za svako poglavlje iz ove knjige. Idite u p o d d ire k to riju m object i upišite:
ja va c H ello D ate.java

O va k o m a n d a ne bi trebalo da proizvede nikakav odziv. Ako d o bijete bilo k akvu p o ru k u o grešci, znači da niste p ro p isn o instalirali JDK i tre b a da isp itate taj p rob lem . S d ru g e stran e, ako dobijete nazad sam o k o m an d n u liniju, m o žete d a otkucate:
ja v a HelloDate

i kao rezultat dob ićete p o ru k u i d atu m . N avedeni proces m ožete da koristite za p rev o đ en je i p o k re tan je svakog p ro g ra m a iz ove knjige. M eđ u tim , videćete da izvorni ko d ove knjige u svakom p oglavlju tak ođ e im a i d a to tek u p o d im en o m bild.xml, koja sadrži ,A n t“ k o m a n d e za a u to m atsk o prev ođ enje d ato tek a iz tog poglavlja. A utom atski prevedene d ato teke i A n t (kao i to odak le d a ga p reu zm ete) detaljnije su opisani u d o d a tk u koji ćete naći na http ://M ind V iew .n et/B oo ks/ Betterjava , ali nakon što instalirate A nt (sa http://jakarta.apache.org/ant ), d o v o ljno je da otk u cate ’ant’ n akon k o m a n d n o g odzivnika i p ro g ra m i iz svakog poglavlja biće prevedeni i p o k re n u ti. U koiiko jo š niste instalirali A nt, k o m a n d e javac i java o tk u ca jte ručn o.

Komentari i ugrađena dokumentacija
Postoje dva tipa k o m en tara u Javi. Prvi je tra d icio n aln i stil pisanja k o m e n ta ra jezika C, koji je nasledio i C + + . Ti k o m en tari p o čin ju sa I* i nastavljaju se, m og uće i u više redova, sve d o */. O b ra tite pažnju na to da m nogi p ro g ram eri svaki red k o m e n ta ra nastavljaju sa 4. C esto ćete videti:
/* * * Ovo j e komentar koji se n a s ta v lja u v iš e redova

*/ D o bro z ap am tite da se sve što se nalazi u n u ta r /* i */ ignoriše, stoga n em a razlike ako napišete:
/* Ovo j e komentar koji se n a s ta v lja u v iš e redova */

D ruga vrsta k o m en tara potiče iz C + + -a. To je k o m e n ta r u je d n o m redu , koji počinje sa // i nastavlja se d o kraja reda. Ovaj način k o m en tara je p rak tičan i često se koristi jer je jed n o stav an . Ne m o ra te da lovite p o tastatu ri i da tražite / a zatim * (u m esto toga, sam o d v a p u t p ritisn ite isti taster) i ne m o rate da zatvorite k o m en tar. Z ato ćete često susretati:
// ovo je komentar u jednom redu

58

Misliti na Javi

Dokumentacioni komentari
V erovatno da je najveći p ro b lem p ri d o k u m e n to v a n ju koda bilo o d ržavanje d o k u m e n ta cije. A ko su k o d i d o k u m en tacija razdvojeni, po staje n ezg o d n o m en jati d o k u m en tac iju svaki p u t kada p ro m e n ite kod. Rešenje izgleda jed n o stav n o : povežite k o d i d o k u m e n ta c iju . N ajlakše ćete to u ra d iti kad sve stavite u istu d ato tek u . D a biste zaokružili p o stu p ak , p o tre b n a je p o seb n a sintaksa za d o k u m e n ta c io n e k o m en tare, kao i alat kojim ćete te kom e n ta re izdvojiti i preb aciti ih u k o ristan oblik. To je u rad ila Java. Alat za izdvajanje k o m en tara naziva se Javadoc i deo je instalacije JDK-a. O n koristi neke o d tehnologija Java prevodioca da p o traži posebne oznake k o m en tara u p ro g ram u . Izdvaja označene inform acije i izvlači im e klase ili m etode koja ide uz taj kom entar. Na ovaj način m ožete sa m in im aln o m količinom rad a generisati p risto jn u doku m en taciju p rogram a. R ezultat ovog p o stu p k a je H T M L d atotek a ko ju m ožete da p regledate p o m o ć u čitača W eba. Tako Javadoc om ogućava d a na p ra v ite i održav ate sam o je d n u izv o rn u d ato te k u i a u to m atsk i generišete k o risn u d o k u m en taciju . Z ahvaljujući p ro g ra m u Javadoc im am o je d n o stav an sta n d a rd za pravljenje đ o k u m en tacije, pa m o žem o da o čekujem o ili čak zah tev am o d o k u m en ta c iju iz svih Java biblioteka. Uza sve, m o žete n ap isati sopstvene Javadoc id en tifikato re (engl. handlers ), doclete, ukoliko k o m en tare koje je izdvojio Javadoc hoćete p o seb n o da o b rad ite (recim o, da ih ispišete u d rug ačijem fo rm a tu ). O d ocletim a čitajte u d o d a tk u na h ttp ://M in d V iew .n et/ Books/Betterjava. Sledi uvod u Javadoc i pregled njegovih obeležja. P o tp u n opis naći ćete u d o k u m e n ta ciji o JD K-u. Kada je raspakujete, p o tra žite p o d d ire k to riju m „tooldocs" ili p ritisn ite istoim en u hipervezu.

Sintaksa
Sve k o m and e p rog ram a Javadoc nalaze se isključivo u n u ta r k o m entara /**. K om entar se završava sa */ kao i obično. Postoje dva osnovna načina za korišćenje ovog sistem a: ugrađeni H TM L ili korišćenje d o k u m en tacio n ih oznaka (engl. doc tags). Samostojeće dokum entacion eo zn a k e su ko m an d e koje p o čin ju sa @ i koje se nalaze na početku reda kom entara. (Zanem aruje se vodeća zvezdica.) Nesam ostalnc dokum entacionc oznake m ogu biti napisane bilo gde u n u ta r Javadoc k o m en tara i takode počinju sa @, ali se nalaze izm eđu vitičastih zagrada. Postoje tri tipa d o k u m e n ta c io n ih k o m en tara koji o d govaraju elem en tu k om e kom enta r p reth o di: klasi, polju ili m etodi. K om en tar klase stoji o d m ah ispred d e fin iđ je klase; k o m e n ta r polja se pojavljuje o d m a h ispred definicije polja, a k o m e n ta r m etode se javlja n e p o sred n o ispred definicije m etode. O vo je jed n o stav an prim er:
//: object/Docum entationl.java /** Komentar klase */ public c lass Docum entationl.java { /** Komentar p o lja */ publi c i nt i ; /** Komentar metode */ p ublic void f ( ) {}

} ///: -

Poglavlje 2: Sveje objekat

59

O b ra tite p ažn ju na to d a će Javađoc o b rad iti d o k u m en tac io n e k o m en tare sam o za javne i zaštićene članice. K o m entari za privatne članice i članice k ojim a se p ristu p a u pak etu (videti poglavlje Kontrola pristupa ) ig n o rišu se i nećete v id eti nikakav izlaz. (M eđ u tim , m o žete k o ristiti in d ik a to r -private da b iste uključili i privatne članice.) O vo im a sm isla, p o što su sam o javne i zaštićene članice d o stu p n e izvan d atoteke, što je i p ersp ek tiv a p ro g ra m e ra klijenata. R ezultat o b ra d e p re th o d n o g p rim e ra je H TM L d ato tek a koja im a isti sta n d a rd n i form a t kao i celok u pna ostala d o k u m en tacija, stoga će k o risn icim a delovati p o z n a to i m oći će lako da se kreću k ro z klase. P rekucajte taj p rim er, p ro p u stite ga k ro z Javadoc i pregled ajte rezu ltu ju ću H T M L d ato tek u , d a biste sam i videli o p isan e rezultate.

Ugrađeni HTML
Javadoc prep isu je H TM L oznake iz k o m en tara u H T M L d o k u m e n t koji generiše. To o m og u ćava p o tp u n o korišćenje H TM L-a; m eđ u tim , o sn ov n i cilj je da se o m o g u ć i fo rm atira n je koda, kao što je:
// : object/Documentation2.java

j

* <pre> *System .out. p rin tln(n ew Date( ) ) ; * </pre>

*/ ///: '
p u b lic c lass Documentation2 {}

Takođe, H TM L m ožete koristiti kao i u svakom d ru g o m W eb d o k u m e n tu , da fo rm atirate običan tekst u svojim opisim a:
//: object/Documentation3.java

/**
* * * * * * Možete u b aciti <em>čak</em> i li s t u : <ol> <li> Prva tačka <1i> Druga tačka <1i> Treća tačka </ol>

*/
pu b lic c lass Documentation3 {}

O b ra tite pažnju na to da u n u ta r d o k u m en tacio n o g k o m e n ta ra , Javadoc o d b acu je zvezdice na početk u reda, kao i vodeće prazn in e. Javadoc sve p o n o v o fo rm a tira tako da se prilagod i sta n d a rd n o m izgledu d o k u m en tacije. Ne koristite naslove kao što su < h l > ili oznake kao < h r> , je r Javadoc ubacuje svoje naslove i vaši će ih o m etati. Svi tipovi d o k u m en tac io n ih k o m en tara - k o m e n ta r klase, polja i m e to d e -p o d r ž a v a ju ug ra d en i HTM L.

60

Misliti na Javi

Primeri oznaka
Evo p rim e ra n ekih Javadoc ozn ak a koje se m o g u stavljati u d o k u m e n ta c iju koda. Pre nego što p o m o ć u Javadoca p o k u šate d a u ra d ite bilo šta ozbiljno, treb alo bi da p ro čitate n jem u posvećen odeljak u d o k u m e n ta ciji JD K -a i tam o vid ite sve m oguće način e u p o tre b e Javadoca.

@see:
O va o zn ak a služi za u p u ćiv an je na d o k u m e n ta c iju u d ru g im klasam a. Javadoc će generisati HTML sa o zn ak am a @see kao hip erv ezam a po vezanim s d ru g o m d o k u m en tacijo m . O blici su:
@see imeklase Psee potpuno-opisano-imeklase @see potpuno-opisano-imeklase#ime-metode

Svaki o d njih do d aje g en erisan o j d o k u m en taciji h ipervezu „Pogledaj tak o đ e“ (engl. See Also). Javadoc ne p ro v erav a isp rav n o st hiperveza koje joj predajete.

{@link

paket.klasa#č!an labela}

V eom a slično o znaci @see, sem što se m ože ko ristiti d ire k tn o u istom nivou i što kao tekst hiperveze ispisuje labelu , a ne „Pogledaj tako đe“.

{©docRoot}
D aje relativ n u p u ta n ju d o koren sko g d irek to riju m a d o k u m en tacije. Koristi se za izričito h iperpovezivanje sa stra n ic a m a u stablu do k u m en tacije.

{@inheritDoc}
Tekući d o k u m en tac io n i k o m e n ta r n asleđuje d o k u m en tac iju najbliže o sn o v n e klase ove klase.

@version
N jen oblik je:
Pversion in fo rm a c ija - o - v e rz iji

gde je informacija-o-verziji bilo koja b itn a inform acija koju treba uključiti. Kada sc ind ik a to r -version navede na k o m a n d n o j liniji p ro g ram a javadoc , inform acija o verziji će biti p ro sleđ en a u gen erisan u H T M L d o k u m en taciju .

@author
N jen oblik je:
@author inform acija-o-autoru

Poglavlje 2: Sveje objekat

61

gde je informacija-o-autoru v ero v atn o vaše im e ali m ože da b u d e i vaša elektronska adresa ili bilo koja d ru g a p rig o d n a inform acija. Kada se in d ik a to r -author navede u kom a n d n o j Iiniji p ro g ra m a Javadoc, inform acija o a u to ru biće p rosleđena u g en erisan u H T M L d o k u m en tac iju . M ožete im ati više auto rsk ih oznaka za listu au tora, ali one m o ra ju da b u d u p o ređ an e uzastopno. Sve inform acije o au to rim a biće spojene u jed an pasus u g enerisanom H TM L-u.

@since
O va oznaka o m og u ćava da naznačite verziju klase koja je počela da k oristi o d re đ e n u m o gućnost. V idećete da se pojavljuje u Java H T M L d o k u m en taciji da naznači koja je verzija JD K -a korišćena.

©param
K oristi se za d o k u m e n to v a n je m e to d a u obliku:
@param ime-parametra opis

gde je ime-parametra id en tifik ato r u listi p a ra m e ta ra m eto d e, a opis tekst koji se m ože p ro te g n u ti na nekoliko redova. S m atra se da je opis završen kada se naiđe n a n o v u d o k u m e n ta c io n u o zn aku . M ožete im ati koliko ho ćete ovih oznaka, najčešće p o je d n u za svaki param etar.

@return
Koristi se za d o k u m e n to v a n je m eto d a, a piše se u obliku:
Pretu rn opis

gde o p is daje značenje p o v ra tn e v red n o sti. O n m ože da se p ro teg n e na nekoliko redova.

@throws
O izuzecim a g o v o rim o u poglavlju O brada grcšaka pom oću izuzctaka. U kratko, to su objekti koji m og u biti ,,bačeni“ iz m eto d e u slučaju greške. Iako sam o je d an objekat izuzetka m ože d a se pojavi kada pozovete m eto d u , o d ređ en a m eto d a m ože da proizvede više razlićitih tipova izuzetaka a svi m o raju biti u n a p red naznačeni. Stoga oznaka za izuzetak im a sledeći oblik:
@throws potpuno-opisano-imeklase opis

gde p o tp u n o -o p is a n o -im e k la s e nedvosm isleno daje iine klase izuzetka koja je negde definisana, a o p is (koji m ože da se p ro teg n e na nekoliko redova) pokazuje zbog čega određeni tip izuzetka m ože da se pojavi pri pozivu inetođe.

62 Misliti na Javi ©deprecated O vo se koristi da naznači m o g u ćn osti koje su zastarele. Taj red sadrži inform aciju o p utanji do datoteke (object označava ovo poglavlje). p rin tln(new D a te O ).MindView. većina će sadržati ovaj oblik izlaza. O znaka /* Ispis: naznačuje početak izlaza koji će ovaj p ro g ram generisati. iza koje sledi ime datoteke. System . (55% nratch) naznačuje sistem u za testiranje da se izlaz priličn o razlikuje od jed n o g do drugog izvršavanja i da treba da očekuje korelaciju od sam o 55 pro cen ata sa ovde prikazanim izlazom. U Javi SE5. . U ovom obliku. Poslednji red takode se završava kom entarom ( / / / : . danas je : Tue Feb 06 14:39:36 M DT 2007 * ///:U prvom redu datoteke koristi se m oja tehnika: stavlja se //: kao posebne oznake za red s kom entarom koji sadrži ime izvorne datoteke. O d onih p rim era u ovoj knjizi koji im aju neki izlaz.java import j a v a . p o što će uskoro v erovatno biti u klonjena.net * @version 4.out. danas j e : " ) . pa ćete m oći da izvršite svaki pro g ram i da proverite da li m u je izlaz ispravan. * @author Bruce Eckel * @author www. 1 } /* Is p is : (55% match) Zdravo. Primer dokumentacije P onovo dajem o prvi p ro g ra m n a Javi. * Is p is u je znakovni niz i današnji datum.) koji označava kraj listinga izvornog koda i om ogućava da se taj kod autom atski ažurira u tekstu ove knjige (nakon što ga prevodilac p ro v eri) i da se izvrši. @deprecated je zam enjena anotacijom @Deprecated (anotacijam a je posvećeno poglavlje Anotacije). O znaka @deprecated pokazuje da više ne treba da koristite tu m ogućnost.p rin tln ("Z d ravo . Prevodilac će vas upozoriti ako koristite m e to d u označenu sa @deprecated.u t il /** Prvi primer programa iz knjige M i s l i t i na J a v i .0 */ public class Zdravo { /** Ulazna tačka u klasu i a p lik a c iju * @param args niz argumenata tip a strin g * @throws exceptions ne baca izuzetke */ public s t a t ic void m a in (S trin g [] args) { Syste m . ovog p u ta s d o d a tn im d o k u m e n ta c io n im k o m en tarim a: //: o b ject:Z d ravo .o u t.

Vežbe U b ud uće će vežbe biti raspodeljene po celom tek stu poglavlja. Stekli ste i uvid u jezik i njegove o sn o v n e pojm ove.M indV iew . o n e se pišu zaje dn o (tj. N a p rim er: c lass SveBojeDuge { in t c e o B ro jK o jiP re d s ta v lja B o je .net. . ali uverićete se da ovde upotrebljeni stil odgovara stan d ardu Jave koliko god je to m oguće. Sažetak Cilj ovog poglavlja je da nau čite tek toliko Jave koliko je dov o ljn o da biste napisali je d n o stavan p ro g ram . Iza red n o g broja vežbe nalazi se broj u zag rad am a. Tako n ap isano im e klase liči n a grbe kam ile.sitii.Coiii/iIocs/cađ<. luip://javii. koji u op seg u od 1 do 10 pokazuje njenu težinu. zatim u rad i o n o . .Poglavlje 2: Sve je objekat 63 Stil programiranja P rem a stilu o p isano m u knjizi Codc C onventions fo r the Java Program m ingLatiguage8 prvo slovo im en a klase treba da b u d e veliko. usvojeni stil je isti kao i za klase. stoga im ajte m ilosti. U n a re d n a dva p oglavlja upoznaćete o sno v n e o p e rato re koji se u p o treb ljav aju u p ro g ra m ira n ju na Javi i naučićete da upravljate tok o m p ro g ram a. i prvo slovo svake u g rad en e reči je veliko.litinl. ali u ovom su sve vežbe stavljene na kraj. Za skoro sve ostalo: m eto d e. koji se m ože k u p iti na adresi w w w . p olja (p ro m enljive članice) i im ena referenci n a objekte. U Java kodu iz Sunovih b iblioteka k oristi se isti stil p isanja o tv o ren ih i zatv o ren ih vitičastih zagrada p o p u t stila u p o treb ljen o g u ovoj knjizi. pošto ste tek naučili da pišete najjed n o stav n ije p ro g ram e. N isam m ogao da sledim sve sm ernice iz ove preporuke jer bi m i to uzelo previše prosfora u knjizi i na prezentacijam a. Do sada su ipak svi p rim eri bili u znaku „uradi ovo. a p o to m nešto treće“. na p rim er: c lass SveBojeDuge { // . osim što se p rv o slovo identifikatora piše m alo. A ko se im e klase sastoji o d nekoliko reči. void promeniNijansuBoje ( in t novaNijansa) { // } / / ••• } M islite na to kako k o risn ik tak o đ e m o ra da kuca sva ova đugačka im ena.’coiiv/indcx. Rešenja o d a b ra n ih vežbi nalaze se u elek tro n sk o m d o k u m e n tu The T hinking in Java A nno tatcd Solution Guide . ne koristite d o n je crte d a razdvojite im en a ). .

Vežba 7: (1) Pretvorite MozeSeUvecati delove k o d a u p ro g ra m koji radi. Vežba 13: (1) P ro p u stite kroz Jav ad o c dato teke D o k u m en tacija 1. d efm isan u kao deo k o da u ovom poglavlju. koji je jednostavan p rim e r d o k u m e n ta c io n ih k o m e n ta ra. iako je nećete koristiti. Izdvojite te d o k u m e n ta c io n e k o m e n ta re u H TM L daiOteku koristeći Jav ad o c i pregledajte ih p o m o ć u čitača W eba. Vežba 6: (2) N apišite p ro g ra m koji o b u h v ata i poziva m e to d u skladiste(). Da biste to uradili. Vežba 12: (2) P ro n a đ ite kođ za d ru g u verziju p ro g ram a Z d rav o . Vežba 11: (1) Pretvorite p rim er SveB ojeD uge u pro g ram koji m ožete da prevedete i izvršite. . V ežba 16: (1) U poglavlju Inicijnlizacijn i čišćenje p ro n ađ ite p rim e r P re ld a p a n je . pozabavite se ind ek sim a u nizu objekta klase S trin g s k o m a d n e linije. A ko k o ristite razvojno o k ru ž en je koje je d ru g ačije od JD K -a. P rop ustite tu d ato tek u k ro z Jav ad o c i pogledajte rezultate p o m o ć u čitača W eba.java i D okum entacija3 .java.jav a. i p ro v erite rezultate p o m o ć u čitača W eba. Prevedite p ro g ra m k o m a n d o m javac i p o k ren ite ga k o m a n d o m java. Izdvojite te d o k u m e n ta c io n e k o m e n ta re u H TM L d ato te k u koristeći Jav ad o c i p regledajte ih p o m o ću čitača W eba. Vežba 9: (2) N apišite p ro g ra m koji po k azu je da a u to m atsk o pakovanje fu n k cio n iše za sve pro ste tipove i njihove o m otače. i ispišite njihove v red n o sti kako biste se uverili da ih Java p o d ra z u m e v a n o inicijalizuje. Vežba 8: (3) N apišite p ro g ra m koji po k azu je da postoji sam o je d a n p rim e ra k o d ređ en o g statičnog polja u klasi. bez o b zira na to koliko objekata te klase n apravite.ja v a i dodajte m u d o k u m e n ta c io n e k o m en tare . n a p ra v ite p ro g ra m „zdravo. Setite se da tre b a d a o stan e statična i da uključite listu a rg u m en ata. V ežba 14: (1) D od ajte H T M L listu d o k u m en taciji u p re th o d n o m vežbanju. Vežba 15: (1) U zm ite p ro g ra tn iz vežbe 2 i d o d ajte m u d o k u m e n ta c io n e k o m en tare. n au čite kako d a prevedete i izvršite p ro g ra m e u to m o k ru ž e n ju . Vežba 4: (1) P retvo rite deliće k od a koji o b u h v ataju klasu SamoPodaci u p ro g ra m koji m ožete d a prevedete i izvršite. D o k u m en tacija2. V ežba 10: (2) N apišite p ro g ra m koji ispisuje tri a rg u m e n ta p re u ze ta s k o m a n d n e linije.64 Misliti na Javi Vežba 1: (2) N apišite klasu koja će sad ržati neinicijalizovana p o lja tip a int i char. Vežba 5: (1) Izm enite p re th o d n o vežbanje tako d a v red n o sti p o d a ta k a u klasi SamoPodaci b u d u d o d eljen e i ispisane iz m eto d e main(). svete“ koji p rikazu je d a tu n a re d b u na ek ran u .ja v a. Vežba 2: (1) N akon p rim e ra Zdravo.java u ov om poglavlju. Vežba3: (1) P ro n a đ ite delove k o d a koji o b u h v ataju klasu NekoImeTipa i p re tv o rite ih u p ro g ra m koji m ožete d a p revedete i izvršite. P o treb n a vam je sam o je d n a m e to d a u klasi (m a in koja se izvršava kada se p ro g ra m p o k re n e).

O n sadrži a u d io lekcije. M eđu tim . *.o u t. R aširite stablo koda i d o d ajte njegov korenski d irek to riju m sistem skoj pro m en ljiv o j CLASSPATH svog ra č u n a ra. danas je : " ) . classpath). VEĆINA OVIH OPERATORA BIĆE POZNATA C I C + + p ro g ram e rim a . ne m o rate znati te p o jed in o sti da biste m ogli da je upotreb ljav ate. m o rate preuzeti paket koda ove knjige s lokacije w w w . p ro đ ite kroz m u ltim ed ijaln i se m in a r na C D -u: T h in k in g in C k o ji m ožete b esp latn o preuzeti s Web lokacije w w w . vežbe i rešenja iz kojih se m o g u steći osnove za u čen je Jave.m in d view . } } /* Is p is : (55% match) Zdravo.p rin tln (''P r ilič n o mnogo kucanja1 ') .net ili s nekog od n jenih p reslik an ih servera. U poglavlju Kontrola pristupa . nego je i p rilično nerazum ljivo kada se p ročita. ali neće škoditi . I’rim etićete da tu im a ne sam o p riličn o m n o g o k u can ja (i suvišnog n a p o ra za tetive). KAKO JE JAVA IZVEDENA IZ C + + . M eđ u tim . Koristeći je. Većina jezika starijih i n ovijih o d Jave im a m n o g o jednostavniji p ristu p tako često u p o treb ljav an o j naredbi. danas je : Wed Oct 05 14:39:05 MDT 2005 * ///:R ezultati su m nogo jasniji. m o žete p releteti kroz ovo i sledeće poglavlje i zadržati se sam o na m estim a gde se Java razlikuje o d tih jezika. Jednostavnije naredbe za ispisivanje U p re th o d n o m pogiavlju. print(new Date( ) ) .M iiidV icw .java import j a v a . Jednom ćem o stići i do p o tp u n o g opisa p u ta n je klasa (engl.u ti1.u t il import s t a t ic n et.m in d view . u p o zn ali ste Javinu n a re d b u za ispisivanje: S y s te m . Da biste tu biblioteku m ogli da koristite.n et. govori se o p o jm u static im port iz Jave SE5. p ub lic class ZdravoDatum { public s t a t ic void main( S t r i ng[] args) { p rin t("Z d ra v o .Operatori N a n ajnižem nivou. u Javi se s podacim a radi pom oću operatora. U koliko poznajete sin tak su C -a ili C + + -a.A . uz to je navedena i m ala biblioteka koja p o jednostavljuje pisan je n ared b e za ispisivanje n a e k ra n u / p a p iru . slajdove. ako m alo zapnete u ovom poglavlju. P r in t . U Javi su d o d ata neka pob o ljšan ja i pojednostavljenja. p rerad ićem o p ro g ram Iz p re th o d n o g poglavlja: //: operatori/ZdravoDatum . O b ratite p ažnju na u m e tn u tu rezervisanu reč sta tic u d ru goj n ared b i im p o rt.

še operato ra. deljenje (/) i do dela v red n o sti (=) m anje-više su isti u svakom p ro g ram sk o m jeziku. klasa S trin g podržava i o p e rato re + i +=.Print lepo p ojeđnostavljuje većinu p ro gram a. p resk ačem uvoz (engl.java public c lass P r io r i t e t i { public s t a t ic void main ( S t r i ng[] args) { in t x = 1.println (). ali efekat ostaje isti. N ažalost. Iako u p o tre b a biblioteke net.2/2 + z. s Javom ćete m o rati počešće d a se borite. m n oženje (*). // (1) in t b = x + (y . ne m ože se o p rav d ati n jen o korišćenje baš posvu da. p ogledajte n ared b e (1) i (2): //: o p e r a t o r i/ P r io r it e t i. U koliko u p ro g ram u im a m alo n a red ab a za ispisivanje. To se naziva sporedan efckat (engl. kao i operato ri bez sp o red n o g efekta. ali treb a im ati na u m u d a i ti o p e ra to ri proizvode v redn ost. Na p rim er. Vežba 1: (1) N apišite p ro g ra m u k o jem up otreb ljav ate i skraćen i i n o rm a ln i oblik naredaba za ispisivanje. Izuzeci su =. o d u zim an je i u n arn i m in u s (-). Korišćenje operatora u Javi O p e ra to r k o m b in u je je d a n ili više a rg u m en ata i daje no vu v red n o st. z = 3.66 Misliti na Javi ako o d m a h počnete d a se privikavate n a b o rb u s n jo m . in t a = x + y .util. A rgu m enti se zadaju u obliku drugačijem o d uobičajen ih poziva m e to d a. V erovatno vam je d o b ro p o z n at o p šti k o n cep t o p e rato ra . S abiranje i u n a rn i plus (+ ).out. koji rade sa svim o bjektim a (i izazivaju n e d o u m ic e u ra d u sa o b jek tim a). o perato r m ože da p ro m en i i v re d n o st o p eran d a.2)/(2 + z ). irnport ) te biblioteke i pišem dugački System. Pored toga. // (2) System .p rin t1 n ("a = " + a + " b = " + b ) . Skoro svi o p e ra to ri rade sam o s p ro stim tip o v im a.o u t. p a stoga nije na o d m e t da koristite zagrade za izričito navođenje p o retk a izračun av an ja. Java im a specifična p ravila koja o d re đ u ju p o red ak izračunavanja. I } /* Is p is : a = 5 b = 1 * ///:- . Svi o p e ra to ri d aju n ek u v red n o st u zavisnosti o d svojih o p e ra n a d a . Najlakše se p am ti pravilo da se m n o žen je i deljenje vrše p re sab iranja i o d u zim an ja. = = i !=. sidc effect). O p erato ri koji m enjaju svoje o p e ra n d e najčešće se u p o treb ljav aju baš radi generisanja tog sp o red n o g efekta. P ro gram eri često zaborave ostala pravila o p rio rite tim a .mindvievv. Pored toga. y = 2. Priori teti P rioriteti o p erato ra definišu kako će izraz biti izraču n at kada se u n jem u javlja vi.

Kao što vid ite iz izlaza. narav n o . import s t a t ic n e t. m o ra p o sto jati fizički p ro sto r za sm eštan je te v red n o sti. i kopiraj ie n a levu stra n u . kada napišete c = d za objekte.n iv o = 9. m o žete d odeliti k o n sta n tn u v red n o st prom enljivoj a = 4. ali Ivrednost m o ra da b u d e p o seb n a im en o v an a pro m en ljiv a.println(). lvalue)“ . { .n ivo = 47.u ti1.. ako napišete a = b za proste tipove. koja se često naziva Ivrednost (engl.out. + znači „nadovezivanje zn ak o v n ih nizova“ i. (N e m o žete n apisati 4 = a. p ok u šaće d a k o n v ertu je ne-String u String. } p ub lic c lass Dodela { p ub lic c t a t ic void m a in (S trin g [] args) Rezervoar r l = new R e z ervo arf). c lass Rezervoar { in t nivo. M eđ u tim . O n znači „u zm i v red n o st s d esn e stra n e koja se često naziva dvrcdnost (engl. neće uticati na b. vi k o p irate sadržaj s jed n o g m esta na d ru g o . i c i d pokazivati na objekat na koji je p rv o b itn o pokazivao d. p ro m en ljiv a ili izraz koji m ože d a se izračun a.m in d view . Ako n akon toga nastavite da m en jate a. Pošto p ro sti tipovi čuvaju stvarnu v red no st. r l. O b ra tite pažn ju na u p o tre b u o p e ra to ra + u n ared b i System. P r i n t . Evo p rim e ra koji će pokazati to ponašanje: //: operatori/D odela . ta izm ena. o n d a se sađržaj p rom enljive b ko p ira u sadržaj pro m en ljiv e a. Kada p revodilac n aiđ e na String + ne-String. a i b je u sp ešn o konv erto vao iz tip a int u String. zapravo kopirate referencu s je d n o g rnesta na drugo. rvalue). a ne referencu na objekat.Poglav[je 3: Operatori 67 Te n ared b e izgledaju gotovo jed n ak o . Na p rim er. ali iz izlaza vidite d a zbog u p o treb e zagrada u (2) im aju sasvim različita značenja. u većini situacija ovo i očekujete. ali k o n sta n tn o j v red n o sti ne m o žete n išta da d o d elite . ako treb a. stvari se m en jaju . kada d o d elite v red n o st p rom enljivoj pro sto g tipa. „konverzija zn ak o v n ih nizova“. D ok rad ite sa ob jek to m . U to m k o n tekstu . To znači da će. a kada d o d elju jete „jedan objekat d ru g o m “. java // Dodela vrednosti objektima može ponekad da p r e v a r i. D vrednost je bilo koja k o n sta n ta. Kao p ro g ram er. vi radite s referencom .) N a p rim er. r2 . kada d odelju jete v re đ n o sti o b jek tim a. Rezervoar r2 = new R ez erv o ar().o n a n e m ože b iti Ivrednost. (O d n o sn o . Dodela vrednosti V red n ost se dodeljuje o p e ra to ro m = .) D odela v red n osti prosto g tip a je p riličn o očigledna.

r2 . " + r l. r2 .n iv o ). n jen objekat će p o čistiti sakupljač sm eća). zatim je v red n o st r2 d o d eljen a p rim e rk u rl i p o to m je r l p ro m en jen .* .n iv o : 47 2: r l.n iv o : 1 1 + r l.n iv o ).u ti1. ali.n iv o : " . r2 . cla s s Slovo { char c. pa im ajte na u m u da d odela kod objekata m ože da dovede d o iznenadenja. O vaj fenom en često se naziva pojavap scu d o n im a (engl. P r in t .n iv o : 47 3: r l. Polju nivo u svakom p rim e rk u klase Rezervoar d od eljen e su različite v rednosti. r2 .n iv o ).n iv o = r2 .n iv o : 27 * ///:Klasa Rezervoar je je d n o sta v n a i njena dva p rim e rk a (rl i r2) n ap rav ljen a su u m eto d i m ain(). Pitanje p seu d o n im a nije jed n o stav n o . p r in t("2 : r l.n iv o : " + r l. r2 .n ivo . kada se izm eni o b jek at rl.n iv o : 9.n iv o = 27.n iv o : 47.min dvie w .n iv o : r l. m enja se i objekat r2.68 Misliti na Javi p r i n t ( " l : r l. u m esto da jed an b u d e o d b ačen i da se obe reference povežu sa istim o b jek to m . Ov'ako će se zadržati dva o dvojena objekta. import s t a t ic n e t.n iv o : ".n iv o + ".n iv o + " + r 2 . zato što i r l i r2 sađrže istu referencu koja pokazuje na isti objekat. java // Pro sleđ ivan je objekata metodama može vas iz n e n a d iti. Pojava pseudonima pri pozivanju metode P seu d o n im će se takođe pojaviti kada objekte prosleđujete m eto d am a: / / : op eratori/Prosl edi O bjekat. Ali šta ako nećete da se u ovom slučaju pojavi pseu d o n im ? M ožete da precizirate d o d elu i d a napišete: r l. (P rv o b itn a referenca koja se nalazila u rl i koja je pokazivala na objekat koji je čuvao v red n o st 9. V ežba 2: (1) N apišite klasu koja sadrži broj tip a flo at i p o m o ć u nje pokažite pojavu p seu d o n im a. p o što ste d odeljivali reference.n iv o + " + r2 . r2 . r l = r2.n iv o : 27. U skoro ćete shvatiti da je rađ s p oljim a u n u ta r objekata prljav posao i da je u su p ro tn o sti s p rin c ip im a d o b ro g o b jek tn o o rijen tisan o g p ro jektovanja. U m n o g im p ro g ram sk im jezicim a očekivali b iste da su r l i r2 nezavisni sve vrem e. . aliasing ). p r in t("3 : r l. i on je u o snovi način na koji Java rad i sa o b jek tim a. izm en jen a je p rilik o m đodele i efektivno izgubljena.n iv o : " + r2 . } } /* Is p is : 1: r l.

red y . c = ' a '. a ne zaok ru žu je rezuitat. java // Prikaz matematičkih operatora import j a v a . import s t a t ic n e t.u ti1.c ). o d u z im an je (-). m n o žen je (*) i m o d u lo (% ). i nt i . Zasad sam o d o b ro pazite da izbegnete zam ke. To se naznačava na sledeći način: iza o p erato ra sledi znak jedn ako sti. P r in t . Ali.* .c = ' z ' . u t i 1.min d view .c : " + x . Java tako d e koristi skraćeni C /C + + zapis za isto v rem en o ob avljanje o p eracije i dođele. m eto d a f() bi napravila kop iju svog a rg u m e n ta Slovo y u n u ta r oblasti važenja m etode.Poglavlje 3: Operatori 69 p u blic c lass ProslediO bjekat { s t a t ic void f(S lo v o y ) { y . Na p rim e r: da biste d o dali 4 p ro m enljivoj x i rezultat dodelili x. } public s t a t ic void m ain (Strin g [] args) { S1ovo x = new S 1 o vo (). Pri celo b ro jn o m deljenju odseca se realni deo. O vaj p rim e r p okazuje korišćenje m atem atičk ih op erato ra: /. c ) . pišite: x + = 4. j . p r i n t ( " l : x . } } /* Is p is : 1: x . k . Matematički operatori O sn ov ni m atem atičk i o p e ra to ri su isti kao i u većini p ro g ram sk ih jezika: sabiranje (+ ).* . x . Vcžba 3: ( 1) N apišite klasu koja sadrži broj tipa flo at i p o m o ć u nje pok ažite p ojavu p se u d o n im a p rilik o m pozivanja m etoda. i d o sled n o se m ože p rim e n iti na sve o p era to re u jeziku (kada to im a sm isla)./: o peratori/M atO peratori. deljenje (/). f(x ). u stvari m enja objekat izvan f(). . p r in t (" 2 : x . pošto je prosleđ ena referenca.c : a 2: x .c : z * ///:U m n o g im p ro g ra m sk im jezicim a. koji daje o statak p ri celobrojn o m deljen ju.c : " + x . ra z in o tre n o ie u jed n o m o d m režnih d o d a ta k a ove knjige.c = ' z ' . p ub lic c lass MatOperatori { p ublic s t a t ic void m a in (Strin g [] args) { // Napravimo i n i c i ja liz o v a n generator s lu ča jn ih brojeva Random slucajan = new Random(47). P itanje p seu d o n im a i njegovo rešavanje je složeno.

+ i ). p rin t("w : " + w ).v. p rin t("u + = v : + u ). u = v + w. in t .k : 3 / j : 0 * j : 3304 % j : 56 %= k : 3 + u ). u = v / w. i = j . u = v * w. p r in t ( " v + w : " + u ) .w. + i).w + u ). p r in t ( " v : " + v ) . p r in t("u /= v : ) /* Is p is : j k j j k k k j : 59 : 56 + k : 115 . p r in t("u *= v : + u ). u -= v. // Sledeće radi i za char. k = s lu c a ja n . // byte.70 Misliti na Javi // Izaberimo broj od 1 do 100: j = s1 ucajan.n e x tF lo a t(). u = v . p r in t ( " v . p r in tfj : " + j ) . p r in t("j + k + i). u *= v. // Prim e n ljiv o i na double v = s lu c a ja n . p r in t ( " v * w + u ). // Test za brojeve s pokretnim zarezom flo a t u. p r in t (" k : " + k ) . p r in t ( " v / w : " + u ) .k. p r in t (" k % j + i). j %= k. + i).nextlnt(100) + 1. w = s lu c a ja n . long i double: u + = v. p r in t (" k * j i = k % j.n e x tF lo a t(). p rin t("j . . p r in t("u -= v : + u). U /= V . sh ort. p r i n t ( “ j %= k : " + j ) .n e x tln t(100) + 1.k i = k / j. i = j + k.w . p r in t (" k / j i = k * j.

stoga je k atkada jasnije ako se napiše: x = a * (-b ). U narni plus je su p ro ta n u n a rn o m m in u su .Poglavlje 3: Operatori 71 v : 0. Java uzim a tekuće v rem e kao v red n o st za inicijalizaciju g e n erato ra p seu d o slu čajn ih brojeva.471473 u -= v : 9. nextLong().028358952 v / w : 9.5309454 w : 0. D onja granica je nula. p o zivajući m etode: nextlnt(). P ro g ram generiše razne tipove slučajnih brojeva p o m o ć u objekta klase Randoni. p a se izlaz p ro g ra m a m ože p ro v e riti1. a p o što je nećem o zbog n e m o g u ćn o sti deijenja s n u lo m . A rg u in en t m eto d e nextlnt() zadaje g o rn ju granicu gen erisan ih brojeva. Na p rim er. short i char p retv ara u int. p a p rilik o m svakog izvršavanja p ro g ram a daje drugačiji izlaz. p ro g ra m p rv o pravi objekat klase Random.940527 u *= v : 5. Unarni operatori minus i plus U n arni m in u s (-) i u n a rn i plus (+ ) isti su o p erato ri kao i b in a rn i m in u s i plus. isti će p seudoslučajni brojevi b iti generisani svaki p u t. U narni m in u s m enja znak v rednosti. zn ačenje izraza x = -a . o čig led n o je. .47753322 v * w : 0. iako nem a nikakav efekat sem što tipove byte. slo b o d n o izbacite sem e.940527 u += v : 10. da bi se m ogao prov eriti p o m o ć u spo ljn ih sredstava. Prevodilac m ože da raspozna: x = a * -b. V ežba 4: (2) N apišite p ro g ra m koji izračunava b rzin u iz k o n sta n tn o g p u ta i k o n sta n tn o g v rem ena. U koliko p ri njegovom pravljen ju ne p rosledite n ijed an arg u m en t. M eđ u tim . U koliko p rilik o m p ravljenja Random objekta zadate isto seme (broj za inicijalizaciju g en erato ra p seu d o slu čajn ih brojeva). pa m i se to urezalo u sećanje.5843576 v .w : 0.0534122 v + w : 0. nextFIoat() ili nextDoubIe().940527 * ///:Za generisanje brojeva. U slučaju da želite drugačiji izlaz svaki p u t kada p o k ren ete p ro g ra m . Prevodilac p rep o z n aje šta ste želeli da u p o tre b ite na o sn o v u načina kako pišete izraz. ali bi čitalac m ogao da se zbuni. Broj 4 / se sm atrao „čarobnim brojem " na koledžu koji sani pohađao. rezultatu sm o đ o d ali 1. u ovoj knjizi važno je da izlaz p rik azan n a k raju p rim era b u d e što u jednačeniji.2778773 u /= v : 9.

koje se često nazivaju prefiksne i sufiksne verzije. O vo su jedini operato ri (osim o n ih koji u pliću i d o d elu ) koji im aju sp o re d n e efekte (o d n o sn o . Pri p refik sn o m uvećanju i p refik sn o m u m a n je n ju (tj. . O p e ra to r uvećanja je + + i o značava „povećaj za je d in ic u “. prefiksno um anjenje je kada se o p erato r — pojavljuje p re p rom enljive.u ti1. Skraćenice d o p rin o se lakšem p isan ju k o d a i lakšem .. čitanju koda. a p o to m se vraća nova v red n o st. ali za sufiksni oblik dobijate vred n o st p ro m en ljiv e pre nego što se o p eracija izvrši. izraz ++a ekvivalentan je izrazu (a = a + 1). P r i n t . p r in t("— i : 1 1 + . + + a ili —a). java // Prikazuje operatore + + i --. koji ne koriste sam o v red n o st o p eran a d a .i označava „sm anji za jedin icu “. već ih i m en jaju ). najpre se izvodi operacija.72 Misliti na Javi Automatsko uvećanje i umanjenje Java im a p u n o skraćenica. A ko je a tip a int. // Sufiksno umanjenje p r in t("i : " + i ). // Sufiksno uvećanje p r in t("i : 1 1 + i). Kao prim er: //: operatori/A utom atskiO peratori. prvo se vraća stara v red n o st.i) . a zatim se izvršava operacija. Slično to m e. na prim er. a++ ili a—). a sufiksno uvećanje kada se o p erato r + + pojavljuje n ak o n p rom enljive.* . Prefiksno uvećanjeje oblik kada se o p e ra to r + + pojavljuje p re prom enljive. ) } /* Is p is : i : 1 ++i : 2 i++: 2 i : 3 —i : 2 i— : 2 l : 1 * III--V idite da se vred n o st za prefiksni oblik vraća n ak o n izvršavanja operacije. ili težem . p ublic class AutomatskiOperatori { public s t a t ic void m a in (S trin g [] args) { in t i = 1. // Prefiksn o umanjenje p r i n t ( " i — : " + i —) .m in d view . p r in tC 'i : " + i ) . Dve zgodne skraćenice su o p e ra to ri uvećanja i u m a n je n ja (n a engleskom se često zovu auto-increm ent i auto-decrem ent). import s t a t ic n e t. a sufiksno um anjenje kada se o p e ra to r -pojavljuje posle prom enljive. // Prefiksn o uvećanje p rin t("i+ + : " + i++). Pri sufiksnom uvećanju i sufiksnom u m an jen ju (tj. N e sam o da o p e ra to ri za uvećanje i u m an jen je m en jaju v red n o st pro m en ljiv e. print("+ + i : 1 1 + ++i). Postoje dve verzije oba o p erato ra. O p e ra to r u m a n je n ja je -. nego je i v raćaju kao rezultat. kao i C.

reference su različite. leži u o p e ra to ru uvećanja. a koji m anji. Stoga je rezultat prvog p oređ en ja false.p rin tln (n l != n2). O p e ra to ri p o ređ en ja su m an je o d (< ). videćete da su m n o g i delovi jednostavniji.Poglavlje 3: Operatori 73 Jedno o d objašnjenja za p o rek lo im en a C + + . S y s te m . Ispitivanje jednakosti objekata O p e ra to ri po ređ en ja = = i != m o g u se p rim e n iti i na sve objekte. Što b u dete više napred ovali kroz ovu k njigu. za koje ionako d o b ro fu n k cio n išu = = i !=).p rin tln ( n l = = n 2) ispisuje rezu ltat logičkog p o ređ en ja koje se u n u ta r nje nalazi. Evo p rim era : //: o p e ra to ri/Je d n ak o st. ovo isprva iznenaduje. Šta ako želite da p o red ite ekvivalenciju stv arn ih sadržaja objekata? U to m slučaju m orate da koristite poseb nu m eto d u eq u a ls() koja p o stoji u svim objek tim a (ta m eto d a se ne koristi za proste tipove. Ali iako je sadržina o b jekata ista. a d ru g o g tru e . a o p e rato ri = = i != p o red e reference objekata. Bill Joy (jedan o d a u to ra Jave) rekao je da je „Java = C + + —“ (C p lus p lu s m in u s m in u s). koje znači „jed an k o rak dalje o d C -a“. pošto su v redno sti oba objekta klase In te g e r iste. { } } /* Is p is : fa l se true * / / / =N aredba S y s te m .o u t. veće ili jed n ak o (> = ). a ne n jihovu sadržinu. jed n a k o (= = ) i različito (!=). S y s te m . Njegov rezultat bi sig u rn o treb alo da b u d e tru e.o u t. p a ne bi im alo sm isla tra ž iti koji o d njih je veći. pa je zbog toga m n o g o jednostavnija. a o n o g sledećeg false. N aravno. O b jekti tip a boolean m o g u im ati sam o v red n o sti true ili false. ali n jihovo značenje često zb u n ju je p očetnike u Javi. O n i o cen ju ju relaciju izm ed u v re d n o sti dva o p era n d a. Jednakost i različitost se m ogu p rim e n iti n a sve proste tip o v e p o d atak a .p rin tln (n l = = n2). nagoveštavajući kako je Java jezik C + + iz kojeg su izbaćeni n e p o tre b n i teški delovi.o u t. U vrem e n a sta n k a Jave. In teger n2 = new In te g e r(4 7 ). veće od (> ). Izraz sa o p e ra to rim a p o ređ e n ja daje v re d n o st true ako je relacija tačn a i false ako je relacija n etač n a. ali im a d ru g ih stvari zbog kojih Java ipak nije m n o g o jed n o stav n ija o d C + + -a . Operatori poređenja R ezultat o p e ra to ra p o ređ en ja je logička v re d n o st (boolean). Evo kako se o n a koristi: . ali se ostala p o ređ en ja ne m o g u p rim e n iti na tip boolean.java p ublic c lass Jednakost { pub lic s t a t ic void m a in (S trin g [] args) In teg er nl = new In te g e r(4 7 ). m an je ili jed n ak o (< = ).

N ažalost.Vafi“ ). na p rim er: //: o p erato ri/ MetodaEquals2. Ah. a o p rav iln o m načinu definisanja m etode equals() do poglavlja Detaljno razm atranje kontejnera. Z atim p rik ažite njihova im ena i šta kažu. Stoga n e ć e ted o b iti željeno p o n ašan je osim ako ne rcdefinišeie (engl. i = v2 . v l .java // eq u als() Podrazumevano ne poredi sadržinu. Vežba 5: (2) N apravite klasu Pas koja sadrži dve prom enljive tipa String: ime i kaže.e q u a ls (n 2 )).74 Misliti na Javi //: o p erato ri/ M etodaEquals.. S y s te m . Z atim obavite p o red en je koristeći = = i equals() za sve reterence. equ als(v 2 )) . Vrednost v2 = new VrednostO . o redefm isanju nećete učiti sve do poglavlja Ponovno korišćenje klasa . U m etod i main() n apravite dva objekta tip a Pas sa im en im a Fleki (koji k aže:„R afi“) i Buva (koji kaže: . Ako sam i n ap rav ite klasu. Integer n2 = new In te g e r(4 7 ). override) m etodu equals() u vašoj novoj klasi.pri n t l n ( v l .out.i = 100. zato što je p o d ra z u m e v an o p o n ašan je m etode equals() da poredi reference.o u t. Većina klasa iz Javine biblioteke realizuje m eto d u equals() tako da o n a p oredi sadržaj objekata u m esto njihovih referenci. System . . } } /* Is p is : fa l se * ///:ponovo ćete biti zbunjeni: rezultat je false. jer će vas to m ožda sačuvati od problem a. ali u m eđ u v re m e n u sam o pazite na način na koji se m etoda equals() p onaša.p rin tln (n l. napišite n o v u referencu objekta tip a Pas i d o d elite je Flekijevom objektu. ali to ipak nije baš tako jed n o stav n o . Vežba 6: (3) Posle vežbe 5. c lass Vrednost { i nt i . } public class MetodaEquals2 { p ublic s t a t ic void main (S t r in g [] args) { Vrednost v l = new V red n o st().java p ublic class MetodaEquals { public s t a t ic void m a in (S trin g [] args) In teger nl = new In te g e r(4 7 ). { } } /* Is p is : true * ///:R ezultat će sada biti kao što i očekujete.

P r in t .*. Za logičke uslove ne m ožete da koristite ostale (nelogičke) tipove. p ri n t ( " j = " + j ) . import s t a t ic n e t.u til. d isjunkcija (II) i negacija (!) daju v re d n o sti true ili false tipa boolean. p r in t(“ i > j je " + (i > j ) ). // Tip in t u Ja v i ne može da se // k o ris ti kao lo g ič k i tip //! p r i n t ( " i && j je " + ( i && j ) ) . in t j = s lu c a ja n . O vakve neuspele pokušaje m ožete v ideti u k o m e n ta rim a sa o zn ak o m //! . je " + ! i ) . p rin t("i = " + i ) . kao u jezicim a C i C + + . //! p r i n t ( " i //! p r i n t ( " ! i p r in t("(i + ( (i p r in t (" (i I I j je " + ( i | ( j ) ) . + ( (i <10) } } i j i i i i i i (i /* Is p is : = 58 = 55 > j je true < j je fa ls e > = < = = = != < j je true j je fa ls e j je fa ls e j je true 10) && (j < 10) je fa ls e (j < 10) je fa ls e (i < 10) || * ///:O p erato re konjunkcije. import j a v a . u t i 1 . < 10) && (j < 10) je " < 10) && (j < 10)) ) . p r in t("i < = j je " + (i < = j )). p r in t("i > = j je " + (i > = j )) .n e x tln t(1 0 0 ). * . java // R elacion i operatori (poređenja) i lo g ič k i o p e ra to ri. p ublic c lass Logicki { public s t a t ic void m a in (S trin g [] args) { Random slucajan = new Random(47).m in d v ie w . in t i = s lu c a ja n .Poglavlje 3: Operatori 75 Logički operatori Logički o p e ra to ri konju n k cija (&&).n e x tln t(1 0 0 ). < 10) j | (j < 10) je " || ( j < 10)) ) . U ovom p rim e ru k oriste se o p e ra to ri p o re đ e n ja i logički o p erato ri: //: o p e ra to ri/ L o g ick i. disjunkcije i negacije m ožete p rim e n iti sam o na v red n o sti tip a b o o le an . p r in t("i = = j je " + (i = = j)). p r i n t f 'i < j j e " + (i < j ) ) . p r in tC 'i != j j e " + ( i != j ) ) .

Z ato p reostali delovi logičkog izraza u opšte neće b iti izraču n ati. Broj koji je na n ajm an jo j d ecim ali iznad nule i dalje je „različit o d n u le“. return vrednost < 1. naići ćete na fen o m en p o d nazivom „ n e p o tp u n o izraču n av an je“. irnport s t a t ic net.java // Prik azuje pojavu nepotpunog izračunavanja pri radu s logičkim operatorima. Nepotpuno izračunavanje K ada rad ite s logičkim o p e ra to rim a . p r in t (" iz r a z ima logičku vrednost" + b ) .glava“ ). } p ublic s t a t ic void m a in (S trin g [] args) { boolean b = te s tl(O ) && te s t2 (2 ) && te s t3 (2 ). Vežba 7: (3) N apišite p ro g ram koji sim u lira b acanje novčića („pism o . Pazite na to da je p o ređ en je brojeva u fo rm a tu p o k re tn o g zareza veom a precizno. a zatim na te rezultate p rim e n e logičke operacije.u ti 1. public c lass Nepotpunolzracunavanje { s t a t ic boolean t e s t l ( in t vrednost) { p r i n t ( " t e s t l ( " + vrednost + “ ) " ) . } } /* Is p is : t e s t l (0) r e z u lta t: true te s t2 (2 ) r e z u lta t: fa ls e izraz ima logičku vrednost fa ls e * ///:- . return vrednost < 2. O b ratite p až n ju na to d a se v re d n o st tip a boolean au to m atsk i k o nvertuje u o d govarajuči tek stualni oblik ako se k oristi ta m o gde se očekuje objek at klase String. što olakšava testiran je). N aredn i izrazi d aju v red n o sti tip a boolean tako što koriste poređ en je.76 Misliti na Javi (takvo označavanje k o m e n ta ra om o g u čav a n jihovo au to m atsk o uklanjanje.. return vrednost < 3. } s t a t ic boolean t e s t3 (in t vrednost) { p r in t ( “ te s t3 (" + vrednost + " ) " ) . P r in t . Evo p rim era koji p o kazuje n ep o tp u n o izračunavanje: //: operatori/N epotpunoIzracunavanje. Broj koji se i p o p o sled n jo j d e đ m a li razlikuje od d ru g o g b ro ja i dalje je . p r in t ( " r e z u l t a t : " + (vrednost < 2 )) . To znači da će izraz b iti izraču n av an sam o do tren u tk a kada tačn o st ili neta čn o st celog izraza m ože n ed v o sm islen o da se odredi.različit“. p r i n t ( " r e z u l t a t : " + (vrednost < 3 )) . } s t a t ic boolean te s t 2 (in t vrednost) { p r in t ( " t e s t 2 (" + vrednost + " ) " ) .mindvievv. p r in t ( " r e z u lt a t : " + (vrednost < 1 )). *. D efiniciju za int u p re th o d n o m p ro g ra m u m ožete zam en iti bilo kojim p ro stim tip o m p o d atak a osim boolean.

*. P r i n t . long nl = 200L. drug i test daje rezu ltat false. Sledeći p rim e r po k azu je te znakove: // : o p e ra to ri/V red n o sti. U to m slučaju m o rate da n avo dite p rev o d io ca d o d a tn im in fo rm ac ijam a u oblik u znakova p rid ru ž e n ih v red n o sti literala. Pošto to znači da će i rezultat celog izraza sigurno biti false.m indview. java import s t a t ic n e t. // najveća vrednost za tip sh o rt. heksadecimalno p r in t (" b : " + In te g e r.Poglavlje 3: Operatori 77 Svaki test vrši p o ređ en je sa a rg u m e n to m i vraća v re d n o sti true ili false. Literali Kada u p ro g ra m u doslov n o n avodite v ređ no sti. zašto nastavljati izračunavanje izraza? To m ože da potraje. flo a t f2 = 1F. heksadecimalno p r in t ( " c : " + In te g e r . Testovi se pozivaju preko sledećeg izraza: t e s tl(O ) && te s t2 (2 ) && te s t3 (2 ) P riro d n o je da pom islite kako će sva tri testa biti izvršena. prevodilac o b ičn o tačn o zna kojim tip o m da ih p redstavi.t o B in a ry S tr in g (b )) . M eđutim . char c = 0 x f f f f . heksadecimalno p r in t ( " s : " + In te g e r. T akođe ispisuje i p o ru k u da je bio pozvan. p u b lic c lass Vrednosti { p u b lic s t a t ic void m a in (S trin g [] args) { in t i l = 0x2f. in t i3 = 0177.t o B in a r y S tr in g (i2 )) .u t i 1. Baš zbog toga se koristi n e p o tp u n o izračunavanje: ako ne treba do kraja izračunavati sve delove logičkog izraza.to B in a r y S tr in g (s )) . // Heksadecimalno zadavanje celog broja // (malim slovima) p r i n t ( " i l : " + In te g e r. flo a t f l = 1. // su fik s za flo a t flo a t f3 = l f . // najveća vrednost za t ip byte. short s = 0 x 7 fff. // Heksadecimalno zadavanje celog broja // (v e lik im s l ovima) p r in t ( " i2 : " + In t e g e r . // Oktalno zadavanje celog broja (vodeća nula) p r i n t ( " i3 : " + In t e g e r .t o B in a r y S t r in g (i3 )). // su fik s za double double d2 = 1D. ali izlaz pokazuje drugačije: Prvi test daje rezultat tr u e pa se izračunavanje izraza nastavlja. byte b = 0x7f. // najveća vrednost za t ip char.t o B in a r y S tr in g (c )) . // sufik s za flo a t double dl = ld . p ro g ram će m ožda raditi brže. P o nek ad se m ože javiti n ed ou m ica. // su fik s za long (može da zbuni j e r l i č i na je d in ic u ) long n3 = 200. // su fik s za long long n2 = 2001. in t i2 = 0X2F .to B in a ry S trin g ( i 1 )). // su fik s za double // (Heksadecimalno i oktalno mogu se zadavati i b rojevi tip a long) ) /* Is p is : i 1: 101111 i 2: 101111 13: 1111111 .

Veliko ili m alo D označava tip double. Veliko ili m alo F označava tip float. System . 39e-43f . double expDouble = 47e47d. prevodilac če prijaviti grešku.out.39E-43 4. M eđutim . C + + -u i Javi ne postoji prikaz b in arn ih brojeva kao literala. ) ) /* Is p is : 1. Ako ih p rekoračite. O ktalni ob lik (sa o sn o v o m 8) nazn ačav a se v odećom n u lo m u zapisu broja. n azn ačav an jem v o d ečim 0x ili 0X n ak o n čega slede sim boli 0 -9 i a -f.39E-43f. koju slede cifre 0 -7 . pri rad u s heksadecim alnim i o k taln im zapisom rezultate je podesno prikazati u b in a rn o m obliku. bilo m alim ili velikim slovim a. // Automatska konverzija u double System . Veliko ili m alo L označava tip long (m eđ u tim . // 'd ' je opciono double expDouble2 = 47e47.) Tada ćete znati da ste prekoračili dozvo ljen u v red n o st.out. m alo 1 zb un juje zato što liči n a jed in icu ).7E48 * ///:- .78 Misliti na Javi c : 1111111111111111 b: 1111111 s : 111111111111111 * ///■ Slovo iza literala zadaje njegov tip. // : o p erato ri/Ekspo n en ti. Eksponencijalni zapis Za ekspon en cijaln i zapis realnog b ro ja k oristi se notacija koju sam o duvek sm atrao o b esh ra b ru ju ć o m . U g o rn jem p rim e ru o b ra tite p ažn ju na m aksim alne m oguće heksadecim alne v red n o sti za tipove char.toBinaryString(). To se lako postiže m eto d am a static toBinaryString() iz klasa Integer i Long.toBinaryString(). (E ksplicitne konverzije su d efin isan e u nastavku poglavlja. U C -u. A ko p o k u šate da inicijalizujete p ro m en ljiv u v red n o šču većom od one koju m ože d a čuva (bez o b zira na n u m eričk i oblik v red n o sti). byte i short. Za prikazivanje rezultata u p o treb ite Long.pri n tln (ex p Fl o a t ) . ja va // "e" znaći "10 na stepen". Sve celo b ro jn e tipove p o d atak a m oguče je zadavati u h ek sad ecim aln o m obliku (sa o sn o vom 16). prevodilac če ih auto m atsk i p retv o riti u int i jav iti kako treb a izvršiti sužavanje eksplicitnom konverzijom za d a tu d odelu. Vežba 8: (2) Pokažite da hek sad ecim aln i i o k taln i zapis rade s brojevim a tipa long. expFloat = 1. public c lass Eksponenti { public s t a t ic void main( S t r i ng[] args) { // V eliko i malo 'e ' su jed n ak i: flo a t expFloat = 1. Im ajte u vidu da se m anji tipovi autom atski k o nvertuju u int kada se proslede u Integer.pri ntln(expDoubl e ) .

O p e ra to ri nad b ito v im a vode p o rek lo od niskog nivoa jezika C. O p e ra to r konjunkcije nad bitovim a (&) daje jedinicu kao vrednost izlaznog bita ako su oba ulazna bita jednaka jedinici.) O n a se k o risti u ek sp o n en cijaln im izrazim a kao što su 1. O p e ra to ri nad b ito vim a p rim e n ju ju logičku (B ulovu) algebru nad od go varaju ćirn bito v im a dva a rg u m e n ta da bi izračunali rezultat. Mi sm o. imali funkcije koje sm o koristili ako nam je zaista bila potrebna osnova p riro d n o g logaritm a. obićno 10.718‘43. ovaj običaj je nastavljen u C -u . H je označavalo eksponent. C + + -u i sada u Javi. Kada napišete: long n3 = 200.Poglavlje 3: Operatori 79 U nauci i inžen jerstv u ’e’ o značava o sno vu p riro d n o g logaritm a. (Preciznija v re d n o st tip a d o u b le je d o stu p n a u Javi kao M ath. Vežba 9: (1 ) Prikažite najveći i n ajm an ji b ro j koji se m ože zapisati p o m o ću eksponencijalno g zapisa tipova float i d o u b le .39 x 10~43.39 x e'43. M eđ u tim . pa bi v am bez p ratećeg slova f prijav io grešku. o n o značava 1. nem a dvosm islenosti.E . za korišćeni brojni sistem. kada se d irek tn o radi s h ard v ero m i treba d irek tn o postavljati bitove hardverskih registara. ne na saniom poćetku. sm a trao bih da je osnova 8. T vorci FORT R A N -a odlučili su d a če e značiti „deset na step en “. pa je L iza bro ja 200 iziišno. M eđ utim . koristeći FORTRAN II na m ašini IBM 1620. Sećam se da sam p rvi p ut video eksponencijalni zapis napisan s m alim e u kasnim sedam desetim i sm atrao sam ga zbunjujućim .39 x 2. koja se uvek piše m alim slovom . kada napišete: flo a t f4 = le-43f. tražeći eksplicitnu konverziju iz d o u b le u float. o p era to re nad bitov im a verovatno nećete previše koristiti. u stvari. daje nulu. ali su sve bile pisane velikim slovim a. što znači 1. FORTRAN je u p o tp u n o sti pisan velikim slovim a.39 e-43f. Froblem se pojavio kada su m ala slova p ro d rla u FORTRAN. inaće. stepen prev od ilac o b ičn o tu m ači e k sp o n e n đ ja ln e brojeve kao brojeve d vo stru ke preciznosti (d o u b le ). Operatori nad bitovima O p e ra to ri nad bitov im a o m o g u ćav aju da rad ite s p o jedin im bitov im a od kojih se sastoji neki prosti tip podataka. // 10 na -43.2 Bilo kako bilo. Java je trebalo da b u d e u g ra đ e n a u a p arate za prikazivanje In tern eta na ek ran u TV-a. koja otprilike iznosi 2.718. što je ču dn o. Stoga. a John K irkham jc napisao: „R ačunarim a sam počeo da se bavim 1962. pa je ova orijentacija ka niskom nivou i im ala sm isla. e. To potičc verovatno od toga što su stari uređaji za u no s koristili 5-bitni Baud o to v kod koji nije p o d r/av ao m ala slova. tokom šezdesetih i početkom sedam desetih.“ . Slovo E je u eksponencijalnoj notaciji uvek pisano kao veliko i nikada nije bilo m ešano sa osnovom p riro d n o g logaritm a. O p erato r disjunkcije nad bitovim a (I) daje jedinicu kao vrednost izlaznog bita ako je bilo koji od ulaznih bitova jed nak jedinici. je r se FO RTRAN u p o trebljava u nauci i inženjerstvu. U to vrem e i oktalni form at je bio široko rasp ro stranjen m edu p rogram erim a. Da sam naišao na oktalni broj u eksponencijalnoj notaciji. P rateći znak n e m o ra te da k o ristite kada prevodilac m ože sam da o d red i odgovarajući tip. i svako je m ogao pom isliti d a će tvorci o b ra titi p a žn ju na takvu d vo sm islen ost. U to vrem e. o b ra tite p a žn ju kad a u Javi v id ite izraz kao što je 1. ako ste se navikli na e kao na o sn ov u p riro d n o g logaritm a.

im a sam o jed an arg u m en t.jed inicu ako je ulazni b it je d n ak nuli i n u lu ako je ulazni b it jed n ak jedinici. za o p erato re nad b ito v im a koristi se sam o p o jed an znak. viši bitovi se p o p u n jav aju jedinicom . shift) takođe rade s bitovim a.80 Misliti na Javi daje n u lu sam o ako su oba ulazna bita jednaka nuli. O ni m o g u da se k oriste isključivo s p ro stim . viši bitovi se p o p u n jav aju nu lo m . Vežba 10: (3) N apišite p ro g ram s dve b in a rn e k o n stan te koje im aju n aizm en ičn e jedinice i nule. ali ne i oba. a d ru g o j jed in ica. sign extension)\ ako je v red n o st p ozitivna. dobićete .toBinaryString(). viši bitovi se p o p u n jav aju n u lo m . O zn ačen o p o m eran je ud esn o > > k oristi produžavanje uz očiivanje znaka (engl.im aju dva o p eran d a.) T ip boolean se tre tira kao je d n o b itn a v red n o st. O p e ra to r p o m era n ja ulevo (< < ) kao rezultat daje o p e ra n d s leve stra n e o p e rato ra. celobrojnim tip o v im a. osim što se n e javlja n e p o tp u n o izračunavanje. ako je v red n o st negativna. a rezu ltate prikažite m eto d o m Integer. Negacija nad bitovim a (~ . Ovaj o p e ra to r ne postoji u C -u ili C++-U. N ad njim m ožete da p rim e n ite k o n ju n k ciju . Operatori pomeranja O p erato ri p o m e ran ja (engl. 1= i A=. ako je jed an ili d ru g i ulazni bit je d n a k je dinici. (Pošto je ~ u n a rn i o p erato r. p o m eren u d esn o za bro j bitova naveden nakon o p erato ra . s tim što je prvoj na n ajm an je zn ačajn o m m estu nula. Isključiva disjunkcija nad bitovim a ili XOR ( A) daje jedinicu kao v red n o st izlaznog bita. p a će v am biti lakše da se setite značenja ako se d o setite sledećeg: p o što su bito v i . Na pro m en ljiv e tip a b o o le a n ne m ožete p rim en jiv ati o p erato re p o m e ran ja koje ćem o u p rav o opisati. ali ne i negaciju nad b ito v im a (verovatno da bi se izbeglo m ešanje s logičkom negacijom ). O p e ra to ri n a d b ito v im a m o g u da se k o m b in u ju sa z n ak o m = i tim e u jed in e operaciju sa dodeljivanjem : dozvoljeni su &=. Za o p erato re n ad b ito v im a i logičke o p e rato re k o riste se isti sim boli. byte ili short. Ako p o m e ra te v red n osti tip a char.m ali“. Za tip boolean o p e rato ri n ad b ito v im a im aju isti efekat kao i logički o p e ra to ri. pa je situacija nešto d rugačija. d isju n k ciju i isključivu d isju n k ciju n ad bitovim a. (U putstvo: to će vam biti najlakše s hek sad ecim aln im k o n sta n tam a). Koristi se sam o p et nižih b itova vrednosti s desne stra n e o p erato ra. zero extension): bez o bzira na znak. on e će biti p ro širen e na int pre nego što se izvrši p o m eran je i rezu ltat će biti tip a int. O vo vas sprečava da izvršite p o m eran je za više m esta nego što ima bitova u ru ita r p ro m en ljiv e tip a int. O p e ra to r isključive disju n k cije n ad b ito v im a nem a ekvivalentan logički op erato r. (Svi ostali o p erato ri n ad bitovim a su b in a rn i o p erato ri .) Negacija n ad b ito v im a daje negaciju ulaznog bita . koja se takođe naziva i operatorprvogkom plem enta ) jeste u n a rn i o p erato r. Ako o perišete n ad v red n o šću tipa long. U Javu je takođe d o d a to i neoznačen o p o m e ran je u d esn o » > koje k oristi produžavanje nz dodavanje nula (engl. Z ato ovaj o p e ra to r predstavlja jed in i način da n a dve vrednosti tipa boolean p rim e n ite o p eraciju XOR. Z ad ajte ta dva b ro ja kao arg u m en te svih o p e ra to ra n ad bito v im a na sve m o g u će naćine. p o m e ren ulevo za broj bitova naveden n.. o n ne m ože da se k o m b in u je sa zn ak o m =. O p e ra to r o zn ačen o g p o m e ran ja u d esn o (> > ) kao rezultat daje o p e ra n d s Ieve stra n e o p e ra to ra .ikon o p erato ra (niži bitovi p o p u n jav aju se n u lan ia).

to B i n a ry S tri n g (b )) .m in d v ie w .to B i n a ry S tri n g ( i) ) . import s t a t ic n e t. U m esto toga. A ko ovu o p eraciju p rim e n ite na vredn o sti tip a b y te ili short. Kada se n eozn ačen o p o m eran je u d esn o k o m b in u je sa d o d e lo m .to B i n a ry S tri n g (b )) . L vrednost se zam enjuje v red n o šću lv red no st p o m e re n o m za d v re d n o st m esta.toBi n a ry S tri n g (s )). pri n t(Lo n g . pri n t (In te g e r. p ublic class NeoznacenoPomeranjeUdesno { p ublic s t a t ic void m a in (S trin g [] args) { in t i = -1. long 1 = -1. p rin t(In te g e r. pri nt (In te g e r . byte b = -1. pa u tim slučajevim a kao rezultat d obijate — 1. p r i n t ( In t e g e r . ali se sk raću ju p riiik o m d odele. on e se p ro širu ju na int. * . pa ne m ožete da izvršite p o m e ra n je za više m esta nego što im a b itova u n u ta r p ro m enljive tip a long. nećete d o b iti p rav iln e rezultate. 1 > » = 10.u til.toBi n a ry S tri n g (b )) . i »>= 10. pri n t (In t e g e r . p o m e ra ju ud esn o. b = -1.java // Test za neoznačeno pomeranje udesno. po sto ji p ro blem . p r in t(L o n g . P r in t . Biće k orišćeno sam o šest nižih b ito v a v re d n o sti s desne stra n e o p erato ra. s >»= 10.to B in a r y S trin g (l) ) . pri n t(In te g e r.toBi n a ry S trin g ( 1 ) ) . toBi n a ry S tri n g (b »> 1 0 )) . ) } /* Is p is : 11111111111111111111111111111111 1111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 11111111111111111111111111111111 1111111111111111111111 * ///:- . pri n t (In te g e r .t o B in a r y S t r in g (i)) . To pok azuje n a red n i p rim er: //: operatori/NeoznacenoPomeranjeUdesno.toBi n a ry S tri n g (s )) . P om eranje m ože da se k o m b in u je sa z n ak o m jed n ak o sti ( « = ili » = ili » > = ) . short s = -1. pri n t (In te g e r . b >»= 10.Poglavlje 3: Operatori 81 rezu ltat tipa Iong.

-1). p rin tB in a ryLo n g ("l | m". P r in t .i ) > » 5 ". p r in tB in a r y In t( " ( . p r in t B in a r y In t (" i « 5 ". long 1 = s lu c a ja n . p rin tB in a ryLo n g ("l & m". j ) . pri n tB in a r y In t("n a jv e ć i" . .82 Misliti na Javi U posled njem p o m e ra n ju . . in t i = s lu c a ja n .n e x t ln t (). p r in t B in a r y In t ( " . . p rin tB in a ry L o n g (". pri ntBi narylnt("najm anj i " . p rin tBin aryLong( " . 1 | m). maxpos). i ~ j ) . već je d irek tn o ispisana. +1L). -1). maxneg). p a se d o b ija isp ravn a v rednost. p r in t B in a r y In t (" i | j " . i « 5 ). prin tB in aryLo n g (" +1L“ . * . 1 « 5 ).i) » 5 ". p r in t B in a r y In t (" i » 5“ . p r in t B in a r y ln t ( " . i » 5 ) .i ) . i ) . i » > 5 ). in t maxpos = 2147483647. 1 ).lL ". p r in t B in a r y In t (" i & j " . p rin tB i naryLong("najmanj i " .java // Korišćenje operatora nad bitovim a.n e x tln t ().u t il import s t a t ic n e t. +1). (~ i) > » 5). 1 & m).1 " . Evo p rim e ra koji p o kazuje korišćenje svih o p e ra to ra koji se o d n o se n a bitove: //: operatori/RadSaBitovim a.i ) .i" .l" . 11). p r in t B in a r y In t ( " ~ i" .m in d view . 1 1n ). p r in tB in a r y In t("+ l". prin tB in aryLon g ("m ". i | j ) . pri ntBi naryLong( " n a jv e ć i". p r intBinaryLong("1 « 5 ". p r in t B in a r y In t ( " j " . i & j ) . rezultu ju ća v red n o st nije d o d eljena prom enljivoj b. m). long m = s lu c a ja n . import ja v a . pri ntBi naryLong ( " 1 " . p r in t B in a r y In t ( " ( . 1 ^ m).u ti1. -1L). nex tLo n g(). -1). p rin tB in aryLo n g ("l " m". nextlong( ) . p ublic class RadSaBitovima { public s t a t ic void main (S t r in g [] args) { Random slucajan = new Random(47). (— i ) » 5 ). p r in t B in a r y In t (" i > » 5 ". in t maxneg = -2147483648. long 1 1 = 9223372036854775807L. p r i n t B in a r y In t ( " i". p rin tB in aryLo n g ("~ 1 " . in t j = s lu c a ja n . p r in t B in a r y In t (" i " j " . long 11n = -9223372036854775808L.

} s t a t ic void p rin tB in aryLo n g (String s. binarno: 10111010001001000100001010010101 . binarno: 1100110010110110000010100010110 i & j .t o B in a r y S t r in g (i)). binarno:\n " + L o n g .Poglavlje 3: Operatori 83 prin tB in aryLo n g (" 1 » p rintBin aryLo ng (" (-1) p ri ntBi naryLong(" 1 » > p rin tB in aryLo n g (" (-1) 5". in t : 1. » 5" . in t : 1149784736. > » 5" . in t : -5 9 5 6 3 8 3 9 7 . binarno: 11111101110100010010001000010100 (— i ) » 5 . in t i ) p r in t(s + ". in t : 2147483647. binarno: 1 n a jv e ć i. in t : 1717241110. long: ". binarno: 10000000000000000000000000000000 i. in t : 570425364. binarno: 1000101110110111011110101101011 j . 1 » 5 ). binarno: 11111110011111110100011110010111 i A j . in t : " + i + " . binarno: 1000100100010000101001010100000 i » 5 . binarno: 100010000000000000000000010100 i | j . binarno: 1000101110110111011110101101010 . binarno: 11011100011111110100011110000011 i « 5 . binarno: 11111111111111111111111111111111 +1. binarno: 1111111111111111111111111111111 najm anji. (-1) > » 5) ) J s t a t ic void p rin tB i n a ry ln t(S t ring s.i . binarno:\n In t e g e r . in t : 36625899. in t : 1172028778. (-1) » 5 ). binarno: 101110100010010001000010100 (— i ) » > 5 . in t : 1172028779.i. in t : -2 5 2 1 3 0 3 3 . 1 > » 5 ). in t : -3 6 6 2 5 9 0 0 .to B in a r y S tr in g (l)). } } /* Is p is : -1. long 1) { p r in t(s + " . binarno: 10001011101101110111101011 i > » 5 . in t : 97591 8 28. in t : -1172028779.+ 1 + " . in t : -2147483648. binarno: 10001011101101110111101011 * // /= - . in t : -1. 5". in t : 3 6625899.

(U putstvo: u p o treb ite h ek sad ecim a ln u k o n sta n tu ). m ožete da k o ristite i u o b ićajen u k o n stru k c iju if-else (o p isan u kasnije). P rik azan je rezu ltat p ro g ram a za deo koji se tiče tip a int.toBinaryString().P r i n t. O p e ra to r uslovljavanja se razlikuje od k o n stru k cije if-else p o to m e što izraćunava vrednost. ispisuju v red n o st tipa int ili long u b in a rn o m o b lik u zajed n o s tek stu a ln im o p iso m .* . ovaj p rim e r pokazuje i m in im aln u i m aksim alnu v red n o st kao i v re d n o sti +1 i -1 za tipove int i long. I s t a t i c in t sta n d a rd n iIfE ls e ( in t i) { i f (i < 10) . Vežba 13: (1) N apišite m e to d u k oja p rik azu je char v red n o sti u b in a rn o m obliku. Evo p rim era u kojem ćete videti tu razliku: / / : o p e ra to ri/T e rn a ry IfE ls e .84 Misliti na Javi Dve m eto de na k raju . Ako je v red n o st logičkog-izraza false. P o m erajte tu jed in ic u o p e ra to ro m označenog p o m era n ja u d esn o p o svim m o g u ćim b in a rn im polo žajim a i sve ih prikažite m e to d o m Integer. ali je te rn arn i o p e ra to r m n o g o sažetiji. N aravno. Iako je jed n a od n ajistak n u tijih osobina jezika C (iz koga ovaj o p e ra to r potiče) m o g u ć n o st pisanja saž. O p e ra to r se k oristi u obliku: lo g ič k i. a zatim ih o p e ra to ro m n eo zn ačen o g p o m e ra n ja p o m e ra jte u d esn o p o svim m o gućim b in a rn im p o lo žajim a i sve ih p rik ažite m e to d o m Integer. Vežba 11: (3) K renite o d b ro ja s je d n o m b in a rn o m jed in ico m na n ajznačajnijem m estu. Rezultate rada m eto d e prikažite n a n ek o lik o različitih znakova. treb a biti o p rezan pri njegovom sv akodnevnom korišćenju jer lako m ože da pro izv ed e nečitljiv kod.jav a import s t a t i c n e t. Vežba 12: (3) K renite o d b ro ja sa svim b in a rn im jed in icam a. printBinaryInt() i printBinaryLong(). O b ra tite p ažn ju n a to da najviši b it p redstavlja znak: 0 označava p o zitivan broj. P o m erite ih za je d n o m esto ulevo. Ternarni operator uslovljavanja Ternarni o p e ra to r uslovljavanja n eo b ićan je jer im a tri o p era n d a. izraćunava se vrcdnostl i njen rezultat postaje v redn o st cele o p eracije. pa m ožete videti kako o n e izgledaju.etih izraza i iako je tern arn i o p e ra to r delim ićno uveden zbog efikasnosti. za razliku o d uobičajene n ared b e if-else koju ćete videti u sledećem o deljku ovog poglavlja. izračunava se vrednostO i taj rezultat postaje vrednost operacije.m in d v ie w . a 1 negativan.iz r a z ? vrednostO : v red n o stl Ako je v red n o st logičkog-izraza tr u e . public c la s s T ern ary IfE lse { s t a t i c in t t e r n a r n i f in t i) { re tu rn i < 10 ? i * 100 : i * 10. O sim što p o kazuje dejstvo svih o p e ra to ra n ad b ito v im a n a v re d n o sti tip a int i long.toBinaryString().u til. O vakav b in arn i zapis celih b rojeva naziva se drugi kom plem ent. jer kao rezultat daje v red n o st. O vo je pravi op erato r.

Poglavlje 3: Operatori 85 return i * 100. z pri n t(s + x + y + z ) . Č ini se da je to razu m ljiv način koriščenja tih o p e rato ra.m in d view . kao što ste več videli. y . p r in t ( t e r n a r n i(1 0 )).u ti1. u kom binaciji s nekim d ru g im o g raničenjim a C + + -a . p rin t(x + " " + s ) . to je u m esn o kada pro m en ljiv o j dodelju jete je d n u od dve v rednosti. pa su u jezik dodali prcklapnnje operatora (engl. Operatori + i += za znakovne nizove Postoje o p e ra to ri koji u favi im aju specijalnu n am en u : o p era to ri + i + = m o g u se koristiti za nadovezivanje znako v n ih nizova. y = 1. pa p ro g ram eri na Javi ne m ogu da preklope o p erato re. javlja se zan im ljiv efek at. P r in t . tada svi o p e ra n d i koji slede tako đ e m o raju biti tog tip a (setite se da će prevodilac au to m atsk i p retv o riti niz znakova pod navodnicim a u String): //: o p e ra to ri/S trin g O p e rato rs. M eđ u tim . } p ub lic s t a t ic void m a in (S trin g [] args) p r in t ( t e r n a r n i( 9 ) ) . z = 2. standardniIfElse() se lakše čita i brže piše.ja va import s t a t ic n et. A k o je p rv i o p eran d izraza tipa String. S trin g s = "x. p u b lic c lass String O p eratori { p ub lic s t a t ic void main( S t r i ng[] args) { in t x = 0. * . p r in t ( s t a n d a r d n iIf E ls e ( lO ) ) . preklapanje o p erato ra je. // Pretvara x u Strin g . kao što m ogu p ro g ram eri na C #-u i C++-U . el se return i * 10. Pri korišćen ju o p era to ra na znak o v n im nizovim a. iako se ne u k lap a u trad icio n aln i način njihovog korišćenja. N ažalost. ispalo p rilično kom plikovano za p rog ram ere koji su tu m o g u ćn o st hteli da u grade u svoje klase. operatoroverloading) koje je om ogućilo dodavanje značenja skoro svakom o p e ra to ru . { } } /* Is p is : 900 100 900 100 * ///:V idite d a je k o d m eto d e ternarni() sažetiji od o noga što biste m o rali pisati d a te rn a rnog o p e ra to ra nem a. O va m og u ćn ost se činila kao d o b ra ideja pro jek tan tim a C + + -a. p r in t ( s t a n d a r d n iIf E ls e ( 9 ) ) . ova m o gućnost je i dalje ocenjena kao previše složena. Stoga d o b ro razm islite p re nego što u p o treb ite te rn a rn i o p e ra to r po pravilu. Iako bi se preklapanje o p erato ra m nogo jednostavnije realizovalo na Javi nego na C ++-U (što je pokazano u jeziku C# koji inui jedn ostav n o preklapanje o p era to ra ). kao u m eto d i standardniIfElse().

v idite kako je o p e ra to r + = u p o tre b lje n da se prom enljivoj s doda znakovni n iz i kako je z ag rad o m o d re đ e n red o sleđ izraču n av an ja izraza. Tako će p ro b lem biti otk riv en p re nego što p o k u šate da pok ren ete program . U C -u i C + + -u rezultat ove d o d ele bi uvek b io true.) Sličan p ro blem u C -u i C + + -u jeste korišćenje k o nju n k cije i đ isjunkcije nad bitovim a um esto logičkih varijanata.šu s dva (&& i II). K onjunkcije i disju n k cije nad b ito v im a se pišu s jed n im sim bolom (& ili I). nego će p ri prevođenju prijaviti grešku. dakle ta konverzija ne zavisi o d redosleda argum enata. Stoga se ovaj tip zam ke u Javi ne javlja. da bi celi brojevi u njoj bili sabrani p re prikazivanja. jer neće dozvoliti da iz n eh ata iskoristite pogrešan tip u izrazu. z x. Veoma česta greška u C -u i C + + -u je: while (x = y) { / / •••• } P ro gram er je o čigledno želeo da ispita jed n ak o st (= = ).to S trin g O } ) /* Is p is : x. a da n ism o m orali da pozivam o g lom azniju izričitu m eto d u . O vo važi i u Javi. Integer. . y i z u znakovne ekvivalente i nadovezati ih. a ne da vrši dodelu. O vo se đesilo zato što će Java prevodilac p retv o riti x.toString(). i verovatno biste dobili b eskrajn u petlju. y . y . u m esto da ih p rv o sabere. a ne 3. R ezultat ovog izraza u Javi nije tipa boolean. (G rešku p ri p rev o d en ju jed in o nećete dobiti kada su x i y tipa boolean. u ovom slučaju. što b ism o dobili da su ti celi brojevi sab ran i. N ajzad. Im ajte u vid u posled n ji p rim e r u m e to d i main(): p razan znak o v n i niz iza kojeg sledi + i neki p ro st tip. p r i n t ( “ " + x ). Isto kao i sa = i = = . dok se logička k o n ju n k cija i d isjunkcija pi.ng. Javin prevodilac to ponovo sprečava. z 012 0 x. ako je y razlićito od nule. ali prevodilac očekuje tip boolean i neće izvršiti konverziju iz tipa int. Česte greške prilikom korišćenja operatora N ačinićete je d n u od čestih grešaka ako p ri ra d u sa o p e ra to rim a izostavite zagrade a niste sasvim sig u rn i kako će teći izraču n av an je izraza. lako je greškom upisati sam o jed an znak um esto dva. tada je x = y ispravan izraz što bi u p re th o d n o m p rim eru verovatno predstavljalo grešku u k u can ju . D ruga n a re d b a p rin t pretvorila je vodeću p ro m en ljiv u u Stri. // Skraćeni zapis umesto In te g e r. y . z (sabrano) = 3 0 * ///:O b ratite pažn ju na to da je p rv a n a red b a p rin t ispisala 012. Java će au to m atsk i p retv o riti taj tip u String.86 Misliti na Javi s + = “ (sabrano) = // Operator nadovezivanja p rin t(s + (x + y + z ) ) .

ako dodelite celobrojnu v red n o st prom enljivoj u fo rm a tu p o k retn o g zareza. casting ) ili da je sprovede u slučajevim a u kojim a se n o rm a ln o ne bi dogodila. pa se inform acije nikad ne gube. P ro g ram er m ože i da zahteva eksplicitnu konverziju (engl. Na p rim er: // : o p e r a to ri/ iz ric ite K o n v e rz ije . n avedite željeni tip u n u ta r zagrada. Proiirujuću konverzijn ne treba izrićito zahtevati jer novi tip m ože da ćuva z n a tn o više in fo rm acija nego stari.Poglavlje 3: Operatori 87 Eksplicitna konverzija tipova Kada je p o treb n o . (Kasnije u knjizi videćete i da se m ože vršiti eksplicitna konverzija objekata u o k v iru porodice tipova. ali ne i u stran i tip kao što je Stena. Na p rim er. // "Sužavajuća k o n ve rz ija ": i = ( in t ) lng2. U d ru g im situacijam a. // Ovde j e e k s p lic itn a konverzija neophodna } } III-Kao što vidite.a ako ipak to želite. kao i na p rom enljivoj. pa e k s p lic itn a konverzija // zapravo n ije potrebna long lng2 = (long)200. je r tim e m ožete d a ie naglasite ili da kod u činite jasnijim . D a biste izvršili eksplicitnu konverziju. Im ajte u vidu da je đozvoljena i izlišna eksplicitna konverzija. prevodilac.to m ože biti op asn o . Klase takođe ne dozvoljavaju eksplicitnu konverziju. obaveštavajući vas na taj način da . Hrast m ože biti eksplicitno k o nvertovan u Drvo i o b rn u to . m oraćete izrićito da tražite konverziju“. a u to m atsk a konverzija m ože izazvati m alo glavobolie. suvišna konverzija se dozvoljava. U to m siučaju prevođilac vas prisiljava da vršite eksplicitn u konverziju. kada prelazite sa tipa p o d atak a koji m ože da čuva više inform acija na onaj koji čuva m anje). Java au to m atsk i p retv ara jed an tip po d atak a u drugi. eksplicitna konverzija m ože b iti n e o p h o d n a da bi kod uop šte m o gao biti preveden. long 1ng = (lo n g )i . za to m o ra da postoji posebna m etoda. Na prim er. ipak. izuzev tipa boolean koji u o p šte ne m ožete k o nvertovati.. kad god treb a.) . U C -u i C++-U . pri čem u rizikujete da izgubite inform acije. Da biste konvertovali jed n u klasu u d ru g u . U Javi je a u to m atska konverzija b ezb ed n a osim kada vršite takozvanu snžavajuću konverziju (tj. 1ng2 = 200. a u to m atsk i prevodi v red n o st tip a int u tip long. // "P ro š iru ju ć a k o n v e rz ija ". prevodilac će a u to m atski konvertovati tip int u tip float. s leve strane v red n o sti ko ju tre b a k o nvertovati. Java dozvoljava da izvršite e k sp liđ tn u konverziju iz bilo kog pro sto g tipa u bilo koji dru gi prost tip. lng = i . eksplicitnu konverziju je m oguće izvršiti na nu m eričk o j vred n o sti.ja v a public c lass iz r ic ite K o n v e r z ije { p ublic s t a t ic void m a in (S trin g [] args) { in t i = 200.

4 f. flo a t fiznad = 0 .ja v a // Šta se dešava kada broj tip a flo a t // i l i double i z r i č i t o p re tv o rite u ceo b ro j? import s t a t ic n e t. odgovor je da se p rilik o m eksplicitne konverzije tipa float ili double u ceo broj (tip int).round(ispod): 0 M ath . p r in t ( " (in t ) iz n a d : " + ( in t)iz n a d ). m o ra te p aziti na odsecan je i zaokru živ an je. p r in t ( "M ath. p r in t ("M a th .7. round(ispod)) . pu b lic class Iz ric ita K o n v e rz ija B ro je v a { public s t a t ic void m a in (S trin g [] args) { double iznad = 0.7 f.7.round( i spod): " + Math.round(iznad)) .88 Misliti na Javi Odsecanje i zaokruživanje K ada obavljate sužavajuću konverziju. fispod = 0 .4. P rim era rad i. ispod = 0. ako realan bro j tip a float izričito p retv o rite u ceo bro j tip a int. ro u n d (fisp o d ): 0 * ///:- .* . p rin t("M a th .round(iznad): 1 M ath. p ublic class ZaokruzivanjeBrojeva { p ublic s t a t ic void m a in (S trin g [] args) { double iznad = 0.rou n d (fi znad): " + M ath. } } /* Is p is : (in t)iz n a d : (in t)is p o d : (in t)fiz n a d : (in t)fis p o d : 0 0 0 0 * ///:Dakle. import s t a t ic n e t. p r in t ( " (in t ) f iz n a d : " + ( in t ) f i z n a d ) . U koliko h oćete da rezultat b u d e z ao k ru žen .hoćete li d o b iti 30 ili 29? O d g o v o r n a to p ita n je naved e n je u sledećem p rim e ru : //: o p e ra to ri/ Iz ric ita K o n v e rz ija B ro je v a .7 p retv arate u int .m in d v ie w . broj 29.ro und (fiznad): 1 Math.Math: //: o p erato ri/Z aok ru zivan jeB rojeva.u til.lang. ro u n d (fisp o d )) . p r in t("M a th . } } /* Is p is : M ath. decim ale uvek odsecaju.round (fiznad)) .u til.ro u n d (fis p o d ): 1 1 + Math.m in d v ie w . * . p r i n t ( “ (in t )is p o d : " + (in t )is p o d ).7 f.4. šta u ra d i Java? Na p rim er. p r in t ( " (in t)fis p o d : " + ( in t ) f i s p o d ) .4 f. fispod = 0 . ispod = 0.java // Zaokruzivanje brojeva tip a flo a t i double. P r in t .roun d(iznad): " + Math. u p o tre b ite m e to d u round() iz b iblioteke java. flo a t fiznad = 0 . P r in t .

Prenosivost je n ajb itn iji razlog za korišćenje o p e ra to ra sizeof() u C -u i C ++-U .) U prin cip u . nije p o tre b n a p o seb n a n ared b a iinport za n jen o uvoženje i korišćenje. Na p rim er. byte ili short). p re nego što izvrši neku o peraciju za koju je b itn a veličina p ro m en ljivih. lavi ne treba o p e ra to r za o d ređ iv an je veličine jer su svi tipovi p o d ata k a uvek iste veličine. Na ovom nivou ne razm išljajte o prenosivosti . boolean y) { . koji su m anji o d int (tj. a rezultat će tak ođ e biti tipa int. Različiti tip o v i p o d atak a m o gu im ati različite veličine n a različitim raču n arim a. rezultat će biti tip a long. Ova d ato tek a se m ožc prevesti bez grešaka. rezultat će b iti tipa double. Sažet pregled operatora Sledeći p rim e r pokazuje koji prosti tipovi m ogu da koriste o d re đ e n e o p erato re .o n a je u g rađ ena u jezik. jer su redovi koji m og u da izazovu grešku p retv oreni u k o m e n ta r p o m o ću //!. ako tu v red n o st želite da p onovo dodelite m an jem tip u . (A pošto vršite d o d elu m an jem tip u .. videćete d a će te v red n o sti b iti u n ap ređ en e u tip int pre nego što se operacije izvrše. Unapređenje tipova Ako vršite bilo koju m atem atičk u operaciju i operaciju nad b itov im a s p ro stim tipo vim a p o datak a.Poglav[je 3: Operatori 89 Pošto round() p rip ad a biblioteci java. Stoga p ro g ra m e r m o ra da im a in fo rm aciju o veličini tip o v a koje koristi. p ub lic c lass SviO peratori ( // Da bi se p r ih v a t ili re z u lta ti logičkog te s ta : void f(boolean b) {} void boolTest(boolean x. Program i na p rv o m ra ču n a ru mogli bi da čuvaju veće v red n o sti u c elob ro jn im p ro m en ljiv am a. rn orate da koristite eksplicitnu konverziju. //: o p e ra to ri/ S v iO p e ra to ri.java // Prik az uje sve operatore nad svim prostim tipovima podataka // da bi pokazao koje su o p era cije dozvoljene. to je isti p rim e r koji se stalno ponavlja. ako p o m n o ž ite float i double. d o k d ru g i to m ože d a rad i sa 16 bitova. Stoga. ako saberete int i long. char. na svim ra ču n arim a. prenosivost zadaje velike glavobolje p ro g ra m e rim a na C -u i C++-U . Java nema operator za određivanje veličine U C -u i C ++-U o p e ra to r sizeof() zadovoljava specifičnu p o treb u : o n daje bro j bajtova koje podaci zauzim aju.Iang. m o gu se izgubiti inform acije. sam o se u p o treb ljavaju d ru g i p ro sti tipovi. Kao što m ožete da zam islite. jed a n ra ču n ar m ože da čuva celobrojne veličine sa 32 bita. U osnovi. najveći tip p o datak a u izrazu o d ređ u je veličinu rezu ltata tog izraza.

//! x = x « //! x = x » 1. // f(x = = y ). y. //! in t i = ( in t ) x . //! flo a t f = (f lo a t ) x . 1 void charTest(char x. //! byte b = (b yte)x . f(x != y ) . x |= y . //! short s = (s h o rt)x . char y) { . y. // f(x < y ) . // x » = 1. x A= y. //! double d = (double)x. // x *= y. // X >»= 1 x &= y. // X = x % y. // E k s p lic itn a kon verzija: //! char c = (ch ar)x . // f (X > = y ). // X = -y. x = x && y. // Poređenje i f(x > y ) . // Složena dodela: = y. y.y . 1. // x /= y. // X = x + y.90 Misliti na Javi // A ritm e tič k i o p e ra to ri: // X = X * y. // x %= y. //! long 1 = (lon g)x . // x « = 1. // x + // x -= y. // f(x < = y ). / / ! x = x > » 1. // Operatori nad bitovim a: //! x = x = x = x x x x = & | ~ ~y. f(!y ). + // x+ // X-// X = +y. x = x || y. // X = x . // X = x / y .

x = (c h a r)(x « 1). X X » = > » = 1 . x &= y. x = (c h a r)(x | y ) . y ). f(x < = y ). x = (c h a r)(x » 1). o p e ra to ri: y ). y ). f(x = = y ). byte b = (b yte )x . // Operatori nad bitovima: x= (ch ar)~ y. double d = (double)x. x = (char)+ y. x |= y. x = (c h a r)(x & y ) . flo a t f = ( f lo a t ) x . y ). //! f ( ! x ) . byte y) { . x--. X « = 1.y. // Poređenje i lo g ić k i: f(x > y ) . f(x ! = y ) . x -= y. f(x > = y ). x = (c h a r)(x ~ y ) .Poglavlje 3: Operatori 91 // A ritm e tič k i x = (c h a r)(x * x = (c h a r)(x / x = (c h a r)(x % x = (c h a r)(x + x = (c h a r)(x x++. // Složena dodela: x + = y. 1. f(x < y ) . short s = (s h o rt)x . long 1 = (lon g )x . x = (char) (x > » 1). x *= y. x /= y. x = (ch ar). //! f(x && y ) . y ). //! f(x || y ) . in t i = ( in t ) x . x %= y . x "= y . // E k s p lic itn a konverzija: //! boolean bl = (boolean)x. ) void byteTest(byte x.

//! f(x || y ) . // E k s p lic itn a ko n verz ija: //! boolean bl = (boolean)x. f(x = = y ). short y) { . } void shortTest(short x. char c = (ch ar)x . in t i = ( in t ) x . f (x < y ) . x++.y. long 1 = (lo n g )x . x— . x » = 1. short s = (s h o rt)x . // Složena dodela: x x x x + = -= *= /= y.y. x « = 1. f(x != y ) . x = (b y te )(x + y ) . x = (b y te )(x | y ) . //! f(x && y ) . x = (byte)+ y.92 Misliti na Javi // A ritm etičk i o p e ra to ri: x = (b y te )(x * y ) . x = (b y te )(x & y ) . x %= y. x = (b y te )(x / y ) .y ) . y. f(x < = y ). x = (b y te )(x ~ y ) . x = (b y te )(x % y ) . x |= y . x = (b yte). x &= y . x = (byte) (x « 1). double d = (double)x. f(x > = y ). y. x A= y. // Operatori nad bitovim a: x = (b yte ). x » > = 1. y. f lo a t f = ( f lo a t ) x . x = (b y te )(x » 1). x = (b y te )(x . // Poređenje i lo g ič k i: f(x > y ) . //! f ( ! x ) . x = (b yte) (x » > 1 ).

byte b = (b yte )x . ) void in t T e s t(in t x. long 1 = (lo n g )x . //! f(x && y ) . x *= y. // Složena dodela: x + = y. x "= y . x = (s h o rt)(x & y ) . in t i = ( in t ) x . x = (sh o rt) (x | y ) . flo a t f = ( f 1o a t )x . x 1 = y. x = (s h o rt)(x % y ) . x = ( s h o r t ) (x / y ) .y . x « = 1. f (x < y ) . // E k s p lic itn a ko n verz ija: //! boolean bl = (boolean)x. //! f(x || y ) . x = (s h o rt)(x + y ) . x /= y. X » = 1. f(x > = y ). x = (s h o rt). //! f(!x ). in t y) { . // Operatori nad bitovim a: x = (sh o rt)~ y . x = (sh o rt) (x > » 1 ). x -= y. x & = y. x = (s h o rt)(x ~ y ) . f(x < = y ).Poglavlje 3: Operatori 93 // A ritm e tič k i o p e ra to ri: X = (s h o rt)(x * y ) .y ) . // Poređenje i lo g ič k i: f(x > y ) . x = (s h o rt)(x » 1 ). x++. f (x ! = y ) . x = (s h o rt)(x « 1 ). x = (sh ort)+ y. x = (s h o rt)(x . X > » = 1. x--. f(x = = y ). char c = (ch a r)x . x %= y. double d = (double)x.

f ( x == y) f ( x ! = y) //! f(!x). x "= y. // Poređenje i lo g ič k i: f(x > y ) .y. long 1 = (long)x . « = 1. x = +y. // Operatori nad bitovim a: x = -y. long y) { . x++. short s = (sh o rt)x . double d = (double)x. } void longTest(long x. x = X / y. / / ! f(x || y). x = -y. x = x A y. x = x % y. x |= y. char c = (ch ar)x . // E k s p lic itn a ko nverzija: //! boolean bl = (boolean)x. f ( x <= y ) .94 Misliti na Javi // A ritm etičk i o p e ra to ri: x = x * y. f ( x >= y ) . x -= y . x = x & y. x = x > » 1. x = x . %= y. x = x | y. f lo a t f = (f lo a t ) x . x *= y. x &= y. x = x + y. » = 1. x--. / / ! f(x & & y). // Složena dodela: x += y. f(x < y ) . x = x « 1. x x x X x /= y. >»= 1. byte b = (b yte)x . X = x » 1.

Poglavlje 3: Operatori 95 // A ritm etičk i o p e ra to ri: x = x x = x x = x x = x x = x x++. == y). « 1. > » 1. f(x M y). A y. double d = (double)x. x--. char c = (ch ar)x . | y. y. // Operatori nad bitovim a: x x x x x x & y. » 1. I void floatTest(float x. y. in t i = (in t ) x . -y . x « = 1. float y) . x >»= 1. f(x && y). // Poređenje i lo g ič k i: f(x f(x f(x f(x f(x f(x //! //! //! x x x x x x x = = = = = = = > y). x -= y. byte b = (b yte )x . f(!x). x = +y. x1 = y. y. x %= y . flo a t f = (f lo a t ) x . short s = (sh o rt)x . x » = 1. // E k s p lic itn a konverzija: //! boolean b = (boolean)x. >= y). y. x /= y . <= y). x "= y . x = -y. != y). x & = y. < y). // Složena dodela: x + = y. x *= y. * / % + - y.

x =x x =x x =x x =x x++. x %= y.96 Misliti na Javi // A ritm etičk i o p e ra to ri: x = x * y. / / ! x > » = 1. f(x < = y ). y. I void doubleTest(double x. / % + y. //! x = x | y. double y) . //! x |= y. y. //! f(x M y ) . f ( x >= y ) . 1. // E k s p lic itn a kon verzija: //! boolean bl = (boolean)x. //! X = X » > 1. x -= y . x--. //! f(x && y ) . in t i = (in t ) x . long 1 = ( 1ong) x . x /= y . short s = (sh o rt)x . f(x < y ) . / / ! x « = 1. // Složena dodela: x + = y. //! X = X « //! X = X » 1. //! x -= y. x = -y. /'/ Operatori nad bitovim a: //! x = -y. //! x = x & y. f ( x != y ) . x = +y. byte b = (b yte)x . //! f ( ! x ) . double d = (double)x. //! x = x ~ y. / / ! x » = 1. //! x &= y. x *= y. // Poređenje i lo g ič k i: f(x > y). f(x = = y ). y. char c = (ch ar)x .

x *= y. //! x = x > » 1. x /= y. // E k s p lic itn a konverzija: //! boolean bl = (boolean)x. f(x = = y) f(x != y) //! f ( ! x ) . x |= y . byte b = (b y te )x . x = +y. x >»= 1. x A= y. x++. //! f(x && y ) . . x % = y. f (x < y ) . x -= y. x--. x | y.Poglavjje 3: Operatori 97 // A ritm etičk i o p e ra to ri: x = x * y. // Poređenje i lo g ič k i: f(x > y ) .y. //! f(x || y ) . //! x = x » 1. flo a t f = (f lo a t ) x . long 1 = (lon g)x . x = x / y. X « = 1. // Operatori nad bitovim a: //! //! //! //! x x x x = = = = -y. //! x = x « 1. x = -y. f (x > = y ). // Složena dodela: x + = y. x = x . x = x + y. x & y. short s = (s h o rt)x . f(x < = y ). x = x % y. in t i = ( in t ) x . x " y. char c = (ch ar)x . x & = y. x » = 1.

out . Ipak. osim tipa boolean. U koliko vam je poglavlje bilo tesko. i nt veci = v e li ki * 4. videli ste kako su Javini o p e rato ri toliko slični o n im a iz vam a zn a n ih jezika da ih gotovo ni ne treb a učiti.rwt. Rešenja odabranih vežbi data su u elektronskom dokumentu Thinking in lava Annotatcd Solution Guide.ja va // Iznenađenje! Ja va dozvoljava prekoračenje.iici. Vežba 14: (3) N apišite m e to d u koja p rim a dva znakovna niza kao arg u m e n te i p o red i ili p o m o ću svih boolean p o ređ en ja. koja je d o stu p n a na adresi www. S d ru g e stran e. 7. koji m o ra ek sp licitn o m konverzijom da b u d e vraćen u p rv o b itn i tip (što je sužavajuća konverzija p ri kojoj se m ogu izgubiti in form acije).a = = i != obavite i test equals(). Ispišite rezultate.p rin tln ("jo s veci = " + v e c i). Svaka aritm etičk a o p eracija p rim e n je n a na ove tipove daje rezultat tip a int. ali nije tohko d o b ra. p ogledajte m u ltim ed ijsk u prezentaciju T hinking in C.M iin1Vicw.MAX_VALUE. p o što je sve već tip a int. Java je d o b ra . byte i short m ožete v id eti efekte u n ap ređ en ja tip a (pro širiv an ja) koje se javlja p ri u p o tre b i aritm e tičk ih o p erato ra . Složena dodeljivanja nc zahtevaju eksp licitn u konverziju za tipove char. I } /* Is p is : v e lik i = 2147483647 jo s veci = -4 * III-Ne dobijate niti p o ru k u o grešci niti u p o zo ren je od prevodioca. d oći će d o p rek o račenja. M ožete m u đ o d eliti vredn o sti true i false i ispitivati v re d n o st. niti se javlja izuzetak pri izvršavanju. System. izostavljanjem eksplicitne konverzije zasigurno se uprošćava kod.p ri ntl n ("v e l i ki = 1 1 + v e lik i). ali ne m ožete da vršite sab iran je ili bilo koju d ru g u operaciju.MindView. p ub lic c lass Prekoracenje { p ublic s t a t ic void m a in (S trin g [] args) { in t v e lik i = Integer. S y s te m . Kod tip o v a char. To pokazuje n a re d n i p rim er: //: o p e ra to ri/P re k o racen je. vodite raču n a o efektu sužavanja kađa vršite e k sp liđ tn u konverziju u m anji tip. byte ili short. m ogu biti eksplicitno konvertovani u bilo koji d ru g i p ro st tip.98 Misliti na Javi O b ra tite p ažn ju n a to da je tip boolean p riličn o o graničen. M ožete p rim e titi kako svi prosti tip o v i. Pozovite svoju m e to d u iz main() s nekoliko različitih String objekata. . Sažetak Ako im ate iskustva s bilo kojim jezik o m čija je sintaksa slična C -ovoj. jer m ožete n ehotice da izgubite inform acije tok o m konverzije.o u t. n e m o jte se o p u stiti i m isliti kako je sve sigurno. Eksplicitn a konverzija nije p o tre b n a kada k o ristite v red n o sti tip a int. Ako p o m n o ž ite dve v red n o sti tipa int koje su dov o ljn o velike. iako vrše p ro širen ja koja im aju isti rezu ltat kao i d irek tn e aritm etičke operacije. koji se može kupiti na lokaciji tvww. P onovo n ap o m in jem .

ili složena n ared b a. M n ogi p ro ced u raln i p ro g ram sk i jezici im aju neku v rstu n ared b e za k o n tro lu i m eđ u jezicim a često posto je sličnosti. p o d razu m ev a se da ona m ože biti jednostavna ili složena. Naredba if-else N aredba if-else je najosnovniji način na koji se k o ntroliše to k p ro g ram a. prvo ga m o rate pretvoriti u v re d n o st tipa boolean p o m o ću usiovnog izraza. Java. veći deo ovoga što sledi biti p o zn at. D eo else nije obavezan. . iako je to dozvoljeno u C -u i C ++-U (gde je tačn o sve različito o d nule. i program tnora da upravlja svojim okruženjem i da bira šta će da radi. m eđ u tim . I dalje m ožete da n ap rav ite skok koji je nalik na goto.i zraz) naredba el se naredba Logički izraz m o ra da vraća rezultat tipa boolean. o d n o sn o g ru p a naredaba u n u ta r vitičastih zagrada. JAVA KORISTI SVE NAREDBE JEZIKA C ZA KONTROLU IZVRŠAVANJA. na p rim e r if(a).i zraz) naredba i f (1ogi č k i. AKO STE p ro g ram ira li na C -u ili C ++-U . Logičke vrednosti Sve uslovne n ared b e koriste tačn o st i n etačn o st uslovnih izraza da bi odredile to k izvršavanja. U lavi birate pom oću naredaba za kontrolisanje toka programa. O b ratite p ažn ju na to da Java ne dozvoljava da kao logički tip (boolean) koristite broj. pa stoga if m ožete da koristite u dva oblika: i f (1ogi č k i. Svaki p u t kada se koristi term in naredba. Ovaj izraz vraća true ili false. M eđ u rezervisane reči za k o n tro lu izvršavanja u Javi sp ad aju if-else. P rim er uslovnog izraza je a = = b. break i n are d b u izbora switch. I bilo koji o p e ra to r p o ređ en ja iz p re th o d n o g poglavlja m ože se ko ristiti za fo rm iran je uslovnog izraza. Tu se k o risti o p e ra to r p o ređ en ja = = d a se utvrdi da li je v red n o st a jed n ak a v red n osti b. ne p o d ržava p riličn o o p a sn u n a re d b u goto (koja i dalje m ože b iti najefikasniji način za rešavanje o d re đ e n e vrste p ro b lem a ). Ako želite da k o ristite nelogički tip u logičkom testu. dowhile. return. STOGA ČE VAM. na p rim e r if(a != 0). while. for. ali je m n o g o više o g ran ičen o d tip ičn e nared b e goto. Naredba je jed n o stav n a nared b a koja se završava z nakom tačka i zarez. a n etač n o je nu ia).Kontrolisanje izvršavanja Kao i svesno biće.

sledi m eto d a test() koja saopštava da li je p retp o stav ljen a vredn ost veća. in t c i l j ) if(v re d n o s t > c i l j ) re z u lta t = +1. Petlje Petlje se k o n tro lišu rezervisanim rečim a w h ile. pri n t ( r e z u l t a t ) . m an ja ili je d n ak a ciljnoj v red n o sti: //: c o n tr o l/ If E ls e .m in d view . d o -w h ile i for. t e s t(5 .100 Misliti na Javi Kao p rim e r za if-else. t e s t(5 . nego jed an else iza kojega je nova n ared b a if. el se re z u lta t = 0. 10). e lse if(v re d n o s t < c i l j ) re z u lta t = -1. s t a t ic void t e s t ( in t vrednost. 5 ). O blik petlje w h ile je sledeći: w hile (1o g ič k i-izraz) naredba Logički-izraz se izračunava je d n o m na p o četk u petlje i p o n o v o pre svakog koraka izvršavanja naredbe. Naredba se ponav lja sve d o k logički-izraz za k o n tro lu ne dobije vredn o st false.P r in t p ub lic c lass If E ls e { s t a t ic in t re z u lta t = 0. . što nije nova rezervisana reč. // Po k lo p ile su se { } p ublic s t a t ic void m a in (S trin g [] args) { te s t(1 0 . kao C i C + + . uvlaćenje tela n ared b e za k o n tro lu izvršavanja je korisn o kako bi čitalac m ogao Iakše da o dredi gde o n o počinje i gde se završava. } } /* Is p is : 1 -1 0 * ///= Negde na sredini koda m eto d e test() v idite kom bin aciju else if. Iako je Java jezik „slo b o d n o g o blika“.ja v a import s t a t ic n e t. p rin t(re z u lta t). 5 ).u ti1 . koje se pon ek ad nazivaju i iteracione narcdbe. p ri n t ( r e z u l t a t ) .

random() < 0. U praksi. izvršava narcdbu. // : control/Prim erZaW hi1e .ja va // Prik az u je p e tlju w h ile.p rin tln ("Iz a š a o iz p e t lje ' whi1e ' " ) . } p ublic s t a t ic void m a in (S trin g [] args) { w h ile (u s lo v () ) Syste m . Z atim isp itu je uslov ( logički-izraz ) i ako je o n isp u n jen . O na vrši inicijalizaciju pre prvog izvršavanja ciklusa. Petlja for Petlja for je verovatno najčešći oblik ponavljanja (ciklusa). Uslovni izraz za while glasi: „Ponavljaj n ared b e u telu petlje sve d o k m e to d a uslov() vraća true“. ledina razlika izm eđu while i do-while jeste ta da se n ared b a u petlji do-while uvek izvrši b arem je d n o m . S y s te m . korak) naredba . ali ne i 1).o u t. do-while se rede javlja od vvhile. } } /* ( Iz v r š i t e da b is te v id e li iz la z ) */ // :- M eto da uslov() koristi sta tičn u m eto d u random() iz b iblioteke Math. Ako je uslovni izraz netačan pre ulaska u petlju vvhile. 1o g ič k i.p rin tln (re z u lta t + " . S y s te m .99. au to m atsk i ćete d o b iti odgo v araju ći znakovni niz tru e ili false.p rin tln (''U n u ta r p e t lje ' wh i 1e 1“ ) . ćak i ako izraz im a v red n o st false i prvi p u t. ćiji je rezu ltat tip a boolean. a p o to m na kraju svakog ciklusa izvršava korak i p o n o v o ispituje logički-izraz.o u t. Petlja do-while O blik petlje do-w hile je: do naredba w h ile ( lo g ić k i. Prom enljivoj rezultat vredno st daje o p e ra to r p o ređ en ja <. " ) .iz ra z . n ared b a se neće izvršiti n ijed n o m . U koliko o d šta m p ate vredn o st tip a boolean.Poglavlje 4: Kontrolisanje izvršavanja 101 Sledi je d n o stav an p rim e r koji generiše slučajne brojeve sve d o k o d red en i uslov ne b u d e ispunjen. koja generiše v re d n o st tip a double izm eđ u 0 i 1 (u k lju ču ju či 0. O b lik petlje for je: fo r ( i n i c i j a l iz a c ij a .o u t. return r e z u lta t. p u b lic c lass PrimerZaWhile { s t a t ic boolean u s lo v () { boolean re z u lta t = Math.iz r a z ) .

zahtevaju da sve prom enljive b u d u definisane na p o četk u bloka. koju o m o tav a pro st tip c h a r u objekat. Petlje for se o b ičn o k oriste za nabrajanje: //: co n tro l/:L ista Z n a k o v a . U p ro g ra m u se koristi i o m o ta čk a klasa ja v a . petlja se p rek ida i izvršavanje se nastavlja p rv o m n a red b o m n ak o n petlje for. Logički izraz se prov erava p re svakog izvršavanja n aredbe. Č im izraz d obije v red n o st false. izvršava se korak. tam o gde vam treb aju . tako da prevodilac. logički-izraz ili korak m ože b iti prazan . T radicionalni p ro c ed u raln i jezici kao što je C. Program će tad a rad iti sve d o k ga ne p rek in ete s ta statu re (o b ičn o pritisk o m na C o n tro l-C ). U Javi i C + + -u definicije p ro m en ljiv ih m ožete da napišete bilo gde u bloku. Za svaku v red n o st u p o tre b ite n a re d b u if-else da biste o dredili da li je veča. Z bog toga je stil pisanja p riro d n iji i k o d razum ljiviji.C h a ra c te r.la n g . p ub lic c lass ListaZnakova { p ub lic s t a t ic void m a in (S trin g [] args) { f o r ( char c = 0. c++) i f (Character. Vežba 2: (2) N apišite p ro g ra m koji generiše 25 slučajnih v rednosti tip a int.o u t. c < 128. m ože da rezerviše p ro sto r za njih. u m esto na p očetku m eto d e m a in (). Vežba 1: ( I) N apišite p ro g ra m koji ispisuje brojeve o d 1 do 100.isLow erCase ( c ) ) S y ste m . } } /* Is p is : vrednost: 97 znak: a vrednost: 98 znak: b vrednost: 99 znak: c vrednost: 100 znak:: d vrednost: 101 znak: : e vrednost: 102 znak: f vrednost: 103 znak: 9 vrednost: 104 znak: h vrednost: 105 znak: i vrednost: 106 znak: j * '/ / / :- O b ratite p ažn ju na to da je p ro m en ljiv a c definisana na m estu gde se koristi. O blast važenja p ro m e n ljive c je sam o n a red b a koju k o n tro liše petlja for. a p ru ža i d ru g e usluge —njena sta tic m eto d a isL ow erC ase() otkriva da li tre n u tn i zn ak p rip a d a m alim slovim a. m anja ili jed n ak a drugoj slučajno generisan o j v red n o sti.p rin tln ("v re d n o st: " + ( in t ) c + " znak: " + c ) . u n u ta r k o n tro ln o g izraza petlje for. Vežba 3: (1) Izm en ite vežbu 2 tako da n jen kod u klopite u b eskonačnu petlju vvliile.102 Misliti na Javi Bilo koji o d izraza inicijalizacija.ja v a // Prik az u je p e tlju fo r tako što // is p is u je sva mala ASC II slova. Na kraju svakog ciklusa (posle svakog izvršavanja n a red b e). . kada pravi blok.

N ju često nazivaju foreach sintaksa. j = i * 2 ) { S y s te m . i++.java p u b lic c la s s OperatorZarez { public s t a t ic void m a in (S trin g [] args) { f o r ( i n t i = 1. m ožete navesti više n a red ab a razdvojenih zarezim a i o n e će biti izvršene sekvencijalno. . i u delu za inicijalizaciju kao i u d elu koraka. kao i arg u m e n te m eto d e) k oristi sam o u k o n tro ln im izrazim a petlje for.o u t. Foreach sintaksa Java SE5 uvodi novu i sažetiju sintaksu naredbe for koja se u p o trebljava za nizove i kontejnere (o kojim a ćete više saznati u poglavljim a N izovi i Detaljno razm atranje kontejnera). j = i + 10.toBinaryString(). jer u njoj ne m o rate sam i da pravite celobrojnu p rom enljivu za bro jan je prolaza kroz sekvencu stavki . P o m o ću o p e ra to ra zarez m ožete definisati više prom enljiv ih u n u ta r n ared b e for. Operator zarez R anije u ovom poglavlju naveo sam da se operator zarez (n e razdelnik zarez koji služi d a odvoji definicije. Inicijalizacioni deo m ože im ati više definicija istog tipa. iM ogućnost da se prom en ljiv e definišu u n u ta r kontro ln o g izraza o g ran ičen a je sam o na petlje for. U očite da su. Vežba 5: (4) P onovite vežbu 10 iz p re th o d n o g poglavlja. O vaj p ristu p ne m ožete da koristite ni sa je d n o m d ru g o m n a re d b o m izbora ili petlje. ali tako da za prikazivanje jed inica i n u la u p o tre b ite te rn a rn i o p erato r. n ared b e izvršavane u sekvencijalnom p o retk u . Kako p rilik o m inicijalizacije. ali o n e m o ra ju b iti istog tipa: // : c o n tro l/ O peratorZarez.foreach au to m atsk i pravi sve stavke u m esto vas. i < 5. te ispitivanje bitova u m esto m e to d e Integer.p rin tln ("i = " + i + " j = " + j ) .Poglavlje 4: Kontrolisanje izvršavanja 103 Vežba 4: (3) N apišite p ro g ram koji p o m o ću dve u gneždene petlje for i o p e ra to ra m o d u lo deljenja (% ) p ro n ala zi i ispisuje p ro ste brojeve (cele brojeve koji su deljivi sam o sa 1 i sam i sa so b o m ). ) ) } /* Is p is : i= 1 j= 11 i= 2 j= 4 i= 3 j= 6 i= 4 j= 8 * ///:- D efinicija c elobrojn ih p ro m en ljiv ih u n aredbi for obuh v ata i i i j. tako i p ri izvršavanju koraka k o n tro ln o g izraza.

{ } } /* Is p is : 0.39982635 0.n e x tF 1 o a t(). je r m u se m o ra p ristu p a ti p o m o ć u indeksa. i < 10.o u t.72711575 0. f o r (f lo a t x : f ) S y s te m .0534122 0.prin t(zn ak + " " ) .java public c lass ForEachString { public s t a t ic void m a in (S trin g [] args) { fo r(c h a r znak : "A frič k a 1a s t a v ic a " . public c lass ForEachFloat { public s t a t ic void m a in (S trin g [] args) Random slu cajan = new Random(47). Za korišćenje foreach sintakse k a n d id at je svaka m e to d a koja vraća niz.57799757 0. u t i l . klasa String im a m e to d u toCharArray() koja vraća niz tip a char.73734957 * ///:Niz je n a p u n jen staro m for petljo m . f o r ( in t i = 0. i++) f [ i ] = s lu c a ja n . pa je lako izdvojiti svaki znak znakovnog niza: //: co n tro l/Fo rE a ch S trin g .p rin tln (x ).5309454 0.51660204 0. flo a t f [ ] = new f 1o a t[10].16020656 0.4170137 0.104 Misliti na Javi Na p rim er.ou t. p retp o stav im o da im ate n iz b ro jev a tip a float i d a ho ćete da izaberete svaki elem ent to g niza: //: c o n tro l/Fo rEa ch Flo at. ) } } /* Is p is : A f r i č k a l a s t a v i c a * ///:- .* . P rim era radi.ja va import j a v a . toCharArray() System .18847865 0. Foreach sintaksu vidite u redu: fo r (f lo a t x : f ) { N jim e se definiše p ro m en ljiv a x tip a float kojoj se se k v e n đ ja ln o d o d elju je svaki elem ent niza f.

import s t a t ic n e t.*. I } /* Is p is : 0 1 2 3 4 5 6 7 8 9 5 6 7 8 9 5 8 11 14 17 * ///:M etoda range() bila je preklopljena. N a m era m i je bila d a se range() ko risti kao static uvoz: // : co n tro l/Fo rE a ch ln t. profiler).. D rugi oblik počinje od prve zadate v red n o sti i daje b ro je v e d o iznosa za jed a n m anjeg od d ru g o g a rg u m en ta. i < 100.20 uz korak 3 pri ntnb( i + " " ) . .u til. u b ib lio tek u net. f o r ( in t i : range(5. range).9 p rin tn b (i + " “ ) . .util. O n a ne zadaje prelazak u novi red. Z ato. 9 p rin tn b (i + " " ) . što znači da se uz isto im e m eto d e m o g u zadavati različite liste a rg u m e n a ta (o p rek lap an ju će u skoro biti reči).m in d v ie w . ali don ek le sm an ju je efikasnost. Im ajte u vidu da range() češće o m ogućava korišćenje foreach sintakse i stoga m ožda povećava čitljivost koda.u til.mindview. recim o ovako: f o r ( i n t i = 0. 10)) // 5 . i++) U ovo m slučaju foreach sintaksa n e b i rad ila.Range stavio sam m eto d u range() koja au to m atsk i g eneriše o d g o v araju ći niz. a treći ob lik p rim a k o rak povećanja u svom trećem a rg u m e n tu . * .ja v a import s t a t ic n e t.. f o r ( in t i : range(5. D a bih to pojeđn o stav io . isključujući sam v rh . kao što ćete v ideti u nastavku knjige. foreach sintaksa ra d i sa svakim obje k to m za koji se zn a p o re d a k n jegovih član o v a (koji p rip a d a klasi Iterable).Poglavlje 4: Kontrolisanje izvršavanja 105 Kao što ćete videti u poglavlju Č iivanje objekata. pri n t ( ) . P r i n t . pa služi za v išek ratn o p isanje u istom redu. p rin t(). Prvi prek lo p ljen i oblik m etode range() počinje o d nule i daje brojeve d o v rh a opsega (engl.Range. u p o treb ljen a i printnbf). M ožda ste p rim etili da je u p re th o d n o m p rim e ru . izm erite njegove p erfo rm an se profajlerom (engl. 20. range() je veom a p ro sta verzija generatora.m in d v ie w . M noge for n ared b e o b u h v ataju p ro lazak k ro z sekvencu celo b ro jn ih v re d n o sti. public c lass ForEachlnt { p u b lic s t a t ic void m a in (S trin g [ ] args) { f o r ( in t i : ra n g e(lO )) // 0 . p rin t(). ako pokušavate da povećate efikasnost svog prog ram a. sem m eto d e print(). 3 )) // 5. sem ukoliko u n a p re d n e n a p ra v ite n iz int brojeva.

el se return 0. in t c i l j ) if(v re d n o s t > c i l j ) return +1. P r in t . početak i kraj. a ne kako to postižete („Pravim ovaj indeks d a b ih m ogao izabrati svaki elem en t niza“ ). * .106 Misliti na Javi Foreach sintaksa štedi nešto v rem en a prilik o m pisan ja koda. ali je važnije to što je takav k od m nogo čitljiviji .o u t. ako m eto d a vraća bilo koji dru gi tip sem void.o u t. break i continue. slično n ared b i goto u d ru g im jezicim a.kazuje šta hoćete (d o b iti svaki elem en t n iza). // Po k lo p ile su se { } p ublic s t a t ic void m a in (S trin g [] args) { S y s te m . Rezervisana reč return Za bezuslovno skakattje služi nekoliko rezervisanih reči: return. završetak m etode čini im plicitan return.o u t. U koliko u m eto d i koja vraća void nem ate n are d b u return. S y s te m . P re th o d n u m e to d u test() m o ž em o p o n o v o n ap isati tako d a iskoristim o tu pogo d n o st: //: c o n tro l/ IfE ls e 2 . pa n a re d b u return ne m o rate pisati. 5 )) . tj. R ezervisana reč return im a dve n am ene: o n a o d re đ u je v re d n o s t k o ju će m eto d a v ratiti (ako uop šte vraća v red n o st. . M eđ u tim . S y s te m . label). 5 )) .p rin tln (te s t(5 .ja v a import s t a t ic n e t. a p o sto ji i način skakanja n a n a re d b u sa o zn ak o m (engl.U ovoj knjizi će se foreach sintaksa upotrebljavati gde god je to m oguće. e ls e if(v re d n o s t < c i l j ) return -1. vaš je po sao d a ob ezb ed ite da za sve m o g u će p u ta n je kroz njen kod postoji neka p ov ratn a v red n o st.p rin tln (te s t(1 0 .u til. } } /* Is p is : 1 -1 0 * ///:Sada else nije p o treb n a je r return završava rad m etode.p rin tln (te s t(5 . public c lass IfE1se2 { s t a t ic in t t e s t ( in t vrednost. Vežba 6: (2) Prepravite m eto d e test() iz oba p re th o d n a p ro g ra m a tak o da p rim a ju još dva a rg u m en ta. Za svaku vrednost treb a pro v eriti da li je njen iznos izm eđu početka i kraja (ukijučivo). 1 0 )).m in d v ie w . ako p o v ratn a v red n o st nije tip a void) i p ro u zro k u je tre n u tan izlazak iz m etode.

// Sledeći c ik lu s S y ste m .p rin t(i + 1 1 "). N aredba break izlazi iz petlje. Sledeći p ro g ra m pokazuje kako se koriste break i continue u n u ta r petlji for i while: / / : co ntrol/BreaklC on tin ue. // Sledeći c ik lu s S y ste m . U dru g o j petlji fo r p rik azan o je kako se u p o treb ljav a foreach sin tak sa i vidi se da o n a daje jed n ak e rezultate. N aredba c o n tin u e nastavlja izvršavanje o d v rh a petlje (stoga uvećava i) kad god i nije deljivo sa 9.Range. .o u t. in t i = 0. if (j = = 1269) break. } S y s te m .o u t. b ez izvršavanja o stalih n a red ab a u n u ta r petlje. } } } /* Is p is : 0 9 18 27 36 45 54 63 72 0 9 18 27 36 45 54 63 72 10 20 30 40 * ///:U petlji fo r v red n o st i nikada ne d ođe d o 100 jer n a red b a b re a k p rek in e p etlju kada i p o sta n e 74.p rin t(i + " " ) . in t j = i * 27.o u t. // Izađi iz p e tlje i f ( i % 10 != 0) continue.java // Pokazuje rezervisane reči break i continue. // Upotreba foreach sin tak se: fo r ( in t i : range(lOO)) { if (i = = 74) break.uti1 . // Povratak na vrh p e tlje S y ste m .p rin tln (). // "beskonačna" p e tlja : w h ile (tru e ) { i++. N aredba b re a k se na ovaj način o b ičn o ko risti satno kada nije u n a p re d p o znato kada će se stvoriti uslov za izlazak.*. // Izađi iz p e tlje i f ( i % 9 != 0) continue. i++) { if (i = = 74) break. p ublic c lass BreaklContinue { p ub lic s t a t ic void m a in (S trin g [] args) { f o r ( in t i = 0.o u t. i < 100. Kada jeste. ) S y s te m . ta v re d n o st se ispisuje.p rin t(i + " " ) .Poglav|je 4: Kontrolisanje izvršavanja 107 Rezervisane reči break i continue Tok petlje takođ e m ožete da k o n tro lišete p o m o ć u rezervisanih reči break i continue u n u ta r tela bilo koje petlje.o u t. import s t a t ic net. N aredb a continue zaustavlja izvršavanje teku ćeg ciklusa i v raća se n a p očetak petlje kako b i p očeo n o v korak.m in dview .p rin tln (). // Izađi iz p e tlje i f ( i % 9 != 0) continue.

O zn aku treba staviti p re petlje sam o ako u n u ta r te petlje želite da ugnezdite jo š jed n u petlju ili n ared bu izbora (sw itch ). O znaka je id en tifik ato r iza koga sledi dvotačka. p a je izb o r isključivo p ita n je p ro g ram e rsk o g ukusa.p etlja { / / ••• . p rim etiće te d a se k o n tro la p ro g ram a sastoji o d više skokova. pov ezan o sa rezervisanim rečim a b re a k i c o n tin u e . Problem nije u korišćenju n ared b e g o to. I to znači baš nep osred n o . To nije skok. zar ne po stoji način da se ko d reorganizuje tako da to k k o n tro le n e b u d e toliko p u n skokova? N aredba g o to je pala u p rav u nem ilost n ako n objavljivanja čuv en o g članka E dsgera D ijkstre „G oto se sm atra štetnim " i od tada su n ap ad i na nju postali p o p u la ra n sp o rt. već u n jen o m prečesto m ko rišćen ju .ne valja stavljati bilo koje d ru g e n ared b e izm eđu oznake i petlje. Čuveni goto R ezervisana reč goto p o sto ji u p ro g ram sk im jezicim a o d sam og početka.). Ipak. izvršavala n ep rekidno.p e tlja { u n u tra šn ja . goto je nastao kao posledica k o n tro le p ro g ra m a u m ašin sk o m jeziku: . a n e hard verski procesor. teorijski.) N a izlazu se ispisuje 0 je r je v red n o st izraza 0 % 9 jed n ak a 0. u n u ta r p etlje se nalazi n are d b a break p o m o ć u koje se izlazi iz petlje. Ako će p ro g ram stalno skakati s je d n e tačke n a d ru g u .u retkim situ acijam a g o to je najbolji način za s tru k tu rira n je to k a izvršavanja.. o n e će p rek in u ti sve petlje d o nivoa gde se nalazi oznaka: oznakal: sp o ljn a .A ko je isp u n jen uslov A. k ad a v re d n o st d o đ e d o 99.) n a isti način. Kao što je takvoj situaciji svojstveno. (Stoga se ispisivanje u dru go j petlji javlja sam o k ad a je v re d n o st i deljiva sa 10. K ad p ro čitate asem blerski ko d koji na k raju generiše p rak tičn o bilo koji p revodilac.. P revodilac tu m a č i while(true) i for(. ali kada se k oriste sa oznak om . koja b i se. Java nem a n ared b u goto. p rim etiće te d a n a re d b a continue v raća izvršavanje na v rh petlje i d a ne izvršava o sta ta k tela petlje n a k o n sebe. Pokušajte d a u m esto toga k oristite return. (P revodilac Jave p rav i sop stveni „asem blerski k o d “. Z aista. M eđ u tim .) N aredba g o to je skok n a niv o u izvornog koda i to ju je iznelo na loš glas. na p rim er: oznakal: U Javi se oznaka k o risti satno n e p o sred n o p re iteracione naredbe. već više način da se izađe iz petlje. ali njega izvršava v irtueln a m ašina Jave (JV M ). O n se često povezuje s n a red b o m g o to zato što koristi isti m eh an izam : o zn ak u (engl. o kojoj ćete u skoro saznati šta treba. o n a se u jeziku ne koristi. label). skoči tam o .108 Misliti na Javi Posleđnji d eo prik azu je b e sk o n ačn u p etlju while. Pored toga. R ezervisane reči b re a k i c o n tin u e o b ičn o prek id aju sam o tek u ću p etlju . Iako je reč g o to rezervisana u Javi. (1) P repravite vežbu 1 tak o d a p ro g ra m završava ra d p o m o ć u rezervisane reči break. skoči o v am o “. Vežba 7. D rugi oblik besk o n ačn e p etlje je for(. u su p ro tn o m . o na im a nešto što liči na skok. srednji p u t je najbolji.

import s t a t ic n e t.Poglavlje 4: Kontrolisanje izvršavanja 109 break. sve d o oznakel. // (3) / / ••• break oznakal. i++. break p rek id a u n u tra šn ju p etlju a vi nastavljate sa spoljašnjom . o n a zaista p rek id a obe petlje. ali počev o d sp oljnog ciklusa. ) { // beskonačna p e tlja unutrasnja: // Ovde ne mogu da sto je naredbe f o r ( . continue se vraća n a p o četa k u n u tra šn je petlje. s p o lja s n ja : // Ovde ne mogu da sto je naredbe f o r ( . Z atim se p etlja nastavlja. continue sp o lja sn ja . break sp o lja s n ja .m in d v ie w . break. } if (1 . .java // P e t lja fo r sa "označenom naredbom break" i "označenom naredbom contin ue".u til. // Inače se i nikad // ne uvećava. // (2) / / ••• continue oznakal. i < 10. Evo p rim e ra s p e tljo m for: //: co n tro l/O znacenaPetljaFor. P r in t . U (2). } if (i = = 3) { p ri n t("p re k i n i " ) . U (4). i++. // (1) / / ••• continue. Ali u (3).8) { p r in t("p r e k in i s p o lja š n ju "). U stvari. * . if(i ■ = 2) { p r i n t ( " n a s t a v i" ) . // Inače se i nikad // ne uvećava. } i f (i = = 1) { p r in t("n a s ta v i s p o lja š n ju "). // (4) } } U (1). p u b lic c lass OznacenaPetljaFor { p u b lic s t a t ic void m a in (S trin g [] args) { in t i = 0. ali n e ulazi p o n o v o u p etlju. continue oznakal prek id a i u n u tra šn ju i sp oljašnju petlju. i++) { p r in t("i = " + i ). break oznakal tak o đ e vrši p rek id sve d o oznakel. conti nue. true .

. m ožete koristiti return. Da nem a n ared b e breakspoljasnja. d o uvećanja dolazi sam o kada je i = = 3.mindvievv. k++) { if (k = = 3) { p r in t("n a s ta v i u n u tra š n ju "). p o što sam a n a re d b a break m ože da p rek in e sam o tre n u tn u petlju. } } } } // Ovde ne možete da pozovete // označene naredbe break i continue } }/ * Is p is : i =0 n astavi unutrašnju i = 1 nastavi unutrašnju i =2 nastavi i =3 preki ni i =4 nastavi unutrašnju i = 5 nastavi unutrašnju i = 6 nastavi unutrašnju i = 7 nastavi spoljašnju i =8 p rekini spoljašnju * ///:O b ratite pažn ju na to da n are d b a break p rek id a p etlju for i da se izraz za uvećavanje ne izvršava sve d o kraja prolaza k ro z p etlju for.110 Misliti na Javi f o r ( i n t k = 0. P r i n t .) Kada n a p u štan je petlje tak o đ e zn ači izlazak iz m eto d e. N ared b a continue spoljasnja u slučaju kada je i = = 7 takođe skače na v rh petlje i preskače uvećavanje.uti 1.java // P e t lje vvhile sa "označenom naredbom break" i "označenom naredbom continue". stoga se i o n o vrši direktno. continue u nutrasnja. k < 5. import s t a t ic n e t.* . Pošto break preskače izraz za uvećavanje. public c lass OznacenWhile { public s t a t ic void m a in (S trin g [] args) { in t i = 0. ne bi p o sto jao način da se n ap u sti spoljašnja petlja iz u n u tra šn je petlje. (Isto važi i za continue. Sledi p rim e r o zn ačen ih n ared ab a break i continue s p etljam a while: //: control/O znacenW hile.

break s p o lja s n ja . . } } } } } / * I s p is : Spoljašnja p e t l j a while i = 1 nastavi i = 2 i = 3 nastavi spo lja šnju Spoljašnja p e t l j a while i = 4 i = 5 preki ni Spoljašnja p e t l j a while i = 6 i = 7 p re k in i spoljašnju * ///:Ista prav ila važe i za vvhile: 1 . O značen a nared b a continue vraća se na o zn ak u i p o n o v o ulazi u p etlju koja se nalazi o d m a h iza oznake.Poglavlje 4: Kontrolisanje izvršavanja 111 spoljasnja: while(true) { p r i n t ( " S p o lj a š n j a p e t l j a w h ile " ) . w h ile (tr u e ) { i++. continue. } if(i == 7) { p rin t("p re k in i s p o lja š n ju "). } if(i == 5) { pri nt("preki n i " ) . print("i = 1 1 + i). if(i “ 1) { printC'nastavi"). ) i f (1 == 3) { print("nastavi spolja šn ju "). O b ičn a n ared b a continue vraća k o n tro lu n a v rh tekuće p etlje i nastavlja. O značen a nared b a break izlazi iz petlje obeležene zad a to m oznakom . 2. continue spoljasnja. 3. 4. break izlazi iz petlje. break.

. A ko ne p ro n a đ e ekvivalentnu v red n o st. posle default. P rim etio je da broj „b u b ica“ raste s b ro jem oznaka u p ro g ram u i da oznake i goto otežavaju analizu p ro g ram a.112 Misliti na Javi V ažno je da zap am tite kako se o zn ak a u Javi jed in o k o risti kad im ate u g n ežđ en e petlje i želite da n ap rav ite break ili continue u više nivoa u gnežđivanja. O vo je uob ičajen naćin fo rm iran ja naredbe switch. isk u sn o m p ro g ram e ru ovaj p ristu p m ože biti koristan . a ne sam e nared b e goto. naredba. N ared b a sw itc h b ira iz m e đ u nekoliko delova koda u zavisnosti o d v re d n o sti d ato g izraza. P rim etićete u p reth o d n o j definiciji da se svaki blok case završava sa break. Za tipove koji nisu celobrojni ili logički m o ra te da koristite niz naredaba if. bez ikakvih posledica. da stavite break na kraj bloka default ako sm atra te da je to važno zbog stila. O b ratite pažnju na to da p o sled n ja nared b a. N aredba switch o m ogućuje čistu realizaciju izbora izm eđu više različitih puteva izvršavanja. Ako nedostaje. Iako o b ičn o ne želite da se to dešava. Sa n aredb o m switch ne m o žetek ao izrazza izbor koristiti. Treba p rim e titi i d a je ovo slučaj kada neka osobin a jezikai postaje korisnija kada se ograniče njene m o g u čn o sti. O b ra tite p ažn ju n a to d a oznake u Javi ne pate o d to g p ro b lem a. čim e se to k izvršavanja p rem ešta na kraj tela nared b e switch. ali je za nju p o treb an izraz koji im a v rednost tipova kao što su int ili char. break. nem a break jer se izvršavanje nastavlja baš tam o gde bi se io n ak o odvijalo nakon break. N jen o p šti ob lik je: switch case case case case case (izraz) { vrednostl vrednost2 vrednost3 vrednost4 vrednost5 : : : : : naredba. U svom član k u „ G o to se sm atra štetn im “. naredba. jer enum lepo radi sa n a re d b o m switch. p o što je m esto n a k o m e m o g u da stoje o g ran ičen o i ne m o g u da se koriste za o p šti p ren o s k ontrole. videćete da to ograničenje olakšava enum. break. Naredba switch N ared ba sw itc h se n ek ad naziva i naredba izbora. break. naredba. na p rim er. D ijkstra je p o se b n o im ao zam e rk i na u p o tre b u oznaka. } Izraz m o ra im ati c elo b ro jn u ili logičku v red n o st. break. naredba. / / •• default: naredba. biće izvršena naredba označena kao default. M ožete. o d g o v araju ća naredba (jed n a ili više njih. Na kraju sledećeg poglavlja. N ared b a switch p o red i rezultat izraza i svake vrednosti. Ako p ro n a đ e ekv ivalen tnu v red n o st. ali je break o pcioni. nova rezervisana reč koja se u Javi koristi od verzije SE5. izvršavaće se sledeće case n aredbe sve d o k se ne naiđe na break. break. vitičaste zagrade nisu p o tre b n e) biće izvršena.z n ak o v n i niz ili broj u fo rm atu po k retnog zareza.

121: suglasnik n. u t i l . 114: suglasnik n. * . m i n d v i e w . java / / Prikaz naredbe svvitch. Z nakovi u p olu n av o d n icim a u nared b am a case tak o đ e se p retv araju u celo b ro jn e veličine koje se koriste pri po ređ en ju . 110: suglasnik z. switch(c) { case ' a ' : case ' e ' : case ' i 1: case ' o ' : case ' u ' : p rin t (" s a m o g la s n ik " ) . 102: suglasnik o. n e t . f o r ( i n t i = 0. . break. u t i l import s t a t i c .Poglavlje 4 : Kontrolisanje izvršavanja 1 13 U n a re d n o m p rim e ru o d re đ u jem o da li su n a su m ič n o o d a b ra n a slova sam oglasnici ili suglasnici: / / : c o n tro l/S a m o g la s n ic ilS u g la s n ic i. 103: suglasnik c. P r i n t . 122: suglasnik b. 1 1+ c + "). 99: suglasnik f. 111: samoglasnik w.nextInt(26) generiše broj izm eđu 0 i 26 (26 je r toliko im a slova u engleskoj abecedi). 98: suglasnik r . 122: suglasnik '/ / / = - Random. 121: suglasnik g. 110: suglasnik y. kojem treba d o d ati p o m eraj slova 'a' da bi se d o b ila m ala slova. ) } } }/* Ispis: y.n e x tln t(2 6 ) + ' a ' ) . 119: suglasnik z. d e f a u lt: p rin t("s u g la s n ik "). i < 100. p r i n t n b (( c h a r )c + " . p u b lic class SamoglasnicilSuglasnici { p u b lic s t a t i c void m a in (S trin g [] args) { Random slucajan = new Random(47). import j a v a . i++) { i n t c = s lu c a ja n .

nextInt() daje slučajan ceo bro j izm eđ u 0 i 25. a switch stavite u n u ta r petlje for koja isprobava svaki slučaj. 3. 21. Vežba 10: (5) Vampirski broj im a p a ran broj cifara i dobija se m n o ž e n je m p ara brojeva koji im aju p o pola o rig in aln ih cifara proizvoda.1 3 .com. 1. 1 .) Sažetak O vim poglavljem se završava proučavanje osnovnih osobina koje se javljaju u većini program skih jezika: računanje. a m o g u se k u p iti na lo k a đ ji www. N apišite m eto d u koja p rim a ceo bro j k ao arg u m e n t i prikazuje toliko F ibonačijevih brojeva počev o d prvog. 8 . a zatim izbacite nared b e break i v idite šta se dešava. n pr. Vežba9: (2) Fibonačijev n iz c ine b rojevi 1 . 5. inače će p ro g ra m proći dalje i p o četi da izvršava n ared b e pred v iđ en e za n a re d n i slučaj.. gde je svaki bro j (o d trećeg nadalje) je d n ak zb iru p re th o d n a dva. 3. eksplicitna konverzija tipova. Cifre se uzim aju iz p o lazn o g broja p ro izvoljnim redosledom . ako p o k ren ete java Fibonacci 5 (gde je Fibonacci im e klase) izlaz će biti: 1. D a bi se pro m en ljiv a c tip a int štam p ala k ao znak. N aredno poglavlje će ob rad iti važne tem e: inicijalizaciju i čišćenje objekata te veom a b itn o sakrivanje realizacije. (P redložio D an F orhan. N isu dozvoljeni parovi završnih nula. koji se d o d aje n u m e rič koj (ASCII) vred n o sti slova 'a'.MindVicw.114 Misliti na Javi O b ra tite pažn ju na to d a n are d b e case m o g u biti naslagane je d n e izn ad d ru g ih tak o da se isti deo k oda izvršava u više slučajeva. 34 itd.2. p rio ritet operatora. R ešenja n ek ih vežbi d ata su u e le k tro n sk o m d o k u m e n tu Thc Thinking in Java Annotalecl Solution Guide. 2. uslovi i petlje.nextlnt(26) + 'a'. Vežba 8: (2) N apišite n a red b u switch k oja ispisuje p o ru k u za svaki o d slučajeva (case). V odite raču n a da je n e o p h o d n o d a stavite n a re d b u break na kraju o d ređ en o g slučaja. P rim eri: 1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81 N apišite p ro g ra m koji pronalazi sve četvorocifrene v am pirske brojeve. 5. m o ra b iti vraćen a u tip char eksplic itn o m konverzijom . U izrazu: int c = slucajan. To znači d a se 'a' a u to m atsk i p retv ara u tip int da b i se izvršilo sabiranje. . m eto d a Random. inače b i se ispisivali brojevi. Stavite n are d b u break n akon svakog slučaja i testirajte p ro g ram . Sada ste sprem ni za korake koji će vas približiti svetu objektno orijentisanog pro g ram iran ja.

i to naročito m em o rija.print("Kamen"). To n aro čito važi za bibltoteke. Tu se javljaju dva p ro b lem a. Rešenje iz C + + -a deluje najlakše i najlogičnije. Java je tak o đ e usvojila k o n stru k to re . M N O G E GRESKE U C . D V E BITNE OBLASTI SIGURNOSTI SU INICIJALIZACIJA I ČIŠĆENJE. kada korisnici ne znaju kako da inicijalizuju k o m p o n e n tu iz biblioteke. constructor). class Kamen { Kamen() { / / Ovo j e konstruktor System.. p o seb n e m e to d e koja se a u to m a tsk i p oziv a p ri p rav ljen ju objekta. p a se tak o đ e koristi i u Javi: im e k o n stru k to ra jc isto kao i im e ldase. Prvo: bilo koje im e m ože se p o k lo p iti s nekim d ru g im im en o m . pre nego što korisnik uopšte m ože da m u p ristu p i. Č išćenje je poseban p ro b lem je r je lako zaboraviti n a elem ent kada s n jim završite . i < 10. čak ne znaju ni d a je to p o treb n o . koje želite d a iskoristite za n e k u članicu klase. Jezik C + + je uveo k o n cep t konstruktora. P ro jektant klase u Javi m ože da obezbedi garan to v an u inicijalizaciju svakog objekta ako napravi konstruktor (engl.U pojavljuju se kada p ro g ra m e r zaboravi d a inicijalizuje prom enljivu. Java ga au to m atski poziva p ri stvaranju objekta.ogično je da će takva m eto d a a u to m atski biti pozvana to k o m inicijalizacije. Ako klasa im a k onstruktor. p o što je prevodilac o d g o v o ran za poziv k o n stru k to ra . Garantovana inicijalizacija pomoću konstruktora Z am islite da za svaku klasu koju pišete. o n uvek m o ra da zna koju m e to d u d a pozove. Sledi jed n o stav n a klasa sa k o n stru k to ro m : / / : in ic ija liz a c ija / J e d n o s ta v a n K o n s t r u k to r . . I.nesigurno“ program iranje je postalo jeda n od glavnih razloga za visoku cenu programiranja.out. to znači da k orisnik m o ra da se seti da pozove tu m etod u. N ažalost. Sledeći izazov je kako nazvati tu m eto d u .ja v a / / P rik a ziv an je jednostavnog konstru ktora.više vas se ne tiče. U ovom poglavlju ra z m a tra se inicijalizacija i čišćenje i način n a koji su p o d rž a n i u Javi. Stoga je inicijalizacija zagarantovana. a p o re d toga im a i sakupljač sm eća koji au to m atsk i oslobađa m em o rijsk e resurse kada se n e koriste. Sam o im e nagoveštava da bi ona trebalo da b u d e pozvana pre korišćenja objekta. . Z bog toga se resursi koje taj elem ent ko risti zadržavaju i lako m ožete doći u situaciju d a vam p o n e stan u resursi. } p u b lic class JednostavanKonstruktor { p u b lic s t a t i c void m a in(S trin g [] args) { f o r ( i n t i = 0.Inicijalizacija i čišćenje S napretkom računarske revolucije. i++) new Kamen(). n aprav ite m eto d u p o d im en o m inicijalizacija(). D rugo.

i++) new Kamen2(i). P reth o d n i p rim e r lako m ože da se prep rav i tako da k o n stru k to r im a jed an arg u m en t: / / : in ic ija liz a c ija / J e d n o s ta v a n K o n s t r u k to r 2 . i < 8 . Ali kao i svaka m eto d a . ja v a / / Konstruktori mogu da imaju argumente.116 Misliti na Javi } /* Ispis: Kamen Kamen Kamen Kamen Kamen Kamen Kamen Kamen Kamen Kamen * ///:Kada se prav i objekat: new Kamen(). G ara n tu je se da će objek at b iti p rav iln o inicijalizovan p re nego što b u d e u p o treb ljen . k o n stru k to r m ože da im a arg u m e n te koji om o g ućav aju d a o d red ite kako će o b jek at biti naprav ljen . T erm in „p o d razu m ev an i k o n stru k to r“ upotrebljava se dugi niz godin a.print(''Kamen " + i + " “ ) . zauzim a se m em o rija i poziva k o n stru k to r. Na p rim er. } } p u b lic class JednostavanKonstruktor2 { p u blic s t a t i c void m a in ( S tr in g [] args) { f o r ( i n t i = 0 . } } / * I s p is : Kamen 0 Kamen 1 Kamen 2 Kamen 3 Kamen 4 Kamen 5 Kamen 6 Kamen 7 * ///:A rg u m en ti k o n stru k to ra o m o g u ćav aju da ob ezb ed ite p aram etre za inicijalizaciju objekta. no-arg constructors). K o n stru k to r koji ne p rim a a rg u m e n te naziva se po d ra zu m eva n i konstruktor. U većem d elu literature o Javi koju je izdao Sun. class Kamen2 { Kamen2(int i ) { System. / / drvo od 12 metara Ako je Drvo(int) jed in i k o n stru k to r. o b jek at Drvo n ap rav ićete na sledeći način: Drvo d = new Drvo(12). . O b ra tite p ažn ju n a to d a se stil p isan ja p o k o m e se prv o slovo im en a svih m eto d a piše m alim slovom ne o d n o si n a k o n stru k to re . prevodilac neće dozvoliti da n ap rav ite objekat Drvo ni na koji d ru g i način. p a ću ga i ja koristiti. ako klasa Drvo im a k o n stru k to r s je d n im celo b ro jn im a rg u m en to m koji o d ređ u je visinu drveta.out. je r im e k o n stru k to ra m o ra da se tačno pok lapa sa im en o m klase. n jih nazivaju „k o n stru k to ri bez arg u m en ata" (engl.

Po čem u se razlik u ju ta dva pristu p a? Preklapanje metoda Jedno od važnih p itan ja u svakom p ro g ram sk o m jeziku jeste u p o tre b a im ena. Praveći objekat. to je opšta p o g o d n o st d o stu p n a za bilo koju m etodu. naro čito ako se radi o je d n o stav n im razlikam a. Tako ne m ožete da im ate jed n u funkciju p o d im en o m p rin t() koja bi ispisivala cele brojeve i d ru g u istog im en a za ispisivanje brojeva u fo rm a tu p o k retn o g zareza . „operi kola“ i „operi psa“. kad a m eto d a ne vraća n išta. U Javi (i C + + -u ) p o sto ji jo š je d a n činilac koji n am eće prek lap an je im ena m etoda: konstruk to r. Stoga je prcklapanje m etoda suštinski zn ačajn o u Javi. Ako bi p o sto jala p o v ra tn a v red n o st i ako b iste m o g li da je b irate . pa i dalje m ožete da od red ite značenje čak i ako ispu stite nekoliko reči. U preth o d n o m p rim e ru ne postoji eksplicitan poziv nekoj m eto d i inicijalizacija() koja je k o n ceptu alno odvojena o d pravljenja objekta. Pokažite da Java tu referencu inicijalizuje v red n o šću null. je r o m o g u ćuje da se isto im e m eto d e koristi s dru g ačijim tip o v im a arg u m e n ata . Vežba 2: (2) N aprav ite klasu s je d n im String p o ljem koje se inicijalizuje n a m estu definisanja i d ru g im koje inicijalizuje k o n stru k to r. Ali šta ako želite da objek at p rav ite na više načina? N a p rim er. D o b ro o d a b ra n a im en a čine sistem koji je lakše razu m eti i m enjati.je d n o bez d ru g o g ne ide. P rob lem nastaje kada nijanse ljudskog jezika p rim en ju jete n a p ro g ram sk i jezik.im e te klase. Većina Ijudskih jezika je re d u n d a n tn a . jed an bez arg u m en ata (p o đ ra zu m ev a n i k o n stru k to r) i d ru g i.cilj je da b u d e te u vezi sa čitaocim a.o n a je preklopljena (engl. K o n stru k to ri n em aju p o v ra tn u v re d n o st i d ru g a m o g u ćn o st ne p o sto ji (izraz n e w v raća referencu n o v onapravljenog objekta.značenje m o ž e m o shvatiti iz konteksta. ali i dalje im ate m o g u ćn o st d a je n ap ra v ite tako da v raća nešto. Vežba 1: (1) N apravite klasu koja sadrži n e in iđ ja liz o v a n u String referencu. K o n stru k to r je n eo b ič n a vrsta m eto d e je r n e m a p o v ra tn u v red n o st. O b a su k o n stru k to ri. ćiji je arg u m e n t tipa String u kom e je im e datoteke iz koje treb a inicijalizovati objekat. U Javi.Poglavlje 5: Inicijalizacija i čišćenje 117 K on struk tori elim inišu veliku g ru p u p ro b lem a i čine p ro g ram e razum ljivijim . Bilo bi b u d alasto ako biste m o rali da g ovorite „operiV ešM ašinom k ošulju“. p re tp o sta v im o da p rav ite klasu koja m ože da se inicijalizuje na sta n d a rd a n način ili čitanjem info rm ac ija iz dato tek e. To je korisno.svaka funkcija m o ra da im a jed in stv en o im e. Svim o b jek tim a i m eto d am a obraćate se prek o im ena. vi zađajete im e oblasti u m em o riji. pa m o raju im ati isto im e . prevo d ilac bi nekako m o ra o da zna šta d a rad i s to m p o v ra tn o m v red n o šću . U većini p ro g ram sk ih jezika (p o seb n o C -u ) svaka m eto d a (koje se u tim jezicim a obično nazivaju funkcije) m o ra im ati jed in stv en identifikator. Č esto ista reč im a više različitih značenja . Vi ćete reći „operi košulju“. M etoda je im e neke akcije. To veo m a liči na p isanje p ro ze . overloaded). pravljenje objekta i njegova inicijalizacija objed injen i su kon cepti . . „operiC rev o m kola“ i „operiK upanjem psa“ sam o da bi slušalac m ogao da n ap rav i razliku izm eđu tih akcija. P otreb n a su vam dva k o n stru k to ra . Pošto je im e k o n stru k to ra u n a p re d o d re đ e n o im e n o m klase. ali sam k o n stru k to r ne vraća n išta). O vo je p o tp u n o različito o d p o v ra tn e v re d n o sti tip a void. Jedinstveni id en titik a to ri n am n isu p o tre b n i . k o n stru k to r m ože im ati sa m o to je d n o im e. Iako je prek lap an je m eto d a neoph o d n o za k o n stru k to re .

class Drvo { i n t v is in a . print("P ravim o novo Drvo koje j e visoko " + v is in a + " m").ja v a / / Prikaz preklapanja kon struktora / / i preklapanja običnih metoda. P r i n t . import s t a t i c n e t . i < 5. m in d v i e w . Drvo() { print("S ađ en je m la dic e "). ) void in f o ( S t r i n g s) { p r i n t ( s + ": Drvo j e visoko " + v is in a + " m"). * .118 Misliti na Javi N ared n i p rim e r po k azu je p rek lap an je k o n stru k to ra i p rek lap an je m etoda: / / : in ic ija liz a c ija /P re k la p a n je . } D rvo (in t pocetnaVisina) { v is in a = pocetnaVisina. d . d . } / / Prekloptjen k on s tru ktor: new D rv o (). i++) { Drvo d = new D rv o ( i) .in fo (). v is in a = 0. } pu b lic class Preklapanje { p u b lic s t a t i c void m a in ( S trin g [] args) { f o r ( i n t i = 0. u t il. } } / * Is p is : Pravimo novo Drvo koje j e Drvo j e visoko 0 m pre klo pljena metoda: Drvo Pravimo novo Drvo koje j e Drvo j e visoko 1 m pre klo pljena metoda: Drvo Pravimo novo Drvo koje j e Drvo j e visoko 2 m pre klo pljena metoda: Drvo Pravimo novo Drvo koje j e visoko 0 m j e visoko 0 m visoko 1 m j e visoko 1 m visoko 2 m j e visoko 2 m visoko 3 m . in f o f 'p r e k l o p l j e n a metoda"). ) void in f o ( ) { p r in t ( " D r v o j e visoko " + v is in a + " m").

Razlikovanje preklopljenih metoda Ako m e to d e im aju isto im e. } s t a t i c void f ( i n t i . in t: " + i ) . o n d a v am n e tre b a a rg u m e n a t. "Prvo I n t " ) . 11). ako želite da ispišete još n e k u d o d a tn u p o ru k u . čiji je a rg u m e n t postojeća visina. P r i n t . p rek lap an je m eto d a om ogućava da isto im e koristite za obe stvari. kako Java zna na k o ju m e to d u mislite? Postoji jed no stavn o pravilo: svaka preklop ljena m e to d a m o ra da im a jed in stv en u listu tipo va argu m en ata. a ako ne želite ništa više d a kažete.a li je njihov p o re d a k d ru g a č iji i p o to m e se razlikuju. N a sreću. } pu b lic s t a t i c void main( S t r i ng[] args) { f("P rv o S t r i ng ". D a bi se to o m ogućilo. * . S trin g : Prvo I n t } ///= Dve m eto d e f() im aju id en tičn e a rg u m e n te . to im a sm isla: kako b i drugačije p ro g ra m e r m ogao da razlikuje dve m eto d e koje im aju isto im e. i n t i ) { p rin t("S trin g : " + s + ". import s t a t i c n e t. ako ne p o tip o v im a n jih o v ih arguinenata? Č ak je i razlika u p o re tk u a rg u m e n a ta d ovoljna da se dve m eto d e razlikuju (ipak nc treba se oslanjati na ovaj p ristu p je r se otežava održavanje): / / : in ic ija liz a c ija / P r e k la p a n je P o r e t k o m . pu blic class PreklapanjePoretkom { s t a t i c void f ( S t r i n g s.m in d v ie w . i n t : 11 i n t : 99. postoje dva k o n stru k to ra . je d an bez arg u m e n a ta i d ru g i. . } } / * I s p is : S tr in g : Prvo S t r in g . ja v a / / Preklapanje zasnovano na poretku argumenata. b ez arg um enata. S tr in g s) { p r i n t ( “ i n t : " + i + " . N a p rim er.Poglavlje 5: Inicijalizacija i čišćenje 119 Drvo je visoko 3 m preklopljena metoda: Drvo je visoko 3 m Pravimo novo Drvo koje je visoko 4 m Drvo je visoko 4 m preklopljena metoda: Drvo je visoko 4 m Sađenje mladice * ///:O bjekat klase Drvo m o že d a b u d e nap rav ljen ili kao m lađica.u ti1. Bilo bi n eo b ič n o da date dva različita im ena nečem u što očigled n o im a isti kon cep t. S tr in g : " + s ). M ože vam zatreb ati d a pozovete m e to d u info() n a više načina. f (99. A ko razm islite na tre n u ta k . ili kao biljka odgajena u rasad n ik u s d a to m visin om . o n d a n a re d ite a rg u m e n t tip a String.

} f3(double x) { p r in t n b ( " f 3 ( d o u b le ) " ) . f 7 (5 ). što u k o m b in aciji s prek lap an jem m ože d a izazove m alu za b u n u . } void f4(float x) { printnb("f4(float) " ) . } } void fl(short x) { printnb("fl(short)"). f 2 ( 5 ) .Print. f 3 ( 5 ) . } void fl(byte x) { printnb("fl(byte)"). } void void void void void void void void void void void f2 (b y te x) { p r i n t n b ( " f 2 ( b y t e ) " ) . N ared n i p rim e r p o k azu je šta se dešava kada se p ro s t tip prosleđuje m etodi: //: inicijalizacija/PreklapanjeProstihTipova. } f 3 ( 1ong x) { p r i n t n b ( " f 3 ( l o n g ) " ) . } void f4(long x) void f4(int x) void f 5(1ong x) { p r i n t n b ( " f 5(1on g)" ) . } { pr intnb("f4(long) " ) . } void f5(double x) { p r i n t n b ( " f 5 ( d o u b le ) " ) . f 5 ( 5 ) . . } f 2 ( i n t x) { p r i n t n b ( " f 2 ( i n t ) " ) . } void fl(long x) { prin tn b(“fl(lon g) ").mind vi ew . } void f4(double x) { printnb("f4(double) " ) . } void f6(double x) { p r i n t n b ( " f 6 ( d o u b le ) " ) . } f 2 ( f l o a t x) { p r i n t n b ( “ f 2 ( f l o a t ) " ) . import static net. } f2(lo ng x) { p r i n t n b ( " f 2 ( l o n g ) " ) . } void fl(float x) { pr in tnb("fl(float)“). } void f 6 ( f l o a t x) { p r i n t n b ( " f 6 ( f l o a t ) “ ) . } void testKonstantom() { printnb ("5: " ) . } f 2 ( s h o r t x) { p r i n t n b ( " f 2 ( s h o r t ) " ) . } void f 7 (double x) { p r i n t n b ( " f 7 ( d o u b le ) " ) . } f 3 ( i n t x) { p r i n t n b ( " f 3 ( i n t ) " ) . p r i n t ( ) . public class PreklapanjeProstihTipova { void fl(char x) { pr intnb("fl(char)"). } void fl(double x) { printnb("fl(double)"). } f 3 ( f 1oat x) { p r i n t n b ( " f 3 ( f l o a t ) " ) .1 20 Misliti na Javi Preklapanje i prosti tipovi Prost tip m ože au to m atsk i da se p ro širi iz m an jeg u veći.*. f 4 ( 5 ) . f 6 ( 5 ) .java // Proširivanje prostih tipova i preklapanje. } f2(double x) { p r in t n b ( " f 2 ( d o u b le ) " ) .u ti l. f 1 ( 5 ) . } void testChar() { char x = ' x ' . } void f 5 ( f l o a t x) { p r i n t n b ( " f 5 ( f l o a t ) " ) . } f3 ( s h o r t x) { p r i n t n b ( " f 3 ( s h o r t ) " ) . } { pr in tnb("f4(int) " ) . void fl(int x) { pr in tnb("fl(int)").

f6(x). f l ( x ) . printnb("short: ").f5 (x). f 2 ( x ) .te s t C h a r O .f4(x). fl(x). f 6 ( x ) . printn b ("d o u b le : " ) .te s tS h o rtO . p. } void t e s t F l o a t( ) { f l o a t x = 0. p rin tn b ("flo a t: ").f2(x).f2 (x). f 6 ( x ) . f 3 ( x ) .f3 (x).testDoubleO . } } / * Is p is : 5: f l ( i n t ) f 2( i n t ) f 3( i nt ) f 4 ( i n t ) f5(lo ng ) f 6 ( f 1oat) f7(double) char: f l ( c h a r ) f 2 ( i nt ) f 3 ( i n t ) f 4 ( i n t ) f5(lo n g ) f 6 ( f l o a t ) f 7 (double) byte: f 1(byte) f2(byte ) f 3( s h o r t ) f 4 ( i n t ) f 5 ( 1ong) f 6 ( f l o a t ) f7(double) sho rt: f l ( s h o r t ) f2 (s h o rt) f 3 ( s h o r t ) f 4 ( i n t ) f 5 (lo n g ) f 6 ( f l o a t ) f7(double) .te stB yte (). { } void t e s t l n t O int x = 0.f2(x).f5 (x). printnbC'int: "). f 3 ( x ) . p.f7 (x).f6(x).f5 (x). f 5( x ) . f 7( x ) . f 5 ( x ) . p r in t n b ( " io n g : " ) . } void testLong() { long x = 0. fl (x). f 7( x ) .f2 (x). f 3 ( x ) .f3 (x). f 2 ( x ) . f 6( x ) .Poglavlje 5: Inicijalizacija i čišćenje 121 printnb("char: ").f7 (x).f3(x). p r i n t ( ) .f7 (x). f 4 ( x ) . { } void testShort() short x = 0. f 7( x ) . p . { f l ( x ) .testKonstantom (). p r i n t ( ) . p r i n t ( ) .f3(x).f6(x). fl(x). p . printnb("byte: "). } void testByte() byte x = 0. p r i n t ( ) . f l ( x ) .t e s t L o n g ( ) . f 4 ( x ) .f7 (x).f5(x). f l ( x ) .te s tF lo a tO .te s tln t().f4(x).f6(x). f 5 ( x ) . p r i n t ( ) . p .f4(x).f4(x). f 4 ( x ) . p r i n t ( ) . p. } void testDouble() { double x = 0. pri n t (). } pu blic s t a t i c void m a in(S trin g [] args) { PreklapanjeProstihTipova p = new PreklapanjeProstihTip ova(). p . f 2 ( x ) . p.

} f 2 ( f lo a t x) { p r i n t (" f 2 (f 1o a t) " ) . m in d v i e w . } f2 (sh o rt x) { p r i n t ( " f 2 ( s h o r t) " ) . } f l ( s h o r t x) { p r i n t ( " f l ( s h o r t ) " ). u t il. P r i n t . } fl(lo n g x) { p r i n t ( " f 1(1ong)" ) . } void f5 (ch ar x) { p r i n t ( "f 5 (c h a r)" ) .122 Misliti na Javi i n t : f l ( i n t ) f 2 ( i n t ) f 3 ( i n t ) f 4 ( i n t ) f 5 (lo n g ) f 6 ( f 1oat) f7(double) long: f l ( l o n g ) f 2 (lo n g ) f3 (lo n g ) f4 (lo n g ) f 5(1 ong) f 6 ( f l o a t ) f7(double) f l o a t : f l ( f l o a t ) f 2 ( f l o a t ) f 3 ( f l o a t ) f 4 ( f l o a t ) f 5 ( f l o a t ) f 6 ( f 1oat) f7(double) double: fl( d o u b le ) f2(double) f3(double) f4(double) f5(double) f6(double) f7(double) * ///:P rim etićete d a se k o n sta n ta 5 tre tira kao v red n o st tip a int. p u b lic class Degradacija { void void void void void void void void void void void void void void void void void void void void void void f l( c h a r x) { p r i n t ( " f l ( c h a r ) " ). o n se p ro širu je n a int. import s t a t i c n e t . } f4 (b y te x) { p r i n t( " f 4 ( b y te ) " ). } f4 (ch ar x) { p r i n t ( " f4 (c h a r)" ). } f3 (sh o rt x) { p r i n t ( " f 3 ( s h o r t) " ). K od tip a char javlja se nešto drugačiji efekat .ako se n e n ađ e ta č n o odgo v araju ći p a rn ja k tip a char. } f3 (b y te x) { p r i n t ( "f 3 (b y te )" ) . } f4 (sh o rt x) { p r i n t ( " f 4 ( s h o r t) " ) . } f 2 ( in t x) { p r i n t ( " f 2 ( i n t ) " ) . } f l ( f l o a t x) { p r i n t ( " f l ( f l o a t ) " ) . pa se. U svim d ru g im slučajevim a tip p o d a tk a se p ro širu je ako je m an ji o d tip a a rg u m en ta u m eto d i. } void f5 (sh o rt x) { p r i n t ( " f 5 ( s h o r t) " ) . } f 3 ( in t x) { p r i n t ( " f 3 ( i n t ) "). } f2 (b y te x) { p r in t( " f 2 ( b y te ) " ). } void f5(b y te x) { p r i n t ( " f 5 (b y te )" ). } . } f l ( i n t x) { p r i n t ( " f 1( i n t ) " ) . Šta se dešava ako je a rg u m e n t veći o d a rg u m e n ta koji se očekuje u p reklopljenoj m etodi? O dgo v o r daje izm en jen i p re th o d n i p rim er: / / : i n i c i j a l iz a c ija /D e g r a d a c ija . } f2(long x) { p r in t( " f 2 ( lo n g ) " ) . } fl( b y te x) { p r i n t ( " f 1(b y te )" ). } f 4 ( in t x) { p r i n t ( " f 4 ( i n t ) " ) . } f2 (ch ar x) { p r i n t (" f2 (c h a r)" ) . } fl(d o u b le x) { p r i n t( " f l ( d o u b le ) " ) . poziva prek lopljen a m eto d a čiji je a rg u m e n t tip a int. } f 3 (1ong x) { p r i n t ( "f 3 (1ong)" ). } f3 (ch ar x) { p r in t( " f 3 ( c h a r ) " ) . ako postoji.ja v a / / Degradacija p r o s tih tip o va i preklapanje. * .

tip p o v ra tn e v red n o sti ne m ože da se koristi za razlikovanje m etoda. kao u in t x = f().f7 ((c h a r)x ). m e d u tim . } void f7(cha r x) { p r i n t ( '' f 7 ( c h a r ) “ ) . ) void f6 (b y te x) { p r i n t ( “ f 6 ( b y t e ) “ ) . U koliko to ne u rad ite.f2 ((flo a t)x ).f4 ((in t)x ). ove dve m eto d e. Prekiapanje povratnih vrednosti C esto se čuje pitanje: „Z ašto sam o im ena ldasa i liste arg u m en ata m etoda? Z ašto ne b ism o pravili razliku izm edu m etoda na osn ov u n jihovih p o v ra tn ih v rednosti?“ Na p rim er. kako izvršno o k ru žen je m ože da o d red i koju m eto d u f() treb a da pozove? I kako bi neko ko čita p ro g ram to m ogao da zna? Z bog ove vrste p ro b lem a. p. to se često naziva pozivanje m etode zbog njenog sporednog efekta. } } / * I s p is : argument t ip a double: fl( d o u b le ) f2 (flo a t) f 3(1ong) f4 (in t) f5 ( s h o r t ) f 6 ( byte) f7(c ha r) * ///:U o vom slučaju m etode u zim aju sužene v red n o sti p ro sto g tipa.f6 ((b y te )x ). M etod u . } void testDouble() { double x = 0. A ko je vaš a rg u m e n t širi. jasno se razlikuju: void f () { } i n t f ( ) { return 1. ako m eto d u pozovete na sledeći način: f0. . f5 ((s h o rt)x ). Z ato.f3 ((lo n g )x ). fl(x )."). prevodilac će prijaviti grešku.Poglavlje 5: Inicijalizacija i čišćenje 12 3 void f6(cha r x) { p r i n t ( " f 6 ( c h a r ) “ ) . p o što vam njena p o v ra tn a v red n o st nije b itn a. } O vo d o b ro radi kada prevodilac nedvosm isleno m ože d a razluči značenje iz konteksta. m o ra te ga eksplicitno k o nv erto vati u p o treb an tip. koje im aju isto im e i a rg u m en te. print("argum ent t ip a d o u b le .tes tD o ubleO . } pu b lic s t a t i c void m a in (S trin g [] args) { Degradacija p = new Degradacija ( ) . m ožete da pozovete i da ignorišete p o v ra tn u vrednost. već vam treb aju d ru g i efekti poziva m etode.

M eđ u tim . p o d ra z u m e v a n i k o n stru k to r (tj. stoga p ustite m en e da vam n a p ra v im jed an . Ptica2 p3 = new P tic a 2 ( 1 . Bez njega ne bi p ostojala n ijed n a m eto d a koju b ism o m ogli da p o zovem o kako bism o napravili objekat. ako n ap rav ite bilo kakav k o n stru k to r. p rev o d ilac će u m esto vas a u to m a tsk i n a p ra v iti p o d ra z u m ev a n i k o n struk to r. znači zn ate šta radite. prevodilac će se žaliti da ne m o že da n ađ e od g o v araju ći k o n stru k to r. n am ern o ste hteli da ga izostavite. N apravite objekat te klase. . iako o n ranije nije izričito naveden. ako niste stavili p o d ra z u m e van. A ko n ap rav ite klasu koja nem a k o n stru k to re.ja v a class Ptica {} p u blic class PodrazumevaniKonstruktor { pu b lic s t a t i c void m a in (S tr in g [] args) { Ptica p = new P t i c a ( ) . } 1 III-Ako sada napišete: new P t ic a 2 ( ) . ako definišete m ak ar jed a n k o n stru k to r te klase (sa arg u m en tim a ili bez n jih). / / Podrazumevani! } } ///:Izraz new Ptic a() pravi nov objekat i poziva p o d raz u m ev an i k o n stru k to r. prevodilac kaže: „N apisali ste k o n stru k to r.“ Ali. prevodilac neće um esto vas n ap rav iti p o d razu m ev an i k o n stru k to r: class Ptica2 { Ptica2 ( i n t i ) { } Ptica2 (double d) { } } p u blic class NemaSinteze { pu blic s t a t i c void m a in (S tr in g [] args) { / / ! Ptica2 p = new P t ic a 2 ( ) ." V ežba 3: (1) N apravite klasu s p o d ra z u m e v a n im k o n stru k to ro m (o n im koji ne p rim a arg u m en te) koji ispisuje n ek u p o ru k u . Na p rim er: / / : in ic ija liz a c ija /P o d r a z u m e v a n iK o n s tr u k to r . p a prev o d ilac kaže: „M o rate da im ate ncki k o n stru k to r. To je kao da niste napravili nijedan k o n stru k to r. n o -a rg k o n stru k to r) n em a arg u m en te i k oristi se za p rav ljen je p o d ra z u m e v a n ih o b jekata.124 Misliti na Javi Podrazumevani konstruktori Kao što je ranije p o m e n u to . 0 ). / / Nema podrazumevanog konstruktora Ptica2 p2 = new P t i c a 2 ( l ) .

Za tu n a m en u . Dva p re th o d n a poziva m e to d e p o staju otprilike: B a n a n a . koji se zovu a i b. O vo su saino in tern i oblici i ako ih napišete. b = new BananaO. o l j u s t i (2 ). kako biste se uverili da se p o d ra z u m e v a n i k o n stru k to r a u to m atsk i sintetizuje. p ri čem u .šaljete p o ru k u objektu". . o lju s t i( b . Rezervisana reč this A ko im ate dva objekta istog tipa. ali vam daje ideju o to m e šta se dešava. 2 ) . Vežba 7: (1) N ap rav ite klasu b ez k o n stru k to ra i zatim u m eto d i main() n ap rav ite objekat te klase. ( } } ///:Ako postoji sam o je d n a m eto d a p o d im e n o m oIjusti(). . P retp ostavim o da se nalazite u n u ta r m eto d e i da želite da koristite referencu na tekući objekat. ali o b rn u tim redosledom . java class Banana { void o l j u s t i ( i n t i ) { / * . R ezervisana reč this . prevodilac obavlja izvestan p rik riv en i posao. M eto d a treb a da je p rek lo pljena na o snov u razn ih p ro stih tip o v a p o d atak a i d a ispisuje različite vrste lajanja. Pošto je tu referencu prevodilac skriveno prosledio. o l j u s t i (1 ). zavijanja itd. postoji rezervisana reč: this. p revodilac ih ne prih v ata. B a n a n a . Tu referencu m ožete da koristite kao i svaku d ru g u referencu na objekat.koja m ože da se koristi sam o u n u ta r ne-static m eto d e . Vežba 5: (2) N ap rav ite klasu Pas s p re k lo p ljen o m m e to d o m laje(). b . N apišite m e to d u main() koja poziva sve te verzije. l ) . o lju s t i( a . U verite se da to radi. Postoji skriveni prvi arg u m en t koji se p ro sleđ uje m eto d i o lju sti() i taj a rg u m en t je referenca n a objek at kojim se rukuje. a . kako će o n a zn ati da li je p o zvana za objek at a ili b? Da b iste p ro g ram napisali u p rak tič n o j o b je k tn o o rijen tisan o j sintaksi. m o žd a se p itate kako m ožete da p ozovete m e to d u oljusti() za o b a objekta: //: in ic ija liz a c ija / B a n a n u O l j u s t i . Vodite .vraća referencu na objekat za koji je m etoda pozvana.. Vežba 6: ( 1) P repravite p re th o d n i p ro g ra m tako d a dve o d prek lo p ljen ih m eto d a p rim a ju po dva ista a rg u m e n ta (različitih tip o v a). za nju ne postoji identifikator. u zavisnosti o d toga koja je p rek lo p ljen a verzija pozvana.Poglavjje 5: Inicijalizacija i čišćenje 1 25 Vežba 4: ( 1) P re th o d n o j vežbi d o d a jte p rek lo p ljen i k o n stru k to r koji p rim a je d a n String a rg u m e n t i ispisuje ga uz vašu p o ru k u . * / } pu b lic class BananuOljusti { p u b lic s t a t i c void m a in (S trin g [] args) { Banana a = new Banana(). m eđ u tim .

i spi s ( ) . p r in t ln (" i = " + i ) . Lista p r e l i s t a j O { i++. ne treba da koristite this. . p r e l i s t a j ( ) . } pu blic s t a t i c void m a in (S trin g [] args) { L ista x = new L i s t a ( ) . } } / * Is p is : i = 3 * ///:Pošto m etoda p re lista j() vraća referencu n a tekući o b jek at preko rezervisane reči th is. th is se koristi i za prosleđivanje tekućeg objekta d ru g o j m etodi: //: in ic ija liz a c ija / P r o s le d iP o m o c u T h is . . Ne činite to. m ožete da napišete: //: i n i c i j a l i z a c i j a / K a j s i ja . zbuničete i naljutiti sve koji če čitati vaš program . * / } } ///:U n u tar m eto d e kostica() tnogli biste d a n ap išete this. Ljudi očekuju da se this upotrebljava sam o o n d a kada je n eo p h o d an . } void i s p i s ( ) { S y s te m . R ezervisana reč this k o risti se sam o kada treb a da izričito k o ristite referencu n a tek u ći objekat. java class Osoba { pu blic void pojedi(Jabuka jabuka) { Ima Ijudi koji kao opsednuti pišu this ispred svakog poziva m eto d e i svake reference polja. / * .ja v a / / Jednostavna upotreba rezervisane re či " t h i s " . lako se m ože izvršiti više o p eracija n ad istim o b jek to m . Znači. o n a se često k o risti uz n a red b e return kada treba da v ratite referencu n a tekući objekat: / / : in ic ija liz a c ija /L is ta . * / } void k o s tic a () { o t r e b i ( ) . .126 Misliti na Javi raču n a o sledećem: ako pozivate m e to d u svoje klase iz neke d ru g e m e to d e te iste klase. x . sam o pozovite m eto d u . Ako budete pisali this kada nije n eo p b o d n o .1 Prevodilac to au to m atsk i radi u m e sto vas. Pridržavajući se doslednog i jednostavnog stila program iranje štedite vrem e i novac. j a v a pu blic class K a js ija { void o t r e b i ( ) { / * . Z na se zbog čega koristim o jezike visokog nivoa: oni m nogo toga rade um esto nas. p r e l i s t a j ( ) .otrebi(). . . o u t. ali to nije p o tre b n o . Tekuća referenca this a u to m atsk i se koristi i za d ru g u m eto d u . Na p rim e r. obrazlažući da je takav ko d „jasniji i eksplicitniji“. p r e l i s t a j ( ) . return t h i s . public class L is ta { i n t i = 0. pošto u svem ostalom kodu koji su pročitali this nije bio posejan posvuda.

sp o ljn u m e to d u koja obavlja o p eraciju koja. } } class lj u s t a c { s t a t i c Jabuka 1ju s ti(J a b u k a jabuka) { / / . . } } / * I s p is : M 1ja c * ///:- Jabuka zove Ijustac. iz nekog razloga. d v ap u t pozovite d ru g u : prvi p u t bez this. import s t a t i c n e t. S y s t e m . a d ru g i p u t p o m o ć u this . tc ne bi treb alo da rad ite u praksi. ukloni Ijusku re tu rn jabuka.u ti1. p r i n t ln ( " M lja c " ) . * . o b ičn o m islite na „ovaj o b jek at" o d n o sn o na „tekući o b jek at“. A ko je u p o tre b ite s listom arg u m en a ta u n u ta r k o n stru k to ra .m in d v ie w . a vi ne želite da p o navljate n jen ko d ). l j u s t i ( t h i s ) . Takav poziv m ožete obaviti p o m o ć u rezervisane reči this. D a bi se p rosledila spoljnoj m etodi. / / Oljustena } } class Jabuka { Jabuka o l j u s t i S e ( ) { return 1j u s t a c . m o ra biti spo ljna za objekat Jabuka (m o žd a se sp o ljn a m eto d a m ože p rim e n iti na više različitih klasa. Kada napišete this. o n a m o ra da u p o treb i this. U n u ta r prve m eto d e. Stoga d ru g e k o n stru k to re m ožete sm esta da pozivate: / / : in ic ija liz a c ija /C v e t. o u t .ljusti(). .tek da biste videli kako radi. što sam o po sebi daje referencu na tekući objekat. P r i n t .pojedi (new JabukaO).Poglavlje 5: Inicijalizacija i čišćenje 127 Jabuka o lju s te na = j a b u k a .ja v a / / Pozivanje konstruktora pomoću rezervisane reči " t h i s " . } } pu b lic class ProslediPomoćuThis { p u b lic s t a t i c void m a in (S trin g [] args) { new Osoba() . Vežba 8: (1) N apravite Idasu s dve m eto d e. . m o žete pozvati je d a n k o n stru k to r iz d ru gog da biste izbegli p isanje istih n ared ab a više p u ta . o l j u s t i S e ( ) . rezervisana reč this im a dru g ačije značenje: o n a eksplicitno poziva p reklopljeni k o n stru k to r sa o d g o v araju ćo m listo m arg u m en ata. Pozivanje konstruktora iz konstruktora Kađa za klasu napišete nekoliko k o n stru k to ra.

} Cvet() { t h is ( " z d r a v o " . Vežba 9: (1) N apravite klasu s dva (p reklopljena) k o n stru k to ra . Takođe. b r o jla t ic a = 47 Argumenti t ip a S tr in g i i n t podrazumevani kon stru ktor (bez argumenata) b r o jL a t ic a = 47 s = zdravo * ///:K o n stru k to r Cvet(String s. } ) / * I s p is : Konstruktor samo sa argumentom t i p a i n t .s. s = " + s s ) . to je dvosm isleno. / / Ne može izvan konstruktora! p r i n t ( " b r o j L a t i c a = " + b r o jL a tic a + " s = "+ s ) . 47). Rešenje je da se p o d a tku čla n u o b raćate sa this. ) Cve t(Strin g ss) { p r i n t ( " K o n s t r u k t o r samo sa argumentom t ip a S t r in g . print("podrazumevani kon stru ktor (bez argumenata)" ) . } C vet(Strin g s. Iz prvog k o n stru k to ra p o m o ć u this pozovite drugi. / / Još jedna upotreba rezervisane reči " t h i s " print("Argum enti t ip a S trin g i i n t " ) . . Pošto su im en a a rg u m e n ta s i p o d atk a člana s ista. / / Ne možete da pozovete dva konstruktora! t h i s .u su p ro tn o m . Takav oblik ćete često sretati u p ro g ram im a. p r i n t ( " K o n s t r u k t o r samo sa argumentom t i p a i n t .is p is B ro ja L a tic a (). s = ss.12 8 Misliti na Javi p u b lic class Cvet { i n t b r o jL a t ic a = 0. kao i na b ro jn im m estim a u ovoj knjizi. int latice) p o kazuje da p o m o ću rezervisane reči this m o žete pozv ati jed an k o n stru k to r ali ne i dva. S trin g s = "početni b r o j " . C v e t( in t l a t i c e ) { b r o jL a t ic a = l a t i c e . s = s. U m e to d i ispisBrojaLatica() m o žete videti da prevodilac neće dozvoliti da pozovete k o n stru k to r iz bilo koje d ru g e m eto d e osim iz dru g o g k o n stru k to ra . k o n stru k to r m o rate da pozovete pre svih operacija . bro jL atic a= " + b ro jL a tic a ). x . i n t l a t i c e ) { th is (la tic e ). } p u b lic s t a t i c void main ( S t r in g [] args) { Cvet x = new C v e t ( ) . } void is p is B r o ja L a t ic a ( ) { //! t h i s ( l l ) . P re th o d n i p rim e r tak o đ e pokazuje još jed a n način u p o tre b e rezervisane reči this. //! t h i s ( s ) . biće p rijavljena greška p ri prevođenju.

ako koristite m e to d u finalize(). N aposletku. Kada je sakupljač sm eća sp rem an da oslobodi p ro sto r koji zauzim a vaš objekat. o n a m ože da p ristu p a d ru g im statič n im m e to d a m a i statič n im poljim a. statičn e m e to d e i polja su p rag m atičn i i p o n e k ad zaista p o tre b n i. Kada u klasu stavite statičn u m eto d u . Ako to zap am tite. d o k u Javi sakupljač sm eća ne počisti uvek objekte. S tatičn u m e to d u takođe m o žete d a pozovete za sam u klasu.posebnu“ m e m o riju bez u p o tre b e op e ra to ra new. O v de se krije p o ten cijalan izvor grešaka. Z nači. To je kao da p rav ite ekvivalent globalne m eto d e.Poglavlje 5: Inicijalizaclja i čišćenje 129 Značenje rezervisane reči static Pošto ste u p o z n a li rezervisanu reč this. To znači sledeće: ukoliko im ate nešto da u ra dite pre nego što odbacite objekat. bez objekta. jed n o stav n o . M eđ u tim . P ostoji m išljenje da statičn e m eto d e nisu o b jek tn o o rijen tisan e p o što im aju se m a n tik u globalne m eto de. je r n e p o sto ji referenca this. globaln e m e to d e nisu dozvoljene u Javi. p o seb n o o n i vični C + + u.posebnu“ m em o riju tog objekta. D ru g im rečim a: 1. m ožete p o tp u n ije da shvatite šta znači k ad a n ek u m e to d u pro glasite statičn o m . kom e treba da čisti m em o riju koju zauzim a p rom enljiva tipa int? Ali u bibliotekam a. napravite sam o običnu nestatičnn m etodu. Čišćenje: finalizacija i sakupljanje smeća P rogram eri su svesni značaja inicijalizacije. p a ra zm atran je jesu li ili n isu „isp rav n o o b jek tn o o rije n tisa n i“ treb a p rep u stiti teoretičarim a. 2. u p o četk u m og u da p o m ešaju m eto d u finalize() s destruktorom u C ++-U . R azm otrim o je d a n neobičan slučaj.. N aravno. Java nem a d estru k to re niti bilo šta slično. pa m o rate d a n ap rav ite uob ičajen u m e to d u koja će o b av iti čišćenje. Da bi se rešio taj slučaj. To jeste ra z u m a n a rg u m e n t i ako p rim e tite da mnogo k o ristite statičn e m eto d e.za tu m e to d u n e po sto ji referenca this. M ože se desiti da sakupljač sm eća ne počisti vaš objekat. nećete im ati nevolje. . Ipak. što je fu n k cija koja se uvek poziva kada se objekat uništava. ali često zaboravljaju na važnost čišćenja. Evo kako bi o na trcbalo da radi. Tada preko te reference (koja je u to m slučaju igra ulogu refe ren ce th is) m ožete da pozivate nestatične m etode i da pristupate nestatičnim poljim a. Iz sta tič n ih m e to d a ne m ožete da pozovete n e statičn e2 m e to d e (iako je o b ra tn o m oguće). Na To je m oguće sam o kada toj statičnoj m etodi prosledite referencu na objekat (i statična m etoda m ože praviti sopstvene objekte).napuštanje“ objekta kada s n jim završite nije uvek bezbedno. prvo će pozvati m eto d u finalize() i tek u d ru g o m prolasku sakupljanja sm eća oslobođiće i m em o riju objekta. Pretpostavim o da je vaš objekat zauzeo . Java im a sakupljač sm eča koji oslobađa m em o riju objekata koji se više ne koriste.. O vde je važno d a n ap rav ite razliku izm eđ u C + + -a i lave. Saku pljanje sm eća nije uništavanje. kada želite nešto tako da radite.. To i jeste o sn o v n a n a m e n a statičn e m eto d e. to m o rate u ra d iti ru čn o . jer neki p ro g ra m e ri. u statič n im m eto d a m a vi n e šaljete p o ru k u o b jek tu . o n a vam o m o g u ću je da nešto važno očistite u trenutku sakupljanja smeća. jer se u C ++-U objekti uvck uništavaju (u p ro g ra m u bez grešaka). vero v atn o bi treb alo da p o n o v o razm o trite svoj projekat. u Javi je obezbeđena m etoda finalize() koju m ožete da definišete u svojoj klasi. Sakupljač sm eča zna sam o kako da oslobodi m e m o riju d o d eljenu pomoću nevv i neće znati kako da oslobodi . Ipak.

v ero v atn o vam je jasno d a nećete često koristiti m eto d u finalize()3. A gde bi. M etoda finalize() je korisna sam o u posebnim slučajevim a. 2004). p ro sto r neće biti o sloboden i javiće se „curenje m em o rije" (engl. free() je funkcija jezika C i C + + . um esto na u o bičajen način. izdanju ove knjige. o n o treb alo d a se radi? Jo sh u a B loch ide još dalje u odeljku pod naslovom „Izbegavajte korišćenje završnih m etoda": „Finalizatori su nepredvidljivi. D a li to znači da m eto d a finalize() treba eksplicitno da oslobađa objekte ukoliko ih sadrži vaš objekat? Ne. celok u p an p ro sto r će b iti odjednom v raćen o p e ra tiv n o m sistem u na izlasku iz p ro g ram a. sakupljač sm eća postoji sam o da bi oslobađao m em o riju koju vaš program više ne koristi. kao što znate. To je zaista tako: o n a nije p rik lad n o m esto na k o m e se radi uobičajeno čišćenje.130 Misliti na Javi p rim er. M ože se d o g o d iti d a p ro s to r koji zau zim a vaš objekat n ik ad ne b u d e o slo b o đ en . često o p a s n i. U n u tar lokalnog koda. čem u . onda. i to bez o bzira na to kako su objekti napravljeni. ako m e to d u finalize() ne treb a d a k o ristite kao m e to d u čišćenja opšte n am ene. native m ethods) koje služe da iz Jave pozovete neki d ru g i lokalni kod. o n d a. ako sakupljač sm eća ne reši da počisti vaš objekat. D ru gim rečim a. ali p o što u njim a m ožete da pozovete p o tp ro g ram na n eko m d ru g o m jeziku. Ako ne pozovete i o d g o v araju ću funkciju free()." Efiknsno programiranje na lavi. Sakupljanje sm eća se bavi sam o m em o rijo m . p osebno m etod a finalize(). pa m o rate da je pozovete p rek o neke lokalne m eto d e iz vaše m eto d e finalize(). (L okalne m eto d e se razm atra ju u d o d atk u B u elektronskom 2. o n a služi? Treća stv ar koju tre b a d a zap am tite glasi: 3. Čemu služi metoda finalize()? D akle. a sakupljač sm eća nije im ao p rilik u d a o slo b o d i p ro s to r koji je bilo koji vaš objekat zauzim ao. . p retp o stav im o da se to k o m stv aran ja vaš objekat iscrta n a ekranu.net. Ali. 18 (M ikro knjiga. Z bog toga svaka aktivnost koja je povezana sa sakupljanjem sm eća. A ko se p ro g ra m završi.M indV iew . To se prvenstveno m ože desiti p ri p ozivu lokalnih m etoda (engl. m em o ry leak). Tako se izbegava d o d a tn a u p o tre b a raču n a rsk ih resursa . m e m o riju m o žete zauzeti n ek o m funkcijom iz C -ove p o ro d ice funkcija malloc(). a o b jek at do sp e p o d dejstvo sakupljača sm eća i fin alize() b u d e p o zv an a (a niko ne ja m č i d a će se to desiti). U koliko m e to d u fin alize() p ro g ra m ira te za n ek u v rs tu b risan ja. u prvoj fazi čišćenja slika će b iti u k lo n jen a sa ek ran a. kada vaš objekat zauzim a m em o riju na neki dru g i način. U s u p ro tn o m . m o žd a o n a n ikad neće biti u klonjena. d o stu p n o m na Iokaciji w w w . Pošto ste sve ovo pročitali. i po pravilu nepotrebni. zapravo m ožete da pozovete bilo šta. Ako eksplicitn o ne ob rišete njegovu sliku sa ek ran a. N aravno. slika o staje na ekranu. m o ra takođe da se bavi sam o m em o rijo m i n jenim oslobađanjem . s. ne pravljenjem objekata. pa kako je. u Javi je sve objekat. je r o oslo b ađ an ju m em orije objekata vodi računa sakupljač sm eća.) O d jezika za pisanje lokalnih m e to d a p o d rž a n i su sam o C i C + + . o n d a . jer vašem p ro g ra m u n ik a d a neće p o n e stati m em o rije. taj slučaj moguć? Ispostavlja se da m eto d a finalize() p ostoji zbog m o g u ćn o sti da m em o riju zauzm ete koristeći neki m eh an izam sličan C -ovom .ako čišćenje nije p o tre b n o p a se p o boljšavaju p erfo rm an se p ro g ram a.

ten n in a tio n condition ) nekog objekta.taj o bjekat treba da b u d e u stan ju u kom e njegova m em o rija m ože b ezb ed no da b u de oslob o đ en a. Z a p a m tite d a se ne g ara n tu je ni sakupljanje sm eća n iti čišćenje. U koliko je o b jek at u C + + -u n ap rav ljen lo k alno (n a p rim e r na steku — što nije m o gu će u Javi). je d n a vrlo k o risna p rim e n a m eto d e finalizef) koja se ne oslanja na to da će ona biti svaki p u t pozvana. što vas. Z ato se čini da je finalize() je d in o korisna za o slo b ađ an je m em o rije rezervisane n a neu ob ičajen način. Ako je o b jek at n ap rav ljen p o m o ć u o p e ra to ra new (kao u Javi).U . d e stru k to r se p o ziva kad a p ro g ra m e r pozove o p e ra to r delete (koji ne postoji u Javi). O d tre n u tk a kada vas objekat više ne zan im a . ako objekat predstavlja o tv o ren u d a to tek u . U C + + . ' Izraz koji je skovao Bill V enners tokom našeg sem inara. u n ištav a se k ada se n a iđ e n a zatv o ren u v itičastu zag radu koja završava oblast važenja objekta. Kako ova knjiga o d m iče. Java n e dozvoljava da p rav ite lokalne objekte . k o risn ik m o ra da pozove m e to d u za čiščenje u p o g o d n o m tre n u tku . to jest. d e stru k to r neće biti n ik ad a pozv an i nastaće „curenje m e m o rije “ a p o red toga ni d ru g i delovi o b jekta neće biti počišćeni. m eđ u tim . je r sakupljač sm eća to rad i u m esto vas.uvek m o ra te da koristite o p e ra to r new. ali se p o m alo su d ara s k o n cep to m d e stru k to ra u C + + -u . pro g ra m e r treb a da zatvori tu d a to tek u pre nego što sakupljač sm eća počisti taj objekat.Poglavlje 5: Inicijalizacija i čišćenje 131 Morate da čistite sami D a bi po čistio objekat.com) . Ako neka finalizacija o tk rije grešku. im aćete grešku u p ro g ram u koju je vrlo teško o tk riti. A ko bilo koji deo objekta nije p ra v iln o počišćen. u Javi ne p o sto ji o p e ra to r delete koji pozivate d a biste oslo b o d ili objekat. svi objekti b i trebalo da b u d u u n išten i. on (m u d ro ) neće gub iti v rem e na o slo b ađ anje m em o rije sakupljanjem sm eća. To zvuči p riličn o jasno.) Ako p o red o slob ađ an ja m em o rije želite i neko d ru g o čišćenje.artima. otkrili ste p ro b lem . nije rešenje p ro b lem a. To je provera p o sto jan ja stanja okončanja' (engl. A ko JV M -u ne p o n estane m em o rije. (w w w. p a to. Na p rim er. O va v rsta grešaka o tk riv a se vrlo teško i je d a n je o d ub ed ljiv ih razloga za p relazak sa C + + -a n a Javu. koju većina p ro g ra m e ra nikada neće koristiti. M eđ u tim . Postoji. P ojednostavljeno gledano. dakle. jedino i brin e. Stanje okončanja U glavnom ne m ožete da se oslonite na to da će finalize() biti pozvana. i dalje m o ra te e k sp liđ tn o da pozovete odgo v araju ću m e to d u u Javi koja je ekvivalent des tru k to ra u C + + . S u p ro tn o o d toga. M etoda fin a lize() je značajna zato što m ože da se iskoristi za otk riv an je tak vih slučajeva i ako se ne poziva uvek. uostalom .kada je sp rem an da b u d e počišćen . već m o ra te da nap rav ite zasebne funkcije za čišćenje i da ih eksplicitno pozovete. Ako p ro g ra m e r na C + + -U zab orav i d a pozove delete. (A nikada n e treb a d irek tn o da pozivate finalize(). m o žete reći d a Java n e m a d e stru k to re zato što im a sakupljače sm eća. videćete d a p o stojan je sakupljača sm eća ne elim iniše p o tre b u za d estru k to rim a i n jih o v im korišćenjem .U svi objek ti se uništav aju .

gc(). / / Poziv v e r z i j e osnovne klase } } pu b lic class StanjeOkoncanja { p u b lic s t a t i c void m a in (S trin g [] args) { Knjiga roman = new K n j ig a ( t r u e ) . to bi predstavljalo grešku koju je p o ten cijaln o teško o tkriti. / / Pravilno čiš ćenje : ro m a n . a m i ih još n ism o razm o trili. treb alo bi da p retp o stav ite kako i verzija fin alize() u osnovnoj klasi irna važnog posla i da je pozovete p o m o ć u rezervisane reči su p e r. / / Zahtevaj sakuplja nje smeća i f i n a l i z a c i j u System. kao što vidite u K njiga. / / Normalno b is te u r a d i l i i sledeće: / / s u p e r . } protected void f i n a l i z e ( ) { i f (pozajml jena) System . ja v a / / O tkrivanje objekta k o ji n i j e ispravno počišćen / / pomoću metode f i n a l i z e ( ) .out. } void v r a t i ( ) { pozajmljena = f a ls e .finalize(). } } / * Is p is : Greška: Knjiga n i j e vraćena * ///:Sve pozajm ljene knjige u stan ju o k o n ćan ja treb alo bi da b u d u v raćen e pre nego što ili pok u pi sakupljač sm eća. Bez m eto d e fin alize() koja proverava stanje o k o n ćan ja. class Knjiga { boolean pozajmljena = f a ls e . ali se do g o d i da su m eto d i m a in () p ro g ra m e r greškom ne vrati jednu o d knjiga. . vrlo je verovatno da bi zalutala K n jiga je d n o m bila o tk riv en a u p o n o v ljen im izvršav an jim a p ro g ram a (p o d p retp o stav k o m da p ro g ra m zau zim a d o v o ljn o m em o rije kako bi bio p o k re n u t sakupljač sm eća). U ovom slučaju. / / Ispu sti referencu.132 Misliti na Javi Evo jed nostav n o g p rim e ra kako d a to iskoristite: / / : in ic ij a li z a c ija / S t a n je O k o n c a n ja . O b ra tite p ažn ju na to da je za zahtevanje čišćenja korišćen p oziv S ystem . Ć ak i da nije. taj red je pretvoren u k o m e n ta r zato što zahteva o b ra d u izuzetaka. f i n a l i z e O .println (''Greška: k njig a n i j e vraćena").v ra ti( ) . zaboravi da p o č is t iš new K n j ig a ( t r u e ) .gc(). Knjiga(boolean p2) { pozajmljena = p2. Po prav ilu .

garbage collector. ispostavlja se da sakupljanje sm eća m ože značajn o u ticati n a povećanje b rzin e p ravljenja objekata. m o žete p retp o stav iti d a je Javin p rin c ip p ravljenja svega (osim p ro stih tipova) u d in am ičk o j m em o riji ta k o đ e zahtevan. pa će izgleđati da im ate više m em o rije nego što je zapravo slućaj.d o k radi. što o d go vara d odeli p ro sto ra sa steka u C + + -u . m ožete zam isliti da je d in a m ič k a m em o rija u C + + -u trav n jak n a kom se svaki objekat pojavljuje kao m ali bu sen. Vežba 12: (4) N aprav ite klasu Rezervoar koja se m o že p u n iti i p raz n iti. ali stalan režijski trošak koji se obavlja za vrem e trajanja vašeg program a. N apišite m e to d u finalize() koja proverava ispun jen je tog uslova o k o n čan ja . o n isto v rem en o sabija sve objekte u dinam ičkoj m em o riji čim e se „dinam ički pokazivač“ p o m e ra bliže p o četk u p o k re tn e trak e i dalje o d kraja stranice. im a m alo d o d a tn ih tro šk o v a za knjigovodstvo. Kako radi sakupljač smeća? Ako ste prešli s p ro g ram sk o g jezika u k o m e je za pravljenje o b jek ta u din am ičk o j m em o riji n e o p h o d n o m n o g o procesorske snage.brojanje referenci.o slo b ađ an je p ro s to ra u tiče n a dodeljivanje p ro sto ra . treba da m alo bolje razu m ete kako rad e sakupljači sm eća (engl. M e đ u tim . Na prim er. gc). brojač referenci se um anji za jedan. Sakupljač sm eća reo rg an izu je stvari i om og ućav a da se za d odeljivanje p ro sto ra koristi m odel brze d in am ičk e m e m o rije b esk on ačn e dužin e. vođenje računa o brojaču referenci je m ali. ali to nije ni nalik tražen ju m esta za ostavu. U n ek im Javinim v irtu e ln im m ašin am a. „D inam ički pokazivač" se p o m eri u n a p re d u n e d irn u tu te rito riju . Sakupljač sm eća proiazi kroz celo k u pn u listu ob jekata i oslobađa m em o riju kada naiđe na objekat čiji je brojač referenci nula. U m eto d i main() ispitajte scenarije koji se m o g u o d ig rati p rilik o m u p o tre b e klase Rezervoar.koje se snim aju na đisk i vraćaju s njega u b rzu m e m o riju . više kao p o k re tn a trak a koja se p o m e ra u n a p re d svaki p u t kada n aprav ite n o v objekat. ub rzo ćete doći u situ aciju da vam se p ro g ra m raširi n a više m em o rijsk ih stranica . p o nestaće vam m em o rije. Pri njihovom rad u koristi se jednostavna ali spora tehnika . Da biste shvatili kako to radi. To znači da svaki objekat im a brojač referenci i d a se taj brojač uveća za jedan svaki p u t kada se objektu prid ru ži neka referenca. U m etod i main() n apravite objekat te klase. O vaj p o sed m ože kasnije d a b u d e n a p u šten i zatim p o n o v o korišćen. n akon što n ap rav ite dovoljan broj o b jekata. u realizacijam a . Na kraju. To u po č etk u zvuči p o m alo č u d n o .ali na taj način rad e neke v irtu eln e m a šin e za Javu i to znači da dodeljivanje p ro sto ra u dinam ičk o j m em o riji u Javi m o že d a b u d e gotovo je d n ak o b rzo kao odvajanje p ro sto ra na steku u d ru g im p ro g ra m sk im jezicim a. (M eđ utim . (N aravno. Kad god referenca izađe iz oblasti važenja ili bude postavljena na vredn o st n u ll. O b jasn ite p o n aša n je svog p ro g ra m a. Vežba 11: (4) Prepravite p re th o d n u vežbu tak o d a se vaša m e to d a finalize() uvek poziva. To znači d a je d o d eljivanje p ro s to ra veo m a brzo.Poglavlje 5: Inicijalizacija i čišćenje 1 33 Vežba 10: (2) N apravite klasu s m e to d o m finalize() koja ispisuje n eku p o ru k u . Tu na scenu stu p a sakupljać sm eća .) O b ra tite pažn ju na to da d in am ičk a m em o rija nije p o k re tn a trak a i ako je na taj naćin tretirate. P rem a tom e. P ro m en a stran ice zn ačajno sm anjuje p erform anse. d in am ič k a m em o rija m ože da b u de p o tp u n o drugačija. i koja im a takvo stanje okončanja da m o ra b iti p ra z n a p rilik o m čišćenja objekta.

JVM k o risti prilagodljiv (engl. Kada se objekat p o m era s je d n o g m esta na d ru g o . Z atim se svaki živi objekat k o p ira iz jed n o g d in am ičk o g m em o rijsk o g p ro sto ra u d ru g i. Za o p štu u p o tre b u . i p ro đ ete kroz sve reference koje se tam o nalaze. Postoje dva činioca koja čine neefikasnim ove takozvane sakupljače s k o p iran jem (engl. praviće m alo ili n im alo sm eća. p ri čem u u staro m ostaje sve sm eće. p o p o treb i. O n e se sređ u ju kako se na n jih nailazi (zam islite tabelu koja p revodi stare adrese u nove). D rugi p ristu p se naziva označi-i-počisti (engl. i k o p iraju iz je d n o g k o m ad ića u drugi. D rugo pitanje je sam proces k o piranja.) Jeđna o d m an a ovog p ristu p a je sledeća: ako su objekti uzajam n o povezani referencam a. dalje ka dru g im o bjektim a itd.iz razloga koji će ubrzo p o stati jasn i . Pored toga. Pri tehnici označi-i-počisti k oristi se ista logika polaženja o d steka i statičkog skladišta i p raćen ja svih referenci da bi se p ronašli živi objekti. o n o se zasniva na ideji d a za svaki živi objek at m ožem o n a k raju p ro n aći n e k u referencu koja se nalazi bilo na steku ili u statičn o m skladištu. sakupljanje sm eća se n e zasniva n a b ro jan ju referenci. ako krenete o d steka i statičn o g skladišta.prilagodljiv“ deo). ali se objekat još uvek ne sakuplja. P o stu p ak se završava kada pro đ ete kroz celu M režu koja je započela to m referencom n a steku ili statičn o m skladištu. Č išćenje se obavlja tek . o n se označi in d ik ato ro m . Da bi to sprečile. To znači da se . o n a je brza. jer njih na ovaj način ne nalazite i stoga au tom atski postaju smeće. Referenca koja p o tiče iz d in am ičk o g m e m o rijskog p ro sto ra ili statičkog skladišta m ože b iti o d m a h p ro m en je n a. Lanac veza m ože ići kroz nekoliko nivoa objekata. U b ržim realizacijam a. O tkrivanje takvih sam oreferencirajućih grupa značajan je d o d atn i posao za sakupljač sm eća. čim e se o n sabija (i o m o g u ćav a da se novi skladišni p ro sto r sam o n astavi na kraj.13 4 Misliti na Javi brojača referenci objekat se često oslobađa čim brojač p ad n e n a nu lu . Svaki objekat kroz koji p ro đ ete sigurno je živ. copy collectors).p ro g ra m p rv o zaustavi (ovo nije sakupljanje u pozad in i). m o rate p ristu p iti objektu n a koji o n a ukazuje i zatim analizirati sve reference u totn objektu. sakupljač s k o p iran jem će i dalje kopirati m em o riju s jed n o g m esta na dru g o . Kada vaš p ro g ram p o stan e stabilan. zavisi o d v arijan te koja se tre n u tn o koristi. Šta posle rad i sa p ro n a đ e n im živim o b jek tim a. Brojanje referenci se često koristi da objasni jed n u vrstu sakupljanja sm eća. adaptive) n ačin sakupljanja sm eća. U m esto toga. Prvi je da im ate dva d in am ič k a m em o rijsk a p ro sto ra i da p reb acu jete m e m o riju izm edu ta dva o dvojena p ro sto ra . O b ratite p ažn ju n a to da n e m a p ro b lem a sa izdvojenim sam oreferencirajućim grupam a. o bjekti se pri k o p ira n ju u n o v i dinam ičk i m em orijski p ro sto r slažu je d a n za d ru g im . ali kada zn ate da im ate m alo ili nim alo d u b reta. trošeći d v o stru k o više m em o rije nego što vam zaista treba.. teh n ik a ozn ači-i-p o čisti je priličn o spora. Neke v irtu e ln e m ašine ovo rešavaju tako što zau zim aju d in am ičk i m em o rijsk i p ro sto r u k o m ad ićim a. stop--and-copy). U prkos to m e. ali se n e p rim en ju je gotovo n i u jednoj stvarnoj virtuelnoj m ašini. Jedna o d tih varijan ata je stani-i-kopiraj (engl. Znači. Svaki p u t kada se naiđe na živi objekat. njihovi brojači referenci m o g u biti različiti od nule. raz u m e se da sve reference koje na njega ukazuju m o raju da b u d u izm enjene. neke v irtu eln e m ašine otkrivaju kada se više ne pravi sm eće i prelaze na drugačije čišćenje (ovo je . U gore o p isa n o m p ristu p u . što je gubljenje vrem ena. ali m o g u p o sto jati i d ru g e reference koje ukazuju na taj objekat n a koje ćem o naići kasnije. p ro n aći ćete sve žive objekte. rnark a n d sweep) i njega su starije virtuelne m ašine kom panije Sun koristile sve vrem e. kao što je ran ije o p isan o ). Za svaku referencu koju p ro n a đete. čak i ako ti objekti predstavljaju sm eće.

Svaki blo k im a brojačproizvodnje koji vodi evidenciju d a li je b lo k živ. JVM p rati efikasnost sakupljača sm eća i ako se za njegovo korišćenje n e o p h o d n o troši vrem e jer su svi objekti dugog životnog veka. U to m tre n u tk u jedan p ristu p m ože biti da p rim e n im o JIT p rev ođ enje na sav k od . ne m ože da b u d e zanem arljivo). M eđ u tim . JIT p revodilac delim ičn o ili p o tp u n o pretvara p ro g ram u lokalni m ašinski kod. m ožda nikada ne b ud e JIT p reveden. za šta je n e o p h o d n o p u n o m em orije. p o sto ji teh n ik a prilagodljiva stani-i-k o p iraj označi-i-počisti. Slično tom e. što znači da se II I prevođenje ne radi sve d o k nije n e o p h o d n o . D rugo. a blokovi koji sadrže m ale o b jek te k o p iraju se i slažu. prvi p u t kada želite da napravite objekat te klase). povećava se izvršni p ro g ram (bajtk od je z n a tn o k o m p ak tniji od raspakovanog JIT koda). loader) i o n og a što se naziva p revodilac b aš-k ad a-treb a (engl. Postoji više d o d atn ih m o g u ćn o sti za ub rzav an je v irtu e ln e m ašine. i ako d in am ič k i m em o rijsk i p ro sto r p o stan e fragm en tiran . o n to rad i tako što p o m e ra objekte. nešto više traje (što. T im e se postiže da kod koji se nikad a ne izvrši. Kao što je ranije p o m e n u to . pa m o g u d a se izm en e m em o rijsk e stranice. I teh n ik a o zn ači-i—p o čisti zahteva zaustavljanje p ro g ram a. ali se ispostavilo da u ran ijim verzijam a S unove JVM saku pljanje sm eća nije realizovano n a taj način. P reth o d n a m eto d a prebacivanja predstavlja p o m e n u ti prilagodljivi deo. Prvo. . prebacuje se nazad u režim stan i-i-k o p iraj. tako da JVM ne m o ra da ga in terp re tira.što se kod više izvršava. Posebno važna m o gućnost o đn o si se na rad p ro g ram a za učitavanje (engl. Kada klasa m o ra da se u čita (o b ično . T okom čiščenja o slo b ađa se m em o rija koju su zauzim ali m rtv i objekti. U literatu ri koj u je objavio Sun p ro n aći ćete više referenci na sakupljač sm eća kao p o zad in sk i proces niskog p rio riteta.Poglavlje 5: Inicijalizacija i čišćenje 1 35 kada se završi p o stu p ak označavanja. T ehnologije Java H o tS p o t u n ovijim razvojnim o k ru žen jim a (JDK) p o stu p aju slično. ali to im a dve m ane. pa je izvršavanje m n o g o brže. U m esto toga. preb acuje ga u režim o zn ači-i-p očisti. O b ič n o se sabijanje vrši sam o n ad b lokovim a koji su n apravljeni posle posled n jeg sak up ljan ja sm eća. pronalazi se d atoteka . kada se n ak u p i kroz životni vek p ro g ram a . Just-In-Time. A ko napravite veliki objekat. S unov sakupljač sm eća je zaustavljao p ro g ra m k ad a p o n estan e m em o rije. n išta se ne k o p ira.veliki o bjekti se i dalje ne k o p iraju (već im se sam o uveća brojač proizvodnje). jer o p tim iz u ju svaki deo koda svaki p u t kada se on izvršava . tj. JVM vodi raču n a o u spešnosti tehnike o zn ači-i-po čisti. p o staje sve brži. P erio dičn o se radi p o tp u n o čišćenje .class i b ajtk od te klase se učitava u m em o riju. svim ostalim blok ov im a b rojač p roizvodnje se uvećava ako su o d n e k u d referencirani. već se p ro g ram zaustavlja d o k se obavlja sak u p ljan je sm eća. o p isan a v irtu eln a m ašin a zau zim a m e m o riju u velikim b lokovim a. Sakupljač sm eća to k o m sakupljanja o bično m ože d a k o p ira objekte u m rtve blokove. lazyevaluation). o n d o b ija so pstveni blok. JIT). Tehnika stani-i-kop iraj počiva na ideji da ovaj tip saku pljan ja sm eća ne rad i u p o zad ini. što defin itiv n o u sporava program . S trik tn a teh n ik a stanii-kopiraj zahteva kop iran je svih živih objek ata sa izvorišnog d in am ičk o g m em orijsk og p ro sto ra u novi p re nego što se stari oslobodi. N a ovaj n ačin se b rin e o uobičajenim slučajevim a p riv re m e n ih o b jekata k ratk o g životnog veka. p a ako sakupljač odluči d a sabije fragm e n tira n i d in am ički m em orijski prostor. A lternativni p ristu p je lenja p ro cen a (engl.

prin t("b y te " + b). " + t). void i s p i s l n i c i j a l n e V r e d n o s t i () { p r i n t ( " T i p podatka I n i c i j a l n a vrednost"). A ko je p ro st tip p o lje neke klase. . Kad su p ro m en ljiv e definisane lo kaln o u m eto d i. a p o d ra zu m ev an a v re d n o st b i to p rik rila . byte b. short s . * . povećava se v ero v atn o ća o tk riv a n ja grešaka. print("double printC'reference " + reference). print("short " + s) print("int " + i) pri nt("1ong p rin t("flo a t " + 1) ■ + f) " + d). Kao što ste viđeli u poglavlju Sve je objekat. ovo g a ra n tu je prevodilac (jer inače prijavljuje grešk u ). double d. 1ong 1. m in d v i e w . ali je neinicijalizovana lo k aln a p ro m en ljiv a v ero v atn o greška p ro g ra m e ra . char c. prev o d ilac je m o g ao d a d o d eli p rom en ljiv o j i p o d ra z u m e v a n u v red n o st. flo a t f . i++. P risiljav an jem p ro g ra m e ra d a o b ezb ed i v red n o sti za inicijalizaciju .136 Misliti na Javi Inicijalizacija članica fava se baš tru d i d a g a ra n tu je k ako će sve p ro m en ljiv e biti p ra v iln o in iđ jalizo v an e p re korišćenja. p r i n t ( “ boolean print("char [" + c + "] " ) . I n i cija ln e V re d n o sti reference . P r i n t . // Greška -.i nije inicijalizovana dob ićete p o ru k u o grešci s n a p o m e n o m d a p ro m en ljiv a i m o žd a nije in iđ jalizo v an a. Evo p rim e ra koji to d o k azuje i tih vrednosti: / / : i n i c i j a l i z a c i j a / I n i c i j a l n e V r e d n o s t i . java / / Prikazuje podrazumevane i n i c i j a l n e vred no sti. p u b lic class I n ic ija ln e V r e d n o s t i { boolean t . Z nači. p u b lic s t a t i c void m a in ( S trin g [] args) { I n ic ija ln e V r e d n o s t i iv = new I n ic i ja l n e V r e d n o s t i( ) . svako polje p ro sto g tip a u svakoj klasi g aran to v an o će d o b iti inicijalnu vred n o st. N aravno. u t il. stvari su nešto drugačije. import s t a t i c n e t . ako napišete: void f() { int i . i nt i .

0 0.).ispislnicijalneVrednosti().14159. char c = ' x ' . } III-- . Stoga je b arem elim inisan a opasnost o d rad a s neinicijalizovanim pro m en ljiv am a. f l o a t f = 3 .ispislnicijalneVrednosti().0 null long flo a t double reference * I I I.šete referencu na objekat u n u ta r neke klase. Zadavanje inicijalizacije Šta se dešava ako želite da p rom enljivoj d odelite p o č e tn u vrednost? D irek tan n ačin d a to urad ite jeste da joj d o d elite v red n o st na m estu gde tu p rom enljivu definišete u klasi.1 4 f. au to m a tsk i inicijalizuju (p o d raz u m ev an a vredn o st za tip c h a r je nula. iako nisu n avedene. byte B = 47. long 1 = 1 . short s = Oxff . */ } } / * I s p is : Tip podatka boolean char byte short in t I n i c i j a l n a vrednost fa ls e [ 1 0 0 0 0 0. /* U ovom slučaju takođe možete napisati: new InicijalneVrednosti(). double d = 3.) U sledećem p rim eru definicije polja u klasi In ic ija ln e V r e d n o s t i p ro m en jen e su da bi obezbedile p o četne v red n osti: / / : i n i c i j a l i z a c i j a / I n ic ija ln e V r e d n o s t i 2 . ja v a / / E k s p lic itn o zadavanje i n i c i j a l n i h v r e d n o s ti.V idite d a se v ređ n o sti. a ne inicijalizujete je. Kada defini. ta referenca d o b ija p o se b n u v red n o st null. i n t i = 999. (To nije m o guće u C + + -u .Poglavfje 5: lnic[jalizacija i čišćenje 137 iv. iako početn ici u jeziku C + + to uvek pokušavaju. što se ispisuje kao razm ak. p u b lic class In ic ija ln e V re d n o s ti2 { boolean b = tru e .

a ne u način u na koji se p ro g ra m prevodi. bu ni zbog referenciranja u nap red . } irit g (in t n) { re tu rn n * 10. O vakav p ristu p inicijalizaciji je d n o stav an je i d irek tan . Razlog leži u redosledu inicijalizacije (p ro m en ljiv a i se koristi pre nego što je definisana). a ipak p ok u šate da je koristite. } in t g ( in t n) { re tu rn n * 10. sasvim o p rav d an o .ja v a p ublic c la s s In icijalizacija M e to d o m { in t i = f () . } ///:N aravno. ali dru gi p u t će v am zatreb ati više fleksibilnosti.ja v a c la s s Dubina {} pu b lic c la s s Mera { Dubina d = new Dubina ( ) . M ožete čak d a pozovete m e to d u d a b iste obezb edili v re d n o st za inicijalizaciju: / / : in ic ija liz a c ija /In ic ija liz a c ija M e to d o m . d obićete grešku p ri izvršavanju koja se u Javi naziva izuzetak (engl. } } III-- Ali ovo ne m ožete d a urad ite: / / : in ic ija liz a c ija /I n ic ija liz a c ija M e to d o m 3 . Stoga ovo m ožete d a u rad ite: / / : i n i c i j a l iz a c ij a / I n i c i j a l iz a c ijaMetodom2. ta m eto d a m o že im ati a rg u m en te . in t f ( ) { re tu rn 11. java p ublic c la s s I n i c ij a l izacijaMetodom3 { / / ! in t j = g ( i ) . što je o b rađ eno u poglavlju O brada grešaka potnoću izuzetaka.š to treba. O graničen je tim e što svnki objekat tip a In ic ija ln e V re d n o sti im a iste inicijalizacione v red n o sti. / / ••• 1 ///:Ako prom enljivoj d n iste dali p o č e tn u v red n o st. } 1 III-Na ovom m estu se p revodilac. in t f( ) { re tu rn 11. definišite p ro m en ljiv u i in iđ ja liz u jte je n a sledeći način: / / : in ic ija liz a c ija /M e r a . }.java p u blic c la s s In icijalizacijaM eto d o m 2 { in t i = f (). A ko je definisan a klasa D u b in a . . Ponekad vam ba. ali ti arg u m e n ti ne m og u biti ostali članovi klase koji još nisu inicijalizovani. / / Nedozvoljeno re f e re n c ir a n je unapred in t i = f (). exception).1 38 Misliti na Javi O bjekte m o žete inicijalizovati n a isti način . in t j = g ( i ) . in t f ( ) { re tu rn 11.

napisali: / / : in ic ija liz a c ija /B ro ja c . } / / ••• } III-- p ro m en ljiv a i bi p rv o bila inicijalizovana v red n o šću 0. ako biste. / / Kada se pozove kon stru k tor za p ra v lje n je / / objekta klase Prozor. a zatim vred n o šću 7. Brojac() { i = 7.ja v a p u b lic class Brojac { in t i .m in d v ie w . P r i n t . Redosled inicijalizacije Redosled inicijalizacije u n u ta r klase o d re đ en je red o sled o m kojim su p rom enljive definisane. Prevodilac zato n e p ok ušav a da vas p risili d a inicijalizujete elem ente na bilo k o m m estu u k o n stru k to ru ili p re nego što ih k o ristite . / / Nakon konstruktora void f () { p r i n t ( " f ( ) " ) . } f class Kuca { Prozor pl = new P r o z o r ( l) . / / Pre konstruktora Kuca() { / / Ukazuje da smo unutar konstruktora p r i n t ( 'KucaO" ) . videćete poruku: class Prozor { P ro z o r(in t marker) { P ro z o r(in t marker) { p r i n t ( " P r o z o r ( " + marker + " ) " ) . / / Ponovo i n i c i j a l i z u j e p3 } Prozor p2 = new Prozor(2). D efinicije pro m en ljiv ih m ogu biti razbacane u n u ta r i izm eđ u definicija m eto d a.ja v a / / Pokazuje redosled i n i c i j a l i z a c i j e . u k lju ču ju ći i o n e koji su eksplicitno inicijalizovani na m e stu definicije. Na p rim er: / / : i n i c i ja liz a c ija /R e d o s le d ln ic ija liz a c ije . Jeđnu stvar treb a im ati na u m u : tim e ne sprečavate a u to m a tsku inicijalizaciju koja se odigrava p re nego što se u đe u k o n stru k to r. * . ali se p rom enljive inicijalizuju pre poziva bilo koje m eto d e .u ti1. na p rim er. Stoga. p3 = new Prozor(33). / / Na kraju . import s t a t i c n e t. je r m o žete da pozivate m e to d e i izvršavate akcije to k o m rad a p ro g ra m a kako biste od red ili p o četn e v red n o sti. O vo važi za sve p ro ste tipove i reference n a objekte.čak i k o n stru k to ra . } Prozor p3 = new Prozor(3). To daje veću fleksibilnost u p ro g ra m ira n ju .inicijalizacija je već sigurno obavljena.Poglavlje 5: Inicljalizacija i čišćenje 1 39 Inic/jalizacija konstruktorima K o n stru k to r m ože d a se k oristi za inicijalizaciju.

P r i n t . ali g aran tu je p rav iln u inicijalizaciju. Sta bi se desilo ako bi bio definisan preklopljeni k o n stru k to r koji nc inicijalizuje p3. k .u ti1.m in d v ie w . f ( ) . * . } } . o n o će dobiti sta n d a rd n u v red n o st. class C in ija { C i n i j a ( i n t marker) { p r i n t ( " C i n i j a ( " + marker + " ) " ) .p o d razu m ev an a“ inicijalizacija za p3 pri njenoj đefiniciji nije zadata? Inicijalizacija statičnih elemenata Za statične podatke postoji jeđ in stv en o skladište.. / / Prikazuje da j e završeno p r a v lje n je } } / * Is p is : Prozor(l) Prozor(2) Prozor(3) Kuca() Prozor(33) f() * ///:- U klasi Kuca. (Prvi objekat će biti n ap u šte n i kasnije sak u p ljen kao sm eće. import s t a t i c n e t. pa se ona p rim en ju je sam o na polja. Evo p rim e ra iz kojega ćete videti u kom tre n u tk u se inicijalizuje sta tič n o skladište: / / : in ic ija l iz a c ija /S ta tic k a ln ic ija liz a c ija . Iz izlaza vidite d a se referenca p 3 inicijalizuje d v ap u t. R ezervisanu reč sta tic ne m ožete p rim e n iti na lokalne pro m en ljiv e. } void f l ( i n t marker) { p r i n t ( " f l ( " + marker + " ) " ) . I kada je statičn o polje p ro sto g tip a. je d n o m p re i je d n o m za v rem e poziva k o n stru k to ra. a vi ga ne inicijalizujete.ja v a / / Zadavanje početnih vrednosti u d e f i n i c i j i klase. p3 se p o n o v o inicijalizuje u n u ta r k o n stru k to ra . to će izgledati isto kao i kod nestatičnih podataka. definicije objekata klase Prozor n a m e rn o su razb acan e d a bi se dokazalo kako će sve biti inicijalizovane p re ulaska u k o n stru k to r. a . R eferenca na objek at d obija p o d ra z u m e v a n u p o četn u vred nost null. P o red toga.) Isprva ovo m ože da izgleda neefikasno. bez o b zira na to koliko je o bjekata napravljeno.140 Misliti na Javi pu blic class R e d o s le d ln ic ija li z a c ij e { pu blic s t a t i c void m a in (S trin g [] args) { Kuca k = new Kuca(). Ako inicijalizaciju želite da izvršite na m estu definicije.

} s t a t i c C in ija ci n i j a 5 = new C i n i j a ( 5 ) . s t o . new Kredenac( ) . p r i n t ( " P ra vlje n je novog objekta klase Kredenac() u metodi main " ) . new KredenacO. c in ija 2 . } s t a t i c C i n ij a c in i j a 2 = new C i n i j a (2 ).fl(2 ). s t a t i c C i n ij a c i n i j a 4 = new C i n i j a ( 4 ) . s t a t i c Kredenac kredenac = new Kredenac(). f 2 ( 1) . class Kredenac { C i n ij a c in i j a 3 = new C i n i j a ( 3 ) .f(l). f3 ( l) .Poglavlje 5: Inicijalizacija i čišćenje 141 class Sto { s t a t i c C i n ij a c i n i j a l = new C i n i j a ( l ) . Kredenac() { p r i n t (" K r e d e n a c ( )" ). } void f 3 ( i n t marker) { p r i n t ( " f 3 ( " + marker + " ) " ) . c in ija 4 . } void f 2 ( i n t marker) { p r i n t ( " f 2 ( " + marker + " ) " ) . S to() { p rin t("S to ()” ) . k r e d e n a c . } / * I s p is : C in ija (l) Cini j a (2) Sto() fl(l) Ci ni j a(4) C in ija ( 5 ) Cini ja (3) Kredenac() f 1 (2) P r a v lje n je novog objekta klase Kredenac() u metodi main C in ija ( 3 ) KredenacO . } s t a t i c Sto sto = new S to () . } pu b lic class S t a t i c k a l n i c i j a l i z a c i j a { pu b lic s t a t i c void m a in (S trin g [] args) { p r i n t ( " P r a v l je n je novog objekta klase Kredenac() u metodi main").

kada se odgovarajući objekat klase C lass učitava p o prvi put. k o n stru k to r jeste statičn a m eto d a. više se ne obavlja p o n o v n a inicijalizacija statičn ih objekata. Stoga.142 Misliti na Javi fl(2 ) P ra v lje n je novog objekta klase Kredenac() u metodi main C in ija ( 3 ) KredenacO f 1 (2) f 2 (1) f 3 (1) * ///:Klasa Cinija om ogućava da p ra tite pravljenje objekata. 3. ako to već nije u čin jen o .class (pri čem u se pravi objekat klase C lass. Z naći. p o što u tip ič n o m p ro g ram u sve neće b iti povezano statičn im e lem en tim a kao u ovom p rim eru .cinija2. Pri učitavanju P as. a zatim se inicijalizuju n jen a statičn a polja sto i kredenac. o n i se inicijalizuju sam o jed an p u t. Da b ism o napravili sažetak procesa pravljenja objekta. D a b i se izvršila statičn a m e to d a m ain( ). čim e se au to m atsk i zadaje p o d ra zu m e v a n a v red n o st svih pro m en ljiv ih pro sto g tipa u to m o bjektu Pas (n u la za brojeve i njen ekvivalent za b o o le a n i c h a r). o čem u će kasnije biti reči) pokreće se inicijalizacija svih statičn ih elem enata. 6. 4 . N akon toga. Taj p ro sto r se p o p u n i n u lam a. Izvršavaju se sve inicijalizacije koje se javljaju na m estu definicije polja. . O b ra tite p a ž n ju na to da Kredenac pre statičnih definicija p rav i nestatičan objekat Cinija cinija3. Prvo se inicijalizuju statičn i elem en ti. a zatim nestatičn i. p o sm a tra jm o klasu p o d im en o m Pas: 1. Kada napravite objekat o p eracijo m n ew Pas(). p o što o b e te klase sadrže statičn e o b jekte Cinija. classpath). Iz rezu ltata p re th o d n o g p ro g ra m a v idite d a se inicijalizacija statičn ih elem en ata javlja sam o ako je n e o p h o d n a. proces kon stru k cije objekta nalaže da se prvo zauzm e do v o ljn o skladišnog p ro sto ra u d in am ič k o m m em o rijsk o m p ro sto ru . što p ro u zro k u je učitavanje tih klasa. Iako se u njoj rezervisana reć sta tic ne upotrebljava eksplicitno. p ri p rv o m pravljenju objekta tip a Pas ili kada se prvi p u t p ristu p a statičkoj m eto d i ili statičk o m polju klase Pas. 5. zatim se učitava Cinija. a klase Sto i Kredenac na više m esta u n u ta r definicija im aju statičn e članove klase Cinija. To najčešće nije slučaj. Izvršavaju se k o n stru k to ri. O n i se inicijalizuju sam o kada se p rav i prvi o bjek at klase Sto (ili kada se p rv i p u t p ristu p a statičn o m p o d a tk u ).class. to m ože da b u d e veliki posao. statičn i objekti Cinija cinijal i cinija2 nik ad a neće b iti n apravljeni. m o ra b iti učitan a klasa Staticlnitialization. a sve reference d obijaju vređ n o st nu ll. 2 . A ko n e n a p rav ite objekat klase Sto i ako se n ik ad a ne o b ratite m e to d a m a Sto. Kao što ćete videti u poglavlju Ponovno korišćenjc klasa . n aro čito p ri nasledivanju. D okaz za to vidite u rezu ltatu p re th o d n o g p ro g ram a . Tako se sve klase ovog p ro g ra m a učitavaju p re početka izvršavanja m etode main( ). Javin in te rp re te r m o ra da p ro n a đ e d ato tek u Pas. što čini pretraživanjem p u ta n je klasa (engl.cinijal ili Sto.

ali je to sam o rezervisana reč sta tic posle koje sledi b lo k koda. class S o ljic a { S o l j i c a ( i n t marker) { p rin tC 'S o l ji c a C ' + marker + " ) " ) . } class S o l jic e { s t a t i c S o ljic a s o l j i c a l . s ta tic { s o l j i c a l = new S o l j i c a ( l ) . s t a t i c S o ljic a s o ljic a 2 .Poglavlje 5: Inidjalizacija i čišćenje 143 Eksplicitna inicijalizacija statičnih elemenata Java om o gućava da statičke inicijalizacije u n u ta r klase grup išete p o seb n im „statičkim od red bam a" (koje se p o n ek ad nazivaju i statički blokovi). f (9 9 ) . m in d v i e w . } } ///= O vo podseća na m eto d u . s o l j i c a l . import s t a t i c n e t . * . } void f ( i n t marker) { p r i n t ( " f ( " + marker + " ) " ) . N a p rim e r: / / : in ic ija liz a c ija /Iz ric ito S ta tic k a . kada prvi p u t p rav ite objekat te klase ili kada p rv i p u t p ristu p a te statič n o m član u klase (čak i ako n ik ad a n e n ap rav ite o b jek at te klase). / / (1) } / / s t a t i c S o l jic e s o l j i c e l = new S o l j i c e ( ) . / / (2) / / (2) .ja v a / / E k s p lic itn a i n i c i j a l i z a c i j a s t a t i č n i h elemenata preko statič n og bloka. u t il. izvršava sam o je d n o m . s ta tic { i = 47. S o l j i c e . P r i n t . kao i d ru g e inicijalizacije sta tič n ih elem enata. Ovaj k o d se. / / s t a t i c S o ljic e s o ljic e 2 = new S o l j i c e ( ) . p u b lic class I z r i c i toS tatic ka { p u b lic s t a t i c void m a in (S trin g [] args) { p rin t ( " U n u t a r metode m a in () "). To ovako izgleda: //in ic ija liz a c ija /K a s ik a . s o l jic a 2 = new S o l jic a ( 2 ) .ja v a p u b lic class Kasika { s ta tic in t i . } S o l jic e ( ) { p rin t("S o lj i c e ( ) " ) .

m i n d v i e w . " i mp o r t s t a t i c n e t . u t i 1 . print("soljal i solja2 inicij a l iz ov an i"). } void f ( i n t marker) { p r i n t ( " f ( " + marker + " ) " ) . kao što v id ite iz rezu ltata p ro g ra m a . V ežba 14: (1) N ap rav ite klasu s je d n im sta tičn im p o ljem tip a S trin g koje se inicijalizuje n a m e stu definisanja i d ru g im p o lje m koje in iđ ja liz u je statičan blok. statičn i elem en ti neće b iti inicijalizovani. Sledi p rim er: // : inicijalizacija/Solje. statičn i elem en ati če se inicijalizovati sam o je d n o m . } } pu blic class S olje { So lja s o l j a l . n azvanu inicijalizacija instanci. } S o lje () { print("S ol j e ( ) "). solja2 = new So l j a ( 2 ) . A ko su i (1) i (2) k o m en tarisan i. D ođajte statičn u m e to d u koja ispisuje o b a p o lja i p o k azu je d a se o b a inicijalizuju p re u p o treb e.java / / Javina " I n i c i j a l i z a c i j a i n s t a n c i. Takođe nije b itn o da li je k o m e n ta r uklonjen isp red sam o je d n o g red a ili o b a re d a o zn ačen a sa (2). So lja s o lja 2 . } S o lje (in t i) { . V ežba 13: (1) P roverite n are d b e iz p re th o d n o g pasusa. { soljal = new S o l j a ( l ) . b ilo d a je red (1) k o m en ta risan a iz redova o zn ačen ih sa (2) uk lo n jen k o m en tar. Inicijalizacija nestatičnih instanci Z a inicijalizaciju n estatičn ih p ro m en ljiv ih svakog objekta. P r i n t . * . class Solja { S o l j a ( i n t marker) { p r i n t ( " S o l j a ( " + marker + " ) " ) . Java obezbeđuje sličnu sintaksu.144 Misliti na Javi } / * I s p is : Unutar metode main() S o ljic a (l) S o ljic a ( 2 ) f (99) * ///:Statični elem en ti klase S oljice in icijalizu ju se bilo da se sta tič n o m o b jek tu s o ljic a l p ristu p a u red u o zn a čen o m sa (1).

sam o što nedostaje rezervisana reč static. R eferencu niza definišete tako što iza im ena tip a stavite prazn e uglaste zagrade: i n t [ ] a l. } p u b lic s t a t i c void m a in (S trin g [] args) { p r i n t ( " U n u t a r metode m a in ( ) " ) . Vežba 15: (1) N aprav ite klasu s je d n im p o ljem tip a String koje se inicijalizuje p o m o ć u inicijalizacije instanci. } } / * I s p is . . } izgleda gotovo istovetno kao o d red b a za inicijalizaciju statičn ih elem enata. new Sol j e ( ) . O va sin tak sa je n e o p h o d n a da bi se obezbedila p o d ršk a za inicijalizaciju anortim nih unutrašnjih klasa (poglavlje U nutrašnje klase). so lja 2 = new Solj a(2 ). new S o l j e ( l ) . Unutar metode main() S o lja (l) S olja (2 ) s o l j a l i s o lja 2 i n i c i j a l i z o v a n i Sol j e ( ) nove S o lje ( ) završene Sol j a ( l ) S olja (2 ) s o l j a l i so lja 2 i n i c i j a l i z o v a n i Sol j e ( i n t ) nove S o l j e ( l ) završene * ///:O b ra tite p ažn ju na to da o d re d b a inicijalizacije instanci: { s o l j a l = new S o l j a (1). p rin t ( " n o v e S o lje ( ) završene"). p r in t ( "n o v e S o l j e ( l ) završene").Poglavlje 5: Inicijalizacp i čišćenje 145 p rin t("S o lje (in t)"). p r i n t ( " s o l j a l i solja 2 i n i c i j a l i z o v a n i " ) . N izovi se definišu i koriste p o m o ć u operatora indeksiranja [ ]. Iz rezultata p ro g ram a v id ite da se o d re d b a inicijalizacije instanci izvršava p re svih k o n stru k to ra. ali o m o g u ću je i da jam čite kako če se o d ređ en e op eracije izvršiti bez o bzira na to koji će eksplicitni kons tru k to r biti pozvan. Inicijalizacija nizova Niz je sekvenca objek ata ili elem en ata pro sto g tip a koji su jed n o g istog tip a i upak o v an i zajed no p o d jed n im im e n o m za identifikaciju.

sam o k o p ira referenca. i++) a 2 [ i] = a 2 [ i] + 1. a2 = a l . Pošto je u Javi m oguće da jed an niz d o d elite d ru g o m . i < a2. 4. 5 }. značenje će b iti p o tp u n o isto. prevodilac vodi raču n a o zau zim an ju skladišnog p ro sto ra (kao da ste koristili new ). 4. m o žete i da napišete: a2 = a l. i++) p r i n t ( " a l [ " + i + "] = " + a1 [ i ] ) . O va specijalna inicijalizacija zadaje skup v re d n o sti izm eđ u vitičastih zagrada. O vo se uklap a u očekivanja C i C + + p ro g ra m era. f o r ( i n t i = 0. l e n g t h . in t a l [ ] . Pri to m e se. N a p rim er: int [] al = { 1. i n t [ ] a2. ali m o žete da koristite i p o seb n u v rstu izraza za in iđ jalizaciju nizova koji m ože da se pojavi sam o na m estu definicije niza. što n a re d n i k o d pokazuje: / / : in i c i j a l i z a c i j a / N i z o v i P r o s t i h T i p o v a . u t i 1 . 5 }. inicijalizacija m ože da se pojavi bUo gde u kodu.146 Misliti na Javi Ako uglaste zagrade stavite posle id en tifik ato ra. U ovom slučaju. Prevodilac n e dozvoljava d a navedete veličinu niza. 3. P r in t pu b lic class NizoviProstihTipova { pu b lic s t a t i c void m a in (S trin g [] args) { i n t [ ] al = { 1. je r p o k azu je d a je tip p ro m en ljiv e n iz celih brojeva. 2. } } / * Is p is : a l [0] = 2 al [1] = 3 a l[2 ] = 4 a l [3] = 5 a l [4] = 6 * ///:- . D a biste napravili skladište za niz. Prvi stil sadrži v erovatno p ristu p ačniju sintaksu. f o r ( i n t i = 0. Kod nizova. To nas vraća na p itan je referenci. 3. U ovoj knjizi biće korišćen taj stil. j a v a import s t a t i c n e t . Sve što u ovom tre n u tk u im ate jeste referenca n a niz (rezervisali ste dovoljno p ro sto ra za tu referencu) i nikakav p ro s to r za sm eštanje sam og niza nije rezervisan u m em oriji. m o rate da napišete izraz za inicijalizaciju.m in dvi e w . i < a l . 2. čem u o n d a služe reference n a nizove bez d o d eljen ih nizova? in t [] a2. u stvari. Pa.1ength.

0. to je g u b lje n je v re m e n a . n e x t l n t ( 2 0 ) ] .ali n e i m en jati . Pored toga. 0. T v o rci |a v e su s in a tra li d a v re d i ž rtv o v a ti n e što e fik a sn o s ti n a u š trb s ig u rn o s ti n a Inte r n e tu i p r o d u k tiv n o s ti p ro g ra m e ra . n izovi p o č in ju o d indeksa 0. pu b lic class NizoviINew { pu b lic s t a t i c void m a in (S trin g [] args) { i n t [ ] a. iz rezultata ovog p ro g ram a v id ite da elem en ti nizova p ro stih tipova au to m atsk i d o b ijaju p o d raz u m ev an e v red n o sti. import j a v a . 0. U n a re d n o m p rim e ru koristi se new . 0] } ///■■Pošto se velićina niza bira p seu d o slu čajn o (m e to d o m R a n d o m . 0. m in d v i e w . Pošto u Javi. le n g th ) . * . a = new i n t [ s l u c a j a n . j a v a / / P ra v lje n je nizova operatorom new. referenci a2 v red n o st je d o d eljen a k asnije . 0. p rin t(A rra y s . 0. iako se pravi niz čiji su elem en ti p ro sto g tip a (n e w n e m ože d a n ap rav i sam o jed nu p ro m en ljiv u p ro sto g tipa): / / : in i c i j a l i z a c i j a / N i z o v i I N e w . .’ ’ Šta ako ne zn ate koliko će v am e lem en ata b iti p o tre b n o u n izu d o k pišete p rogram ? Sam o u p o tre b ite o p e ra to r n e w z a p rav ljen je elem en ata niza. daje verziju je d n o d im e n z io n a ln o g niza koja se m ože ispisati. p ro v e ra v a n je sv ak o g p ris tu p a n iz u iz isku je v re m e i k o d i tu p ro v e ru n e m o ž e te d a isključite. 0. m e đ u tim . 0. } } / * I s p is : duzina niza a = 18 [0.to S trin g (a )). 0.u ovom slučaju. što z n ač i đ a p ris tu p i n iz o v im a m o g u b iti izv or n e e fik a sn o s ti u v a še m p ro g r a m u ako s e ja v lja ju n a važn im m e stim a . što pred stav lja izvor m n o g ih grešaka. čiji je re zu k tat slučajan broj izm eđ u nule i n jen o g arg u m e n ta ). * .1. izm en e sprovedene preko a2 o d ražavaju se i u a l.to S trin g (). 0. 5 N a ra v n o . u t i 1 . 0. u t il.da biste znali koliko elem en ata im a u nizu. p r in t ( " d u z in a niza a = " + a . Svi nizovi im aju član (bilo da su n izovi o b jek ata ili nizovi elem enata p ro sto g tip a) koji m ožete čitati . a za b o o le a n to je false. 0. štiti o d takvih p ro b lem a tak o što pro izv o d i grešku p ri izvršavanju ( izu zetak) ako zakoračite v an g ran ica. Java vas. M a d a ćete m o ž d a d o ć i u isk u še n je d a sam i p išete k o d k o ji bi tre b a lo e fik asn ije da p ris tu p a n iz o v im a . Taj član je len g th . 0.Poglavlje 5: Inicijalizacija i čišćenje 1 47 O b ra tite p ažn ju n a to da je n izu a l d o d eljen a inicijalizaciona v red n o st. C i C + + to ćutke p rih v ataju i dozvoljavaju da vršljate dalje p o m em o riji. import s t a t i c n e t . Pošto su a2 i a l tak o p o stali p se u d o n im i istog niza.u til. 0. kao u C -u i C + + -u . 0. a nizu a2 nije. koja p rip ad a sta n d a rd n o j Javinoj biblioteci ja v a . o n a pokazuje n a d ru g i niz. jasn o je da se niz zaista pravi za v rem e izvršavanja. P r i n t .n e x tIn t(). (Za n u m eričk e i p rom enljive tipa ch a r to je nula. A ko izađete van granica. 0. Random slu caja n = new Random(47). najveći elem en t koji m ožete da indelcsirate je l e n g t h .) M etod a A rra y s. p o š to će a u to m a ts k e o p tim iz a c ije to k o m p re v o đ e n ja i iz v ršav a n ja u b rz a ti p ris tu p a n je n iz o v im a .

U g o rn jem p rim e ru . 429.ja v a / / I n i c i j a l i z a c i j a niza. / / Autopakovanje p rin t(A rra y s . p u b lic class NizObjekata { p u b lic s t a t i c void m a in (S trin g [] args) { Random slu caja n = new Random(47). import j a v a . * . R az m o trim o o m o ta čk i tip In teg er. 51. Za to p o sto je dva oblika: / / : in ic ija liz a c ija /In ic ija liz a c ija N iz a . i < a . Niz o b jekata tak o đ e m o žete da inicijalizujete koristeći listu izm eđu vitičastih zagrada. javiće se izuzetak kada po k u šate da u p o tre b ite p ra z n u lokaciju u nizu. 128. I n t e g e r [ ] a = new I n t e g e r [ s lu c a ja n . u t i l . import s t a t i c n e t . u t i l .to S trin g (a )). 22. n e x t l n t ( 2 0 ) ] . n e x t l n t ( 2 0 ) ] . u stvari p rav ite niz referenci. n e x t ln t ( 5 0 0 ) . import j a v a . ) } / * I s p is : (Primer) duzina niza a = 18 [55. Ako to k o m izvršavanja zab o rav ite da n ap rav ite objekat. 200. 361. 20] * U /-. 193. i++) { a [ i ] = s lu c a ja n . f o r ( i n t i = 0. j a v a / / P ra v lje n je niza č i j i elementi nisu prostog t i p a . čak i kada o p e ra to ro m n ew n a p rav im o niz: Integ er [] a = new I n t e g e r [ s lu c a ja n . 278. Kada n ap rav ite n iz o bjekata. le n g th ) . . m in d v i e w . koji je klasa. preko autopakovanja): a [ i ] = new Integer ( s lu c a ja n . 461.le n g th . bilo bi bolje da rad ite tako. 288. p r in t ( ''d u z in a niza a = 1 1 + a .148 Misliti na Javi N aravno. 207. u ovom slučaju niz je m ogao d a b u d e definisan i inicijalizovan u istoj naredbi: i n t [] a = new i n t [ s l u c a j a n . d o b ićem o sam o niz referenci pa inicijalizacija neće biti p o tp u n a sve do k ne inicijalizujem o sam e reference praveći nove objekte tipa Integer (u ovom slučaju. u t il. a n e p ro st tip: / / : in ic ij a l i z a c i j a / N i z O b j e k a t a . 89. \k o m ožete. n e x t l n t ( 2 0 ) ] . n e x tln t ( 5 0 0 ) ) . 361. * . 309. P r i n t . 368. 498. p u b lic class I n i c i j a l i z a c i j a N i z a { p u b lic s t a t i c void m a in ( S tr in g [] args) { Integerf ] a = { new I n t e g e r ( l ) . * .

o u t. Ispišite niz petljom for. In te g e r[ ] b = new Integer [ ] { new I n t e g e r ( l ) . je r se m ože u p o treb ljav ati sam o na m estu definicije niza. / / Autopakovanje ).ou t. m ogli biste n ap rav iti niz o bjekata tip a String koje ćete proslediti m etod i main() neke d ru g e m etode. završni zarez u listi inicijalizatora nije obavezan. D rugi i treći oblik m ožete u p o tre b iti b ilo gde. (O va m o g u ćn o st je n am en jen a lakšem o d ržavan ju d ugačkih lista.out.) Poslednji zarez u listi inicijalizatora je o p cio n i. pa altern ativ n e arg u m en te m ožete zadati čak i u tre n u tk u to g poziva. 3. " l a " } ) . }.main(new S t r in g [ ] { " t r a " .print(s + " " ) . 3] [1. p r i n t ln ( A r r a y s . System. . pu b lic class ĐinamickiNiz { pu b lic s t a t i c void m ain(S trin g [ ] args) { Druga.main() n ap rav ljen je n a m estu poziva te m etode. / / Autopakovanje ). (Z ato je lakše o d ržavanje dugačkih lista. čak i u n u ta r poziva neke m etode. }. da biste n a taj n ačin zadali a ltern ativ n e arg u m en te k o m a n d n e Iinije toj m eto d i main(): / / : i n i c i j a l i z a c i j a / D i n a m i c k i N i z . Vežba 16: (1) N apravite niz objekata tipa String i svakom elem e n tu d o d elite p o jed a n String. t o S t r i ng(b)) . java / / I n i c i j a l i z a c i j a nizova. to S tr in g ( a ) ) . Na p rim er. p r in t ln ( A rr a y s . 2. }. " l a " . 2. 3] * ///:U ob a slučaja.Poglavlje 5: Inicijalizaaja i čišćenje 149 new I n t e g e r ( 2 ) . } / * Is p is : t r a la la * lll'Niz napravljen za arg u m en t m etode Druga. 3. } class Druga { p u b lic s t a t i c void m ain(S trin g [ ] args) { f o r ( S t r in g s : args) Sys tem . } / * I s p is : [1. njegova o g ran ičen ja su veća.) lako je p rv i oblik k oristan . new In te g e r( 2 ) . S y s t e m .

Vežba 18: (2) D o p u n ite p re th o d n u vežbu p ravljenjem o bjekata koje ćete d o d eliti n iz u referenci. što će b iti o p isan o u nastavku knjige) jeste da se ispisuje im e klase i adresa olijekta. Liste promenljivih parametara D rugi oblik (inicijalizacije niza) o b ezb eđ u je p o g o d n u sin tak su za pravljenje i pozivanje m eto d a koje m o g u d a p ro izv ed u isti efekat kao lista p ro m en ljiv ih p a ra m e ta ra u C -u (p o zn a ta i kao varargs).11) }). T okom p ravljenja ispišite taj a rg u m en t.p rin t(o b j + " " ) . i spisiNiz(new O bje ct[ ] {new A (). m o žete d a n a p rav ite m e to d u čiji je arg u m e n t n iz elem en ata tip a Object i d a je pozovete na sledeći način: / / : in ic ija liz a c ija /P ro m e n ljiv a L is ta .o u t. ali o bjekti ovde n ap rav ljen ih klasa štam p aju im e klase. new A( ) } ). K ada p o k ren ete p ro g ram . a zatim foreach sintaksom prolazi kroz niz i ispisuje sve njegove objekte. D akle.14 11. Pošto sve klase u o sn o v i n asleđ u ju zajedničku k o ren sk u klasu Object (o čem u ćete više saznati n a p re d u ju ć i k ro z o v u knjig u ). new Double ( 11. new A ( ) . Lista m o že im ati n e p o z n a t bro j arg u m en ata. p ro v erite d a li se ispisuju inicijalizacione p o ru k e iz poziva k o n stru k to ra . class A { } pu b lic class Prom enljivaLis ta { s t a t i c void is p i s i N i z ( O b j e c t [ ] argumenti) { fo r(O b je c t obj : argumenti) S ys te m . znak @i heksadecim aln e cifre. p r in t ln ( ) . . S y s t e m . } pu b lic s t a t i c void m a in (S trin g [ ] argumenti) { is p is iN iz (ne w O bje ct[ ] { new In te g e r(4 7 ). a m o g u se p o jav iti i nep o z n ati tipovi. ali n e m o jte p ra viti objekte koje ćete d o d eliti to m n izu.1 4 ). } } / * I s p is : (Primer) 47 3. new F lo a t(3 . is p is iN iz (ne w O bje ct[ ] {"je d a n ". "dva".ja v a / / Korišćenje sin takse nizova za p r a v lje n je promenljive l i s t e parametara. p o d ra z u m e v a n o p o n ašan je (ako za svoju klasu ne definišete m eto d u to S trin g ( ). N apravite niz referenci objek ata te klase. o u t.11 jedan dva t r i A@la46e30 A@3e25a5 A@19821f * ///:M ožete v ideti da p r in t( ) u zim a niz elem enata tip a O b jec t.150 Misliti na Javi Vežba 17: (2) N aprav ite klasu s k o n stru k to ro m koji p rim a arg u m en t tip a String. Klase sta n d a rd n e Javine biblioteke daju razum ljiv ispis. " t r i " } ) .

zbog toga print( ) m ože foreach sintak som da p ro d e kroza sve e lem en te niza.1 1)). M ed u tim .11 jedan dva t r i A@lbab50a A@c3c749 A@150bd4d 1 2 3 4 * ///:Kada se radi o prom enljiv im p a ra m e trim a. D akle. new A ().14 11. isp is iN iz (ne w A (). gde se niz elem enata tipa Integer (n ap rav ljen ih autop ak o v a n jem ) eksplicitno pretvara u niz elem en ata tip a Object (da bi se izbeglo up o zo ren je prevodioca) i p rosleđuje m eto d i isp isiN iz( ). " t r i " ) . j a v a / / Korišćenje sintakse vezane za nizove. o u t . i s p i s i N i z ( ) .14).11 47 3.print(ob j + " " ) .14 11. za p ra v lje n je promenljive l i s t e / / parametara. Jasno. / / Prazne l i s t e su dozvoljene } } / * I s p is : (Uzorak) 47 3. 11. prevodilac će ga p rih v atiti kao listu p ro m en ljiv ih arg u m en ata (p aram etara). kao što vidite u sledećoj m e to d i ispisiNiz(): / / : i n i c i ja lizacija/N ovaProm enlj i v a L i s t a . new Double( 11 . } p u b lic s t a t i c void m ain (S trin g [] argumenti) { / / Može p r i m i t i pojedinačne elemente: isp isiN iz(n e w Inte g e r(4 7 ).ou t. p u b lic class NovaPromenljivaLista { s t a t i c void is p i s i N i z ( O b j e c t . is p is iN iz ( 4 7 . / / 111 n iz : i s p i s i N i z ( ( O b j e c t [ ])new In te g e r[ ] { 1. argumenti) { f o r ( 0 b je c t obj : argumenti) S y s tem .14F.Poglavlje 5: Inicjjalizacija i čišćenje 151 O vako su se pre pojave Jave SE5 pisali Java p ro g ram i d a bi se d ob ile p rom enljive liste p ara m e ta ra . To je korisno kada im ate neobavezne prateće argu m en te: . prevo dilac vidi da je to već niz i na njem u ne obavlja nikakvu konverziju. 3. new A ( ) ) .to će prevodilac u činiti um esto vas čim zadate prom en ljiv e p a ram etre. new F1oat(3. Poslednji red p ro g ra m a p o kazuje cla se listi pro m en ljiv ih p a ra m e ta ra m ože prosled iti nula arg u m en a ta. O b ra tite pažn ju na p retp osled n ji red p ro g ram a. Svoj niz ćete svakako d o b iti. više ne m o ra te eksplicitno da ispisujete sintaksu nizova . . 2. na delu je više od p roste a u to m atsk e konverzije liste elem en ata u niz. 4 } ) .11). S y s t e m . . a ako niz već im ate. 3. "dva". p r i n t ln ( ) . m ožete ih proslediti kao listu. ako im ate g ru p u stavki. i s p is iN iz ( " j e d a n " . u Javi SE5 pojavila se du go zahtevana m o g u ćn o st da se p ro m en ljive liste p a ra m e ta ra definišu p o m o ć u o p era to ra tri tačke. M ed utim .

} s t a t i c void g ( i n t . svi p ro m en ljiv i p a ra m e tri m o ra ju biti String objekti.ja v a p u blic class TipPromenl jivogParametra { s t a t i c void f ( C h a r a c t e r . i prosti.out. "dva". o u t . S y s t e m .g e tC la s s ()) . f(). java pu blic class OpcioniPratećiArgumenti { s t a t i c void f ( i n t obavezan. g().out. U p re th o d n o m p rim e ru . f(0 ).prin t l n ( " i n t [ ] : " + new i n t [ 0 ] .o u t.prin t(arg um e nti. . duzina 0 class [ I duzina 1 class [ I duzina 0 i n t [ ] : class [ I * ///:- .p rin t(s + " " ) . p r i n t ln ( ) . } } / * I s p is : class [1ja v a . p r i n t l n (" duzina " + argumenti. System. g(i). . duzina 1 class [1ja va . S t r i n g .print("obavezan: " + obavezan + " " ) .152 Misliti na Javi / / : in ic ij a li z a c i ja / O p c io n i P r a t e ć iA r g u m e n t i. getClass( ) ) . " j e d a n " ) . " t r i " ) . p r i n t l n (" length " + argumenti. getCla ss( ) ) . } public s t a t i c void main( S t r i n g [] argumenti) { f('a'). ) pu blic s t a t i c void m a in ( S tr in g [] args) { f (1. argumenti) { S y s te m . U p ro m en ljiv im p a ra m e trim a m o g u se ko ristiti svi tip ov i.la n g . System. U sledećem p rim e ru po k azu jem o d a lista p ro m en ljiv ih p a ra m e ta ra p ostaje niz i da je veličina to g niza nula ukoliko ta lista n e m a sadržaja: //: in ic ija liz a c ija / T ip P r o m e n ljiv o g P a r a m e tr a .C h a ra cte r. f (2. } } / * I s p is : obavezan: 1 jedan obavezan: 2 dva t r i obavezan: 0 * ///:I ovo pokazuje da prom enljiv. .p rin t(a rg u m e n ti. argumenti) { S ystem . 1e n g th ). 1e n g th ) . Sys tem .out.la n g .C h a ra c te r.o u t. .ou t. .ou t. f o r ( S t r in g s : p ra te ć i) S yste m . .e p a ra m e tre m ožete u p o treb ljav ati i sa zadatim tip o m koji nije Object. p r a te ć i) { System.

f ( 4 . . 7. N a p rim e r: //: in ic ija liz a c ija /A u to p a k o v a n je P ro m e n ljiv ih P a ra m e ta ra . p r i n t ln ( ) . radi još jed n e provere.ja v a p u b lic class PreklapanjePromenljivihParametara { s t a t i c void f ( C h a r a c t e r . f o r ( I n t e g e r i : argumenti) S y ste m . } } / * Is p is : 1 2 4 5 6 7 8 9 10 11 12 * ///:Im ajte u v idu da u istoj listi arg u m e n a ta m ožete m ešati tipove i da au to p ak o v a n je selektivno u n a p ređ u je in t a rg u m en te u tip In teg er. .o u t. 8. argumenti) { S y s t e m . S y s t e m . i kada je ispišete. Prom enljivi p a ra m e tri k o m p lik u ju p o stu p a k p rek lap an ja. . new I n t e g e r ( l l ) . O na daje klasu objekta. o u t. M eđ u tim .Poglavlje 5: Inicijalizađja i čišćenje 153 M etoda getClass() je deo Objecta i biće p o tp u n o ra zm o tre n a u poglavlju Podaci o tipu. o u t . 5. . f ( 1 0 . T im e je do kazan o da u p o tre b a p ro m en ljiv ih p a ra m e ta ra ne zavisi o d au to p ak o v an ja. nego da zaista rad i s p ro stim tipovim a. p r i n t ln ( ) . S y s t e m . d o b ijate k o d ira n znakovni niz koji predstavlja tip te klase. } p u b lic s t a t i c void m a in ( S tr in g [] argumenti) { f(new I n t e g e r ( l ) . . S y s t e m . new I n t e g e r ( 2 ) ) . u p o sled n jem re d u sam n ap rav io niz tipa int i ispisao njegov tip. 9). p r i n t ln ( ) .p rin t(" " + c ) . o u t . o u t .p rin t( i + " " ) .o u t. p r in t ( " d r u g i" ) . p ro m en ljiv i p a ra m e tri lepo ra d e sa au to p ak o v a n jem . I n azn aču je pro sti int. p r i n t ( " p r v i" ) .o u t. 12).p rin t(" " + i ) . argumenti) { S y s t e m .ja v a p u b lic class AutopakovanjePromenljivihParametara { p u b lic s t a t i c void f ( I n t e g e r . iako to na p rv i pogled izgleda sasvim bezopasno: //: in ic ija liz a c ija /P r e k la p a n je P r o m e n ljiv ih P a ra m e ta ra . Vodeće [ p o k a zu ju d a se rad i o n izu tip a koji sledi. . } s t a t i c void f ( I n t e g e r . 6. argumenti) { f o r ( I n t e g e r i : argumenti) S y s te m . . for(C h ara cte r c : argumenti) S y s te m . o u t .

' a ' ). } } ///:O znaka {C o m p ileT im eE rro r} u k o m e n ta ru uklanja ovu d ato tek u iz sk rip ta za prevođenje p rim era iz ove knjige. p rev o d ilac u p o tre b ljav a au to p ak o v a n je da b i se p rilagodio preklopljenoj m eto d i i poziva n ajp rik la d n iju m eto d u .p r in t("d ru g i" ) . . f (0 ).. } public s t a t i c void m a in (S trin g [] argumenti) { f C a ' . } p u blic s t a t i c void main ( S t r in g [] argumenti) { f ( l . d o b ićete p o ru k u o grešci: reference to f is am b ig u o u s. f(2 .) in P rek lap an jeP ro m en ljivihParam etara2 m atch . o u t . o n a će v ero v atn o izn en a d iti p ro g ra m e ra klijenta.C haracter. Ali kada pozovete f() bez a rg u m en ata. i) .. .java..višeznačno } } / * Is p is : prvi a b c drugi 1 drugi 2 1 drugi 0 treći * ///:U svakom o d p re th o d n ih slučajeva..o u t. b o th m e th o d f(float. p r i n t ln ( " t r e ć i" ) .154 Misliti na Javi s t a t i c void f( L o n g .lang.. C h a ra c te r. 1c ' ) . f (0 L ). P roblem biste m ogli p o k u šati da rešite d o d a v an je m n ep ro m en ljiv o g a rg u m e n ta jed n o j o d m etoda: / / : i n i c i j a l iz a c ija /PreklapanjeProm enljivihParam etara2.lang.. 'b ').C haracter. } s t a t i c void f (C h aracte r. o u t .. Iako je ta greška razum ljiva.java / / {CompileTimeError} (Neće se p r e v e s ti) pu blic class PreklapanjePromenljivihParametara2 { s t a t i c void f ( f l o a t i . Ako je prevedete ru č n o . o n n e zna k o ju m e to d u da pozove. argumenti) { S y s t e m .. ' b ' . . f (i). / / Neće se prevesti . argumenti) { S y s t e m .) in P reklapanjeP rom enIjivihP aram etara2 a n d m eth o d f(java. argumenti) { S y s t e m . p r i n t ln ( " p r v i" ) . / / ! f ( ) . fC a '.

. argumenti) System.out.ne znaju“ da čine skup. { } static void f(char c. PALI } ///:- . U verite se da toj m e to d i m ožete proslediti listu elem en ata tip a String razdvojenih zarezim a ili String[]. a o n je čak i m oćniji o d o noga što im aju C /C + + . Character. u o p šte n e u p o trebljavajte. Vežba 20: ( 1) N apišite m e to d u main() koja u m esto u o b ičajen e sintakse u p o treb ljav a p ro menljive a rg u m en te. { } } /* Ispis: prvi drugi * ///:Po pravilu..println("prvi"). M NO G O . Evo je d n o stav n o g p rim era : / / : i n i c i j a l iza ci j a / L j u t o .. SREDNJE.println("drugi"). N ekada biste napravili skup k o n sta n tn ih c elo b ro jn ih v red n o sti. enum erated types).. BLAGO. argumenti) Sy stem. upaliće: //: inicijalizacija/PreklapanjePromenljivihParametara3. Ili. ali one . { } public static void main(String[] argumenti) f(l. C + + -u i u više d ru g ih jezika. n a b ro jan i tip o v i su toliko često p o tre b n i da su oduvek postojali u C -u . Inače. Character. listu p ro m en ljiv ih arg u m e n a ta treb alo bi d a u p o treb ljav ate sam o u jed n o j od p rek lo p ljen ih m eto d a. Ispitajte tu m e to d u p o m oću različitog b ro ja arg u m e n ata s k o m a n d n e linije. p ro g ra m e ri na Javi m orali su m n o g o d a znaju i da paze kako bi valjano proizveli e n u m efekat. Sada i Java ima e n u m . pa se rizičnije i teže upo trebljavaju.Poglavlje 5: Inicijalizacija i čišćenje 1 55 A ko o bem a m e to d am a date n ep ro m en ljiv a rg u m e n t..out. Vežba 19: (2) N apišite m e to d u koja p rim a String niz p ro m en ljiv ih a rg u m en ata. 1b 1). 'a'). f (' a '.java public class PreklapanjePromenljivihParametara3 { static void f(float i. java pu b lic enum Ljuto { NE. Pre Jave SE5. Ispišite sve elem en te rezu ltu ju ćeg niza args. Nabrojani tipovi Naizgled m ali d o d a tak u favi SE5 jeste rezervisana reč e n u m koja m n o g o olakšava život kada tre b a da g ru pišete i u p otreb ite skup nabrojanih tipova (engl.

p o konvenciji ih pišem o velikim slovim a (ako im e sadrži više reči. K ada v am zatreb a enum. p r in t ln (k o lik o l j u t o ) . prav i m e to d u toStringO k o jo m m o žete lako da prik ažete im e enum instance. } } / * Is p is : SREDNJE * ///:K ada n ap rav ite enum.ja v a p u b lic class RedosledNabrojanihTipova { p u b lic s t a t i c void m a in (S trin g [] args) { f o r ( L j u t o s : L ju t o . 0. 4. po redu BLAGO. n a b ro jan i tipovi i jesu klase sa sopstvenim m eto d am a. pa m ožete u m n o g o m e da ga tre tira te kao i svaku d ru g u klasu. o r d i n a l( ) + ". i statičn u m e to d u values() koja daje niz v red n o sti enum k o n stan ti p o ređ a n ih p o red o sled u kojim su bile deldarisane: / / : in ic ija liz a c ija /R e d o s le d N a b ro ja n ih T ip o v a . po redu PALI. Pošto su p rim e rci n a b ro ja n ih tip o v a k o n stan te.p rin tln (s + ". " + s . } } / * Is p is : NE. ja v a pu b lic class Pljeskavica { Spiciness stepen. po redu MN0G0. po redu"). v a lu e s ()) S y s te m . razd v ajam o ih d o n jo m crtico m . Prevodilac pravi i m e to d u ordinal() koja daje red n i bro j d eklarisanja o d red en e enum k o n stan te u n jenoj klasi. 3. p revodilac m u au to m atsk i dod aje korisne m o g u ćn o sti. S y s t e m .ja va pu b lic class JednostavnatlpotrebaNabrojanihTipova { p u b lic s t a t i c void m a in (S trin g [] args) { Lju to k c l i k o l j u t o = Ljuto. n ap rav ite referencu to g tipa i d odelite je n ek o m p rim e rk u (instanci): / / : in ic ijalizacija /Je d n o sta v n a llp o tre b a N a b ro ja n ih T ip o v a . 1.po d v lak o m ). o u t. (U pravo tako je p re th o d n a n ared b a print dala rezultat.SREDNJE. po redu SREDNJE.ste p e n = stepen. 2.156 Misliti na Javi O vim e je n ap rav ljen n a b ro ja n i tip Ljuto s p et im en o v an ih v red n o sti. ta rezervisana reč sam o o d ređ u je p o n ašan je p revodioca to k o m generisanja klase za enum.} . Posebno je zg odno kako se n ab ro jan i tipovi m o g u u p o trebljavati u n u ta r n ared b e svvitch: //: i n i c i j a l i z a c ija / P lje s k a v ic a . po redu * ///:lako enum izgleda kao nov tip p o d atak a. N a p rim er. pu b lic P1jeska vica(Ljuto stepen) { th is.o u t. U stvari.

f e f e r o n . o p iš i ( ) . case M NO G O : case PALI: d e fa u lt: S y s te m .println ("po tp un o nezačinje na. case BLAGO. o u t . break. ispišite svaku v red n o st i (m e to d o m ordinai()) njen redni broj.SREDNJE).Poglavlje 5: Inicijalizacija i čišćenje 157 p u b lic void o p i š i (} { System . . Ova p lje s k a v ic a j e p r e l j u t a . O b ratite pažn ju na to kako im ena n a b ro jan ih tipova m nogo jasnije p o kazu ju šta će p ro g ram urad iti. o p iš i ( ) . case SREDNJE: S y s t e m . b ib e r . M eto d o m values() p ro d ite kroz sve n ab ro jan e v red n o sti.N E). * ///:Pošto sw itc h služi za izbo r iz ograničer. Ova p lje s k a v ic a j e lj u t k a s t a . To je i b io cilj. ispišite op is te novčanice. } } / * I s p is : Ova p lje s k a v ic a j e potpuno nezačinjena."). bez.MNOGO). Za svaki case.o u t.ou t. pa na njih više ne m o rate o b raćati p o seb n u pažnju. Pre uvođenja n ab ro janih tip o v a u Javu SE5. p r i n t l n ( " l j u t k a s t a . N jim a sm o posvetili p o seb n o poglavlje. N a b m ja n i tipovi. " ) . bib e r = new P1jeska(Začinjenost. U opšte uzev. enum m ožete da koristite kao d ru g i naćin đefinisanja tipova p o dataka .p rin tln ("p re lju ta . trebalo je uložiti dosta tru d a za pravljenje ekvivalentnog n a b ro janog tipa koji je b ezb ed n o upotrebljavati. fefero n = new P1jeska(Začinjenost. Vežba 22: (2) N apišite naredba switch za enum iz p re th o d n o g p rim era." ) .opiši ( ) . idealno o dg ov ara definisanju tipova n ab rajan jem . switch(stepen) { case NE: System . break.og sk u p a m o g u ćih v rednosti. O vo je do voljno za shvatanje i korišćenje je d n o stav n ih n ab ro jan ih tipova.print("O va plje ska vic a j e " ) .out. } } p u b lic s t a t i c void m a in (S trin g [] args) { P 1jeskavic a bez = new P1jeskavica(Ljuto. Vežba 21: (1) D efinišite enum o d šest n ajm an je v red n ih tipova p ap irn ih novčanica.

a slični p ro b lem i javljaju se i p ri nepraviln o m čiščenju. nasleđivanju i to m e kako te operacije u tiču n a k o n stru k to re . k oji se m o ž e k u p iti na lo kaciji www. O k o n stru k to rim a p osto ji još stvari koje nisu ra zm o tren e u ovom poglavlju.M indView. zbog svoje spo ro sti. sakupljač sm eća dod aje režijske troškove to k o m izvršavanja p ro g ram a.com. koje je S tro u stru p izneo d o k je p ro jek to v ao jezik C + + .) Kada v am ne treb a p o n a ša n je nalik na d estru k to re. U C + + -u u n ištav an je je v eom a b itn o . M eđ u tim . p o trebn a je d o d a tn a sin tak sa da bi se to podržalo. kakav je k o n stru k to r. . O kom poziciji. tak o da u većini slučajeva o d g o varaju će m eto d e za čišćenje nisu p o treb n e. Iako su se p erfo rm an se Jave z n atn o poboljšaie to k o m v rem en a. Pošto k o n stru k to ri o m o g u ću ju da garantujete prav iln u inicijalizaciju (prevodilac neće d o zv o liti d a o b jek at b u d e n ap rav ljen bez valjanog poziva k o n stru k to ra ). Javin sakupljač sm eća u m n o g o m e p o jed n o stav lju je p ro g ram ira n je i dodaje preko p o tre b n u sig u rn o st u u p rav ljan ju m e m o rijo m . je r objekti n apravljen i o p e ra to ro m n ew m o raju eksplicitno da b u d u u n išten i. i dalje ne p rim en ju je u nekim situacijam a. čiju je cenu teško pro cen iti zbog tra d iđ o n a ln e sp o ro sti Javinih in te rp re ta to ra. Sakupljač sm eća u Javi au to m atsk i oslobađa m em o riju . kao što su id en tifik ato ri d ato tek a i grafičkih objekata.158 Misliti na Javi Sažetak P rilično razrađ en m e h a n iz am iniđ jalizacije. Jedno od p rv ih zapažanja o p ro d u k tiv n o sti u C -u . d obijate p o tp u n u k o n tro lu i sig urno st. (Ali kada jesu. N eki sakupljači sm eća m o g u čak da čiste i drug e resurse. m o rate sam i sve d a u ra d ite . Pošto garancija ko n stru k cije važi i kada p rav ite nove klase kom pozicijom ili nasleđivanjem . taj jezik se. O v u v rstu grešaka je teško p ro n ači. bilo je da nep rav iln a in icijalizađ ja p ro m en ljiv ih p ro u zro k u je značajan deo pro b lem a p ri p ro g ram iran ju . naučićete u n ared n im poglavljim a. treb alo bi da ukaže na o g ro m n u važnost koja je u o v o m jeziku d ata inicijalizaciji. R ešenja o d a b ra n ih vežbi d a ta su u e le k tro n sk o m d o k u m e n tu The Thinking in Java Am iotated Solu- tion Guide.

Na p rim er.Kontrola pristupa K ontrola p ristu p a (ili sakrivan je realizacije) zn ači „m oći p o p ra v iti ono što p r v i p u t nije bilo dobro u ra đ en o “ . O b rn u ta situacija je z n atn o složenija. O vo je p o se b n o važno za biblioteke. a šta nije. kako tv orac biblioteke m ože da zna kojim su p oljim a p ristu p ali p ro g ra m e ri klijenti? Isto važi i za m eto d e koje su sam o deo realizacije klase i nisu n am en jen e da ih d ire k tn o u p o trebljavaju p ro g ram e ri klijenti.ZN A JU DA NIŠTA NIJE D O BRO n ap isan o d o k se više p u ta n e p rerad i. nego na njegovo održavanje. sa argum entom da je kod koji radi savršeno d o b ar i da prerađivati ga znači gubiti vrem e. . koji su napisali M artin Fow!er i dr. D o kraja ovog poglavlja trebalo bi d a se uverite u značaj k o n tro le p ristu p a u Javi. u Javi postoje specifikatori p ristu p a koji tv o rcu biblioteke o m o g ućava ju da naznači šta je p ro g ra m e rim a klijentim a d o stu p n o . dakle za p re ra d u fu n k cio n alnog k o d a da bi se učin io čitljiviji i razum ljiviji..UKLJU ĆU JU ĆI T U I O N E KOJI PlSU SOFTVER . ' V ideti liefactoring: Improving tlie Design o f Existing Code. m o ž d a ćete o tk riti m n o g o bolji n a č in d a ga u rad ite. Da bi se rešio ovaj p ro b lem . D akle. S d ru g e stran e.1 M e đ u tim . U činiti kod razum ljivijim . K orisnici biblioteke m o ra ju b iti sig u rn i kako se m ogu o slo n iti na deo koji k o riste i kako neće m o rati p o n o v o d a p išu p ro g ra m e k ad a se poiavi nova verzija biblioteke. To je sasvim tačno. Č esto korisnici (p ro g ra m eri klijen ti) raču n aju na to da će o d re đ e n i aspekat koda ostati neizm enjen. p ak etn i p ristu p ( 7 a koji ne p ostoii rezervisana reč) i p riv a te . je r b i tim e n aru šio k o d p ro g ram era klijenta. A ko d eo svog k o d a na neko v rem e ostavite u fioku i zatim ga p o n o v o p ro čitate. Takav argum ent nije vaijan zato što lavovski deo vrem ena i novca koji se uloži u projekat ne o tp ad a na prvo pisanje koda. a sam im tim će se i lakše o d ržav ati. iako je često su p ro tn o intuiciji stru č n ja k a koji p ro g ram ira ju na d ru g im jezicim a (posebno na C -u ) i koji su navikli da svem u p ristu p aju bez ograničenja. N ivoi d o zvoljenog p ristu p a od „ p o tp u n o g p ristu p a" d o „najm anjeg p ristu p a “ jesu p u b lic . vi h o ćete d a ga m en jate. 1999). Stoga su tvorcu biblioteke vezane ruke i ne m ože ništa d a m enja. Sve to m o že da se ostvari p rek o konvencija. To je jedan o d glavnih razloga za p o n o v n u p o d e lu na p ro ste faktore. Povrem eno se neko pobuni protiv po n o v n ep o d ele na proste faktore. a o n i d a o n o stan e neizm en jen . p ro te c ted. posto je i p ro b lem i zbog n asto jan ja d a se p ostojeći k o d m en ja i poboljšava. N a o sn o v u p re th o d n o g m ožete p o m isliti da kao p ro jek tan t b iblioteke treb a sve da čuvate što . Z ato je jed an od o sn o v n ih ciljeva o b jek tn o o rijen tisan o g dizajna „razdvojiti o n o što se m en ja o d stvari koje o sta ju iste“. (Addison-W esley. Šta ako tvorac biblioteke želi d a p o tp u n o izbaci staru realizaciju i napiše novu? M enjanje bilo koje od gore p o m e n u tih članica m oglo bi d a n aruši kođ p ro g ra m e ra klijenta. tvorac biblioteke m o ra im ati slo b o d u da pravi izm en e i u n a p ređ e n ja a da p ri to m b u d e siguran kako te izm ene neće uticati na kod klijentskog p rog ram a. A ko je reč o polju. znači uštedeti m nogo novca. p ro g ra m e r biblioteke m o ra da se složi kako neće izbacivati postojeće m eto d e kada m enja klasu u b iblioteci. SVI DOBRI PISCI .privatnije“ m oguće i da izložite sam o m etode koje želite da p ro g ram eri klijenti koriste.

java p u b lic class Punolme { pu blic s t a t i c void m a in (S trin g [] args) { j a v a . Ali. kako stoje stvari sa im en im a klasa? P retp o stav im o da n apravite klasu Stek koja se instalira na ra č u n a r na k om e već postoji klasa Stek koju je neko d ru g i napisao.utiI. } } ///= Sada ArrayList m ožete da k o ristite bez im en a paketa. * . p a ćete u m e sto nav ođ enja p u n o g im en a klase verovatno radije upotreb ljav ati rezerv isan u reč import. u t i l .16 0 Misliti na Javi K oncept biblioteke k o m p o n e n a ta i k o n tro le p ristu p a o v im nije završen. } } ///= O vo brzo p ostaje zam o rn o .ArrayList. nam e spaces). u t i l . a n ak o n toga m oći ćete da raz u m e te p o tp u n o značenje specifikatora p ristu p a . Z bog p o ten cijaln ih suk ob a im ena b itn o je da im ate p o tp u n u k o n tro lu im enskih prostora u Javi i da za svaku klasu p rav ite jed in stv en u k o m b in aciju identifikatora. A r r a y L i s t ( ) . pu b lic class Jedanlmport { pu b lic s t a t i c void m a in (S trin g [] args) { A rra y L is t l i s t a = new j a v a . Jedan o d n a č in a u p o tre b e klase ArrayList jeste da navedete n jen o p u n o im e java. Paket: bibliotečka jedinica Paket sadrži g ru p u klasa. N a p o č e tk u ovog poglavlja naučićete kako se ko m p o n e n te biblioteke stavljaju u pakete. u t i l . / / : pristup/PunoIme.ja va import j a v a . u p o tre b ite * kao što je u rad e n o u ostalim p rim e rim a u ovoj knjizi: import j a v a . . Ako želite da uvezete sam o je d n u klasu. A r r a y L is t ( ) . A r r a y L i s t . N a prim er. b ib liotek a sa alatk am a java. u t i 1 . nije d o stu p n a nijedna d ru g a klasa iz p aketa java. Da biste uvezli sve klase biblioteke. a n a specifikatore p ristu p a utiče da li je klasa u istom ili u nekom d ru g o m p ak etu . o b jed in jen u u isto m prostoru im ena.util.util deo je sta n d a rd n e d istrib u cije Jave.util. M eto d a f() iz klase A neće se su d a riti s m eto d o m f() koja im a isti p o tp is (listu argum enata) iz klase B. O vo uvoženje se rad i da bi se obezbed io m eh an izam za upravljanje im ensk im pro storim a (engl. M eđ u tim . A r r a y L i s t l i s t a = new j a v a . I dalje postoji p itan je kako se k o m p o n e n te p o v ezu ju u je d n u k o h e re n tn u bib liotek u. U Javi se paketi prave p o m o ć u rezervisane reči package. u t i l . ArrayList je jed n a o d klasa u p ak etu java. Im en a svih vaših članica klasa su izolovana jedn a od dru gih. njeno im e m ožete da n avedete u n aredb i import: / / : pristu p/Jed an lm po rt.

U tim p rim e rim a klase su ip ak bile u paketu. P o sto je Java p re v o d io c i u lo k a ln i k o d koji p ra v e je d n u iz v ršn u d a to te k u . naznačavate da je ta jedinica za p rev o đ en je d eo b iblioteke p o d im e n o m p ris tu p . te se nije b avio im e n im a pak eta. drugačije rečeno. Ako neko želi da k oristi to im e. Im e svake jed in ice za p revođenje m ora da se završava sa . Organizacija koda Pri prev o đ en ju dato tek e . Ako ste p ro g ram ira li n a jeziku koji se p rev o d i u izvršni oblik. P ro g ram koji rad i je sk u p d ato te k a .java m ožete da dobijete p riličan broj datotek a . je d n o stav n o sti radi. a u n u ta r nje m ože da p o sto ji je d n a jav n a (public) klasa istog im ena kao i d atoteka (uk lju ču ju ći i velika i m ala slova. ali bez nastavka . verovatno ste navikli da prevodilac p rav i m eđ u o b lik (o b ičn o d ato te k u . u čita i in te rp re tira 2 te d atoteke. in ače se prev o d ilac b u n i. čak i za reči u sred in i im ena.java). librarian) da biste n a p ra vili biblioteku. k o risti se rezervisana reč package. p o d kišo brano m im ena p ristu p .java. ali s nastavkom . n eim en o v an o m ili podrazumevanom paketu. Svaka izvorna d ato tek a o b ičn o im a jednu klasu koja je javna i proizvoljan broj n ejavnih klasa.class koje m ogu da b u d u spakovane i k o m p rim o v an e u JAR arh iv u (p o m o ć u Javinog arh iv ara jar. compilation unit. translation unit ).class) id u zajedno. Ako ko ristite n ared b u package. ako ih u o p šte im a. linker) d a biste napravili izvršnu d atoteku ili to činite p o m o ću b ib lio tek ara (engl. pa za svaku izv o rn u d ato tek u p ostoji je d n a javna (p u b lic) k o m p o n en ta .java.Poglav[je 6: Kontrola pristupa 161 Do sada se veći d eo p rim e ra u ovoj knjizi nalazio u je d n o j d ato teci i bio je n ap isan za lokalnu u p o tre b u . kao što je ranije objašnjeno.java. jer o n e nisu javne i p red stav ljaju kiase za . Stoga iz m alog b ro ja d a to tek a . Ali ako nam eravate da prav ite b iblioteke ili p ro g ram e koje će v o d iti rač u n a i o d ru g im p ro gram im a na istom rač u n a ru . Ostale klase iz te jed in ice za prev o đ en je.java. m o ra te da v o d ite ra č u n a o sp rečav an ju su k o b a im en a klasa. skrivene su o d sp o ljn o g sveta izvan tog paketa.) Posao Javinog in te rp re ta to ra je da p ro n ađ e.java i . iz te jed in ice za prev o đ en je. .class. m o ra ili da p o tp u n o navede dato im e ili da u p o treb i rezervisanu reč im p o rt u k o m b in aciji s im e n o m p ris tu p .p o d ršk u “ glavnoj javnoj klasi. To se svakako m ože rad iti. Kada napišete: package p r is tu p . Biblioteka je skup takvih d ato tek a sa klasam a. U svakoj jedinici za prevođ en je m ože d a se nalazi sam o jedna jav n a klasa.obj) koji zatim s drugim d ato tek am a istog oblika p ak u jete p o m o ć u povezivača (engl. Svaka o d tih izlaznih d ato tek a im a isto im e kao o d g o v araju ća klasa u d atoteci . tzv. i u nastavku knjige takav p ristu p biće korišćen gde g o d je m oguće. Java ne radi n a taj način . (Im ajte u v id u d a konvencija za d avanje im en a Javinim p ak etim a nalaže da se koriste sam o m ala slova. O d n o sno. Kada p rav ite dato tek u sa izv o rn im k o d o m za Javu. Ako želite d a n azn ačite da sve te k o m p o n e n te (koje se nalaze u o d vojenim d ato te k am a .class. o n a mora da b u d e u p rv o m re d u koji nije k o m e n ta r u datoteci. naznačavate da je jav n o im e klase. d o b ijate p o je d n u izlaznu d a to te k u za svaku klasu iz d ato teke .) Java b a š ni sa ćim n e n a m e ć e u p o tre b u in te rp r e ta to ra .. ta d ato te k a se često naziva i jedinica za prevođenje (engl.

To je jed an način na koji Java rešava p o m e n u ti p ro b lem . o d n o sno. To znači da u njoj m ože d a po stoji jed n a i sam o je d n a jav n a klasa i d a im e te klase m o ra d a b u d e MojaKlasa (s to m k o m b in acijo m velikih i m alih slova): / / : pristup/mojpake t/M ojaKlasa . } } ///:R ezervisana reč im port z n a tn o d o p rin o si jed n o stav n o sti: / / : pristup/OdređenaMojaKlasa.java. p retp o stav im o d a je im e d ato tek e MojaKlasa. Takođe m ože da u p o tre b i p o tp u n o o d re đ e n o im e: / / : pristup/OdređenaMojaKlasa.m ojpaket.* .mojpaket.1 62 Misliti na Javi Na p rim er.M ojaKlasa( ) . Logičan potez b io bi da stavite sve d ato tek e .class i stvari m o g u da p o sta n u p rilič n o kom plikovane. kada b u d e predstavljana alatka jar. .MojaKlasa m = new pristup. Pravljenje jedinstvenih imena paketa B uduči da paketi nikada zaista n isu . m o ra d a u p o tre b i rezervisanu reč im port da bi im e ili im en a iz pak eta pristup po stala dostu p n a.java p u b lic class OdređenaMojaKlasa { pu b lic s t a t i c void m a in (S trin g [] args) { pristup. pu b lic class UvezenaMojaKlasa { pu b lic s t a t i c void m a in (S trin g [] args) { MojaKlasa m = new MojaK1asa(). pu b lic class MojaKlasa { // } ///:A ko neko želi da koristi klasu MojaKlasa ili n ek u d ru g u ja v n u klasu iz paketa pristup..java import p ris tu p .java package pristu p.mojpaket. } } ///:Vredi im ati na u m u da p ro jek tan tu b iblioteke.u p ak o v an i“ u je d n u d ato tek u . dru g i način ćete videti kasnije.class je d n o g paketa u p o seb an d ire k to riju m . jed a n paket m ože da se sastoji o d više d ato tek a . da iskoristite h ijerarhijsku stru k tu ru sistem a dato teka o p erativ n o g sistem a. rezervisane reči p ack ag e i im p o rt o m o gućavaju da p odeli jed an g lobalni im enski p ro sto r i izbegne višesm islenost im en a.m o jp a k e t. bez o bzira na to koliko se Ijudi poveže na In t''rn e t i p o čn e da piše klase n a Javi.

tako da se celo im e piše m alim slovim a. A ko ste odlučili da objavljujete k o d p isan n a Javi.java / / P ra v lje n je paketa package net.class.bar.m indview ustanovljava se jed in stv en o globalno im e za m oje klase.mindview.simple. u zavisnosti od vašeg o p erativ n o g sistem a).class. CLASSPATH sadrži je d a n ili više direk to riju m a koji se koriste kao korenski za tražen je d ato tek a . edu. C L A SSPA TH ). ranije su u Javinim pak etim a pisani velikim slovim a. } )///:S iste m sk e p ro m e n ijiv e ć c m o p isati v elik im s io v im a (n p r . d o k neko d ru g i ne p reu zm e vaš d o m e n i n e po č n e da piše k o d na Javi sa istim p u ta n ja m a koje ste i vi koristili). u n eću p o d elu u g lobalno im e i d o biti im e paketa: package net. sm islite m alo v ero v atn u k om b in aciju (kao što je vaše im e i prezim e) d a b iste n ap rav ili je d in stv en o im e paketa. m ože da p ro n a đ e d ire k to riju m u k o m e se o n a nalazi. ako p rim en ju je te ovu konvenciju.baz postaje foo\bar\ baz ili foo/bar/baz ili m o žda nešto drugo. In te rp re ta to r u im en u paketa zam enjuje svaku tačku kosom crto m da bi generisao p u ta n ju od korena definisanog p rom enljivom CLASSPATH (tako paket foo. N aravno.p rin tln (" n e t. p u b lic class Vector { pu b lic Vector() { S y ste m .net.) D a biste ovo shvatili.Poglavjje 6: Kontrola pristupa 1 63 G ru p isan je d ato teka jed n o g pak eta u zaseban d ire k to riju m rešava i jo š dva p ro b lem a: pravljenje jedinstv enih im en a paketa i pro n alažen je ldasa koje m o g u biti zak o p an e negde u d u b in i stru k tu re direkto riju m a. Kada o b rn e m o redosled i svc ispišem o m alim slovim a.V e c to r" ).mindview. Kada izvršni sistem treb a da u čita d a to te k u . razm o trite im e m og d o m e n a . . To se p ostiže tako što se p u ta n ja do d ato tek a . org itd. Sada ovo im e paketa m ože da se koristi kao im enski p ro s to r za sledeće dve datoteke: / / : ne t/m indview/simple/Vector.MindView. isp lati se ulo žiti relativ n o m ali n a p o r u pribavljanje ličnog do m en a.m in d v ie w . Javin in te rp re ta to r radi sledeće: prv o p ro n alazi sistem sku p ro m en ljiv u CLASSPATH3 (koja se postavlja u o p erativ n o m sistem u.) Ako od lućim da n ap rav im biblioteku p o d im en o m simple. (N astavci com .o u t.class čije im e odgovara klasi koju p okušavate d a napravite. p rv i deo im e n a pak eta je im e In te rn e t d o m e n a tvorca ldase.s im p le . N a tim m estim a in te rp re ta to r traži d ato teku . (O n tak o đ e p retražu je i neke stan d a rd n e d irektoriju m e u zavisnosti o d m esta n a k o m e se in te rp re ta to r nalazi. net. u o b rn u to m redosledu. Pošto su im en a In te rn e t d o m e n a g aran to v an o jed in stv ena. Po konvenciji. D ru g i d eo ove tehnike je d a preslikate im e p ak eta n a im e d ire k to riju m a n a v ašem raču n a ru .simple. što p o n ek a d u ra d i in stalacioni p ro g ram koji na rač u n a ru instalira Javu ili na Javi zasnovanu alatk u ). ako n e m a te svoj d o m e n . To se zatim spaja s raznim d irek to riju m im a iz p u tan je CLASSPATH. ali ie to p ro m e n je n o u Javi 2.class ub acuje u im e paketa. im e vašeg pak eta će sig u rn o b iti jed in stv en o i neće doći do suk o b a im en a (tj.

*. v id ite im e p aketa net. ali šta je s prv im d elo m putan je? O to m e je v o đ en o rač u n a u sistem skoj prom enljivoj CLASSPATH koja. ako bi se JAR dato tek a zvala grozd.sim ple .V ector net. pu b lic class LibTest { pu b lic s t a t i c void m a in ( S tr in g [] args) { Vector v = new V e c to r ().println("net. n ared n u d ato tek u m ožete da stavite u bilo koji d irek to riju m : / / : p r is tu p / L ib T e s t . a n e sam o p u ta n ju d o nje.jar.) A ko k ren ete o d kraja ove p u ta n je.m in dview . na m o m ra č u n a ru .mindview.164 Misliti na Javi Kao što je već bilo rečeno.List").mi nd vie w . M eđ u tim . p o sto je izvesne izm ene.mindvievv. } } / * I s p is : net.simple. kada k o ristite JAR dato tek e..simple.out.ja r Kada p ro m en ljiv u CLASSfATH p o d esite kako treba. import ne t. U CLASSPATH m o rate da stavite i im e JAR dato tek e. L i s t 1 = new L i s t ( ) . D :\J A V A \L IB . .java // Pravljerje paketa. u vašoj p ro m en ljiv o j CLASSPATH treb alo bi da piše: CLASSPATH=.sim p le . C: \D0C\JavaT V idite da p ro m en ljiv a CLASSPATH m ože da sađrži više a ltern ativ n ih p u ta n ja za pretraživanje. public class List { public List() { System.L ist * ///:- . To je u ra đ e n o zbog alatke koja u ovoj knjizi a u to m a tsk i p ro n a laz i k o d . D ru g a d ato tek a je v eo m a slična: //: net/mindview/simple/List.ja v a / / K o r i s t i b i b li o t e k u . Z nači.simple.m indview. package net.nrindview. n are d b a package m o ra da b u d e u p rv o m red u koji nije kom en tarisan . im a sledeći sadržaj: CLASSPATH=.sim ple.C :\u k u si\g ro z d . } } III-- O be dato tek e se sm eštaju u p o d d ire k to riju m na m o m sistem u: C:\DOC\JavaT\net\mindview\simple (O b ra tite p a žn ju n a to da se u p rv o m re d u k o m en tara u svakoj dato teci u ovoj knjizi daje m esto d ire k to riju m a te d ato tek e u stab lu izvornog koda. D: \JAVA\LIB.

M eđutim . Z ap am tite da obe klase kao i p o tre b n e m eto d e u klasam a Vector i List m o raju da b u d u javne. sve će b iti u red u —to je do b ro .Vector v = new ja va . Na koju se klasu Vector ovo odnosi? Prevodilac to ne m ože da zna.m in dview. Stoga se prevodilac žali i zahteva da b u d ete izričiti.* tak o đ e sadrži klasu Vector.Poglavlje 6: Kontrola pristupa 165 Kada p revodilac naide na n a re d b u im port za biblio tek u simple.java. Pošto ovo (zajedno s p ro m en ljiv o m CLASSPATH) p o tp u n o od ređ u je lokaciju klase Vector. želite sta n d a rd n i Javin Vector. N aprav ite p rim e ra k te Idase izvan tog paketa.util. import j a v a . prim etićete da ćete m oći da prevodite i pokrećete osnovne p ro g ram e u Javi.M indV iew . kada sam počinjao). p retpostavim o da u p ro g ra m u piše: import ne t. ukoliko u istom p ro g ra m u ne u p o treb ite oba sukobljena im ena.) Vežba 2: (1) P retvorite delove koda u ovom o d eljk u u p ro g ram i uverite se da se sukobi zaista dešavaju. n ared b a import. tj. dokle g od ne napišete k o d koji izaziva d vosm islenost. Pošto i java. tražeći p o d d ire k to riju m net\mindview\simple a zatim i prevedene dato tek e odgo v araju ćih im en a (Vector.util.net). Pravilno podešavanje p rom enljive CLASSPATH bio je veliki p ro b lem početnicim a u Javi (meni takođe. . Vežba 1: (1) N aprav ite ldasu u nekom p ak etu .u ti l.util. Kada instalirate Javu. o n počinje da p retra£uje d ire k to riju m e n av ed en e u prom enljiv o j CLASSPATH. na p rim er. p a je SU N u kasnijim verzijam a Jave„opam etio“ razvojno okruženje. u t i l . prom enljivoj CLASSPATH m o raćete d od ati osnovni direkto riju m stabla koda laijige. Ve ct or (). Ako. m o ra te da napišete: j a va .* postaje n e o p h o d n a sam o ako hoćete da koristite i nešto d ru g o iz biblioteke java. kao ni čitalac. da biste preveli i izvršavali izvorni k o d iz ove knjige (d o stu p an n a lokaciji w w w . * . p o tp u n o o d re đ e n a im ena.class za klasu Vector i List. m orali biste da navedete njihova celo k u p n a. Dvosmislenost i sukobi imena Šta se dešava ako se p rek o * uvezu dve biblioteke koje sadrže ista im ena? N a p rim er.sim ple . Sukob nastaje ako sada p o k u šate da n a p rav ite objekat klase Vector: Vector v = new V e c to r () . Sukobe im ena biste m ogli sprečiti tako što ćete uvesti sam o je d n u klasu u m esto celog paketa.class za klasu List). čak i ako n e podesite prom enljivu CLASSPATH. (U to m slučaju.*. M eđutim .u ti1 . inače biste m o rali m n o g o da pišete d a biste izbegli sukob koji se nik ad a neće d ogoditi. to m ože d a izazove sukob im ena.

ja v a . i o . bilo s prelaskom u novi red (print()) ili bez prelaska u novi red (printnb()). } / / Nova metoda p r i n t f ( ) Jave SE5 (kao u C-u): p u b lic s t a t i c PrintStream p r i n t f ( S t r i n g format. P r i n t . } )///■■O ve skraćenice m ožete da k o ristite za ispisivanje svega.m in d v ie w . p r i n t ( lO O ) . . N akon prevodenja. p r i n t ( o b j) . . koje pripadaju kla si / / P r in t . pogledajte pseudonim za n aredb u System. m in d v ie w . p u b lic class P rin tT e st { pu b lic s t a t i c void m a in (S trin g [] args) { print("D ostupna od sada pa n a d a lje ! " ) . * . u t il. tako da na kraju dobijem o čitljiv statički uvoz: / / : n e t /m in d v i e w / u t il / P r i n t . kada ih u Javu SE5 uvezemo kao s t a t ič k e : package n e t . statičke m etod e print() i printnb() m o žete da ko ristite bilo gde na svom sistem u p o m o ću n ared be irnport static: / / : p r is tu p / P r in t T e s t .out. import j a v a . Neka bu d e deo klase p o d im en o m Print. u stanju ste da napravite svoje biblioteke sa alatkam a kako biste sm anjili ili ukinuli ponavljanje koda. p r i n t ln ( ) . O va d ato tek a m o ra da se nalazi u d ire k to riju m u koji p o čin je na nekoj lokaciji iz p ro m enljive CLASSPATH i zatim se nastavlja sa net/m indview. } / / I s p i š i bez prelaska u nov red: pu b lic s t a t i c void p rin tn b (Object ob j) { S y s t e m . N a prim er. p r i n t ln ( o b j ) .166 Misliti na Javi Lična biblioteka sa alatkama Pošto sada sve ovo znate. o u t. .println() koji sm o koristili da bism o sm anjili količinu teksta koji m o ram o da pišem o. o u t . ja v a / / K o r i s t i s t a t ič k e metode za is p i s i v a n j e . argumenti). p u b lic class P r in t { / / I s p i š i i pređi u nov red: p u b lic s t a t i c void p r i n t (Object obj) { S y s t e m . * . o u t. O b je c t .u ti1. p r in t f(f o r m a t. import n e t. ja v a / / Metode is p is iv a n j a koje se mogu u p o t r e b lja v a t i bez određenja / / paketa i putanje. argumenti) { return S y s t e m . } / / Samo pređi u nov red: pu b lic s t a t i c void p r i n t () { S y s t e m . o u t .

početak. . i n t [ ] r e z u lt a t = new i n t [ s z ] . i < sz. i n t korak) { i n t sz = ( k r a j . i n t k r a j) { i n t sz = k raj . f o r ( i n t i = 0.java / / Metode za p r a v lje n j e nizova koje se mogu u p o t r e b lja v a ti / / bez potpuno određenih imena. k ra j) p u b lic s t a t i c i n t [ ] ran g e (in t početak.m in d v ie w . i++) r e s u l t [ i ] = početak + i . } ) / * I s p is : Dostupna od sada pa na dalje ! 100 100 3. f o r ( i n t i = 0. p u b lic class Range { / / Napravi niz [ 0 . i n t [ ] r e z u lt a t = new i n t [ s z ] .n) p u b lic s t a t i c i n t [ ] ra n g e (in t n) { i n t [ ] r e z u lt a t = new i n t [ n ] .. return r e z u l t a t . e n d ) uz inkrement korak pu b lic s t a t i c i n t [ ] ra n g e (in t početak. B iblioteci n e t.14159 * ///:D ru g a k o m p o n e n ta ove b ib lio tek e m o g u b iti m eto d e range( ) koje ste u p o zn ali u poglavlju Kontrolisanje izvršavanja. i < sz.Poglavlje 6: Kontrola pristupa 167 p rin t ( lO O L ) . i < n. . i n t k r a j .početak)/korak. p r i n t ( 3 . return r e z u l t a t . } } / / / =O d sad a m ožete u svoju bib lio tek u d o d ati svaku k o risn u novu alatku kada god naiđete na nju. 14159).u til do d av aćem o k o m p o n e n te kroz celu knjigu. u t il. k o r i s te ć i Java SE5 naredbe s t a t i c import: package n e t . O n e om o g u ćav aju zadavanje jed n o stav n ih nizova celih b ro jeva fo reach sintaksom : / / : n e t/m in dview /util/R an ge . } / / Napravi niz [ s t a r t . return r e z u l t a t . . m in d v ie w . } / / Napravi niz [p o če ta k. i++) re z u lta t[i] = i. f o r ( i n t i = 0 . i++) r e z u l t a t [ i ] = početak + (i * korak).

za sve je definisana neka vrsta p ristu p a. bez d ru g ih izm en a u ko du . im p lic itn o o d ređ u jete stru k tu ru d ire k to riju m a . O n o se najčešće koristi za ispravljanje grešaka u p ro g ra m u . p ro te c te d i p riv a te . pojaviti m no štvo tajan stvenih grešaka p ri izvršavanju. Na jedan ili na drug i način. bilo da je u p itan ju polje ili m etod a. naučićete sve o razn im v rstam a p ristu p a. takva m o g u ćn o st je sm a tra n a n e p o tre b n o m . U koliko ne zadate specifikator p ristu p a. . p o d razu m ev a se „paketni pristup". znaćete gde Ieži problem . Ako d o bijete takvu p o ru k u o grešci. Takva m ogućn o st je izostavljena iz Jave vero vatn o zbog toga što je u C -u najćešće ko rišćen a za rešavanje p itan ja različitih p latfo rm i: u zavisnosti o d p la tfo rm e za koju se p ro g ra m prevodi. a u fin a ln o m p ro izv o d u su o n em o g u će n e. Svaki specifikator p ristu p a k o n troliše p ristu p sam o p ojedino j definiciji. Upozorenje pri radu s paketima Treba zap am titi sledeće: svaki p u t kada p rav ite paket i d ate m u im e. P rv a verzija p rik azuje n a k o nzoli svoj a rg u m e n t tipa String. Funkcije za o tk lan jan je grešaka su u k lju čen e u razvojnoj fazi. Specifikatori pristupa u Javi Specifikatori p ristu p a (engl. Vežba 3: (2) N ap rav ite dva paketa: debug i debugoff koji sadrže id e n tič n u kiasu s m eto d o m d eb u g( ). P ro m e n o m p aketa koji uvozite. E ksperim entisanje rezervisanom reči p a ck ag e u p o četk u m ože da zb u n i jer će se. Pošto je p red v iđ e n o da Java a u to m atsk i p rav i p renosiv kod. O va teh n ik a m ože da se k oristi za bilo koju v rstu uslo v n o g prevođenja. Na p rim er. ali izvršnom o k ru žen ju Jave m o rate o m o g u ćiti da p revedeni kod p ro n a đ e p o m o ću prom enljive CLASSPATH. U n ared n im odeljcim a. b irate verziju za o tk lan jan je grešaka ili verziju za isp o ru k u . Povedite raču n a o to m e da se prevedeni kod često ne sm ešta u d ire k to riju m u kojem je izvorni kođ. U p o treb ite n a re d b u static im port da biste u p ro g ra m za ispitivanje uvezli tu klasu i pokažite na d elu u slovno prevođenje. a d ru g a ne rad i ništa. m e đ u tim . Stavljaju se ispred svake definicije svakog člana klase. i d ru g e k orisne u p o tre b e uslov no g prev ođ enja. prevode se različiti delovi koda. stavite n ared b u pack ag e po d k o m e n ta r i ako p ro g ra m p ro ra d i. Paket tnora d a se nalazi u d ire k to riju m u na koji uk azuje im e paketa i taj d ire k to riju m m o ra da b u d e d o stu p a n p retraživ an jem p ro m en ljiv e CLASSPATH. m ožete d a d o b ijete p o ru k u kako nije bilo m o guće naći o d re đ e n u klasu i ako se o n a nalazi u teku ćem d ire k to riju m u . Postoje.1 68 Misliti na Javi Korišćenje uvoženja za promenu ponašanja programa U Javi nedostaje uslovno prevođenje iz C -a koje o m og ućava d a p ro m e n o m v red n o sti nekog sem afora p ro m e n ite p o n ašan je p ro g ra m a. access specifiers) u Javi su p u b lic . ako se ne držite p ravila o im en u paketa i im en u d ire k to riju m a .

zato što im aju p ak etn i p ristu p .m o že d a p rip a d a sam o je d n o m p ak etu . Klasa k ontroliše odakle se m ože p ristu p a ti n jen im člano vim a. U m n o gim jezicim a. p o to m a k klase m ože da p ristu p a i zaštićenim i jav n im člano vim a (ali ne i priv atn im članovim a) roditeljske klase. označavate da je definicija člana koji sledi o d m ah iza nje d o stu p n a svim a. sve klase u n u tar nje a u to m atsk i su d o stu p n e jed n a d ru g o j. Kada klase grup išete u pak et. Tada ostale klase to g paketa m o g u da p ristu p aju to m članu.Poglavlje 6: Kontrola pristupa 169 Paketni pristup U svim p rim e rim a d o ovog poglavlja specifikator p ristu p a u o p šte nije bio naveden. Paketni p ristu p om o g učav a da g ru pišete sro d n e klase u je d a n pak et ta k o d a m o g u lako m eđ u so b n o da k o m u n iciraju . To znači da sve ostale klase iz tekučeg p ak eta im aju p ristu p to m članu. ja sam Perin p rijatelj“ i očekuje da će d o b iti p ristu p zaštićenim . . ali se o n o b ič n o naziva p a k e tn i (katkada i . O bezbedite m eto d e koje čitaju i m enjaju željenu v re d n o st (koje se tak o đ e nazivaju i m etode p ro čitaj/po stav i . O nasleđivanju i zaštićenim član ovim a n em o jte sada da b rinete. C lan proglasite jav n im (p u b lic). vi po stajete „vlasnik" k o d a u to m p aketu. Č lan u se dozvoljava p ristu p sam o na sledeće načine: 1 . d e s e rt . čim e p a k e tn im člano vim a dozvoljavate m eđ u so b n i p ristu p . kao što ćete videti u poglavlju Grafička korisnička okruženja. p ak etn im i p riv a tn im član o vim a klase Pera. 3.prijateljski“ ). Im a logike u tom e d a sam o k o d u vašem vlasništvu treb a d a im a p ak e tn i p ristu p o stalo m k o d u u vašem vlasništvu. Za p odrazu m ev an i p ristu p ne p o sto ji rezervisana reč. definicije m ožete svakojako da organ izu jete. Pored toga. Ć lan u om og u ćite paketni p ristu p izostavljajući bilo kakve specifikatore p ristu p a . ali ste u Javi p risiljen i da ih organizujete n a razu m an način .engl. K od iz d ru g o g pak eta n e m ože da se pojavi. a ostale klase stavite u isti paket s njim . Tada svako i sa svakog m esta m ože da m u p ristu p i. U O O P -u je to n ajp am etn iji p ristu p i suštinski je značajan za zrn a Jave. M ože se reći da p ak etn i p ristu p o p ravdava g ru p isa n je klasa u pakete. get/set rnethods). public: interfejs za pristup Kada u p o treb ite rezervisanu reč p u b lic .d ato tek a . 4 . p o seb n o p ro g ra m e ru k lijentu koji k oristi biblioteku. ali sve klase van tog paketa taj član v ide kao p riv a tn i (i n e m o g u da m u p ristu p e ). Kao što ćete videti u poglavlju Ponovno korišćenje klasa posv ećen om n asleđivanju. Pošto jedinica za prevođenje . 2. v ero v atn o ćete odv ojiti klase koje n e tre b a da im aju p ristu p klasam a defin isan im u tek u ćem pak etu .. Č lan o v im a s p a k etn im p ristu p o m m ože da p ristu p a saino ako su te dve klase u istom p ak etu . ja v a / / Pravi b ib lio t e k u package p r is tu p . P retp o stavim o da definišete paket d e se rt koji sadrži sledeću d ato tek u: / / : p r is tu p / d e s e rt /K o la c ic . kaže: „Z dravo.

d atoteka klase koju će n ap rav iti Kolacic.java m o ra da se nalazi u p o d d irek to riju m u desert d irek to riju m a pristup (ukazuje na poglavlje K ontrolapristupa ove knjige) koji m o ra da b u d e u n u ta r jed n o g o d d irek to riju m a d efinisanih u p rom enljivoj CLASSPATH. } } III--Z apam tite. import p r i s t u p .ja va / / K o r i s t i b i b li o t e k u . m eto d a članica zag rizi() nije d o stu p n a klasam a iz datoteke V ecera. Ako ne navedete tačku kao je d n u o d p u ta n ja u svojoj prom enljivoj CLASSPATH. f () * ///:- . jer m eto d a z a g rizi() o m ogućava p ristu p sam o klasam a iz paketa d e se rt. } void z a g r iz i( ) { S y s t e m . } } / * I s p is : P i t a .o u t.f 0 . o u t . * . pa će vas prevodilac sprečiti da je u p o treb ite. / / P ris tup n i j e moguć } } / * I s p is : Konstruktor klase Kolacic * ///:m ožete da nap rav ite objek at klase K olacic.java. class Torta { pu b lic s t a t i c void m a in (S trin g [] args) { P ita x = new P i t a ( ) . / / ! x . Pogrešićete ako p om islite da će Java uvek da pogleda u tek u ći d ire k to riju m kao je đ n u o d p o četn ih tačaka za pretraživanje. ja v a / / Pristupa k la s i iz druge (zasebne) je d in ic e za prevođenje (dato teke). Ako sada n ap rav ite p ro g ra m koji k oristi klasu Kolacic: / / : pristu p/Vecera. S y ste m . Podrazumevani paket M ožda će vas iznenaditi kada o tk rijete da će naredni p ro g ra m biti ispravno preveden iako na prvi pogled izgleda da krši pravila: / / : p r is tu p / T o r t a . p r i n t l n ( " g r i c " ) . pu b lic class Vecera { pu blic s t a t i c void m a in (S trin g [] args) { Kolacic x = new Kolacic ( ) . Java neće uzeti u razm atra n je tek u ći d irek to riju m .p rin tln ("K o n s tru k to r klase Kolacic " ) . (K oncept javnih klasa detaljnije ćem o razm o triti kasnije. z a g r i z i ( ) . d e s e r t .o u t.p rin tln (" K o n s tru k to r klase K olacic1 1 ).170 Misliti na Javi pu b lic class Kolacic { pu b lic Kolacic() { S y ste m . x .) M ed u tim . je r je njegov k o n stru k to r javni i klasa je javna.

m eđ u tim . ja v a / / Druga klasa. nije n eob ičn o da paket pravi nekoliko Ijudi. } . U početku verovatno nećete često razm atrati u p o treb u rezervisane reči private. class Pita { void f ( ) { S y s t e m .Poglavlje 6: Kontrola pristupa 171 D ruga d ato teka treb a da b u d e u isto m d irek to riju m u : / / : p r i s t u p / P it a . Siedi p rim e r u p o tre b e rezervisane reči private: / / : pris tu p /S la d o le d . To je d o b ro . f ( ) ' ' ) . private: to ne sme da se dira! R ezervisana reč private označava da nekom članu niko ne sm e da p ristu p a osim klase koja sadrži taj član. setite se. Takve dato tek e Java tre tira kao deo „p o d razu m ev an o g p aketa“ za taj d ire k to riju m i stoga om o g u ćav a p ak etn i p ristu p svim o stalim k lasam a u istom d ire k to riju m u . ove dve dato tek e m ogli biste d a p o sm a tra te kao p o tp u n o odvojene pa ip a k o b jek at klase Torta m ože d a n ap ra v i objek at klase Pita i d a pozove n je n u m e to d u f()! (V odite ra č u n a o to m e d a u svojoj prom en ljiv o j CLASSPATH m o ra te im a ti ta č k u da bi se ove datotek e p rav iln o prevele.) Pom islili biste d a klasa Pita i f() im aju p a k e tn i p ristu p i d a su stoga n e d o stu p n e klasi Torta. p r i n t l n ( " P i t a . pa kao da ste izolovali kiasu. D o stu p n e su klasi u dato teci Torta. jer m ožete da p ro đ ete i bez nje. class SladoledSaVocem { p r iv a t e SladoledSaVocem() {} s t a t i c SladoledSaVocem napraviSladoledSaVocem() { r e tu rn new SladoledSaVocemf). p a v am rezervisana reč private o m o gu ćav a da slo b o đ n o m enjate taj član bez brige kako će to da utiče na d ru g e klase iz istog paketa. da je d osledna u p o treb a rezervisane reči private veom a važna. je r o bično i koristite p o d razu m ev an i p ristu p (a i njega dobijate ako zaboravite da d o đ a te neki specifikator p ristu p a). Stoga ćete o b ičn o da razm išljate o p ristu p u članovim a koje izričito želite da proglasite javnim i d o stu p n im p ro g ra m e ru klijentu.java zato što se nalaze u isto m direktoriju m u i n em aju izričito im e paketa. p o seb n o za višenitni rad (kao što ćete videti u poglavlju Paralelno izvršavatije). O n e imaju p ak etn i p ristu p —taj d eo zaključka je ispravan. o u t . S d ru g e stran e. Takvi članovi se zovu p riv atn i. Ispostavlja se. P odrazum ev an i paketni p ristu p često obezbeđuje d ovoljno sakrivanje. } } ///:U p rv o m tre n u tk u . D ru g e klase iz istog paketa ne m o gu da p ristu p a ju p riv atn im članovim a.ja v a / / Prikazuje rezervisanu reč " p r iv a t e " . i to u n u ta r n jen ih m eto d a. član kojem se p ristu p a pak etno nije d o stu p a n p ro g ram eru k lijentu koji tu klasu upotrebljava.

tj. Rezervisana reč p ro te c te d o d n o si se na k o n cep t koji se naziva nasleđivanje. um esto toga m o rate d a pozovete m eto d u napraviSladoledSaVocem() koja će to da u ra d i um esto vas.p o m o ćn a“ m e to d a te klase. (Pseud o n im i su o b rađ en i u d o d a cim a knjige d o stu p n im na M reži. ako nasleđivanje u rad ite u istom paketu. biće d a t k ratak opis i p rim e r korišćenja rezervisane reči p ro te c te d . ali ne iz ostalih klasa. U p re th o d n o m p rim eru .4 Svaku m eto d u . p o đ im o m alo u n ap re d . To se p o stiže rezerv isan o m rečju p ro te c te d . im aćete p ristu p sam o javn im članovim a iz o rig in a ln o g paketa. Isto važi i za p riv a tn a p o lja u n u ta r klase. (N aravno. bez izm ena na postojećoj klasi (koju ćem o zvati osnovna klasa). m o žete da izm en ite p o n ašan je postojećih članica klase kada su u novoj klasi. za k o ju ste sig u rn i d a je sam o .) P onekad a u to r o sn o v n e klase poželi da o m o g u ć i p ristu p o d ređ e n o m član u iz izvedene klase. kažite da nova klasa pro širu je (engl. protected) članovim a.172 Misliti na Javi public class Sladoled { public s ta tic void m ain(String[] args) { //! SladoledSaVocem x = new SladoledSaVocem(). O sim k ad a osn o v n a realizacija m o ra d a b u d e vidljiva (što je m n o g o m an je v ero v atn o n ego što m ožete da po m islite). SladoledSaVocem x = SladoledSaVocem. tu m o g u ćn o st g ara n to v an o zadržavate. ) } ///= P retho d ni p ro g ram predstavlja p rim e r kada rezervisana reč private m ože zgodno da p osluži: m ožete da poželite da kontro lišete pravljenje objekta i da sprečite nekog da d irektno p ristu p i o d ređ en o m k o n stru k to ru (ili svim k o n stru k to rim a). M e đ u tim . (O to m e će kasn ije još b iti reči). e. A ko m e to d u p roglasite p riv atn o m .tako ćete pred u p re d iti ev en tu aln u k asn iju iz m e n u ili izbacivanje te m etode. m o žete da proglasite p riv a tn o m kako je n e b iste slu čajn o u p o tre b ili negde u p a k e tu .) protected: „pristup nasleđivanjem" Da biste razum eli specifikator p ristu p a p ro te c te d . ne znači da neki d ru g i objek at ne m ože da im a jav n u referencu n a taj isti objekat. pom irite se s tim da ne m o ra te da razu m ete ovaj deo da biste m ogli da nastavite d o nasleđivanja (poglavlje Ponovno korišćenje klasa). ostale klase u isto m pak etu m o g u p ristu p a ti zaštićenim (engl.. u kom e se uzim a postojeća klasa i njoj d o d a ju novi članovi. T akođe.napraviSladoledSaVocem(). opšte slike radi. Kao prvo.rtends) tu p o sto jeću klasu. m oći ćete da p ristu p a te svim njegovim član o v im a koji im aju paketni p ristu p . n a sle d iv a n je klase n e će b iti m o g u ć e . Ali. to što je referenca n a neki objekat p riv atn a u n u ta r klase. . Ako n ap ravite nov paket i ako n asledite neku klasu iz d ru g o g paketa. Da b iste nasledili o d re đ e n u klasu. na p rim er: class Naslednik extends Osnova { O statak definicije klase je isti kao i ranije. U o v o m slu ča ju n a sta je jo š je d n a p o sle d ic a : p o š to je d e fin isa n je d in o p o d ra z u m e v a n i k o n s tru k to r koji je p riv a tn i. sva polja treb a da proglasite p riv atn im . p ro te c te d daje i paketni p ristu p . objekat klase SladoledSaVocem ne m ožete da nap rav ite preko k o n stru k to ra.

desert. n arav n o .Poglav[je 6: Kontrola pristupa 173 Ako p o n o v o ra z m o trite d a to tek u Kolacic.kolacic2. x. Ako klasu Kolacic izm en im o n a sledeći način: //: pristup/kolacic2/Kolacic.*.out.pri ntln ("gri c " ) .out. } } /* Isp is: Konstruktor klase Kolacic Konstruktor klase CokoladniKeks * ///:Jedna o d važnih o so b in a n asleđivanja je sledeća: ako m eto d a zagrizi() po sto ji u klasi Kolacic.kolacic2.java.java // N ije moguć pristup članu s paketnim pristupom u drugom paketu import pristup.out. public class CokoladniKeks extends Kolacic { public CokoladniKeks () { System. ali bi o n d a svi im ali p ristu p . } public void njam() { //! z a g r iz i(). // Nije moguć pristup metodi zagrizi } public s ta tic void m ain(String[] args) { CokoladniKeks x = new CokoladniKeks().njam (). publi c class Kolacic { public K o l a c i c O { Sy stem.out. o n a n am nije d o stu p n a u tek u ćem paketu. public class CokoladniKeks2 extends Kolacic { public CokoladniKeks2 () { Sy stem. Ali pošto m eto d a zagrizi() im a paketni p ristu p i nalazi se u d ru g o m pak etu .*. a to m o žd a niste želeli. } protected void zagrizi() { System.println ("Konstruktor klase Co ko la dn iK ek s2“) .java package pris tu p. videćete da sledeća klasa ne m ože da p ristu p i članu zag rizi( ) s p a k e tn im p ristu p o m : //: pristup/CokoladniKeks. M ogli biste.println(''Konstruktor klase CokoladniKeks"). o n d a o na p o stoji i u svakoj klasi nasledenoj iz klase Kolacic. da je p rogiasite za javnu. } ) III-- sada je m eto d a zagrizi() d o stu p n a svim a koji nasled u ju klasu Kolacic: //: pristup/CokoladniKeks2. .java import pr istup.println("Konstruktor klase Kolacic").

njam ().. . Prvi je da od red ite šta p ro g ram eri klijenti sm eju da koriste. a zatim zaštićene. jer njim a m ože da p ristu p i izvan date datoteke) a zatim će se zau stav iti kada naide na ostale članove koji su deo in tern e realizacije: //: pri stup/RasporedPoNaci nuPri s t u p a . } // Zaštićena metoda public s ta tic void m ain(String[] args) { CokoladniKeks2 x = new CokoladniKeks2(). a p ro g ram e ri klijenti sam o m ogu da šalju p o ru k e javn o n i interfejsu. Im ajte u v id u da su klase u istom d ire k to riju m u d eo .p o d razu m ev an o g “ paketa. p ak etn e i p riv atn e. Vežba6: (1) N apravite klasu sa zaštićenim p o d a c im a . bez b rig e o to m e da će p ro g ram e ri klijenti slučajno koristiti in tern e delove interfejsa. . Interfejs i realizacija K ontrola p ristu p a se često naziva i sakrivanje realizacije. zaštićenim članovim a i članovim a (poljim a i m e to d a m a ) s p a k e tn im p ristu p o m . N ap rav ite objekat te klase i p roverite kakve p o ru k e dobijate kada p o k u šate d a p ristu p ite svim član o v im a klase. tad a m ožete da m enjate sve što nije jav n o (znači sve to je prijateljsko. x. N apravite d ru g u klasu u istoj datoteci s m eto d o m koja ru k u je zaštićenim p o d ac im a u prvoj klasi. za. a to je razdvajanje interfejsa i realizacije. a šta ne. ali mjt’ javna. Vežba 4: (2) Pokažite da zaštićene m e to d e im aju p a k e tn i p ristu p iako nisu javne. Radi boljeg razum evanja.' Kao rezultat dobija se tip p o d atak a sa svojstvenim obeležjim a i o d re đ e n im p o n ašan jem . p riv a tn im . . In tern e m eh an izm e m ožete slo b o d n o da u g rad ite u stru k tu ru ... kao stil pravljenja klasa m o žete usvojiti da na p o četk u stavite javne članove. } } /* Isp is: Konstruktor klase Kolacic Konstruktor klase CokoladniKeks2 zagrizi * ///:Povedite ra ču n a o to m e d a zag rizi( ) d o d u še im a p ak etn i p ristu p .174 Misliti na Javi public void njam() { z a g r iz i()..java public class RasporedPoNacinuPristupa { public void javl( ) { /* . */ } public void jav2( ) { /* . */ } public void jav3( ) { / * . Pakovanje p o d atak a i m etoda u n u ta rk la sa u k o m binaciji sa skrivanjem realizacije često se naziva kapsuliranje. a da ne po k v arite klijentske p ro g ram e. To nas uvodi d ire k tn o u d ru g i razlog. * / } 5 P od k a p su lira n je m n e k i često p o d ra z u m e v a ju s a m o s a k riv a n je realizacije. A ko se stru k tu ra koristi u više p ro g ra m a. Vežba 5: (2) N ap rav ite ldasu s jav n im . P red n o st ovog načina je to što korisnik klase m ože d a k ren e o d v rh a i prvo vidi o n o što m u je b itn o (javne članove. K ontrola p ristu p a n am eće o g ran ičen ja u n u ta r tip a p o d a ta k a iz dva b itn a razloga.štićeno ili p riv atn o )..

T im e od ređ u jete d a li pro gram er klijent u op šte m ože da n ap rav i objekat date klase. u klasi. iako nije uo bičajeno. dok um entacioni k o m en tari koje p održava alatka Javadoc u m a n ju ju značaj čitljivosti prog ram a za prog ram era klijenta.Poglavlje 6: Kontrola pristupa 175 private private private private void p r iv l( ) { / * . da im ate je d in icu za p rev ođ en je u kojoj uopšte nem a javne klase. uklju ču ju ći m ala i velika slova. . U to m slučaju. alatke čiji je zadatak d a nap rav i pregled svih raspoloživih klasa i pokaže šta se s njim a korisno m ože u rad iti (tj.ja v a ili SPR A V IC A . Da bi kon tro lisao p ristu p klasi. A ko u n u ta r jed in ice za p revo đen je im ate više o d jed n e javne klase. i dalje vidite izvorni ko d . U svakoj jedinici za p rev o d en je (datoteci) m ože da p o stoji sam o jed n a javna klasa. M oguće je. Pristup klasama Specifikatori p ristu p a u Javi tak o đ e se m o g u u p o tre b iti d a o d red e koje će klase u n u ta r b iblioteke biti d o stu p n e n je n o m k o risn ik u. . koje članice su d o stu p n e). Z nači. * / } void priv2( ) { / * . . / / ••• } ///:O vo će sam o delim ično olakšati čitanje jer su interfejs i realizacija i dalje zajedno. postoje d o d a tn a ograničenja: 1. Im e jav ne klase m o ra ta čn o da se poklap a sa im en o m datoteke koja sadrži jed in icu za prevođenje. d ato tek u m ožete da nazovete kako god želite (iako će proizv o ljn o im enovanje zb u n iti o n e koji čitaju i o d ržavaju taj kod). Prikazivanje interfejsa k o risniku klase u stvari je posao čitača klasa (engl.jav a.je r se o n a nalazi tu . .Spravica. Ako se im ena ne slažu. p o n o v o ćete d o b iti p o ru k u o grešci.*. prevodilac će p rijaviti grešku. * / } ir t i .java. Ideja je da svaka jedinica za prev ođ en je im a sam o jed an javni interfejs koji ta javna klasa predstavlja. Prikazivanje d o k u m en tacije razvojnog okruženja za Javu p o m o ć u čitača W eba daje isti rezultat kao i čitač klasa. * / } void priv3( ) { / * . 2. . . Jedinica za prev o d enje m ože d a im a proizvoljan broj p o m o ć n ih klasa s p ak etn im p ristu p o m . Stoga m ožete d a napišete: public class Spravica { Ako je im e vaše biblioteke p ris tu p . class browser). A ko želite d a klasa b u d e d o stu p n a p ro g ra m e ru kliientu. . stavite rezervisanu reč p u b lic n a čelo definicije klase. import pristup. M eđu tim . nikako sp ra v ic a .realizaciju . za klasu S p rav ica im e d ato teke m o ra da b u d e S p rav ica. O d n o sno. specifikator m o ra da se n ađ e pre rezervisane reči class. 3. Pored toga. svaki p ro g ra m e r klijent m ože da p ristu p i klasi Spravica kada napiše: import pristup.

sve k o n stru k to re m o žete da p roglasite p riv atn im . m eto d e takve klase tre b a da u čin ite jav n im sam o ako m o rate .6 Za p ristu p klasi. (Ta klasa m ože d a se k o risti sam o u n u ta r paketa. Z atim n a p rav ite o b jek at klase Spravica u klasi koja nije d eo pak eta pristup. D a b iste zadržali tu m o g u ćn ost. m o ra te o sig u rati da n ijed an p ro g ra m e r klijen t ne p o sta n e zavisan o d o d ređ e n ih detalja realizacije skrivenih u n u ta r biblioteke pristup. // ("Sing ularni" projektni obrazac): private s ta tic Supa2 psl = new Supa2(). K ada n ap rav ite k lasu s p ak etn im p ristu p o m . a to će v am reći prevodilac. Da biste to postigli. A ko želite da nik o dru g i n e m a p ristu p nekoj klasi. (I vi ćete to m oći sam o u n u ta r statičn e članice te klase. } class Supa2 { private Supa2() {} // (2) Napravi statičn i objekat i vra ti referencu ako je zahtevano. Z ap am tite da klasa n e m ože da b u d e p riv a tn a (tim e bi postala d o stu p n a sam o sebi) n iti zaštićena. im ate sam o dva izbora: p ak etn i ili javni. Klasu pretvarate // u privatnu proglašavajući njene konstruktore privatnim: class Supal { private Supal() {} // (1) Dozvoljava pravljenje statičkom metodom: public s ta tic Supal napraviSupu() { return new Supal( ) .) Evo p rim era: //: pristup/Rucak. im a sm isla d a n jen a p o lja b u d u p riv a tn a —p olja b i uvek treb alo d a b u d u p riv atn a —ali je p o p rav ilu u p u tn o d ati m e to d a m a je d n ak i (p aketni) p ristu p k ao klasi. } public void f ( ) {} } " U n u tra š n ja (e n g l. stoga. .) Vežba 7: ( 1) N ap rav ite bib lio tek u pristup n a o sn o v u p re th o d n ih delova k ođa koji o p isu ju n ju i klasu Spravica. izostavite rezervisanu reč public ispred klase. ali to je s p ec ija la n slučaj. Pošto se klasa s p ak e tn im p ristu p o m o b ič n o u p o treb ljav a sam o u n u ta r svog pak eta.176 Misliti na Javi Šta ako u n u ta r b iblioteke pristup im ate klasu k o ju k o ristite sam o za zadatke koje izvršava klasa Spravica ili neka d ru g a javna klasa iz te biblioteke? N ećete d a pišete d o k u m e n tacije za p ro g ra m e ra k lijenta i m islite kako ćete k asnije v ero v atn o h te ti d a p o tp u n o izm en ite stvari i celu tu klasu izbacite i zam e n ite je n ek o m novom .java // Pokazuje specifikatore pristupa k la s i. public s ta tic Supa2 pristupO { return psl. p ri čem u o n a d o b ija p a k e tn i p ristu p . čim e ćete sprečiti sve osim sebe da n aprave ob jek at te klase. Te klase će b iti o b ja šn je n e u p o g la v lju Unutrašnje klase. inner) klasa m o ž c b iti p riv a tn a ili z aštič e n a.

d o k o n e izvan paketa to ne m ogu. } } ///:D o sada. Ako sam i napišete p o d razu m ev an i k o n stru k to r.p ristu p (). jer dozvoljava da b u de naprav ljen sam o je d a n objekat. pa p o stoji jed a n i sam o jed an i njem u m ožete da p ristu p ite sam o preko javne m eto d e p ris tu p (). sprečićete d a se o n a u to m atski napravi.) A ko je. što se ovde i đešava. M eto d a vraća referencu na objekat klase Supal. au to m atsk i će biti n apravljen p o d razu m ev an i k o n stru k to r (k o n s tru k to r bez arg u m en ata). ako izričito ne n a p ra v ite n ijed an k o n stru k tor.napraviSupu(). U S u p a l napravljena je statična m etoda koja pravi novi objekat klase S u p a l i v raća referencu na njega. niko neće m o ći d a n ap rav i objekat te klase.Poglavlje 6: Kontrola pristupa 177 // Dozvoljena je samo jedna javna klasa u d atoteci: public class Rucak { void te s tP riv a te () { // Ovo ne može da se uradi! Konstruktor je privatan: //! Supal supa = new SupalO.net. O b jek at klase Supa2 je napravljen kao statični i priv atn i član klase S upa2. iako ne m ože da n ap rav i objekat te klase.M indV iew . eksplicitno svrstane u p o d razu m ev an i paket za taj d ire k to riju m . većina m e to d a je vraćala ili void ili p ro st tip. p ro g ram e r klijent još uvek m ože da p ristu p a sta tič n im članovim a. kako će sada iko tu klasu d a koristi? P re th o d n i p rim e r p o k azu je dva n a č in a .f(). U koliko ga zatim proglasite p riv atn im . Ali. pod razu m ev a se da je u p ita n ju paketni p ristu p . Ali tak o d e m ožete da vratite i referencu na objekat. } void te stSin g u la rn i() { Su p a 2 . U po treb ljen i o b razac u p rim e ru naziva se „singularan". m e đ u tim . (Z a p a m tite da su sve datotek e koje se nalaze u istom d ire k to riju m u i koje n em aju izričitu p a k e tn u deklaraciju. Kao što je ranije n a p o m e n u to . Klase S u p a l i S u p a2 pokazu ju kako se proglašavanjem k o n stru k to ra p riv a tn im sp rečava d ire k tn o stv aranje objekata. To m ože da b u d e k o risn o ako želite da sa o b jek to m klase S u p a l u rad ite još neke operacije pre nego što v ratite referencu ili ako želite da v o d ite ra ču n a o broju naprav ljenih o b jekata kiase S u p a l (recim o da biste o graničili n jih o v u p o p u laciju ). Reč Supal p re im ena m eto d e (napraviSupu) g o v o ri šta m etoda vraća. o čem u više m ožete da p ro čitate u knjizi T hinking in Patterns (w ith Java). } isprva m ože m alo da zbuni. Z apam tite. Do sada je u ovoj knjizi to najčešće bila reč void. p a definicija: public s ta tic Supal napraviSupuO { return new S u p a l(). na adresi w w w . statični član te klase javni. . } void te s tS ta tic n i() { Supal supa = Supal. što znači da ne vraća ništa. ako ne stavite nijedan specifik ato r p ristu p a za klasu. U S u pa2 koristi se projektni obrazac. To znači da b ilo koja d ru g a klasa u paketu m ože da n apravi ob jek at date klase.

O vo poglavlje se o d n o silo na pravljenje klase da bi se fo rm irala biblioteka: prvo. vi uspostavljate vezu s k o risn ik o m te biblioteke . P ro g ram er k lijent ne sm e da b u d e u m o g u ćn o sti d a izričito p rav i objekte klase Veza.java package pr is tup. Vežba9: (2) N apravite sledeću d a to te k u u d irek to riju m u pristup/lokal (k o ja b i treb alo da je u vašoj p ro m en ljiv o j CLASSPATH): ///: pristup/lokal:UpakovanaKlasa. način na koji klasa kontroliše pristu p svojim članovim a. Kada klasi UpravIjacVezama p o n estane objek ata. Sve bi bilo p o tp u n o izloženo.strana. . treb alo b i da ih d obija sam o prek o statičn e m eto d e iz klase UpravljacVezama.print1n("Pravljenje upakovane klase1 '). na koji način se klase p ak u ju u je d n u bib lio tek u i dru g o .*.out.java package pristup. } } O b ja sn ite zašto prevodilac p rijavljuje grešku. public class Strana { public static void main (String [] args) { UpakovanaKlasa uk = new U p a k o v a n a K l a s a O .lokal. Da li bi se išta p ro m e n ilo ako bi klasa Strana p ostala deo paketa pristup.lokal? Sažetak U svakoj vezi b itn o je da sve uklju čen e stran e p o štu ju izvesne granice. } } Z a tim na p rav ite sledeću d ato te k u u n ek o m d ru g o m d irek to riju m u : ///: pristup/strana/Strana. import pristu p.178 Misliti na Javi Vežba 8: (4) P rateći fo rm u iz p rim e ra Rucak. Kad ne bi bilo pravila. lo ka l. Kada pravite biblio tek u . ali koji koristi vašu b iblioteku da bi n ap rav io neku aplikaciju ili još veću biblioteku.java.koji je tako đ e p ro g ram er.p ro g ra m e ro m klijen to m . čak i k ada biste vi više voleli da ne rade d irek tn o s nekim od njih. Klase testirajte u m e to d i main(). p ro g ra m e ri klijenti m ogli bi da rade šta im je volja sa svim član o v im a klase. n ap rav ite klasu p o d im en o m UpravljacVezama koja u p rav lja fiksnim n izo m objek ata klase Veza. class UpakovanaKlasa { public UpakovanaKlasa () { System. o n a treb a da vraća referencu null.

te h n ik a im en o v an ja pak eta i rezervisana reč import. dokle god ne izbacite neke koje je p ro g ram e r klijent već u p o treb io u svom p ro g ra m u . ali nisu deo interfejsa koji je p o treb an p ro g ram e rim a k lijentim a.M indView. bićete više rasp olo ženi za eksperim ente. K orisnik vidi javni interfejs. čim e se p ro b le m sa su d ara n je m im en a lako zaobilazi. pa k ru to prid ržavan je pravila p ristu p a m ože da sm eta. ldasu isprva n ap rav ite n a jed an način . o b ezb eđ u ju p o tp u n u k o n tro lu n ad im e n im a . a zatim otk rijete kako će se rek o n stru k cijo m k oda b itn o u b rz ati izvršavanje. to m ožete da postig n ete bez p rim o ra v a n ja p ro g ra m e ra k lijenta da p o n o v o p išu svoje p ro g ram e. koji se m o ž e kupiti na Iokaciji www. a šta m o g u d a ignorišu. Prvi je obezb ed iti da korisn ici d rže ru k e podalje o d delova koje ne bi sm eli da diraju . A ko interfejs ne .pogodite“ iz prve.lako m o g u da razluče šta je za njih b itn o . Z bog to g a bolje ra z u m e ju klase. Im a m n o g o situacija u kojim a to nije slučaj. već i da prav ite greške. C im a jeđ in stv en im enski p ro sto r. Tada bi p o d ra zu m e v a n i (p ak etn i) p ristu p m ogao da b u d e o p tim alan . U Javi. pa je to. rezervisana reč package. Rešenja o d a b r a n i h vežbi data su u e l e k tr o n sk o m d o k u m e n t u Thinking Iti Java A nnotated Solution Guide. ne sam o da m o žete da u n a pre đ u je te projekat.Poglavlje 6: Kontrola pristupa 179 P ro cen a je da pro jek ti pisani n a jeziku C p o čin ju da se uru šav aju kada d o stig n u izm eđ u 50 K i 100 K redova koda. Ti delovi su n e o p h o d n i za in te rn i ra d klase. Z ato p ro g lašavanjem m eto d a i p olja p riv atn im p rav ite uslugu p ro g ram e rim a k lijen tim a .izm eđu au to ra biblioteke i n jenih spoljnih klijenata. p rilik o m analize i p ro jek to v an ja p ro g ra m a .. Ć ak vam je i tu d ata izvesna slo b o d a da m en jate. naprav ićete greške. O b ra tite pažn ju na to da se kon tro la p ristu p a u sred sređ u je na o d n o s . sam i pišete sav kod ili rad ite zajedno s m a lo m ekip o m i sve što napišete ide u isti paket. Bez ob zira na to koliko pažljivo p lan ira te i p ro jek tu jete.i n ek u v rstu k o m u n ik a c ije . K ada im ate m o g u ćn o st da m en jate o sn o v n u realizaciju. Ako su interfejs i realizacija jasn o razd v o jen i i zaštićeni. Ako zn ate da greške neće izazvati m n o g o štete. uvek m ožete da dodate d ru g e m eto d e. p a im en a p o č in ju d a se su d a ra ju te ih m o rate raspetljavati. D ru g i i najvažniji razlog k o n tro le p ristu p a jeste o m o g u ćiti p ro je k ta n tu bib lio tek e da p ro m e n i u n u tra šn ji izgled ldase b ez brige o to m e kako će to u ticati n a p ro g ra m e ra klijen ta . N a p rim e r.net . najvažniji deo klase koji treba da u rad ite kako valja. U tim situacijam a p o tre b n a je drugačija k o m u n ikacija. P rim era radi. brže ćete učiti i brže završavati projekte. Postoje dva razloga za k o n tro lu p ristu p a članovim a. K ontrola p ristu p a osigurava d a n ijed an p ro g ra m e r k lijent ne p o sta n e zavisan o d realizacije koja se nalazi u osn o v i klase.

Prvi je p rilič n o jasan: p ra v ite objekte postojeće klase u n u ta r nove klase. Ali. a n e njegova fo rm a. Izvor() { System. je r je n o v a klasa sastavljena o d o b jekata p o stojećih klasa. Vi b u k v aln o uzim ate o b lik postojeće klase. U o v o m poglavlju n au čićete dva n ačin a d a to p o stig n ete. To se naziva kom pozicija. d o k p ro ste tipove d ire k tn o definišete: //: ponovnaupotreba/Prskalica. Sintaksa kompozicije D o ovog m esta u knjizi često sm o k oristili k o m p o ziciju . } } public class Prskalica { private String ventill. uzim ate postojeće klase koje je n eko već n a p ra v io i o čistio o d grešaka. ventil3. D ru g i p ristu p je su p tiln iji. Kod složenih tipova. Kao i sve ostalo u Javi. rešenje se v rti oko klase.java // Ponovna upotreba koda kompozicijom. P onovo se k o risti fu n k c io n aln o st koda. Rešenje je d a se u p o tre b e klase b ez m e n ja n ja p ostojećeg k o d a. N asleđivanje (engl. P retp o stav im o . sa kodom m orate u m eti da uradite m nogo više od p u ko g kopiranja i menjanja. } public String t o S t r i n g O { return s. da želite da n a p rav ite objekat koji čuva nekoliko o bjekata tip a S trin g . class Izvor { private String s. ali se takav p ristu p i nije baš n ajb o lje p okazao. K O D SE PO N O V O KORISTI TAKO STO SE KOPIRA i izm eni.sm eštan je referenci na objekte u n u ta r nove klase. inheritance) predstavlja jed a n o d k a m e n a tem eljaca o b je k tn o o rije n tisan o g p ro g ram ira n ja i p o d raz u m ev a još neke p o stu p k e koji će b iti istražen i u poglavlju Polimorfizam. u n u ta r nove klase stavljate reference. Ispostavlja se d a je d o b a r d eo sin tak se i o so b in a k o m p o z iđ je i nasleđivanja sličan (što im a sm isla. je r se oba k o riste za pravljenje n o v ih tipova o d p o sto jećih ). ventil2. da biste u tom p o slu bili revolucionarni. . U ovom poglavlju učićete o tim m e h a n izm im a p o n o v n o g korišćenja koda. U PRO C ED U RA LN IM JEZICIM A KAO ŠTO JE C .out. O va teh n ik a se naziva nasleđivanje i p rev o d ilac tu obavlja veći d eo posla. na p rim e r.Ponovno korišćenje klasa Jedna od najlepših m ogućnosti u Javijeste ponovno korišćenje koda.. ventil4.od n u le “. nekoliko p ro stih tip o v a i o b jek at neke d ru g e klase.pri n t ln("Izvor()"). u m e sto da ih p ravite . s = "Konstruisan". K od p o n o v o k o ristite tak o što p rav ite n o v e klase ali. d o d ajete jo j k o d i n išta n e m e n ja te n a njoj sam oj. private Izvor izvor = new Izvor(). N ova klasa se p rav i kao tip p o sto jeće klase.

izazvaćete izuzetak . Stoga u izrazu u Prskalica. Im a sm isla to što prevodilac ne pravi p o d razu m ev a n i objek at za svaku referencu.toString(): "izvor = " + izvor.grešku to k o m izvršavanja. public String t o S t r i n g O return { "ventill = " + ventill + " " + "venti!2 = " + ventil2 + " 1 1 + "ventil3 = " + ventil3 + " " + "ventil4 = " + ventil4 + "\n" + "i = 1 1 + i + " " + "f = " + f + " " + "izvor = " + izvor. reference na objekte inicijalizovane su v red n o šću null i ako preko bilo koje od tih referenci p o k u šate da pozovete neku m eto d u . o n m ože da k o m b in u je dva o b jek ta klase String i da rezultat pro sled i m eto d i System. je r bi to u m n o g im slučajevim a izazvalo n ep o tre b n e režijske troškove.out. println() (ili p re th o d n o u knjizi d efin isan im statićn im m eto d a m a print() i printnb()). private float f. Ako želite da reference b u d u inicijalizovane. } } /* Ispis: Izvor() ventill = null ventil2 = null ventil3 = null ventil4 = null i = 0 f = 0. Prom enljive pro stog tipa koje su polja klase. M eđ u tim . } public static void main(String[] args) System. o n kaže: „pretv oriću Izvor u tip String po ziv an jem m e to d e toString()“.println(prskal i c e ) . Svaki objekat im a m e to d u toStringO koja se poziva u p o seb n im situacijam a. N akon toga.out. Kad god želite da klasi koju p rav ite o m o g u ćite takvo p o n ašan je. 2. sam o nap išite m e to d u toString(). ako prev o d io cu treb a objekat klase String. . prevodilac p rim eću je kako p okušavate da na objek at tipa String ("izvor = ") nadovežete objekat tipa Izvor. a da se p ri to m ne javi izuzetak. U k o n stru k to ru te klase. to m o rate da u rad ite sam i: 1. au to m a tsk i su inicijalizovane v rednošću nula. Pošto na objek at tip a String m o žete da nadovežete sam o d ru g i takav olijekat. kao što je n a p o m e n u to u poglavlju Sve je objckat. { Prskalica prskalice = new Prskalica(). a u m esto toga m u je p ro sleđ en neki d ru g i objekat. To znači d a će uvek biti inicijalizovani p re nego što k o n stru k to r b u d e pozvan. Na m estu gde se objekti definišu.Poglavjje 7: Ponovno korišćenje klasa 181 private int i .0 izvor = Konstruisan * ///:Jedna o d m eto d a d efin isan ih u o b e ldase je p o seb n a: to je m e to d a toString(). D o b ro je što ipak m ožete da ispišete null referencu.

} public static void main(String[] args) { Kada b = new Kada(). class Sapun { private String s. private int i.util. s3. import static ne t. Inicijalizacijom instance (p rim erk a ). Sapun() { print{"Sapun()"). O n a m o že d a sm an ji režijske troško ve o n d a k ad a je pravljenje objekta skupo. } // Inicijalizacija instance (primerka): { i = 47. return " sl = " + sl + "\n" + "s2 = " + s2 + "\n" + "s3 = " + s3 + "\n" + "s4 = " + s4 + "\n" + "i = " + i + "\n" + "igracka = 1 1 + igracka + "\n" + "sapuncic = " + sapuncic.*. sapuncic = new Sapun(). public Kada() { print("Unutar klase Kada()"). } } public class Kada { private String // Inicijalizacija na mestu definicije: s 1 = "Srećan". igracka = 3 .Print.java // Inicijalizacija u konstruktoru i kompozicija. private Sapun sapuncic. } public String toStringO { if(s4 == null) // Odložena inicijalizacija: s4 = "Radostan". . N eposredno p re nego što v am je zaista taj o bjek at p o tre b a n . s2 = "Srećan". s3 = "Radostan".182 Misliti na Javi 3. s = “Konstruisan". Sva četiri p ristu p a p rik azan a su ovde: //: ponovnaupotreba/Kada. } public String t o S t r i n g O { return s.mindview. a ne treb a ga p ra v iti svaki p u t. private float igracka. 4. s4.14f. To se često naziva i lenja inicijalizacija.

Sintaksa nasleđivanja N asleđivanje je sastavni deo Jave (i u o p šte o b jek tn o o rijen tisa n ih jezika). . import static net. im plicitno ćete n aslediti favinu p o d ra z u m e v a n u ko ren sk u kiasu O b ject. kada pravite klasu. class Cistac ( private String s = "Cistac". Kada inicijalizaciju ne u ra d ite n a m e stu definicije. } public static void main(String[] args) { Cistac x = new Cistac(). ali se za n asleđivanje up otreb ljav a p o seb n a sin tak sa. } public void ribaj() { dodaj(" ribaj()"). public void dodaj(String a) { s += a.*.Poglavlje 7: Ponovno korišćenje klasa 183 p rin t(b ).java // Sintaksa i osobine nasleđivanja. Kada to učinite. pišući rezervisanu reć e x te n d s iza koje sledi im e osnovnc kluse. } } /* Ispis: Unutar klase Kada() Sapun() sl = Srećan s2 = Srećan s3 = Radostan s4 = Radostan i = 47 igracka = 3 . 1 4 sapuncic = Konstruisan * ///:O b ra tite p ažn ju na to da se u k o n stru k to ru klase K ad a n a re d b a izvršava p re nego što se u ra d i bilo koja inicijalizacija. ispostavlja se da uvek p rim en ju jete nasleđivanje. U n u ta r d ru g e klase definišite referencu objekta prve klase.util.mindview. } public String toStringO { return s.Print. Pri nasleđivanju kažete „nova klasa ie kao ta sta ra klasa“. Za in stan ciranje tog objekta k o ristite len ju in iđ jalizaciju . } public void sipaj() { dodaj(" sipaj()"). n e p ostoji g arancija da će objekat ili referenca biti inicijalizovani p re nego što im pošaljete p oru k u . Kada se pozove to S trin g O . Vežba 1: (2) N apravite jed n o stav n u klasu. } public void razredi() { dodaj(" razredi()"). A ko eksplicitno ne nasledite neku klasu. U stvari. U p ro g ra m u to navodite pre p o ćetn e vitićaste zagrade tela klase. Evo p rim era : //: ponovnaupotreba/Deterdzent. S intaksa kom pozicije je oćigledna. au to m atsk i p reu zim a te sva polja i m eto d e o sn o v n e klase. o n p o p u n ja v a s4 tak o d a su sva p o lja p rav iln o inicijalizovana u tre n u tk u njihovog korišćenja.izuzev neizbežnog izuzetka p rilik o m izvršavanja.

ribaj () r ib a j() zapeni() Testiranje osnovne klase: Cistac razrediO s ip a j() r ib a j() * III-- O vim se p o kazuje više oso b in a. Cistac i Deterdzent sadrže m eto d u inain(). tak o đ e m ožete da napišete java Cistac čim e pozivate m e to d u Cistac. x . m ožete da pro sled ite bilo koji niz elem en ata tipa String).rib aj ( ) . D rugo.. iako klasa Cistac nije javna.r ib a j ( ) . teh n ik o m stavljanja m eto d e main() u svaku klasu.main(). Svaka o d vaših klasa m ože d a sadrži in eto d u main(). x . p rin t("T e stira n je osnovne k la s e :"). Č ak i ako klasa im a paketni p ristu p . u m eto d i dodaj klase Cistac. biće pozvana sam o m eto d a main() klase p o zvane s k o m a n d n e linije. Za klasu Deterdzent. ako izostavite specifik a to r p ristu p a.razred i( ) . Setite se da se.zapeni( ) .s ip a j(). Važno je d a sve m eto d e klase Cistac b u d u javne. pri nt (x ). na prim er. objekti klase String se nadovezuju na sadržaj p ro m en ljiv e s p o m o ć u o p e ra to ra + = . Cistac. Kada ga završite. m ožete d a je o stavite za kasnije testiranje.main() ako napišete java Deterdzent. Stoga će u ovom slučaju biti pozvana m etoda Deterdzent. o m o gućavate lako testiran je svake klase. obe klase. x .184 Misliti na Javi x . p o d raz u m ev a d a član im a p ak etn i p ristu p koji dozvoljava p ristu p sam o članov im a istog paketa. } // Testira novu klasu: public s ta tic void m ain(String[] args) { Deterdzent x = new Deterdzent(). .main(). javn a m eto d a main() je d o stu p n a . x. p r in t(x ). Stoga bi. x . I kada im ate p u n o klasa u p ro g ra m u .main() izrićito poziva m e to d u Cistac. U ovom slučaju o b ra tite p ažn ju na to da m eto d a Deterdzent. m e to d u main() ne m o rate da uklanjate.preklopili“ tako da rad i i sa o b jek tim a klase String. Taj o p e ra to r (kao i o p erato r + ) au to ri Jave su .ra z re d i(). ako ne navedete specifikator p ristu p a.s ip a j( ) . p ri čem u joj p ro sled u je iste a rg u m en te koje je sam a d o b ila s kom a n d n e linije (u p rin c ip u . // Poziva verziju iz osnovne klase } // Dodaje metode k la si: public void zapeni() { dodaj(" z a p e n i()"). su p e r. } } /* Isp is: Cistac razrediO s ip a j() Deterdzent.ribaj( ) " ) . Prvo. x . svaki člnn tog paketa m ogao da koristi te m etode. M eđ u tim .m ain(args). } } public class Deterdzent extends Cistac { // Promeni metodu: public void rib a j() { dodaj(" D eterdzent. ne bi biio problem a.rib aj( ) .

sipaj(). subobject) osn ov ne klase. m ožda uz p o n e k u d o d a tn u m eto d u ili polje. Inicijalizacija osnovne klase Pošto su sada u p riču uključene dve klase . U ovom slučaju.P r in t. M e đ u tim . Klasa Cistac im a g ru p u m eto d a u svom interfejsu: dodaj(). iako ne v id ite d a su o n e u njoj izričito definisane.* . njen interfejs au to m atsk i sadrži i navedene m eto d e. razredi(). D akle. Pri n asleđivanju ne m o ra te ko ristiti sam o m eto d e o sn o v n e klase. import s ta tic net.o sn o v n a i izvedena . a sve m eto d e javne (izvedena klasa tak ođ e m ože da p ristu p a zaštićenim članovim a. N aravno. Z nači d a nasleđivanje m o žete d a p o sm a tra te kao p o n o v n o korišćenje klase.ribajO poziva verziju m eto d e ribaj() iz o sn o v n e klase. Taj k o n stru k to r im a sve p o tre b n o znanje i privilegije da inicijalizuje o sn ovn u klasu. superclass ) koju tek u ća klasa nasleđuje. u m e to d i ribaj() nije ispravno d a se pozove sam o m eto d a ribaj(). spolja gledano. ribaj() i toString(). Javina rezervisana reč super označava natk lasu (engl. Spolja izgleda kao d a Tiova klasa im a isti interfejs kao o sn o v n a klasa. p o d o b jek at o sn o v n e klase u pakovan u objek at izvedene klase. . U m eto d i Deterdzent. Jedino je. n e o p h o d n o je da podobjekat osnovne klase b u de pravilno inicijalizovan i postoji sam o jedan način da se to i garantuje: da se inicijalizacija obavi u k o n stru k to ru p ozivanjem k o n stru k to ra osnovne klase. je r bi to b io rek u rziv an poziv. Taj p o d o b jekat izgleda isto kao da ste napravili sam objekat osn o v n e klase. D a b i rešila ovaj p ro b lem .util. zapeni()). da biste om ogućili nasleđivanje klase. ako bi n ek a klasa iz nekog d ru g o g pak eta nasledila klasu Cistac.m indview . on sadrži podobjekat (engl. Java auto m atsk i dodaje poziv k o n stru k to ra o snovne klase u k o n stru k to r izvedene klase. Izvedenoj klasi m o žete d a dod ajete nove m eto d e na isti način na koji b iste to radili i s bilo k o jo m d ru g o m klasom : definišite ih. N aredni prim er pokazuje rad s tri nivoa nasleđivanja: //: ponovnaupotreba/Karikatura. Kada n apravite objekat izvedene klase.java // Poziv konstruktora pri nasleđivanju. iz n ove verzije je p ozv an a i m eto d a iz osno v n e klase. P rim e r za to je m etod a za p e n i(). Vežba 2: (2) Iz klase D e te rd z e n t nasledite novu klasu.main() v idite da preko objekta klase Deterđzent m o žete da p o zivate m eto d e koje su raspoložive za klasu Cistac i o n e za klasu Deterdzent (na prim er. opšte p rav ilo je da sva polja b u d u p riv atn a. Redefinišite m eto d u rib a j(). a to niste n am eravali. N aravno d a u o d ređ en im slučajevim a m o ra te u čin iti izvesna prilag o đ av an ja. p o m alo zb u n ju je p o m isa o na to kako izgleda objckat koji se d ob ija o d izvedene klase. Pošto je klasa Deterdzent izvedena iz klase Cistac (p o m o ću rezervisane reči extends). a d o dajte i n o v u m e to d u p o d im e n o m ste rilisi(). Na p rim e ru m eto d e ribaj() v id i se d a je m og uće m en jati m e to d u koja je već bila definisan a u o sn o vno j klasi. Ali nasledivanje ne kopira sam o interfejs o sn ov ne klase. Stoga n aredba super. o n a b i m ogla da p ristu p a sam o n je n im jav n im članovim a. ali ovo je k o risn a sm ernica.u m esto sam o jed n e.Poglavlje 7: Ponovno korišćenje klasa 185 M e đ u tim . o to m e nešto kasnije).

public s ta tic void m ain(String[] args) { Karikatura x = new K a rik a tu ra (). Konstruktori sa argumentima U p re th o d n o m p rim e ru su k orišćeni p o d ra zu m e v a n i k o n stru k to ri. Vežba3: (2) D okažite p re th o d n u tv rd n ju (da prevodilac pravi p o d razu m ev an e k o n stru k tore u m esto vas). } } public class Karikatura extends Crtez { public KarikaturaO { print("Konstruktor klase Kari k atu ra"). pa je osn o v n a klasa inicijalizovana p re nego što k o n stru k to r izvedene klase m ože da joj pristu p i. Vežba 5: (1) N ap rav ite dve klase.uti1 . o d n o sn o . je r nem a su m n je koje arg u m ente treb a p roslediti. import s ta tic net. } } } /* Isp is: Konstruktor klase UmetnickoDelo Konstruktor klase Crtez Konstruktor klase Karikatura III-V idite da se k o n stru k cija obavlja o d osn o v n e ka izvedenim klasam a. A ko o sn o v n a klasa n em a p o d raz u m e v a n i k o n stru k to r ili ako želite da pozovete k o n stru k to r o sn o v n e klase kom e su p o tre b n i a rg u m e n ti. P rev o d io cu je lako da ih poziva. m o rate izričito pozvati k o n stru k to r o sn o v n e klase koristeći rezervisanu reč s u p e r i proslediti m u odgovarajuću listu arg u m en ata: //: ponovnaupotreba/Sah. oni nisu im ali nikakve arg u m e n te . prevodilac će um esto vas n apraviti p o d ra zum ev an i k o n stru k to r koji će pozv ati k o n stru k to r o sn o v n e klase.*. } } class Crtez extends UmetnickoDelo { Crtez() { print("Konstruktor klase C rtez"). Iz klase A nasledite n o v u klasu C i u njoj n apravite objekat član Idase B.m indview.186 Misliti na Javi class UmetnickoDelo { UmetnickoDelo() { print("Konstruktor klase UmetnickoDelo"). Č ak i ako za klasu Karikatura n e n a p ra v ite k o n stru k to r. N e m o jte da p rav ite k o n stru k to r klase C.P r in t . . N apravite objekat te klase i p o sm atrajte rezultate. Vežba4: (2) D o kažite da se k o n stru k to ri osn o v n e klase (a) uvek pozivaju i (b) pozivaju pre k o n stru k to ra izvedene klase.java // Nasleđivanje. konstruktori i argumenti. A i B. sa p o d ra z u m e v a n im k o n stru k to rim a (bez arg u m en ata) koje javljaju svoje p o sto jan je.

jav a d okažite tv rd n je iz p re th o d n o g pasusa. Iz klase K oren izvedite klasu S tab ljik a koja takode im a po instancu svake k om ponente. (Prevodilac će vas p odsetiti ako pogrešite. Svaka klasa treba da im a p o d razu m ev an i k o n stru k to r koji ispisuje p o ru k u o njoj. Pored toga.Poglavlje 7: Ponovno korišćenje klasa 187 class Igra { Ig ra (in t i) { printC'Konstruktor klase Ig ra "). K o m p o n en ta2 i K o m p o n en ta3 . . N apišite k o n stru k to r klase C i svu inicijalizaciju obavite u n u ta r njega. Vežba 9: (2) N apravite klasu p o d im en o m K oren koja sadrži p o jed n u instancu klasa (koje takod e treba da napravite) p o d im enim a K o m p o n e n ta I. } } class IgraNaTabli extends Igra { IgraN aTabli(int i ) { su p e r(i). Pozovite k o n stru k to r osno v ne klase iz k o n stru k to ra izvedene klase. V ežba 8: ( 1) N apravite o sn o v n u klasu koja im a sam o jed an n ep o d razu m ev an i k o n stru k to r i izvedenu klasu koja im a i p o d razu m ev an i i n ep o d razu m ev an i k o n stru k to r. p revodilac će se žaliti da ne m ože da p ro n ađ e k o n stru k to r oblika Ig ra(). print("Konstruktor klase Sah"). prvo se mora pozvati k o n stru k to r osn o v n e klase. } public s ta tic void m ain(String[] args) { Sah x = new Sah ( ) . V ežba 7: ( 1) Izm enite vežbu 5 tako da A i B u m esto p o d razu m ev a n ih k o n stru k to ra im aju k o n stru k to re sa a rg u m e n tim a. print("Konstruktor klase IgraNaTabli" ) . i to n ajp re m orate da u rad ite u k o n stru k to ru izvedene klase. Vežba 10: ( 1) Izm enite p re th o d n u vežbu tak o da svaka klasa im a i n ep o d razu m ev an i konstru k to r. } } /* Isp is: Konstruktor klase Igra Konstruktor klase IgraNaTabli Konstruktor klase Sah * ///:Ako u k o n stru k to ru klase Ig raN aT ab li() ne pozovete k o n stru k to r o sn o v n e klase.) V ežba 6: ( 1) P om oću dato tek e S ah . } } public class Sah extends IgraNaTabli { Sah() { s u p e r (ll).

S v em irsk iB ro d u stvari n ije „jed an od o bjekata“ klase U prav Ijačk iU ređ ajiS ve m irsk o gB ro d a. p o što u klasu k o ju p ra v ite sm eštate o b jek at član (kao kom pozicija). { } } ///:N aravno. štit. } public s ta tic void m ain(String[] args) { SvemirskiBrod š t i t = new SvemirskiBrod("PVO t i t " ) .ime = ime.java public class DelegiranjeSvemirskogBroda { private String ime. private UpravljačkiUredajiSvemirskogBroda upravljačkiUređaji = new Upravl jačkiUređajiSvemirskogBroda(). public SvemirskiBrod(String ime) { this. } public String to S trin g () { return ime. O vu n ed o u m icu rešava delegiranje: //: ponovnaupotreba/DelegiranjeSvemirskogBroda. p rim e ra radi. svem irskom b ro d u treb a m o d u l za upravljanje: //: ponovnaupotreba/UpravljačkiUređajiSvemirskogBroda. u o b jek tu ldase S v em irsk iB ro d ek sp o n iran e su sve m eto d e objekta klase U prav ljačkiU red ajiS v em irsk o g B ro d a. To je nešto na pola p u ta izm eđu nasleđivanja i k om pozicije. čak i ako o bjektu klase S v em irsk iB ro d . N a p rim er. } // Delegirane metode: public void nazad(int brzina) { .java public class SvemirskiBrod extends UpravljačkiUređajiSvemirskogBroda private String ime. ali u novoj klasi isto v rem en o ek sp o n ira te sve m eto d e to g objekta člana (kao nasleđivanje).napred(lO O ). Istovrem eno. public DelegiranjeSvemirskogBroda(String ime) { this.ime = ime. Tačnije je reći da S v em irsk iB ro d sadrži U p rav Ijačk iU ređ ajiS v em irsk o g B roda. m ožete „narediti" da ide n a p red ().java public class UpravljačkiUređajiSvemirskogBroda void naviše(int brzina) void naniže(int brzina) void nalevo(int brzina) void nadesno(int brzina) void napred(int brzina) void nazad(int brzina) {} {} {} {} {} {} {} { void turboPotisak(int brzina) } // / = ~ Jedan o d način a d a se n a p ra v i svem irski b ro d bilo b i nasleđivanje: //: ponovnaupotreba/SvemirskiBrod.188 Misliti na Javi Delegiranje Java ne podržava d ire k tn o treći o d n o s koji se naziva delegiratije.

deleg iran je o m o g u ću je više k o n tro le. korišćenjem kom pozicije i nasledivanja. } public s ta tic void m ain(String[] args) { DelegiranjeSvemirskogBroda š t i t = new DelegiranjeSvemirskogBroda("PVO t i t " ) . class Tanjir { T a n jir(in t i) { print("Konstruktor klase T a n jir").turboPotisak(brzina).ja v a tako da se u njoj koristi delegiranje. gornji p rin ie r je au to m atsk i g enerisan p o m o ć u razvojnog o k ru žen ja JetB rains Idea. import s ta tic net.P r in t.nazad(brzina).util.Poglavlje 7: Ponovno korišćenje klasa 189 upravljačkiUređaji. kao i n e o p h o d n e inicijalizacije k o n stru k to rim a: //: ponovnaupotreba/PostavkaStola . Recim o. Kombinovanje kompozicije i nasleđivanja K om pozicija i nasleđivanje se često koriste zajedno.m indview. } public void napred(int brzina) { upravljačkiUređaji. } public void naniže(int brzina) { upravljačkiU ređaji.nadesno(brzina). } } III--- V idi se kako su m etode pro sleđ en e p rip a d n o m o b jek tu tip a u p ra v lja č k iU re đ a ji. Iako Java ne podržava delegiranje. im a m n o g o razv o jn ih alatki koje ga p održavaju. } public void naviše(int brzina) { upravljačkiU ređaji. } public void nalevo(int brzina) { upravljačkiU ređaji. štit.naniže(brzina). V ežba 11: (3) Izm enite D e te rd z e n t.napred(lO O ). } public void turboPotisak(int brzina) { up ravljačkiUređaji.nalevo(brzina). . N ared n i p rim e r po k azu je pravljenje složenije klase. M eđ u tim . p ošto u objekat član m ožete p ren eti proizvoljan p o d sk u p svih m etoda. } public void nadesno(int brzina) { upravljačkiUređaji.* . pa je interfejs zato je d n a k kao pri nasleđivanju.naviše(b rzina).napred(brzina).java // Kombinovanje kompozicije i nasleđivanja.

private Noz nz. } } // Kulturan način da se nešto uradi: class Obicaj { O bicaj(int i) { print("Konstruktor klase O b icaj"). } } class Noz extends Pribor { Noz(int i ) { s u p e r(i). public PostavkaStola(int i) { super(i + 1).190 Misliti na Javi class TanjirZaVeceru extends T anjir { TanjirZaVeceru(int i) { su p er(i). ks = new Kasika(i + 2). print("Konstruktor klase Noz"). . } } class Kasika extends Pribor { Kasika(int i ) { su p er(i). private TanjirZaVeceru tv . nz = new Noz(i + 4). print("Konstruktor klase V ilju s k a "). v i l j = new V ilju sk a (i + 3). } } class Pribor { Prib o r(in t i) { print("Konstruktor klase P rib o r"). } public class PostavkaStola extends Obicaj { private Kasika ks. private Viljuska v i l j . print("Konstruktor klase Kasika"). } } class Viljuska extends Pribor { V ilju sk a(in t i) { super(i) . print("Konstruktor klase TanjirZaVeceru"). tv = new TanjirZaVeceru(i + 5). print("Konstruktor klase PostavkaStola").

cl ass Obli k { O blik( i nt i) { print("Konstruktor klase O b lik "). Stoga. import s ta tic net. vi ne m ožete znati kada će sakupljač sm eća biti pozvan ili da li će u op šte biti pozvan. (O vo važi i za nasleđivanje i za ko m poziciju. Kao što je p o m e n u to u poglavlju Inicijalizacija i čišćenje. P rilično je zadivljujuće kako su klase jasn o razdvojene. } } } . void ciscenje() { print("Č išćenje klase O b lik ").*. tj. verovatno zato što je u Javi prak sa da objekte zabo rav ite u m esto da ih u ništavate i da p u stite sakupljač sm eća da p o v rati m e m o riju kad a je p o tre b n o . P rin t. m o rate izričito da napišete p o seb n u m e to d u i obezbedite da p ro g ram er klijent zna da m o ra pozvati tu m e to d u .Poglavlje 7: Ponovno korišćenje klasa 191 } public s ta tic void main(String[] args) { PostavkaStola x = new PostavkaStola(9). R azm o trim o p rim e r sistem a za projek tov an je p o m o ć u ra č u n a ra koji na ek ran u crta slike: //: ponovnaupotreba/CADSistem. N ije vam čak p o tre b a n ni izvorni k od m eto da da biste ih p o n o v o koristili. o n ne vodi ra č u n a o to m e d a li ste inicijalizovali objekte članove. pa m o rate sam i o to m e voditi raču na. n em a m e to d u koja se au to m atsk i poziva pri u n ištav an ju objekta.java // Obezbeđivanje pravilnog čišćenja package ponovnaupotreba. P o vrh svega —kao što će biti o p isan o u poglavlju Obrada grešaka pom oću izuzetaka .mindview.o d izuzetaka m o ra te d a se zaštitite tako što ćete odg o v araju ću p ro c e d u ru za čišćenje u g rad iti u blo k finally.) Garantovanje pravilnog čišćenja Java n em a ništa slično destruktoru iz C + + -a. U većini slučajeva treb a sam o d a uvezete paket. ako je za neku klasu p o tre b n o čišćenje. } } /* Isp is: Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor Konstruktor * ///:- klase klase klase klase klase klase klase klase klase klase Obicaj Pribor Kasika Pribor Viljuska Pribor Noz Tanjir TanjirZaVeceru PostavkaStola Iako vas prevodilac prisiljava da inicijalizujete osn ov ne klase i zahteva da to u čin ite odm ah n a p o četk u k o n stru k to ra . Ć esto je to sasvim u redu.uti1. ali u nekim slučajevim a klasa m ože d a obavlja izvesne aktivnosti koje zahtevaju čišćenje.

" + k ra j). } class L in ija extends Oblik { private in t pocetak.ciscen je ().k ra j = kraj. su p er.ciscen jeO . fo r (in t j = 0. j++) 1in i j e [ j ] = new L in i j a ( j . public CADSistem(int i) { superfi + 1). } } public class CADSistem extends Oblik { private Krug c. .ci sc e n je ()" ) . j < 1in ije . } void ciscenje() { p rin t("B ris a n je kruga"). } class Trougao extends Oblik { Trougao(int i ) { s u p e r(i).192 Misliti na Javi class Krug extends Oblik { Krug(int i) { s u p e r(i).ciscenjeO . private Trougao t. this. private L in ija [] l i n i j e = new L ini j a [3 ]. } public void c isce n je() { print("CADSistem. p rint("C rtanje kruga"). th is. c = new K ru g (l). } void cisce n je() { p rin t("B ris a n je l i n i j e : " + pocetak + ". t = new Trougao(l). in t kraj) { super(pocetak). super. kraj. } void ciscenjeO { p rin t("B ris a n je tro u g la"). su p e r.le n g th .pocetak = pocetak. j * j ) . L in ija (in t pocetak. p rin t("C rtan je l i n i j e : " + pocetak + ". " + k ra j). pri nt("Kombi novani konstruktor"). p rin t("C rtan je tro u g la ").

u stanje u kom e su bile pre nego što je objekat napravljen. jer im p licitn o nasleđuje k orensku klasu).1. } fin a lly { x . ..Poglav[je 7: Ponovno korišćenje klasa 193 // Poredak čišćenja je inverzan u odnosu na poredak in ic ija liz a c ije t . Svaka klasa im a svoju m e to d u ciscenje() koja vraća stvari bez ikakve veze s m em o rijo m . poziva i verziju te m etod e iz osn o v n e klase p o m o ć u rezervisane reči super. su p er. } public s ta tic void m ain(String[] args) { CADSistem x = new CADSistem(47).. 0 Čišćenje klase Oblik Čišćenje klase Obli k * ///:U ovom sistem u sve je neka v rsta Oblika (koji je i sam tip a Object.c is c e n je (). 1 Konstruktor klase Oblik Crtanje l i n i j e : 2.Krug. } } } /* Is p is : Konstruktor klase Oblik Konstruktor klase Oblik Crtanje l i n i j e : 0.im aju svoje k o n stru k to re koji „crtaju". Trougao i Linija .ciscen jeO . fo r (in t i = lin ije . Svaka klasa redefiniše m e to d u ciscenje() klase Oblik i p o red ostalog. 4 Konstruktor klase Oblik Crtanje kruga Konstruktor klase Oblik Crtanje trougla Kombinovani konstruktor CADSistem.c is c e n je (). p rem d a bilo koja m e to d a to k o m životnog veka objekta m ože da u rad i nešto što zahteva čišćenje. 0 Konstruktor klase Oblik Crtanje l i n ij e : 1.le n g th . Pojedine vrste klase Oblik . 4 Čišćenje klase Obli k Brisanje li n i j e : 1. i > = 0.ciscenje() Brisanje trougla Č išćenje klase Obli k Brisanje kruga Či šćenje klase Obli k Brisanje li n i j e : 2. i--) 1in i j e [ i ] .c is c e n je O .c is c e n je (). try { // Kod i obrada izuzetaka. c . 1 Čišćenje klase Oblik Brisanje li n i j e : 0.

) U o vo m slučaju. Ako v am je čišćenje p o tre b n o . Po prav ilu . a to su try i finally..O f. m ože d a čisti objekte bilo kojiin redosled o m .) Z atim pozovite m e to d u za čišćenje o sno v n e klase. b lo k try m ože se n ap u stiti na više n eu o biča jen ih načina. Sakrivanje imena Ako je u osnovnoj klasi u Javi defin isano im e m eto d e koje je kasnije nekoliko p u ta preklopljeno. što znači d a im a p o seb an tre tm a n . b lo k finally kaže: . (P ri o b ra d i izuzetaka. N ajbolje je n e oslan jati se na sakupljač sm eća ni za šta o sim za o slobađanje m em o rije. redefinisanje tog im en a m eto d e u izvedenoj klnsi //ect’ sakriti n ijed n u verziju iz o sn o v n e klase (za razliku o d C + + -a ).194 Misliti na Javi U m eto d i main() m o žete d a p rim e tite dve n o ve rezervisane reči koje neće biti d etaljn o o b jašnjene sve d o poglavlja O brada grešaka pom oću izuzetaka. } flo a t doh(float f) { p rin t("d o h (flo a t)" ) . Print class Homer ( char doh(char c) { p rin t("d o h (ch a r)"). bez o bzira na to kako se iz b loka try izlazi. Stoga prek lap an je fu n k cio n iše bez obzira na to da li je m eto d a definisana na to m nivou ili u o sn o v n o j klasi: / / : ponovnaupotreba/Sakrivanje. } . i to red osled o m koji je o b rn u t o d redo sled a pravljenja. n je m u m o ra te da p ristu p ite m arljivo i pažljivo. import s ta tic net. Ali. m e to d i ciscenje()) tak o đ e m o rate da v odite ra č u n a o p o retk u čišćenja osnov n e klase i o b jekata članova. treb a da p ra tite p rin c ip koji je uveo prevodilac jezika C + + za svoje d estru k to re: prv o o b av ite sve čišćenje k oje je specifično za vašu klasu.u t i1.java // Preklapanje imena metode osnovne klase u izvedenoj klasi // ne sakriva v erz ije iz osnovne klase. return 'd '.mindview. return l.Za x uvek pozovi m e to d u ciscenje(). Sakupljanje sm eća u o pšte n e m o ra da se d o go d i. U koliko jed an p o d o b je k a t zavisi o d d ru g o g . Jedan d eo to g p o se b n o g tre tm a n a o d n o si se n a k o d u n u ta r b lo k a finally koja sledi iza to g zaštićenog regiona. a ako se d o g o d i. (U o p štem slučaju. U m n o g im slučajevim a čišćenje nije p ro b le m i m o žete d a p u stite sakupljača sm eća da obavi posao. Taj k o d se uvek izvršava. n a p rav ite svoje m eto d e za njega i ne oslanjajte se na m eto d u finalize(). Rezervisana reč try naznačava da je b lo k koji sledi (u n u ta r v itičastih zagrada) zaštićeni region. V ežba 12: (3) D odajte o d g o v araju ću h ijerarh iju m eto d a ciscen je() svim klasam a iz vežban ja 9. p o što n a sak u p ljan je sm eća ne m ožete previše d a se oslo n ite. zap am tite da u svojoj m e to d i za čišćenje (u ovom slučaju. za to je p o tre b n o d a elem en ti o sn o v n e kiase i dalje b u d u u životu. kada je izričito čišćenje p o tre b n o . kao što je u n ašem p rim e ru p o k azan o . bez o b zira n a to šta se d o g ađ a“.

m ožete d o d ati tu an o tac iju i prevodilac će prijaviti grešku ukoliko je n e n a m e rn o preklo p ite um esto da je redefinišete: //: ponovnaupotreba/Lisa.d o h (l.d o h ('x '). } } III-- O znaka {C om pileT im eE rro r} uklanja ovu d ato te k u iz A nt skripta za prevođenje p rim era iz knjige.O f). . b . Kada hoćete da redefinišete m eto d u .d o h (l). ali se m ože u p o trebljavati kao da jeste.out.Poglavlje 7: Ponovno korišćenje klasa 195 class Milhaus {} class Bart extends Homer { void doh(Milhaus m ) {} print ("doh (Mi 1haus)1 1 ). ali ako p ro b a te ru č n o da prevedete taj p rim e r d obićete p o ru k u o grešci: method does not override a method from it s superclass T im e će anotacija <®Override sprečiti da slučajno preklo p ite m e to d u koja nije bila pred v iđ en a za to. što nije rezervisana reč. Inače rezultati m o g u biti zbun juju ći (zbog čega to u C++-U i nije dozvoljeno. } } public class Sakrivanje { public s ta tic void m ain(String[] args) { Bart b = new B a r t ( ) . da ne biste napravili grešku). b . U Javi SE5 d o d a ta je an o tacija @Override.doh(new M ilh au sO ). } } /* Is p is : doh(float) doh(char) doh(float) doh(Milhaus) * ///:Viciite da su sve preklopljene m eto d e klase Homer d o stu p n e u klasi Bart. Kao što ćete p ročitati u n ared n o m poglavlju. m eto de istog im ena se m n o g o češće redefinišu p o m o ću p o tp u n o istog potp isa i p o v ratn o g tipa kao i u osnovnoj klasi.U sakrile m etode osnovne klase). b. iako Bart uvodi novu p reklopljenu m e to d u (tim e bi se u C + + .java // {Compi1eTimeError} (Neće se prevesti) class Lisa extends Homer { OOverride void doh(Mi1haus m ) { System.println("doh(Mi 1haus)“ ) . b .

class Motor { public void s t a r t() {} public void rik v e rc () {} public void stop() {} } class Tocak { public void naduvaj(int psi) {} } class Prozor { public void podigni() {} public void spusti () {} } class Vrata { public Prozor prozor = new Prozor(). D a biste to postigli. a ne interfejs u g ra đ e n o g objekta. lakše će razu m eti interfejs. dodajte još je d n o p rek lap an je m eto d e i pok ažite d a su sve četiri m eto d e d o stu p n e u izvedenoj klasi. ali ne i n jen interfejs. P ošto o b jek ti čianovi i sam i koriste sakrivanje realizaciie.196 Misliti na Javi V ežba 13: (2) N ap rav ite klasu s m e to d o m k oja je prek lo p lje n a trip u t. Ponekad im a sm isla d a k o risn ik u klase dozv o lite d ire k ta n p ristu p k o m poziciji nove klase. u novu klasu treb a d a u g rad ite p riv atn i o bjek at p o sto jeće klase. ali k o risn ik te nove klase vidi interfejs koji ste vi za n ju definisali. Izbor između kompozicije i nasleđivanja I kom pozicija i nasleđivanje dozvoljavaju d a u m e tn e te p o d o b jek te u n o v u klasu (u k o m p o z iđ ji to m o ra te da u ra d ite eksplicitn o . O b jek at k o la je d o b a r p rim er: //: ponovnaupotreba/Kola. a u n asled iv an ju je to im p licitn o ). // sa dvoja vrata . K om pozicija se p o p rav ilu k o risti k ad a u novoj klasi h o ć ete da im ate m o g u ćn o sti p o stojeće klase. to m o žete b ez b o jazn i da u ra d ite. public Tocak[] tockovi = new Tocak[4]. desna = new V ra ta ().java // Kompozicija pomoću javnih objekata. M ožete d a se zapitate kakva je razlika izm eđ u n jih i k ad a se koja te h n ik a koristi. O d n o sn o . public Vrata leva = new V ra ta (). vi u g ra d ite ob jek at tako da ga m o žete k o ristiti za realizovanje fu n k cio n aln o sti u n ov oj klasi. public void o tv o ri() {} public void z a tvo ri() {} } public class Kola { public Motor motor = new M otor(). N eka je nasledi n ova klasa. o d n o sn o da objekte članove proglasite jav n im . Kada k o risn ik zna da je posredi sastavljanje o d više delova.

prozor. import s ta tic net. ) public s ta tic void m ain(String[] args) { Kola kola = new K o la (). Im ajte n a u m u da je ovo specijalan slučaj i d a polja u g lav n o m treb a da b u d u p riv atn a. } public String toStringO { . kola. Tada p o m o ć u zaštićenih m eto d a m ožete da dozvolite k o n tro lisan p ristu p n asled n icim a vaše klase: //: ponovnaupotreba/Ork. class Nitkov { private String ime. A ko m alo razm islite.u v e k tre b a da zad ržite pravo da m en jate o sn o v n u realizaciju. kola. ali je d o stu p n o svakom ko ovu klasu nasledi ili bilo kom d ru g o m u istom p ak etu “. V ežba 14: (1) U datoteci K ola. Rezervisana reč protected Pošto ste savladali nasleđivanje. } } ///= Pošto je k o m p o z iđ ja kola u ovom slučaju deo analize p ro b le m a (a n e sam o d eo osnovno g p ro jek ta).uti1. i++) to ck o v i[i] = new Tocak(). p riv a tn i članovi bi uvek bili p o tp u n o p riv atn i.podigni( ) . U o pštem slučaju. O d n o sn o .tockovi [ 0 ]. uvidečete k ako n em a sm isla d a klasu a u to p rav ite k o m p o zicijom o d klase v o zilo .leva. to znači d a uzim ate klasu o p šte n a m e n e i specijalizujete je za o d ređ e n e potrebe.naduvaj (72). Pri nasleđivanju polazite o d postoječe klase i p rav ite n je n u specijalnu verziju. proglašavan jem članova jav n im p o m aže te p ro g ra m e ru klijen tu d a shvati kako d a k oristi klasu. u Javi zaštićeno (engl.Poglavlje 7: Ponovno korišćenje klasa 197 public Kola() { fo r (in t i = 0. ali u stv arn im projektim a nekad ho ćete da nešto sakrijete o d šire jav n o sti. o n jeste vozilo.java // Rezervisana reć protected. i < 4. O n a kaže: „O vo je p riv a tn o što se tiče korisnika klase. rezervisana reč p ro te c te d n ap o k o n d o b ija značenje. najbolje je d a p o lja b u d u p riv atn a . Relacija jesteizražav a se nasleđivanjem a relacija sadrži izražava se k o m p o zicijo m . lako m o žete prav iti zaštićena polja. U id ealn om svetu. protected void postavi(String im) { ime = im. } public N itkov(String ime) { this. a da ipak izvedenim klasam a dozvolite p ristu p .mindview. a tim e se i sm an ju je slo žen o st k o d a koji a u to r klase m o ra d a napiše. protectcd) au to m a tsk i p o d ra z u m ev a i paketni p ristu p . P r in t.a u to n e sadrži vozilo.ime = ime.java klasi M o to r d o d ajte m e to d u serv is() i pozo v ite je iz m eto de m a in (). Rezervisana reć p ro te c te d d o p rin o si p ra g m atizm u .*.

m ožem o reći kako je objek at tipa Duvacki takođe i tip a Instrument. Sada n asledite tu klasu i pozovite zaštićenu m e to d u iz neke d ru g e m eto d e te nasleđene klase. Vežba 15: (2) N ap rav ite klasu sa zaštićen o m m e to d o m u n u ta r paketa. Svođenje naviše N ajbitniji vid nasleđivanja nije o b ezbeđivanje m eto d a n ovim klasam a. p rin t(o rk ). } public s ta tic void m ain(String[] args) { Ork ork = new OrkC'Limburger".orkBroj = orkBroj. Relacija m ože da se sažm e kao „nova klasa je tipa postojeće klase“. } } public class Ork extends Nitkov { private in t orkBroj. Na p rim er. public Ork(String ime. } } /* Isp is: Ork 12: Ja sam Nitkov i zovem se Limburger Ork 19: Ja sam Nitkov i zovem se Bob * ///:M ožete v ideti da m eto d a prom eni() im a p ristu p m eto d i postavi() je r je o n a zaštićena. N asledivanje predstavlja relaciju izm ed u nove i osn o v n e klase. // Dostupna zato što je zaštićena this. O b ratite p až n ju i na to d a je m eto d a toStringO klase Ork definisana p o m o ć u o d govaraju će verzije isto im en e m eto d e natklase. m ožete da pošaljete i izveđenoj klasi.to Strin g (). N aredni p rim e r pokazuje kako prevodilac p održava tu notaciju: . P okušajte da pozovete tu zaštićenu m e to d u van paketa i o bjasnite rezultate. Pošto nasleđivanje podra/. ork.um eva da su sve m etode osnovne klase d o stu p n e i u izvedenoj klasi. svaku p o ru k u koju m ožete da pošaljete osnovnoj klasi. i izvedenu klasu po d im en o m Duvacki. } public void promeni(String ime.orkBroj = orkBroj. pri nt (o rk ). 19). in t orkBroj) { super(ime). P reth o d n i opis nije izm išljen sam o da bi se objasnilo nasledivanje . bez greške. To znači da. Ako klasa Instrument im a m eto d u sviraj(). 12). im aće je i Duvacki in stru m en ti. } public String to Strin g () { return "Ork" + orkBroj + 1 1 + su p e r.198 Misliti na Javi return "Ja sam Nitkov i zovem se " + ime. in t orkBroj) { postavi(im e). this. p o sm atrajte o sn o v n u klasu p o d im en o m Instrument.jezik ga d irek tn o podržava.promeni("Bob".

upcasting).main(). Z bog toga n e po sto ji m e to d a m elodija() kojoj m ože da se prosledi objekat klase Instrument. dijagram e m o žete d a crtate n a bilo koji n ačin. Instrum ent. Prilikom svođenja naviše. Svođenje naviše je uvek bezb ed n o . čiji arg u m e n t je referenca n a Instrument.su instrumenti // je r imaju is t i in te rfe js : public class Duvacki extends Instrument { public s ta tic void main(String[] args) { Duvacki flauta = new Duvacki().m elodija(flauta). ali zato mora da sadrži o n e m eto d e koje p o sto je u osno v noj klasi. pa se to često zove svođenje naviše. (N aravno. izvedena klasa je natklasa osn o v n e klase. sve d o tre n u tk a d o k ne shvatite da je objekat tip a Duvacki takođe i objekat tip a Instrument. } } // Objekti klase Duvacki. m eto d a melodija() se poziva uz prosleđivanje reference na objekat klase Duvacki. a dijag ram se širi nadole. O n a m ože d a sadrži više m eto d a nego osn o v n a klasa. je r se sa o d ređenijeg tip a vraćate na opštiji.s v ira j ( ) . o d n o sn o . je d in o se m ože d o g o d iti da interfejs . č u d n o je da m e to d a koja prihvata jed an tip sp rem n o p rih v ata neki d ru g i.) D ijagram nasleđivanja za D u v ack i. a sam čin konverzije iz reference klase Duvacki u referencu klase Instrum ent naziva se svođenje naviše (engl.ja v a je: K onverzijom od izvedene ka osnovnoj klasi krećete se naviše k roz dijagram nasleđivanja. Z n aju ći da Java strog o proverava tipove. class Instrument { public voiđ s v ir a j() {} s ta tic void melodija(Instrument i) { / / ••• i .java // Nasleđivanje i svođenje naviše. u m eto d i Duvacki.Poglav[je 7: Ponovno korišćenje klasa 199 //: ponovnaupotreba/Duvacki. ali ne i objek at klase Duvacki. Zašto „svođenje naviše'? Ovaj naziv je zasnovan na trad icio n a ln o m n ač in u crtan ja d ijag ram a nasledivanja: koren je u v rh u . K od u n u ta r m eto d e melodija() rad i za klasu Instrument i za sve što je iz nje izvedeno. // Svođenje naviše } } ///:U o v om p rim e ru važna je m eto d a melodija(). M ed u tim .

konsta n ta n “. Vežba 16: (2) N ap rav ite klasu p o d im en o m Vodozemac. Stavite odgovarajuće m e to d e u o sn o v n u klasu. nasleđivanje je n e o p h o d n o . ali se p ri to m e javljaju o d re đ e n e dilem e. A ko za p a m tite ove prin c ip e i u p itate se: . M ožete poželeti da p ro m en e sprečite zbog p ro jek ta ili efikasnosti. 2. N asleđivanje ćete ređe k oristiti. m e to d e i klase. to n e znači da ga treb a k o ristiti gde go d je m oguće. Vežba 17: (1) Izm enite p re th o d n u vežbu tako da u klasi Zaba redefinišete m e to d u iz osn o v n e klase (n ap ra v ite nove definicije koristeći iste p o tp ise m eto d a). o čem u če biti reči u n a re d n o m poglavlju i poglavlju Podaci o tipu. rezervisana reč final m ože se i p o g rešn o u p o tre b iti. svedite ga naviše d o klase Vodozemac i p okažite da sve m eto d e i dalje rade. M ogu da predstavljaju v red n o sti koje inicijalizujem o to k o m izvršavanja.. m o žete da u ra d ite i su p ro ta n proces. U n a re d n o m o deljku razm atraju se tri slučaja u kojim a m ože da se u p o treb i rezervisana reč final: za p o d atk e. O sim svođenja naviše. pažljivo p ro u čite d a li v am n asleđivanje zaista treba. a n e d a ih d obije. u ru k a m a ćete im ati d o b ru alatku za o dlučivanje izm eđ u k om pozicije i nasleđivanja. K onstante su k o risn e iz dva razloga: 1. Z ato p revodilac dozvoljava svođenje naviše bez eksplicitne konverzije ili neke d ru g e p o se b n e notacije. U poglavlju Polim orfizam opi suje se je d a n o d o sn o v n ih razloga za svođenje naviše. treb a ga k o ristiti štedljivo. ali ako ne m o rate.Da li m i je p o tre b n o svođenje naviše?“. Iz nje nasledite klasu Zaba. Ponovo o biranju između kompozicije i nasleđivanja N ajčešči način za pravljenje i korišćenje o b jek tn o o rijen tisan ih p ro g ra m a jeste pakovanje p o d a ta k a i m eto d a u klase i u p o tre b a o b jek ata te klase. Rezervisana reč final Z načen je Javine rezervisane reči finai im a nekoliko nijansi. . Iz m eto d e main() n ap rav ite objekat klase Zaba. svođenje naniže. A ko m o ra te da k o ristite svođenje naviše. K oristićete i p ostojeće klase za izgrađ iv an je no v ih klasa k o m p o zicijo m .200 Misliti na Javi klase izgubi neke m e to d e. ali o p šte je: „Ovo ne m ože da se m enja“. Pošto su ti p rin cip i sasvirn različiti. u zavisnosti od ko n tek sta u kom je u p o treb ljen a.. Finalni podaci M nogi p ro g ram sk i jezici im a ju n ačin da p revodiocu naznače kako je neki p o d a ta k . N ajsig u rn ije ćete o d red iti d a li d a k o ristite k o m poziciju ili nasleđivanie ako se zap itate h o će li v am ikada b iti p o tre b n o svođenje naviše iz nove klase u o sn o v n u klasu. Baš su p ro tn o . sam o kada je jasn o da je nasleđivanje k orisn o . Iako je p ri p o d u čav an ju O O P -a p riličn o n aglašeno nasledivanje. M ogu da zad aju k onstantne vrednosti p ri prevođenju koje se nikada neće p ro m en iti. a ne želim o da b u d u m enjane. Pogledajte šta se dešava u m eto d i main().

m e đ u tim . // Paketni pristup public Vrednost(int i) { th is . private Vrednost vl = new Vrednost(11). n jen o značenje m ože da zbuni.util . svoju Idasu d a napišete tako da se n jen i o b jek ti efektivno p o n ašaju k ao d a su k o n stan tn i.) O vo og ran ičen ie se o d n o si i na nizove. private s ta tic fin al Vrednost VRE_3 = new Vrednost(33). O va v rsta k o n sta n ti u Javi m o ra da b u d e p ro sto g tip a i označava se p o m o ć u rezervisane reči final.id = id } // Mogu da budu konstante pri prevođenju private fin al int vrednostJedan = 9.u til import s ta tic net.mindview. koji su tak o đ e objekti. 5. (M ožete. 3. Sledi p rim e r fin aln ih polja.nextlnt(20).i = i } 1 public class FinalniPodaci { private s ta tic Random slucajan = new Random(47). to jest raču n an je m ože d a se obavi to k o m prevođ en ja.nextlnt(20). // Ne m ogu da budu konstante pri prevođenju: private fin al int i4 = slucajan. public F inalniPodaci(String id) { th is . ipak. N jena v re d n o st m o ra biti zad ata n a m estu definicije.Poglavlje 7: Ponovno korišćenje klasa 201 K ada se k o risti k o n sta n ta p ri p rev o đ en ju.. // N izovi: private fin al in t [] a = { 1. O b ratite p ažnju na to da se statičn a i finalna polja (tj. private String id. // : ponovnaupotreba/Finalni Podaci. 6 }. private s ta tic fin al in t VREDNOST_DVA = 99. final označava d a je vrednost k o n sta n tn a . import s ta tic ja v a . s ta tic fin al in t INT_5 = slucajan. čim e se ubrzava izvršavanje.u k lo p i“ u sva izraču n av an ja u k ojim a se pojavljuje. a uz referencu na objekat da je referenca k o n stan tn a. public String toStringO { . Sam objekat. K ada se rezervisana reč final ko risti u z reference n a objekte u m esto uz p ro ste tipove.Java ne o b ezb eđ u je n ačin d a neki proizv o ljan o b jekat p retv o rite u k o n stan tan . Uz p ro s t tip. s tim da se iz m e đ u reči piše p o tcrta. Kada se referenca je d n o m inicijalizuje i poveže sa o b jek to m . Za polje koje je i statičn o i finalno p ostoji sam o je d n o m esto za sldadištenje i o n o ne m ože da se m enja. 2. // Tipična javna konstanta: public s ta tic final in t VREDNOST_TRI = 39. p revo dio cu je dozvoljeno d a k o n sta n tn u vred n o st . m ože d a se izm eni . private fin al Vrednost v2 = new Vrednost(22).* . 4.P r in t. class Vrednost { in t i .java // Efekat rezervisane reči fin al na polja. o n a više ne m ože da b u d e p ro m en je n a tak o d a po k azu je n a neki d ru gi objekat. ko n stan te p ri p rev o đ en ju ) p o konvenciji pišu velikim slovim a.

p rin t("P ra v lje n je novog objekta FinalniPodaci" ) . p r in t ( f d l) . i < fd l. jer više nisu p o treb n e. //! fdl. pa se inicijalizuje sam o je d n o m pri učitavanju klase. finalne su i dobijaju vrednost prilik o m prevodenja.a = new in t [3 ] . INT5 = 18 Pravljenje novog objekta FinalniPodaci f d l: i4 = 15.VAL_3 = new Vrednost(l). } public s ta tic void main(String[] args) { FinalniPodaci fdl = new FinalniPodaci ( " f d l " ) .) Razlika se vidi iz rezultata izvršavanja p rim era. Isto važi i za niz. a reči su razdvojene p o tc rto m (kao i k on stan te u C -u. // Greška: ne možete da //! fdl. ne znači da ne m ožete m enjati vrednost objekta na koji ukazuje. // Objekat n ije konstantan! fd l. ne znači da je njegova vredn ost p o z n a ta u tre n u tk u prevođenja. VREDNOST_TRI je uobičajeniji način za definisanje takvih konstanti: kao javne. INT5 = 18 f d l: i4 = 13. jer sve k on stan te p ri prev ođ enju prevodilac isto tretira. Razlika se javlja sarno kada se vrednosti inicijalizuju prilikom izvršavanja.vrednostJedan++. V rednosti i4 za fd l i fd2 jedinstvene su. INT_5 = 18 * ///:Pošto su prom enljive vrednostjedan i VREDNOST_DVA prosto g tipa. } } /* Ispis: f d l: i4 = 15. da se naznači da su k on stantne. (I verovatno o p tim izu je i elim iniše. FinalniPodaci fd2 = new Fin aln iPo d aci("fd 2 "). // Objekat n ije konstantan! //! fdl.le n g th .n ije finalna fo r(in t i = 0. // Greška: vrednost ne može da bude promenjena fdl. da bi se naglasilo kako postoji sam o je d n a kopija i finalne.a. // promenite referencu //! fd l. Kao što m ožete videti u m etodi main(). i++) fdl.v2. k o n stan te p ri p rev o đ enju ). Taj deo p rim era tak ođ e p okazuje u čem u je razlika izm eđu statičn ih i nestatičn ih finalnih vrednosti. Prom enljive o d vl do VRK 3 pokazuju značenje finalnih referenci. odakle i potiče ova konvencija).a[i]+ + . obe m o gu da se u p o treb e kao k o nstan te p ri prevođenju i b itn o se ne razlikuju. p rin t(fd 2 ). rezervisana reč final znači da v2 ne m ožete da povežete s nekim dru g im objektom . p r in t ( f d l) .i++. U p rim eru . O na je statična. dok se v red no st INT _5 ne m enja n akon pravljenja dru g o g olijekta FinalniPodaci. koji je u suštini sam o druga vrsta . a ne svaki pu t kada se pravi novi objekat. po konvenciji napisane velikim slovim a. statične. Sam o zato što je nešto finalno. Ali pošto je v2 referenca. O b ratite pažnju n a to da su finalne i statične prom enljive pro stog tipa s k o n sta n tn im inicijalnim vred nostim a (tj.202 Misliti na Javi return id + ": " + "i4 = " + i4 + ". // O K -.v l = new Vrednost(9). to je po k azan o na prom enljivam a i4 i INT_5 koje su inicijalizovane slučajnim brojevim a to ko m izvršavanja.v2 = new Vrednost(O). zbog čega m o g u da se koriste i izvan paketa. to što je v2 finalna. INT_5 = " + INT_5.

ne postoji način da sam e reference u nizu proglasite finalnim . } } III-- Finalnim poljim a m o rate da dodeiite v rednosti p o m o ću izraza na m estu definicije ili u svakom k o n stru k to ru . Evo p rim era: // : ponovnaupotreba/PraznoFinalno. // In icija liz o v a n je praznog finalnog polja p = new Poppet(x). Na taj način se g aran tu je da su finalna polja uvek in iđjalizov ana pre upotrebe. U svim slučajevim a. Poppet(int i i ) { i = i i . // I n i c i j a l izovanje prazne finalne reference } public PraznoFinalno (in t x) { j = x. prazna finalna polja moraju da b u d u inicijalizovana p re nego što se u p o treb e i prevodilac to proverava.Poglavlje 7: Ponovno korišćenje klasa 203 reference. (Koliko ja znam . // In ic ij a l izovanje praznog finalnog polja p = new Poppet(l). .) Proglašavanje referenci finalnim čini se m anje korisnim o d proglašavanja prom enljivih prostog tipa finalnim. Vežba 19: (2) N apravite klasu s p razn o m finalnom referencom na objekat. m n o g o fleksibilnija. a da ipak pri to m zadrži neprom enljivost. ali im nije zadata inicijalizaciona v red n o st.java // "Prazna" finalna polja. N a p rimer. // prazna finalna promenljiva private final Poppet p. Prazna finaina polja su. D okažite da finalni elem ent m o ra biti inicijalizovan pre u p otreb e i da nakon toga više ne m ože da se m enja. // Inicijalizovana finalna promenljiva private final int j . finalno polje u n u ta r klase u to m slučaju m ože d a b u d e različito za svaki objekat. new PraznoFinalno (47). V ežba 18: (2) N apravite klasu koja im a statičn o finalno polje i finalno polje i p okažite razlike izm eđ u njih. class Poppet { private int i . m eđ u tim . } 1 public class PraznoFinalno { private final int i = 0. Prazna finalna polja Java dozvoljava pravljenje praznih fina ln ih polja (engl. // In ic ijalizovanje prazne finalne reference } public sta tic void main(String[] args) { new PraznoFinalno ( ) . // prazna finalna referenca // Prazna finalna polja MORAJU da budu in ic i j a l izovana u konstruktoru: public PraznoFinalno () { j = 1. blank finals). što označava polja koja su deklarisana kao finalna. U n u tar svih k o n stru k to ra inicijalizujte prazan finalni elem ent.

204 Misliti na Javi Finalni argumenti A rgum ente m ožete da pro g lasite fin aln im tak o što ih deklarišete k ao finalne u listi argum enata. skoči na kod m eto de i izvrši ga. U preth o d n im realizacijam a Jave. inline call). počisti arg u m en te sa steka i razm o tri p o v ra tn u v red n o st). o d n o sn o kako m eto d a ne m ože biti redefinisana. m ogao je (p o svom n a h o đ e n ju ) da preskoči uobičajen poziv (stavi arg u m en te na stek. Kada bi prevodilac naišao na poziv finalnoj m etod i. poziv m etode m ogao je da se zam eni k opijom stv arn o g k oda iz njenog tela. Ranije se kao dru g i razlog za koriščenje finalnih m eto da navodila efikasnost. kada biste m eto d u proglasili finalnom . } // Ne možete da promenite // Finalnu promenljivu prostog tipa možete samo da č ita te : int g(final in t i) { return i + 1. Finalne metode Za u p o tre b u finalnih m eto d a posto je dva razloga. To se radi zbog projektn ih razloga. // Nedozvoljeno -. vrati se. } // void f(fin a l int i) { i++.bez(nul1).zaključa“ kako bi se sprečilo da bilo koja klasa naslednica p ro m en i n jeno značenje. To znači da u n u ta r m e to d e n e m ožete m en jati o n o na šta taj a rg u m en t kao referenca ukazuje: //: ponovnaupotreba/FinalniArgumenti. dozvoljavali ste prevodiocu da sve pozive toj m eto d i u gradi d irek tn o u kod (engl.z a v rti().java // Upotreba rezervisane reči " fin a l" uz argumente metode. ali ga ne m ožete pro m en iti. kod počinje da se povečava i verovatno ne . bf. // OK -. kada želim o da b u d e m o sigurni kako če p on ašan je m etod e biti neprom enjen o p rilikom nasleđivanja. T im e su se elim inisali režijski troškovi sam og poziva. U m esto toga. class Stvar { public void z a v r ti() {} } public class FinalniArgumenti { void sa(final Stvar g) { //! g = new S tv a r (). } } lll--~ M etode f() i g() pokazuju šta se dešava kada su arg um enti prostog tipa finalni: argum ent m ožete čitati. ako je m etod a velika.g n ije finalno g . } public s ta tic void main(String[] args) { FinalniArgumenti bf = new FinalniArgumenti( ) . N aravno.g je finalno } void bez(Stvar g) { g = new S tv a r (). b f.sa(nul1). Prvi je da se m eto da .. To se koristi prvenstveno za prosleđivanje podataka an o n im n im u n u trašn jim klasam a koje čete u poznati u poglavlju Unutrašnje klase.

mindview.ako pokušate da redefinišete p riv atn u m eto d u (koja je im plicitno finalna).g ()" ) .to zaista itiože d a u b rz a vaš p ro g ra m . } private void g() { pri nt("Redefi ni sanjePri v a tn ih . import static net. ali njoj to ne daje nikakvo d o d a tn o značenje.net/Hooks/ NBetterlava im a te p o d a tk e o p ro filisan ju .f ( ) " ) . to ne b i treb alo da rad ite). // Takođe automatski finalna: private void g() { p rin t("S a d rz iF in a ln e . Pošto priv atn o j m eto d i ne m ožete da pristu p ite iz nasleđenih klasa.*. N a http://M indView. pustite da se prevodilac i izvršno o k ru žen je (JVM ) staraju o efikasnosti.g ()" ) .1 Finalno i privatno Svaka p rivatna m etod a u klasi im p licitn o je i finalna. to ćete sam o naizgled uspeti. } public void g() { p rin t("R ed efin isan jePrivatn ih 2 .f ()" ).java // Privatnu i l i privatnu finalnu metodu samo naizgled možete da redefinišete. ne m ožete n i da je redefinišete. ali je previše spo r. . p a više ne treb a da p o m ažete o p tim iz ato ru tako što ćete koristiti rezervisanu reč fin al (p o p ravilu. jer prevodilac neće prijaviti grešku: //: ponovnaupotreba/IluzijaRedefinisanjaFinalnih.f( ) " ) . P r in t. class RedefinisanjePrivatnih2 extends RedefinisanjePrivatnih { public fin al void f () { print("R edefinisanjePrivatnih2 . } } class RedefinisanjePrivatnih extends SadrziFinalne { private final void f ( ) { pri nt("Redefini sanjePri v a t n ih . jer b i sva u n ap ređ en ja bila zanem ariva u o d n o su na vrem e izvršavanja m etode. a m e to d u proglasite fin aln o m sam o ako želite izričito da sprečite n jen o redefinisanje. tehnologije v ru ćih tačaka) m ože da prep ozna takve situacije i p a m e tn o o d ab ere da li d a k oristi u m etan je k oda na m estu poziva za finalnu m eto d u . O vo stanje m ože da izazove zab u n u .uti1. v irtu e ln a m ašin a (ko n k retn o . U Javi SE5/6. } } 1 N e m o jte p o d le ć i isk u še n ju d a p re ra n o o p tim iz u je te . p ita n je je n io ž e te li to p o p ra v iti p o m o ć u re z erv isa n e reči fin a l. U novijim verzijam a Jave.Poglavlje 7: Ponovno korišdenje klasa 205 biste d o b iti poboljšanje p erfo rm an si. class SadrziFinalne { // Identično kao i kada sto ji samo "priva te": private final void f ( ) { p rin t("S a d rz iF in a ln e .g ()" ) . A ko p o s tig n e te d a vaš sistem ra d i. P rivatnoj m eto d i m ožete da dodelite specifikator final.

//! s f . O na je sam o neki kod koji je sakriven u n u ta r Idase i sam o slučajno im a isto im e kao m eto da u izveđenoj klasi.f( ) . o p 2 . V ežba 21: (1) N apravite klasu s fin aln o m m eto d o m . iz nekog razloga p ro jekat vaše klase nikad se neće m enjati ili iz bezbedn o sn ih razloga ne želite da o m o g u ćite nasledivanje. // Isto važi i ovde: SadrziFinalne sf = op2.g () . Pošto je privatna m etoda n e d o stu p n a i efektivno nevidljiva. f ( ) . O d no sn o.206 Misliti na Javi public class IluzijaR edefinisanjaFin alnih { public s ta tic void m ain(String[] args) { RedefinisanjePrivatnih2 op2 = new RedefinisanjePrivatnih2 ( ) . .f(). //'■ o p . zaštićenu m e to d u ili m eto d u s p ak etn im p ristu p o m u izveđenoj klasi.g (). //! s f . Ako napravite javnu m eto du . in t j = 1. D ru g im rečim a. //: ponovnaupotreba/Preistorijski. Vežba 20: (1) Pokažite da anotacija <®Override reša\'a problem razm otren u ovom odeljku. Niste redefinisali postojeću m e to d u . // A li ne možete da pozovete metode: //! o p . saopštav ate da tu klasu ne želite da nasleđ u jete niti dozvoljavate bilo kom e da to učini. m o rate biti u m o g ućno sti da objekat svedete naviše do njegovog prostog tipa i da pozovete istu m e to d u (p o en ta ovoga će postati jasna u n a red n o m poglavlju). class MaliMozak {} fin al class Dinosaurus { in t i = 7. nego napravili novu. o n a nije deo interfejsa o snovne klase. // Možete da obavite svodenje naviše: RedefinisanjePrivatnih op = op2.f() Redefini sanjePri vatni h2. Finalne klase Kada ozn ačite da je cela klasa finalna (stavljajući rezervisanu reč final pre njene definicije). op2.java // Proglašavanje cele klase finalnom. U koliko je m etoda privatna.g() * ///:R edefinisanje se javlja sam o ako se m enja deo interfejsa osnovne kJase. o n a ne utiče ni na šta sem na organizaciju koda klase u kojoj je definisana. ne postoji veza s priv a tn o m m eto d o m koja m ože im ati takvo isto im e u osnovnoj klasi. } } /* Isp is: Red efinisanjePrivatnih2 . N asledite klasu i pokušajte da tu m eto d u redefinišete.g().

N aročito klasa V ector iz Jave 1. klasa S tack je nasledena iz klase V ector.a. Ako m eto d u proglasite fin aln o m .i =40. Kako je nasleđivanje sprečeno. void f ( ) {} } //! class Nastavak extends Dinosaurus {} // greška: Klasa 'Dinosaurus' ne može da bude proširena public class P re is to rijs k i { public s ta tic void m ain(String[] args) { Dinosaurus n = new Dinosaurus( ) .Poglavlje 7: Ponovno korišćenje klasa 207 MaliMozak x = new MaliMozak(). n aro čito klase opšte naraene. kontejnerska biblioteka .j++. m ože vam se učiniti lcao d o b ra iđeja da m e to d u proglasite finaln o m . što govori da Stack icstc V ector. sam i pro jek tan ti Jave izveli su tu klasu iz klasc V ector. n . Prvo.0/1. kako god izaberete. Kao što ćete videti u poglavlju Paralelno izvršavanje. sve tnetode u finalnoj klasi su im p licitn o (au to m atsk i) finalne. U prkos to m e. sin h ro n izo v an e su (rezervisana reč sy n ch ro n ized ). V ežba 22: (1) N apravite finalnu klasu i p okušajte da je nasledite. U glavnom je teško pred v id eti kako će se klasa p o n o v o koristiti. treb alo je da shvate kako su finalne m eto d e previše ograničene. ali su p ro je k tan ti nekako odlučili d a to nije u redu. O va priča p o tv rđ u je teo riju da p ro g ram eri loše p ogađaju m esta na kojim a treb a o p tim izovati. pažljivo razm islite. Lako je p retp o stav iti kako želite da nasledite i redefinišete tako fu n d am en taln o k o risn u klasu. po što ne p o sto ji način za njihovo redefinisanje. bez o bzira na to da li je sam a klasa finalr. Za finalna polja važe ista pravila kao i ranije. kao što su ad d E Ie m e n t() i eIem en tA t().1 koja se često koristi i koja je m ogla da b u d e još korisnija da nisu. ali on ne dod aje nikakvo novo značenje. } } III-- Polja finalne klase m ogu da b u d u finalna. u im e efikasnosti (što je gotovo sig u rn o bila zabluda) sve m etode proglašene finalnim . M eto d am a u finalnoj klasi m o žete da d o date specifikato r final. Zaista je loše što je tako nesp retan projekat ušao u sta n d ard nu bib lio teku pa svi m orarn o da se b o rim o s njim . i to sam o zato što niste m ogli zam isliti d a se o n a m ože koristiti na taj način. D rugo. n. Č im su n a taj način napravili Stack. Iro n ičn o . n. Ipak. (Na sreću. Pažljivo sa final Kada p ro jek tu jete klasu. m ada to i nije baš tačno s logičke tačke gledišta. S ta n d a rd n a Javina biblioteka je d o b a r p rim er. Ponekad je to zaista tako. sprečićete da vašu klasu p u te m nasleđivanja u p o treb i neki d ru g i p ro g ram er. f 0 .iz dva razloga. ali i ne m o raju . M ožda p om islite da ionako n em a šanse da iko ikada ređefiniše vaše m etode. m noge najvažnije m etode klase Vector. to p rav i značajne režijske troškove koji verovatno poništavaju svu korist o d toga što su inetode finalne.

i dalje do sta n o v ih p ro g ra m a k oriste sta ru k o n tejn ersk u bib lio tek u . R azm o trite n are d n i p ro g ram : //: ponovnaupotreba/Buba. je r o n a im a d ru g i p ristu p učitav an ju . Svi statičn i objekti i statični delovi koda inicijalizuju se u tre n u tk u učitav an ja p o „redosledu pisanja" (tj. (Videćete i da su im ena m eto d a u klasi Hashtable m n o g o k raća o d im en a u klasi Vector.* . obavlja se i statičk a inicijalizacija. u C++-U se javlja p ro b lem kada jed an statični elem en t očekuje da d ru g i b u d e isp rav an p re nego što je taj d ru g i statični elem ent inicijalizovan.1.m indview . m o žem o reći da se . jo š je d n a v ažn a klasa iz sta n d a rd n e bib lio teke Jave 1.208 Misliti na Javi savrem ene Jave zam enjuje ldasu Vector klasom ArrayList. ali se učitavanje obavlja i prilikom p ristu p a n ja statičk o m po lju ili statičkoj m e to d i. . U Javi se taj p ro b lem n e pojavljuje. priličn o je o čigledno d a su neke klase p ro jek to v ali sasvim različiti Ijudi. N akon toga sledi inicijalizacija. O b ičn o se klasa učitava p rilik o m k o n stru k cije prv o g o b jek ta te klase.) V ažno je n a p o m e n u ti d a klasa Hashtable. koja se po n aša m n o g o p rim erenije.. u p o retk u kojim ste ih napisali u definiciji klase). class Insekt { int i = 9. O vo je je d n a od aktiv n osti koje su p ostale lakše zato što je u favi sve objekat. kako p o re d a k inicijalizacije statičn ih e lem en ata ne b i p ro u zro k o v ao p ro b lem e. Kada stvari nisu dosledne. Insekt() { ' I k o n stru k to r je statična m etoda. što je još je d a n dokaz. i nt j .P r in t. Setite se da se prevedeni kod svake klase nalazi u zasebnoj dato teci.) Baš to k o risn icim a b ib lio teke klasa ne bi treb alo d a b u d e očigledno.kod klase učitava na inestu prve u p o tre b e “. P rim era rad i.util. U opšteno. import s ta tic net. Inicijalizacija i nasleđivanje Da bism o dobili celovitu sliku o svem u ovom e. P roces inicijalizacije u tak v im jezicim a m o ra da b u d e pažljivo k o n tro lisan . inicijalizuju sam o jed n o m . m ada se rezervisana re ć s ta tic ne m ora eksplicitno navesti. Dakle. (U k o n tejn ersk o j b ib lio teci sav rem en e Jave. Kao što je već rečen o n a d ru g im m estim a u ovoj knjizi. tiema n ije d n u fin aln u m e to d u .0/1. k o risn ik sam o im a više posla. N ažalost.) Inicijalizacija i učitavanje klasa P ro g ra m i pisani n a većini jezika učitav aju se u celini u o k v iru p o k re ta n ja p ro g ra m a.java // Potpuni proces in ic ija liz a c ije . S tatični ele m e n ti se. a zatim o tp o čin je p ro g ra m . klasa Hashtable je zam en jen a klasom Hashmap. p o g le d a jm o ceo proces inicijalizacije uključujući i nasleđivanje. To go v o ri d a p ro jek a t i k o d treb a pregledati više p u ta.2 Prilikom prvog korišćenja klase. preciznije je reći da se klasa učitava o n d a kada se pristupi biio kojem njen o m statičnom članu. n arav n o . Ta d ato tek a se ne učitava sve d o k taj k o d ne b u d e p o treb an .

zbog čega prevodilac (u d atoteci Buba. U to m tre n u tk u . Z atim se obavlja statička inicijalizacija u korenskoj o sn o v n o j klasi (u n ašem slučaju klasi Insekt). Buba b = new Buba().x2 " ) . j = 39.) Ako o sn o v n a klasa im a so p stv en u o sn o v n u klasu. j =0 Buba. tako što se m em o rija u o b jek tu p o p u n i b in a rn im n u lam a. Prvo. n ajpre p okušavate d a p ristu p ite (statičn o j) rnetodi Buba.to se obavlja o d je d n o m .k in ic ija liz o v a n a "). učitan e su sve n e o p h o d n e klase i objek at m ože da b u d e napravljen.xl in icijaliz o va n a statična promenljiva Buba.Poglavlje 7: Ponovno korišćenje klasa 209 p r in t("i = “ + i + “ . p ro b a jte da stavite u k o m e n ta r pravljenje objekta. public s ta tic void m ain(String[] args) ( printf'konstruktor klase Buba"). O vaj redosled je b itan . } private s ta tic in t xl = p r in t ln it ( “ in ic ijaliz o v a n a statična promenljiva In s e c t.main(). je r statička inicijalizacija izvedene klase m ože da zavisi o d p rav iln e inicijalizacije nekog statičkog člana osn o v n e klase. i o n a će biti u čitan a i tako redom . zatim u sledećoj izvedenoj i tako redom . To će se d o g o d iti bez o b zira na to da li ćete p raviti objekat te osn ov n e klase. pa zatim učita i nju. U n ašem slučaju. p r in t("j = " + j ) . return 47. Z atim se poziva k o n stru k to r o sn o v n e klase. P ro gram za učitavanje (engl. public Buba() ( p rin t("k = " + k). . loader) p rim eču je d a o n a im a o sn o v n u klasu (što označava rezervisana reč extends).x2 konstruktor klase Buba i = 9. (Kao dokaz.class) traži p revedeni k o d klase Buba. a reference na objekte d o bijaju v re d n o st n u l l . } private s ta tic in t x2 = p rin tIn it("in ic ija liz o v a n a statična promenljiva Buba. } } /* Is p is : in icijaliz o va n a statična promenljiva Insekt. s ta tic in t p rin tIn it(S trin g s) ( p r in t (s ). } } public class Buba extends Insekt ( private in t k = p rin tIn it("Bu b a . sve pro m en ljiv e p rostog tipa do b ijaju p o d ra zu m e v a n e v red n o sti. j = " + j ) .k in icijaliz o va n a k = 47 j = 39 * ///= Kada p o k ren ete klasu Buba.x l“ ) .

K onačno. m o žete im p ro m en iti tačan tip.net. P ratite i objasn ite rezu ltat p ro g ra m a . a sam im tim i p o n ašan je to k o m izvršavanja. u p rvo m p ro lazu kroz p ro jek at treb alo b i d a se k o n cen triše te na k o m p o ziciju (ili na delegiranje). držeći se istog fo rm ata kao kod postojećih klasa. N asleđivanje i k o m pozicija sp ad aju m eđ u najvažnije alatke u objektno o rijen tisan o m p ro g ra m ira n ju koje om o g u ćav aju takvo ek sp erim e n tisan je.i više n ep o sred n ih p o d ata k a o rezu ltatim a . p a m ože da b u d e svedena navišc ka osnovi. U koliko p ro jek at p o stan e previše složen. p o n ašan je objekta nastalog p o m o ć u kom pozicije m o žete da m en ja te to k o m izvršavanja.uzgajate“ svoj projekat kao organsko biće koje se razvija. važno je da shvatite kako je razvoj p ro g ram a p o stu p an proces. N jegova osnova je ek sp erim e n tisan je. U prkos veom a n aglašenom n asledivanju u o b jek tn o o rije n tisa n o m p ro g ra m ira n ju . n ijed n a klasa ne treb a da b u d e ni prevelika (s toliko m o gućno sti da postaje n ezg rap n a da bi se p o n o v o koristila) ni p rem ala (toliko da ni vi ne m ožete da je koristite takvu kakva je već je m o rate p ro širiti).java. izvršava se o statak tela k o n stru k to ra . u m esto da ga o d je d n o m pravite kao stakleni soliter. Sažetak I nasleđivanje i kom pozicija o m o g u ćav a ju da o d po sto jećih tip o v a n a p ra v ite nove. R ešenja o d a b ra n ih vežbi d a ta su u e le k tro n sk o m d o k u m e n tu Thinking in Jnva Annotated Solutiini Guide. što je veom a b itn o za p o lim o rfizam (kao što ćete videti u n ared n o m poglavlju). Im aćete m n o g o više u sp eh a . vaš cilj je d a p ro n a đ e te ili n ap rav ite sk u p klasa u k om e svaka klasa im a specifičnu n a m en u . baš kao i čovekovo učenje. . iz klase Buba n asledite specifičnu v rstu b u b e. D ru g im rečim a. Kada počnete da p ro jek tu jete sistem .210 Misliti na Javi poziv se obavlja au to m atsk i.. Iukavo p rim en ju ju ći nasleđivanje na objekte članove. Vežba 24: (2) U dato teci Buba. U nasleđivanju. K o n stru k to r osn o v n e klase p ro lazi k roz isti p ro ces i istim red o sled o m kao k o n stru k to r izvedene klase. ali i dalje nećete znati sve o d g o v o re kada se u p u stite u projekat. K om pozicija upotrebljav a postojeći tip kao d eo o sn o v n e realizacije n o v o g tip a.ako . a nasleđivanje pon o v o u potrebljava interfejs.MindView. pro m en ljiv e in stance inicijalizuju se p o p o retk u pisanja. koji se m o ž e k u p iti n a VVeb lokaciji www. N akon obavljene k o n stru k cije o sn o v n e klase. izvedena klasa o b u h v a ta interfejs o sn o v n e klase. Kada projektujete sistem . D o k ažite d a učitavanje m ože da b u d e p ro u zro k o v an o bilo p ravljenjem prve in stan ce te klase bilo p ris tu p o m statičn o m članu. a nasleđivanje koristite sam o kada je n eo p h o d n o . često p o m aže kada d o d a te nove objekte nastale cep an jem p ostojećih na m anje delove. Vežba 23: (2) D okažite da se klasa učitava sam o je d n o m . ali tak o đ e m o žete d a o d red ite koji k o n s tru k to r o sn o v n e klase treb a da b u d e pozvan (prva o p eracija u k o n stru k to ru klase Buba) p o m o ć u rezervisane reči super. Uz to. m ožete b eskrajno dug o da an alizirate stvari. K om pozicija u m e da b u d e fleksibilnija.

K apsulacija daje nove tipove k o m b in o v an jem k arak teristik a i po n ašan ja.Polimorfizam „Pitali su tne: ’M o lim vas. p o re d apstrakcije p o d atak a i nasleđivanja. upcasting) zbog načina crta n ja stabala nasleđivanja —sa o sn o v n o m klasom u vrh u . Sakrivanje realizacije odvaja interfejs o d realizacije tako što detalje proglašava p riv a tn im .muzika publi c enum Nota ( SREDNJE_C. P olim orfizam o b e /b ed u je još je d n u d im en ziju u razd vajan ju interfejsa i realizacije. m e đ u tim . // Itd . gospodine Bebidže. Videli ste tak ođe da se pojavljuje i p ro blem p rikazan u sledećem p rim e ru s m u zičkim in stru m e n tim a. Čarls Bebidž (1791-1871) PO L IM O R FIZA M PREDSTAVLJA TR EĆU SUSTINSKU O SO B IN U O B IEK TN O O R IJEN TISA N OG pro g ram sk o g jezika. C_P0VISEN0. pošto se u više ovih p rim e ra sviraju n o te. recite hoće li iz vaše m ašine izaći tačni odgovori čak i ako u nju unesetepogrešne brojeve?’N e m ogu da p o jm im k a kva je zbrka u glavam a Ijudi koji p ita ju tako šta“ . P olim orfni poziv m eto d e o m ogućava da jed an tip izrazi svoju različitost o d d ru g o g sličnog tip a. kao i k a sno vezivanje ili vezivanje prilikom izvršavanja) poći ćete o d osnova. razdvaja šta i kako. dokle god su oba izvedena iz istog pro stog tipa. Prvo. B_SNIZEN0 . O vakva m eh an ička organizacija je p o tp u n o jasn a n ek o m e ko im a iskustva u p ro c e d u ra ln o m p ro gra m ira n ju . Ponovo o svođenju naviše U p re th o d n o m poglavlju videli ste kako objekat m ože da b u d e u p o tre b ljen kao objekat sopstvene klase ili kao objekat natklase. tj. p o lim o rfizam om o g u ćav a i pisan je proširivih p ro g ra m a koji m o g u d a . To je veom a b itn o . package polimorfizam. uz jed n o stav n e p rim ere koji ne sadrže ništa d ru g o sem p o lim o rfn o g p o n ašan ja p ro gram a. to se naziva svođenje naviše (engl..rastu“ i to k o m p o če tn o g pravljenja p ro je k ta i kada zatreb aju nove m o gu ćno sti. P olim orfizam . je r o m o g u ćava d a m n o g o tip ov a (izvedenih iz istog prosto g tip a) b u d e o b rađ iv a n o kao đa su svi jed n o g istog tip a i d a jed an isti kod radi jed n ak o sa svim tim različitim tipo vim a. > ///:- . Pored toga što o m o g u ćava n a p re d n iju o rganizaciju k o da i poboljšava čitljivost. U ovom pogiavlju o p o lim o rfizm u (koji se tak ođ e naziva dinam ičko vezivanje. Ta različitost se ispoljava u p o n a šan ju m eto d a koje m ožete d a pozovete preko o sno v ne klase.java // Note koje će se s v ira ti na tnuzičkim instrumentima. tre b alo bi d a u n eko m p aketu n ap ravim o zaseban tip N o ta definisan nab rajan jem : //: polimorfizam/muzika/Nota. Kada referencu na objekat tre tira te kao referencu natklase. razdvaja klase p o tipovim a. U p re th o d n o m poglavlju ste videli kako nasledivanje o m og ućava d a ob jek at tre tira te kao objekat sopstvenog tipa ili kao objekat natklase.

212 Misliti na Javi Nabrojane tipove pređstavili smo u poglavlju Inicijalizacija i čišćenje. // Svođenje naviše } } /* Isp is: D uvacki.muzika public class Muzika { public s ta tic void melodija(Instrument i ) { / / ••• i. je r je klasa Duvacki nasleđ en a iz klase Instrument.T o je prihvatljivo. } public s ta tic void m ain(String[] args) { Duvacki flauta = new Duvacki().out. zato je Duvački nasleđen od Instrumenta: //: polimorfizam/muzika/Instrument. class Instrument { public void sviraj(N ota n) { print(''Instrum ent..P r in t. U to m o žete d a se uverite u m eto d i main().java //: Nasleđivanje i svođenje naviše package polimorfizam.s vira j( ) " + n).sviraj ( ) " ) .suzi“ interfejs. m e lo d ija(flau ta ).ali takode i na bilo šta što je iz te klase izvedeno.* .sviraj() SREDNJE_C * ///:M etoda Muzika. pa u njoj m o ra da p o stoji interfejs klase Instrument.printl n ("D u v a c k i.muzika // Objekti klase Duvacki su instrumenti // je r imaju is t i in te rfe js : public class Duvacki extends Instrument { // Redefinisanje metode in te rfe js a : public void sviraj(N ota n) { System.java package polimorfizam. ali o n neće biti m anji od p o tp u nog interfejsa klase Instrument.melodija() p rih v ata reference n a o b je k te klase Instrum ent.SREDNJE_C). . Svodenje naviše iz klase Duvacki na klasu Instrument m ože da . } } III-- //: polimorfizam/muzika/Instrument.s v i raj(Nota.java package polimorfizam. a da nem a p o trebe za eksplicitnom ko n v erzijo m .muzika import s ta tic net.util. } } III-//: polimorfizam/muzika/Instrument. Ovde je Duvački tip Instrumenta.m indview . u kojoj se m eto di melodija() p ro sleđ u je referenca na objek at klase Duvacki.

} public s ta tic void melodija(Zicani i) { i . } public s ta tic void melodija(LimeniDuvacki i) { i.sviraj() SREDNJE_C * ///:- .sviraj( ) " + n). To nas d o v o d i d o ključnog dela: u to m slučaju. za svaki tip in s tru m e n ta m o rali biste da pišete n o v u m e to d u m e lo d ija().* . } public s ta tic void m ain(String[] args) { Duvacki flauta = new Duvackif). svi raj(Nota. LimeniDuvacki francuskiRog = new LimeniDuvacki( ) .SREDNJE_C). // Nem a svođenja naviše m e lo d ija (v io lin a ). Zicani vio lin a = new Z ic a n i().java // Preklapanje umesto svođenja naviše package polimorfizam. melodija(francuski Rog).muzika import s ta tic net. Z ašto b i iko n a m e rn o zanem ario tip objekta? Baš to se dešava p ri svo đ en ju naviše. P retp o stav im o da tak av način razm išljanja p rim e n ite i n a ostale in stru m en te: //: polimorfizam/muzika/Muzika2. class Zicani extends Instrument { public void sviraj(N ota n) { p rin t("Z ica n i .Poglavlje 8: Polimorfizam 213 Zanemarivanje tipa objekta M o žda v am p ro g ra m M u zik a.ja v a izgleda n eobično. m e lo d ija (fla u ta ). N aizgled je m n o g o logičnije da arg u m e n t m eto d e m e Io d ija () b u d e referenca n a klasu D u v ack i.s v ira j ( ) " + n). s v ir a j () SREDNJEC Lim eniD uvacki.SREDNJE_C). } } class LimeniDuvacki extends Instrument { public void sviraj(N ota n) { print("Lim eniD uvacki. } } /* Isp is: D u va ck i.util .svira j() SREDNJE_C Z ic a n i.P r in t. svi raj(Nota.SREDNJE_C).mindview. s v i raj(Nota. } } publi c class Muzi ka2 { public s ta tic void melodija(Duvacki i) { i .

o d n o si se na ran o vezivanje.sviraj(). čiji b i arg u m en t bila osn ov n a klasa. C im a sam o jed an n ačin za pozivanje m etoda. linker.214 Misliti na Javi Ovaj p ristu p dovodi d o željenih rezu ltata. To n a sa m o m p o četk u zahteva više p ro g ram iran ja. D o b ijen je željeni rezultat. ali u z veliku m an u : za svaki novi Instrument koji dodate. M eđ u tim . čim e se označava da se vezivanje obavlja prilik o m izvršavanja. Vežba 1: (2) N apravite klasu Cikl s p o tk lasam a Unicikl. P rim era radi. p a ceo proces ra d a s tip o v im a p o staje v eo m a nep o d esan . Vezivanje poziva metoda Povezivanje poziva m eto d e i tela m eto d e naziva se vezivanje (engl. late binding). to se naziva rano vezivanje (engl. ne m ože da zna koju m eto d u treb a da pozove. Kako. ali tak o đ e znači da ćete im ati i p u n o posla ako želite d a d o d a te n o v u m e to d u sličnu m eto d i m elodija() ili n o v u p o tk lasu klase Instrument. a ne neka p o seb n o izvedena klasa? O d n o sn o . m ora . Kada se vezivanje obavi pre pok retan ja p ro g ram a (što rad e prevodilac i p ro g ram za povezivanje . prevodilac uopšte m ože znati da referenca na Instrument u stvari p o k azu je na objek at klase Duvacki. Kada je u n ekom jeziku o m o g u ćen o k asn o vezivanje. biitciing). a ne na objekat klase LimeniDuvacki ili Zicani? Prevodilac i ne zna. D o d ajte to m e činjenicu d a prevodilac neće p rijav iti p o ru k u o grešci ako zab o rav ite da p rek lo p ite n eku m e to d u . Pokažite da se p rim e ra k svakog o d tih tipova m e to d o m v o z iti( ) m ože svesti naviše na Cikl. Da biste ovo pitanje bolje razum eli. O n o što u p re th o d n o m p rim e ru zb u n ju je. u zavisnosti od tipa objekta. early binding). većina p ro g ra m e ra sa iskustvom u p ro c e d u ra ln o m p ro g ra m ira n ju m a lo teže ra z u m e n ačin n a koji p o lim o rfizam deluje. Pošto prevodilac im a sam o referencu na Instrument. korisno je p ro u č iti vezivanje. m o ra te d a n ap išete p o se b n u m eto d u . P o sm atrajte m e to d u melodija(): public s ta tic void melodija(Instrument i) { / / ••• i . Bicikl i Tricikl. Začkoljica P roblem s p ro g ram o m Muzika.engl. Rezultat će b iti poziv m eto d e Duvacki. } O n a do b ija referencu na Instrument. M oguće je da za ovaj te rm in uopšte niste čuli zato što u p ro ce d u ra ln im jezicim a i nije bilo d ru g e m ogućnosti. ako postoji). d yn a m ic binding) ili vezivanje prilikom izvršavanja (engl. ali ne izgleda logičn o zašto to tak o radi.sviraj(Nota.SREDNJE_C). a to je ran o vezivanje. runtim e binding). K asno vezivanje se još naziva i dinam ičko vezivanje (engl. Rešenje tog pro b lem a naziva se kasno vezivanje (engl.java m ože d a se u oči n ak o n p o k retan ja p ro g ram a. o n d a. Z ar n e bi bilo m n o g o lepše ako b iste m o g li d a napišete sam o je d n u m e to d u . zar ne bi bilo fino ako biste m ogli z an em ariti čin jen icu d a su to izvedene klase i m ogli da napišete p ro g ram tak o d a se ob raća sam o o sn o v n o j klasi? P olim orfizam v am om ogućava baš to.

T ro u g ao itd. U Javi se svi p ozivi m eto d a obavljaju p rek o k asn o g vezivanja. U većini slučajeva. nije slučaj. D ru g im rečim a. o n pro g ram ere početn ik e m ože navesti da pogrešno pom isle kako O O P služi sam o za p ro g ra m ira n je grafike. jer je lako pojm ljivo kada kažem o „k ru g je oblik “. nažalost. m e đ u tim . Dobijanje pravilnog ponašanja Im ajući na u m u da se svi pozivi in eto d a u Javi oliavljaju po lim o rfn o . K v ad rat.isJđjučujete“ d in am ičk o vezivanje. prev o d ilac i dalje ne zna tip objekta.. tim e sprečavate redefinisanje. M eđ u so b n i o d n o si su p o k azan i na d ijag ram u nasleđivanja: Svođenje naviše kroz dijagram nasleđivanja K v a d ra t Trougao nacrtaj() Identifikator objekta Krug nacrtajd obriši obriši . Klasičan p rim e r u O O P -u je onaj sa oblicim a. pa je najbo lje da rezervisanu reč fin a l k o ristite sam o kao posledicu projekta. V erovatno da je još b itnije što tim e efektivno . ali m eh anizam za pozivanje to o tk riv a i poziva od g o v araju će telo m etode. Z bog čega biste n e k u m e to d u proglasili finalnom ? Kao što je u p re th o d n o m poglavlju n a p o m e n u to .o n o se u p o treb ljav a au to m atsk i. ali je jasn o d a u objekte m o ra da b u d e u g ra đ e n a nekakva in fo rm ac ija o tip u .Poglavlje 8: Polimorfizam 215 p o sto jati m e h a n iz a m koji o d ređ u je ta ča n tip o b jek ta p rilik o m izvršavanja i koji će p o to m pozvati o d g o v araju ću m e to d u . tako se neće o stv ariti opšte pob o ljšan je p erfo rm an si p ro g ra m a . O vaj p riin e r je veo m a p o g o d an . p ro g ra m m o žete da pišete tako da se o b raća osn o v n o j Jđasi pa će p o u z d a n o ispravno rad iti i sa svim izveđenim klasam a. To znači d a o b ično n e m o ra te od lu čiv ati o to m e da li će se k o ristiti kasno vezivanje . M eh an izam kasnog vezivanja v arira o d jezika d o jezika. n arav n o . osim ako je m eto d a p ro glašena sta tič n o m ili finaln o m (p riv a tn e m eto d e su im p licitn o finalne). O n se često koristi je r se lako p rikazuje ali. o d n o sn o u k azu jete p rev o d io cu kako d in am ičk o vezivanje nije n e o p h o d n o .„p o šaljite p o ru k u o bjektu i p u stite ga da sam o tkrije šta treb a da u ra d i“. preko kasnog vezivanja. To om o g u ćav a nešto efikasnije pozivanje fin aln ih m etoda. P rim e r sa o b licim a im a o sn o v n u klasu p o d im e n o m O b lik i razne izvedene klase: K ru g . a ne kao p o k u šaj za poboljšavanje p erfo rm an si. O d n o sn o . što.

java package polimorfizam. P rin t. public class Kvadrat extends Oblik { public void n a crta j() { p rin t("K v a d ra t.java package polimorfizam. ponovo.* .mindview. } } ///:// : polimorfizam/obli k/Kvadrat. što je naizgled greška (jer jed an tip d o d elju jem o d ru g o m ).* . zbog nasleđivanja. P retp o stav im o d a p o zovete n ek u m e to d u o sn o v n e klase (koja je red efin isan a u izveden im klasam a): o .util.java package polimorfizam. } public void o b ris i() { p rin t("K v a d ra t.P r in t. zbog kasnog povezivanja (p o lim o rfizm a) poziv a se o d g o v araju ća m e to d a Krug. o n d a. M ogli biste.o b risi( ) " ) . N ared n i p rim e r p o kazuje taj p rin c ip n a nešto d rugačiji način .oblik.uti1. Stoga se p revodilac slaže s p reth o đ n o m n a re d b o m i ne prijavljuje p o ru k u o grešci. prev o d ilac m o g ao bilo šta d ru g o da u ra di? A ipak. import s ta tic net.216 Misliti na Javi Svođenje naviše m ože d a se pojavi čak i u ovako jed n o stav n o j naredbi: Oblik o = new Krug().* .java package polimorfizam. import s ta tic net. public class Oblik { public void n a crta j() {} public void o b ris i() { } ) III-- //: polimorfizam/obl i k/Krug.obrisi ( ) " ) .m indview. pravi se objekat klase Krug.P r in t.n acrta j( ) " ) .n a crta j( ) . import s ta tic net. a njegova referen ca se o d m a h dodeljuje p ro m enljivoj tip a Oblik.nacrtajO. } ) III-- polimorfizam/oblik/Trougao. očekivati kako će b iti p o zv an a m eto d a nacrtajO klase Oblik. public class Krug extends Oblik { public void n a c rta j() { p rin t("K ru g . p o što je to ipak referenca n a Oblik .util. U ov o m slučaju. //: .m indview. Krug jeste Oblik.oblik.oblik.kako bi. a op et to je u red u jer.oblik. N ajpre ćem o n ap rav iti v išek ratn o u p otreb ljiv u b ib lio tek u tipo va Oblika: //: polimorfizam/oblik/Oblik. } public void o b ris i() { print("K ru g.n a crta j( ) " ) .

nacrtaj() Kvadrat.nacrtaj() Kvadrat.nacrtaj() Krug.java // Polimorfizam u Javi import polimorfizam. i++) o [i] = gen.nacrtajO Trougao.java //: "Proizvodjac" koji nasumično proizvodi oblike.nacrtaj() Kvadrat. public Oblik next() { sw itch(slucajan.nextlnt(3)) { default: case 0: return new Krug(). } } 1 III--//: polimorfizam/Oblici. case 2: return new Trougao().next().*.Poglavlje 8: Polimorfizam 217 public class Trougao extends Oblik { public void n a crta j() { print{"Trougao. public s ta tic void main(String[] args) { 0 b lik [] o = new Obl i k [9].nacrtaj() Trougao. package polimorfizam. } } /* Isp is: Trougao.length.nacrtaj() * ///:- .nacrtaj() Trougao. // Obavi polimorfne pozive metoda: fo r(0 b lik obl : o) obli k . } } III-- // : pol imorfizam/obli k/GeneratorSlucajnihOblika.obrisi( ) " ) .nacrtaj( ) " ) .u til public class GeneratorSlucajnihOblika { private Random slucajan = new Random(47).n a crta j( ) . case 1: return new Kvadrat(). // Popuni niz oblicima: fo r(in t i = 0.nacrtaj() Trougao. } public void o b ris i() { print("T ro ugao. i < o. public class Oblici { private s ta tic GeneratorSlucajnihOblika gen = new GeneratorSlucajnihOblikaO.oblik. import ja v a .oblik.

V ežba 3: ( I ) D o d ajte n o v u m e to d u osnovnoj klasi u dato teci O b lici. Svi pozivi m eto d i nacrtajO m o ra ju biti d in am ičk i vezani. P ri svakoj nared bi return obavlja se svođenje naviše. Prosirivost V ratim o se sada p rim e ru s m u zičk im in stru m e n tim a . klasi C ikl dodajte m e to d u to ck o v i() koja vraća broj točkova. svi oblici m o g u d a b u d u n a c rta n i i ob risani. V ežba 4: (2) D o dajte n o v u p o tk lasu klase O b lik u d ato teci O b lic i.ja v a koja ispisuje p oru k u . U to se m ožete u veriti iz rezu ltata p ro g ra m a kada ga p okren ete. Sada je redefinišite u sam o jed n o j izvedenoj klasi i v idite šta se dešava. jer m ožete da m u d o d ate novu fu nkc io n aln o st ako nove tipove p o d atak a nasledite iz zajedničke o sn o v n e klase. Z ato k ad g o d pozovete next().jav a i p o tv rd ite u m cto d i m a in () da p o lim o rfizam rad i za novi tip kao i za stare tipove.. p ri čem u se referenca n a Krug. zbog neke čarolije. kada p ro đ ete kroz taj niz i za svaki elem en t pozovete m e to d u nacrtajO. nik ad a ne v id ite koji je tip o d a b ra n . ali n e m o jte d a je redefinišete u izvedenim klasam a. O b jasn ite šta se dešava. u o p šte ne treb a da m en jate da bi prihvatile i nove klase.od n o sn o . redefinišite je u svim izvedenim klasam a.proizvođača“ koja vrača referencu na slučajno o d a b ra n tip o blika. Izm enite m eto d u v o z iti() tako da poziva m eto d u to ck o v i() i uverite se da p olim orfizam radi. D ijagram hijerarh ije nasleđivanja d a t je na slici: . U to m tre n u tk u znate d a im ate neke objekte klase Oblik ali n e zn ate n išta preciznije (n iti to zn a p revodilac).218 Misliti na Javi O sn o v n a klasa Oblik ustanovijava zajednički interfejs za sve što je iz nje nasleđeno . R azm o trite šta se dešava ako u p rim e ru sa in stru m e n tim a d o d a m o nove m eto d e u o sn o v n u klasu. K onačno. Izvedene klase redefinišu ove m etod e da b i obezbedile od g o v araju će p o n ašan je za specifičan oblik. bez p o treb e d a m en jate m eto d u m eIo d ija ().next(). kao i izvestan broj n o v ih klasa. N asu m ičn o pravljenje o blika treb a da vam dokaže kako prev o d ilac n e m ože zn ati išta što bi m u p o m o g lo da p rav iln o poziva m eto d e p rilik o m prev o đ enja. svaki tip p o čin je d a se p ra v iln o p o n aša. V ežba 5: (1) U vežbi 1. P olim orfizam o m o g u ću je da to m sistem u d o d ate koliko god želite novih in s tru m en ata. je r kao p o v ra tn u v red n o st uvek d o b ijate referencu na Oblik. Takav p ro g ram je proširiv . M etode koje obavljaju neki p osao preko interfejsa o sn o v n e klase. Klasa GeneratorSlucajnihOblika je neka vrsta . većina m eto d a ili sve naše m eto d e p ratile bi m o d el p rim e n jen na m e to d u m eIo d ija() i k o m u n ik aciju obavljale sam o preko interfejsa o sno v n e klase. V ežba 2: (1) U p rim e r sa oblicim a d o d ajte ano taciju @ O verriđe. taj niz se p o p u n ja v a poziv im a m e to d i GeneratorSlucajnihObIika. M eđ u tim . M eto d a m ain() sadrži niz referenci n a objekte klase Oblik. Kvadrat ili Trougao šalje iz m eto d e next() i p retv ara u p o v ra tn i tip Oblik. U d o b ro p ro jek to v an o m O O P p ro g ram u . svaki p u t k ad a pozovete n jen u m e to d u next().

import s ta tic net. Evo i realizacije dijagram a: //: polimorfizam/muzika3/Muzika3.muzika. class Instrument { void sviraj(N ota n) { p rin t("In stru m en t. bez po no v n o g prev o đ en ja.Nota. } void nastimuj() { p r in t( “ Štimovanje instrumenta").sviraj() " + n ).Poglavlje 8: Polimorfizam 219 Sve ove nove klase p rav iln o rade sa starom i n e izm en jen o m m e to d o m m elo d ija (). s v ir a j () " + n). } } class Duvacki extends Instrument { void sviraj(N ota n) { print("D uvacki.*.muzika3. } String sta () { return "Instrument". import polimorfizam.mindview. } . Ć ak i ako se m eto d a m e lo d ija () nalazi u posebnoj d a to te đ i ako se interfejsu klase In s tru m e n t d o d a ju n o \re m etode. p rav iln o raditi.P rin t. m e lo d ija () će. } String sta () { return "Duvacki". } void nastimujf) { print("Štimovanje duvačkog").java // Pro širiv program package polimorfizam.uti1 .

} public s ta tic void m ain(String[] args) { // Svođenje naviše prilikom dodavanja u niz: Instrument[] orkestar = { new Duvacki( ) . }.s v ir a jO String s ta () { return "DrveniDuvacki". } void nastimuj() { p r in t('‘Štimovanje žičanog"). } } class Zicani extends Instrument { void sviraj(N ota n) { p rin t("Z ic a n i . } String s ta () { return "U daraljke". } String s ta () { return "Z ic a n i".SREDNJE_C). } void nastimuj() { print("Štim ovanje u d araljke"). } } class LimeniDuvacki extends Duvacki { void sviraj(N ota n) { print("LimeniDuvacki . } public s ta tic void sveMelodije(Instrument[] e) { for(Instrument i : e) melodi j a ( i ). pa će novi tipovi // koje dodamo sistemu i d alje pravilno r a d iti: public s ta tic void melodija(Instrument i) { / / ••• i . new DrveniDuvacki( ) . } } public class Muzika3 { // Ne vodi računa o tipovima.220 Misliti na Javi class Udaraljke extends Instrument { void sviraj(N ota n) { print("Udaral jk e . new Udaral j k e ( ) . } } class DrveniDuvacki extends Duvacki { void sviraj(N ota n) { print("DrveniDuvacki . new LimeniDuvacki( ) .s v ira j () " + n ).sviraj(Nota.s v ir a j( ) SREDNJE_C U d a raljk e . } } /* Isp is: Duvacki .s v ira j () " + n ).nastim uj()").svira jO SREDNJE_C . sveM elodije(orkestar). new Z ic a n i( ) . s v ir a j( ) “ + n ). } void nastimuj() { print("Lim eniD uvacki. } " + n ).

println() (bez ikakve konverzije).util. p o p u n ite ga razn im o b jek tim a p otklasa klase Glodar. i m e to d a nastimuj() koja o m o g u ćav a da se svaki in s tru m e n t n a neki način naštim uje. Izm en e u k o d u n e rem ete delove p ro g ra m a n a koje i ne bi tre b alo da utiču. svedite ga naviše d o njegovog pro sto g tip a i pozovite prv u m etod u. D ru g im rečim a. package polimorfizam import s ta tic net. .P r in t. } public s ta tic void m ain(String[] args) { Redefin isa n je P riv a tn ih rp = new Izvedena(). pozovite m eto d e definisane u o sn o v n o j klasi i v idite šta se događa. N asledite tu klasu i redefinišite d ru g u m eto d u . Vežba 7: (2) U d a to te k u Muzika3.java d o d ajte n o v u p o tk lasu klase Instrument i uverite se da p o lim o rfizam rad i i za n o v i tip.java tako da objekte klase Instrument p rav i na slučajan način kao u dato teci Oblici.* . M eto da meIodija() je p o tp u n o im u n a na sve izm ene u p ro g ra m u i rad i p ravilno.f(). Vežba 10: (3) N apravite o sn o v n u klasu s dve m etode.java // Pokušaj redefinisanja privatne metode. Svaki p u t k ada nešto u b acite u niz orkestar u m eto d i m ain(). koja v ra ća referen cu n a ob jek at klase String u kojem je o pis klase. public class RedefinisanjePrivatnih { private void f ( ) { p rin tf'p riv a tn a f ( ) “ ) .Poglavlje 8: Polimorfizam 221 Z ic a n i. O bjasnite šta se dešava.sviraj() SREDNJE_C DrveniDuvacki.out. Pozovite d ru g u m eto d u iz prve m etode. P ro b ajte d a objekte klase Instrument ispisujete p o m o ću m eto d e System. Greška: „redefinisanje" privatnih metoda Evo nečega što biste u blažen o m n ezn an ju m ogli pok u šati d a uradite: //: pol imorfizam/RedefinisanjePrivatnih. U o sn o v n o j klasi obezb ed ite m e to d e koje su zajedničke za sve glodare i redefinišite ih u izvedenim klasam a. tako da se različito p o n ašaju za razne tipove glodara. r p . Vežba 9: (3) N apravite h ijerarh iju nasleđivanja klase Glodar: Mis. N apravite niz objek ata klase Glodar. Polim o rfizam baš to om ogućava.m indview . Vežba 8: (2) Izm enite d a to te k u Muzika3. N apravite objekat izvedene klase. Vežba 6: (1 ) P ro m e n ite d a to tek u Muzika3. Pacov.java tak o d a m e to d a sta() p o stan e m e to d a toStringO iz korenske klase Object. a u to m atsk i obavljate svođenje naviše ka klasi Instrument.s v ir a j() SREDNJE_C Lim eniDuvacki. p o lim o rfiza m je važna te h n ik a koja p ro g ra m e ru o m o gućava da „razdvoji o n o što se m e n ja o d o n o g što ostaje isto“.svirajO SREDNJE_C * ///=- N ove su m e to d a sta(). Hrcak itd.java.

polje.222 Misliti na Javi class Izvedena extends RedefinisanjePrivatnih { public void f ( ) { p rin t("ja vn a f ( ) " ) .polje + ".pribaviPolje() + ".pribaviNadPolje()) . } } /* Isp is: privatna f ( ) * ///:M ogli biste razložno očekivati d a rezu ltat b u d e javna f().println("pod. o n a nije čak ni p reklop ljen a. p o što u klasi Izvedena nije vidljiva verzija f() iz o sn o v n e klase. } class Pod extends Nad { public in t polje = 1.java // Neposredno pristupanje polju biva razrešeno u trenutku prevođenja. ako po lju p ristu p ite n ep o sred n o . m o gli biste p o m isliti da se sve dešava p o lim o rfno. ) public in t pribaviNadPolje () { return nad. public in t prib aviPolje () { return po lje. R ezultat svega ovoga jeste d a sam o n ep riv atn e m etod e m o g u b iti redefinisane. D a b u d e m o p o tp u n o jasni. public int p rib aviPolje () { return po lje. M eđ u tim . taj p ristu p će b iti razrešen u v rem e p rev ođ enja. // Svođenje naviše System .pribaviNadPolje() = " + pod. pod. class Nad { public int polje = 0.println("nad. Greška: polja i statične metoda Pošto ste sada naučili šta je p o lim o rfizam . N a p rim er. p o lim o rfn i m o g u biti sam o o b ičn i pozivi m eto d a. ali se pro gram verovatno neće po našati o nako kako ste hteli. k ao što pokazu je' sledeći p rim er: //: polimorfizam/PristupPolju. System. } } public class PristupPolju { public s ta tic void m ain(String[] args) { Nad nad = new Pod(). . } 1 Z a h v a lju je m R en d iju N ik o lsu koji se s e tio d a p o sta v i to p ita n je . ali je p riv atn a m e to d a a u to m atski finabia. p r ib a v iP o lje ()) . pod. Z ato je u ovo m slučaju m eto d a f() klase Izvedena p o tp u n o nova m eto d a. nad.polje = " + nad.polje + ". Pod pod = new Pod().pribaviPolje() = “ + pod.out.out.pribaviPolje() = " + nad. u izvedenoj klasi upotrebljavajte im ena drugačija od im ena p riv atn e m eto d e iz osnovne klase. ali se m o rate čuvati i od redefinisanja p riv atn ih m e to d a —prevodilac vas n ičim neće upo zo riti na to. a i sakrivena je o d izvedene klase.pol je = " + pod.

public class PolimorfizamStaticnih { public s ta tic void m ain(String[] args) { StaticnaNad nad = new StaticnaPod( ) . u p raksi se to gotovo n ik ad a n e dešava. M eđ u tim . m o rate izričito napisati nad. U ovom p rim eru .out. Prvo. { } public String dinamicnaPribavi() { return "Osnovna dinamicnaPribavi( ) " . Iako m o žd a izgleda da b i ovo m o g lo izazvati zab u n u . Nad verzija nije o n a p o d razu m ev an a koja se d o b ija kada izraz u pu ćuje na polje u klasi Pod. Uz to. // Svođenje naviše System. class StaticnaNad { public s ta tic String s ta tic n a P rib a vi() return "Osnovna s ta tic n a P rib a vi( ) " .out. p a o na zato nisu polim o rfn a. println(nad . je r biste tako izazvali zbrku. } } /* Isp is: Osnovna s ta tic n a P rib a vi() Izvedena dinamicnaPribavi() * ///:Statične m e to d e su p rid ru ž e n e klasam a. . o n a se n e p o n a ša p o lim o rfn o : //: polimorfizam/Stati cni Polimorfi zam.polje = 1. Ako je m e to d a statična.polje ne do b ijaju isti m em orijski prostor.polje = 0. p o p rav ilu sva p o lja tre b a d a b u d u p riv atn a. nad.java // Staticne metode nisu polimorfne. po d.pribaviNadPolje = 0 * / / / :- Kada se Pod objekat svede naviše na Nad referencu. v erovatno nećete d ati isto im e p o lju osnov n e klase i p o lju izvedene klase. Nad. } public String dinamicnaPribavi() { return "Izvedena dinamicnaPribavi( ) " .staticnaPribavi ( ) ) .polje. a ne p o jed in ačn im o b jektim a. sva p ristu p an ja po ljim a razrešava prevodilac.pribaviPolje() = 1 pod. ako hoćete Nad polje.pribaviPolje() = 1. p a im nećete p ristu p a ti n ep o sredn o . } } class StaticnaPod extends StaticnaNad { public s ta tic String s ta tic n a P rib a vi() { return "Izvedena s ta tic n a P rib a vi( ) " .polje i Pod. pod.Poglavjje 8: Polimorfizam 223 ( /* Is p is : nad.pri ntln(nad. nego sam o kao sp o red n i efekat p o zivanja m eto d a.dinami cnaPri b a v i( ) ) . Z ato Pod zapravo sadrži dva polja Polje: sopstveno i o n o koje dobija o d klase Nad. System.

} } class Salata { SalataO { p r in t (" S a la t a ()" ) . ali ne i član o v im a osn o v n e kiase (koji su o b ičn o p riv a tn i). Z bog toga p revođilac insistira da b u d e pozv an k o n stru k to r za svaki d eo izvedene klase.m indview . ali je njihova deklaracija statičnosti im plicitna). u su p ro tn o m . } } class S ir { S ir ( ) { p r in t ( " S ir ( ) " ) . U koliko u telu k o n stru k to ra izvedene klase izričito ne pozovete k o n stru k to r osnov n e klase. To znanje će vam p o m o ći da izbegnete n ep rijatn a zapetljavanja. (K ada klasa nem a n ijedan k o n stru k to r. Izvedena klasa im a p ristu p sam o svojim član ovim a. Ako takav k o stru k to r ne postoji.util.) Pogledajm o p rim e r koji pokazuje efekte kom pozicije. class Obrok { Obrok() ( p rint("Obrok( ) " ) . prevodilac će au to m atsk i da pozove njen p o d ra z u m ev a n i k o n stru k to r. neće b iti n apravljen ceo objekat. Redosled poziva konstruktora Redosled poziva k o n stru k to ra je kratk o razm atran u poglavlju Inicijalizacija i čišćenje i p o novo u poglavlju Ponovno korišćenje klasa. To važi i u slučaju p olim orfizm a. prevodilac au to m atsk i pravi p o d razu m ev an i. } } class Hleb { Hleb() { p r in t("H le b ()"). prevodilac će prijav iti grešku.* . Stoga je n e o p h o d n o d a b u d u p o zvan i svi k o n stru k to ri. razlikuju o d ostalih m etoda. b itn o je da shvatite način na koji o n i rade u složenim hijerarh ijam a i s polim orfizm om . nasleđivanja i p o lim o rfizm a na p o re d a k konstrukcije: //: polimorfizam/Sendvic. jer k o n stru k to r im a p o seb a n zadatak: da se p o b rin e d a objekat b u d e p rav iln o n apravljen. U pro cesu konstru k cije izvedene klase uvek se poziva k o n stru k to r o sn o v n e klase. tako da b ivaju p o zv an i svi k o n stru k to ri o sn o v n ih klasa. Iako k o n stru k to ri nisu po lim orfni (to su zapravo statične m etode. ali je to bilo p re nego što sm o uveli p olim orfizam .java // Poredak poziva konstruktora package polimorfizam import s ta tic net. kao i obično. } } . S am o k o n stru k to r osno v ne klase im a o dgovarajuće zn an je i p rav a p ristu p a za inicijalizaciju e lem en ata te klase. Taj poziv se au to m atsk i p o m e ra naviše p o stablu hijerarhije.P r in t. jer. To im a sm isla.224 Misliti na Javi Konstruktori i polimorfizam K o n struktori se.

R ezultat se vidi nakon pravljenja objekta klase S en d v ic u m eto d i m a in (). Poziva se k o n stru k to r osn o v n e klase. private Salata sl = new S a la ta (). ako b ro jite i im p licitn o nasledivanje klase O b je ct) i tri objekta člana. p a su svi članovi svih delova objekta napravljeni. kada se nađ ete u k o n stru k to ru izved en e klase. n ak o n njega prva izvedena klasa itd. o osno v n o j klasi znate sve i m ožete da p ristu p ite svim n jen im jav n im i zaštićenim članovim a.} } class RucakZaNosenje extends Rucak { RucakZaNosenje() { print("RucakZaNosenje()“ ) . 3 . } } public class Sendvic extends RucakZaNosenje { private Hleb h = new Hleb(). 2 . Ali kada ste u k o n stru k to ru . Pozivaju se inicijalizatori članova i to po red u njihove deklaracije. kada god to m ožete.. O vaj k o rak se rekurzivno p onavlja tako d a se prvo k o n stru iše koren u hijerarhiji. svi članovi o sn o v n e klase ispravni. inicijalizujete sve objekte članove (tj. private S ir s = new S ir'O . konstrukcija je već obavljena. Kada se nađete u običnoj m etodi. public Sendvic () { p r in t(“Sendvic ( ) " ) . P rilikom nasleđivanja. } } /* Is p is : Obrok() Rucak() RucakZaNosenjeO Hleb() S ir ( ) S a la ta () SendvicO * ///:U ovom p rim e ru . Poziva se telo k o n stru k to ra izvedene klase. Svaki k o n stru k to r ispisuje p oru k u kada je pozvan. To znači d a je redosled poziva k o n stru k to ra složenog objekta sledeći: 1. kada se nađ ete u izvedenoj klasi. N akon toga. m o rate biti sig u rn i da su svi članovi klase koju nasleđujete već napravljeni.Poglav[je 8: Polimorfizam 225 class Rucak extends Obrok { Rucak() { p rin t("R u c a k ()"). objekte koje u klasu um ećete . To što m o ra te „ z n a ti da su svi članovi ispravni“ u n u ta r k o n stru k to ra tak o đ e je razlog da. sve d o k se ne d o d e d o krajnje izvedene klase. N am a je b itn a klasa S en d v ic koja o b jed in ju je tri n ivoa nasleđivanja (četiri. To znači da m ožete p retp ostav iti kako su. složena klasa se pravi o d d ru g ih klasa. svi članovi o snovne kiase kojim a m ožete da p ristu p ite prav iln o su inicijalizovani. } public s ta tic void m ain(String[] args) { new Sendvic ( ) . R edosled poziva k o n stru k to ra je veom a b itan. Jedini način da se to g aran tu je jeste da se prvo pozove k o n stru k to r osnovne Idase.

P rin t. tim e ne p okrivate sve slučajeve. n azovite je drugačije).s = s . To dokazuje n a red n i p rim er: //: polimorfizam/Zaba. za svoju n o v u klasu m o rate sam i da n ap rav ite n eku m e to d u ciscenje() (ako im ate bolje im e. import s ta tic net. p o d o b jek ti se o b ičn o m o g u p rep u stiti sakupljaču sm eća. } prottected void ciscen je() { p rin t("č iš ć e rje Opisa " + s ). Vežba 11: (1) D atoteci Sendvic. Opis(String s) { th is . s i sl u p re th o d n o m p rim eru ). } } class ZivoBice { private Karakteristika p = new K a rak teristik a("živo j e “ ). p rin t("P ra v lje n je Opisa " + s ) . class Karakteristika { private String s. } protected void ciscen je() { p rin t("č iš ć e n je Karakteristike " + s ) . } } } class Opis { private String s. N ažalost. Karakteristika(String s) { th is . private Opis t = . Kada u izvedenoj klasi redefinišete m e to d u ciscenje(). inače o sn o v n a klasa neće biti očišćena.mindview.*. U koliko čišćenje ip ak treb a d a obavite. Nasleđivanje i čišćenje K ada n o v u klasu prav ite k o m p o zicijo m i n asledivanjem .java // Čišćenje i nasleđivanje. A ko ovaj p o stu p a k p oštujete. p rin t( "Pravljen je Karakteristike " + s ). kao što ćete videti u n are d n o m odeljku. I p rilik o m nasleđivanja. uglav n o m nećete m o ra ti da brin ete o ciscenju.java d o d ajte klasu KiseliKrastavcic. bićete sigurniji da su svi članovi klase i objekti članovi tekućeg objekta inicijalizovani. h.s = s .226 Misliti na Javi k om pozicijom ) na m estu njihove definicije u kiasi (npr. u izvedenoj klasi m o rate da redefinišete m e to d u ciscenje() ako je p rilik o m saku p ljanja sm eća p o tre b n o nekakvo p o seb n o čišćenje. package polimorfizam. b itno je d a se setite da pozovete verziju te m eto d e iz osn o v n e klase.uti1 .

ciscen je f). Zivo Bice() { p r in t("Z iv o B ic e ()").č iš će n je "). public Zaba() { p rin t("Z a b a ()" ) .c isc e n je (). su p e r. t.čišće n je"). Z iv o tin ja f) { p r in t("Ž iv o tin ja ()" ) . } protected void ciscenje() { p r in t("Z iv o tin ja . Vodozemac() { pri nt ("VodozemacO" ) .ciscenjeO . super. } protected void cisce n je() { prin t("Z ivo Bice . n ije b iljk a " ). p. c i sc e n je f). ci sc e n je ().Poglavlje 8: Polimorfizam 227 rew OpisC'Elementarno živo b ić e ").c is c e n je O . p . .c is c e n je () p. } protected void ciscenjeO { p r in t("Vodozemac . p .ciscenjeO } class Z ivo tin ja extends ZivoBice { private Karakteristika p = new Karakteristika("im a src e "). private Opis t = new O p is("I u vodi i na z e m lji"). } } class Vodozemac extends Zivotinja { private Karakteristika p = new Karakteristika("može da ž ivi u vo d i"). private Opis t = new O pis("Životinja je .c is c e n je O . su p e r. private Opis t = new Opis("Jede bube").c is c e n je O . t . } protected void ciscen je() { print("Zaba .čiš će n je "). } } public class Zaba extends Vodozemac { private Karakteristika p = new K arakteristika("K rekeće"). t . t .č išće n je ").ciscenjeO .

o n d a kada m orate. taj proces zahteva p ažnju i znanje.čišćenje čišćenje Opisa Z ivotinja je . } } /* Isp is: Pravljenje Karakteristike živo je Pravljenje Opisa Elementarno živo biće ZivoBiceO Pravljenje Karakteristike ima srce Pravljenje Opisa Z ivo tin ja je . Iz rezultata p re th o d n o g p ro g ra m a v idite da se delovi objekta Z ab a čiste re d o m su p ro tn im redosledu kojim su pravljeni. Za polja to znači da redosled čišćenja treba da je su p ro tan redosledu d eklarisanja (p o što se p olja inicijalizuju o n im red o m kojim su deklarisana).čišćenje čišćenje Opisa I u vodi i na zemlji čišćenje Karakteristike može da ž ivi u vodi Zivotinja . . R azlog je to što p ri čišćenju izvedene klase m ožete d a pozovete neke m eto d e iz o sn o v n e klase koje zahtevaju da kom p o n e n te osnovne klase jo š b u d u žive. za slučaj da je d an p o d o b jek at zavisi od dru g o g . pa ne sm ete da ih u n ištite pre vrem en a. Za o sn o v n e klase (p rateći fo rm u u p o tre b ljen u za d estru k to re u C + + -u ) prv o treba da očistite izvedene klase. Sada i osn o v n o j klasi i izvedenim klasam a d o d ajte objekte članove i pokažite kojim redosledom se inicijalizuju p rilik o m konstru k cije. p rint("Z dravo!" ) . Iz ovog p rim era vidite sledeće: iako ne m o ra te uvek sam i da čistite. R edosled čišćenja treb a da je su p ro ta n red o sled u inicijalizacije. n ije b iljk a čišćenje Karakteristike ima srce ZivoBice . n ije b iljk a Z ivo tin ja O Pravljenje Karakteristike može da ž iv i u vodi Pravljenje Opisa I u vodi i na zemlji VodozemacO Pravljenje Karakteristike Krekeće Pravljenje Opisa Jede bube Zaba() Zdravo! Zaba .ciscenje().čišćenje čiščenje Opisa Jede bube čiščenje Karakteristike Krekeće Vodozemac .228 Misliti na Javi public s ta tic void m ain(String[] args) { Zaba zaba = new Zaba().čišćenje čišćenje Opisa Elementarno živo biće čiščenje Karakteristike živo je * ///:Svaka klasa u h ijerarh iji sadrži i objekte članove tipova K a ra k te ristik a i O p is. a zatim i o sn o v n e klase. Z aba. V ežba 12: (3) Izm enite vežbu 9 tako da prikazuje ređosled inicijalizacije u osnovnoj klasi i u izvedenim klasam a. koji takode m o raju biti očišćeni.

m o ž d a će vam b iti p o tre b n o brojanje referenci d a biste znali koliko objek ata jo š uvek p ristu p a d eljen o m (zajed n ičk o m ) ob jek tu .java // Čišćenje deljenih objekata članova. p a više n e m ožete p ro sto d a p re tpo stav ite kako je d o v oljn o p o zv ati ciscen je(). new Kompozicija(deljena). } public void dodajRef() { brojacref++.. M eđ u tim . private s ta tic long brojac = 0. ukoliko je d a n ili više d ru g ih objekata p o sed u ju neki o d tih objekata članova.m indview .P r in t.b ro jacre f = = 0) p rint("Č išćenje " + th is ). public DeljenaO { p rin t("P ra v l jenje 1 1 + th is ). private fin al long id = brojac++. public Kompozicija(Deljena deljena) p rin t("P ra v lje n je " + th is ). private s ta tic long brojac = 0. th is. Kompozicija[] kompozicija = { new Kompozicija(deljena). new Kompozicija(deljena) } . new Kompozicija(deljena).d eljena = deljena.d elje n a . import s ta tic net. .d o d a jR ef().Poglav[je 8: Polimorfizam 229 Povedite ra č u n a i u to m e d a u g o rn jem p rim e ru ob jek at Z a b a „ p o se d u je “ svoje objekte članove. p a zn a kada da pozove ciscenje() za te objekte članove. private fin al long id = brojac++. U to m slučaju. zad atak p ostaje složeniji. class Deljena { private in t brojacref = 0.} public class BrojanjeReferenci { public s ta tic void m ain(String[] args) { Deljena deljena = new D eljena(). O n ih p ravi i zna koliko d u g o treb a d a žive (koliko i Z a b a ).* . } public String toStringO { return "Deljena" + id .} class Kompozicija { private Deljena deljena.util. } protected void c isce n je() { if(.ciscenjeO } public String toStringO { return "Kompozicija " + id . this. Evo kako to izgleda: //: polimorfizam/BrojanjeReferenci. { } protected void ciscen je() { p rin t("č iš ć e n je " + th is ). del jena. new Kompozicija(deljena).

zato što se redefinisana verzija m etode poziva p re završetka k o n stru isan ja objekta.c is c e n je O . Vežba 13: (3) D atoteci BrojanjeReferenci. to je sam o d o b ra praksa. P rom enljiva id je fin a ln a . biće u p o treb ljen a redefinisana verzija te m etode. nem ate m n o g o izbora. } } /* Isp is: Pravljenje Deljena 0 Pravljenje Kompozicija Pravljenje Kompozicija Pravljenje Kompozicija Pravljenje Kompozicija Pravljenje Kompozicija čišćenje Kompozicija 0 ćišćenje Kornpozicija 1 čišćenje Kompozicija 2 čišćenje Kompozicija 3 čišćenje Kompozicija 4 čiščenje Deljena 0 0 1 2 3 4 * ///. T ip brojaca je long u m esto int da b i se izbeglo p rek o račen je (u ovom slučaju. dinam ičk i povezan poziv bio bi razrešen prilikom izvršavanja.java d o d ajte m e to d u finalize() da biste p roverili postoji li stanja okončanja (videti poglavlje Inicijalizacija i čišćenje). a to m ože izazvati greške koje se veom a teško pronalaze. je r objekat ne m ože da zna da li on p rip ad a klasi u kojoj se m eto d a nalazi ili nekoj drugoj klasi koja je iz nje izvedena. v ero v atn o n ijed an p rim e r iz ove knjige neće p ro u zrok o vati prekoračenje takvog brojača). zato što ne očekujem o da će m en jati v red n o st to k o in životnog veka ovog objekta.230 Misliti na Javi for(Kompozicija c : kompozicija) c . ali će m eto d a ciscenje() p ra titi broj referenci i odlu čiti kada da obavi čišćenje. ceo objekat m ože biti sam o d elim ičn o fo rm iran . Ejekat m ože da b u d e p riličn o neočekivan. Šta će se desiti ako se nalazite u n u ta r k o n stru k to ra i pozovete dinam ičk i p o v ezan u m e to d u objekta čija je konstru k cija u toku? U n u tar obične m etode. U n u ta r svakog ko n stru k to ra. Ako je izrada k o n stru k to ra sam o . ali ako su objekti koji zahtevaju čišćenje deljeni. posao k o n stru k to ra je da objekat dovede u život (što je priličan podvig).m ožete da znate sam o da su inicijalizovani objekti o sn o v n e klase. ne sm ete zabo rav iti da pozovete dodajRef(). Ako dinam ički povezanu m eto d u pozovete iz k o n stru k to ra .Statičan brojac tip a long p ra ti bro j n ap rav ljen ih p rim e ra k a o b jek ta tip a Deljena i daje v re d n o st prom enljivoj id. Vežba 14: (4) Izm enite vežbu 12 tako da jed an o d objekata ćlanova b u d e đeljen s b rojan jem referenci i pokažite da to ispravno radi. Ova teh n ik a zahteva đ o d a ta n tru d . Ponašanje polimorfnih metoda unutar konstruktora H ijerarhija poziva k o n stru k to ra izaziva zanim ljivu n ed o u m icu . Po k o ncep tu. Kada svojoj klasi p rid ru ž ite deljeni objekat.

Ako ga iskoristite u n u ta r k o n stru k to ra . što je u ra đ e n o u klasi OkrugliGIif. import s ta tic net. poluprecnik = 5 * ///:U klasi Glif.S to g a bi na e k ran u bila n ac rtan a tačka ili m o žd a ne bi bilo n ac rta n o ništa. Okrugl iGl if (in t r) { poluprecnik = r.c rta j ( ) . O n poziva m e to d u izvedene klase. class G lif { void c r t a j( ) { print ("Gl i f . u v rem e poziva tekućeg k o n stru k to ra izvedeni delovi jo š n isu inicijalizovani. } } class O krugliG lif extends G lif { private in t poluprecnik = 1. d in am ičk i povezan poziv seže ka „spoljašnjosti1 1h ijerarh ije nasleđivanja. Okrugl iGl i f ( ) .util. što kao da nam je i bila n am era.P r in t. crta j ( ) " ) .* . te će biti n ap rav ljen skok u m eto d u OkrugliGlif. Ali. P rob lem m ožete d a sagledate u n a re d n o m p rim e ru : //: polimorfizam/PoliKonstruktori.java // Konstruktori i polimorfizam // ne pružaju ono što možda očekujete. } void c r t a j () { p r in t(“ OkrugliGl i f . poluprecnik = 1 1 + poluprecni k ).Poglav|je 8: Polimorfizam 231 jed an k o rak u pravljenju objekta klase koja je izvedena iz klase to g k o n stru k to ra . N jena v red n o st jeO . p ogledajte rezu ltat i videćete sledeće: kada k o n stru k to r klase Glif pozove m e to d u crtaj(). što je sig u ran recep t za k atastrofu. . M ed u tim . Okrugli G l i f ( ) . p r int("O krugliGli f. } GlifO { p r in t { " G lif ( ) pre metode c r t a j ( ) " ) . poluprecnik = " + poluprecnik).crtajO. public class PoliKonstruktori { public s ta tic void m ain(String[] args) { new OkrugliGli f (5 ). c rta j ( ) . poluprecnik = 0 G l if ( ) posle metode c r t a j () O krugliG lif.c rta j( ) . m eto d a crtaj() m ože da b u d e redefinisana. a vi biste ostali zb u n jen i po k u šavajući da otkrijete zašto p ro g ra m ne radi. } } /* Isp is: G l if ( ) pre metode c r t a j () O k ru g liG lif. p r in t ( " G lif ( ) posle metode c r t a j ( ) " ) .m indview. pro m en ljiv a poluprecnik nije još d obila ni p o d razu m ev an u p o četn u v red n o st 1. Tu m eto d u poziva k o n stru k to r klase Glif. pozvaćete m e to d u koja m o žd a rad i sa član ov im a koji još uvek nisu inicijalizovani.

P ro sto r za sm eštan je objekta p o p u n jav a se b in a rn im n u la m a p re nego što se bilo šta d ru g o odigra.232 Misliti na Javi P oredak inicijalizacije koji je opisan u ran ijem o deljku n ije baš k o m p le ta n i to je ključ za rešenje m isterije. pre nego što se pozove k o n stru k to r klase O k ru g liG lif). P o stu p ili ste logično. ako takvu referencu zab o rav ite d a inicijalizujete. Pozivaju se inicijalizatori članova p o red o sled u deklaracije. 3.java class Zito { public String toStringO { return "Ž ito ". Kovarijantni povratni tipovi Java SE5 je do n ela i kovarijantne povratne tipove. a p revodilac se nije b u n io . (O vo se au to m atsk i o d n o si i na p riv atn e m eto d e. Stoga. (U ovakvim situ a đ ja m a se C + + p o n aša razb o ritije. 2 .sve je b arem in icijalizovano n u la m a (ili šta god n u la značila za o d re đ e n i tip) i nije ostavljeno sa slu čajn o zatečen im v re d n o stim a koje su beskorisne. Izvršava se telo k o n stru k to ra izvedene klase. Z bog toga. d o b a r savet za p isanje k o n stru k to ra giasi: „U rad ite što m an je posla da objekat dovedete u isp rav n o stan je i ako ikako m ožete. Postoji je d n a d o b ra stran a svega ovoga . 4. izbegavajte da pozivate bilo kakve d ru ge m etode u toj klasi“. ali to je ideal kojem tre b a težiti. Sve d ru g o do b ija v re d n o st nula. S d ru g e stran e. što znači da redefinisana m eto d a izvedene Idase m ože vraćati tip izveden iz tip a koji vraća m eto d a osn o v n e klase: //: polimorfizam/KovarijantnoVracanje. } } . treb alo bi da vas p riličn o užasne rezu ltat ovog p ro g ra m a . koja zbog koraka 1 kao v re d n o st p o lu p reč n ik a d o bija n u lu . } } class Psenica extends Zito public String toStringO { { return "Pšenica".) O n e ne m o g u da b u d u redefinisane i stoga ne kriju ovakvu v rstu izn en ađ en ja.) O vakve greške lako m o g u da b u d u d u b o k o u k o p an e i njihovo pro n alažen je iziskuje p u n o v rem en a.ja v a d o dajte P ra v o u g a o n iG lif i p okažite p ro blem opisan u ovom odeljku. Proces inicijalizacije zaista teče na sledeči način: 1. N ećete uvek m oći d a se p rid ržav ate ovog saveta. To uključuje i reference na objekte koje su u g ra đ e n e u klasu p rek o k o m p o zicije i do b ijaju v red n o st n u ll. što je o b ičn o siguran znak da ćete u re z u lta tu v ideti grešku. koje su au to m a tsk i i finalne. V ežba 15: (2) D atoteci P o IiK o n stru k to ri. Sa sig u rn o šću m o žete da pozivate sam o fin aln e m e to d e osn o v n e klase. a ipak je njegovo p o n ašan je tajan stveno pogrešno. Pozivaju se k o n stru k to ri o sn o v n ih klasa kao što je ran ije op isan o . N a to m m estu poziva se redefinisana m eto d a c rta j() (da. javiće se izuzetak p rilik o m izvršavanja.

m ože vam se u činiti da bi sve treb alo da nasleđ u jete jer je polim orfizam tako p a m etn a alatka. System.*. o b r a d i (). ako o d m a h u p o trebite nasleđivanje kada o d postojeće klase p ravite novu. K om pozicija je tak ođe fleksibilnija.println(z).java // Dinamička promena ponašanja objekta // pomoću kompozicije (projektni obrazac "stanje") import static net.P r i n t . Zito z = m. do k p ri nasleđivanju m o rate već p rilik o m p rev o đ en ja d a zn ate tačan tip. } } public class KovarijantnoVracanje M1 in m = new M1 i n ( ) .Poglavlje 8: Polimorfizam 233 class Mlin { { return new Zito(). } Zito obradi() } class PsenicaMlin extends Mlin Psenica obradi() { { return new Psenica(). je r ste u m o g u ćn o sti da tip o d ab erete d in am ičk i (a tim e i po n ašan je). To m ože da o p tereti projekat. { { public static void main(String[] args) } } /* Ispis: Ži to Pšenica * ///:K ljučna razlika izm eđu Jave SE5 i ran ijih verzija Jave leži u sledećem : ranije verzije bi naterale redefinisanu verziju m eto d e obradi() da v rati objek at klase Zito.out. K o m p oziđ ja ne nam eće uvođenje h ijerarh ije nasledivanja u projekat. .println(z). n aim e. z = m.mindview. a ne Psenica.out. K ovarijantni p o v ra tn i tipovi o m ogućavaiu specifičniji p o v ra tn i tip Psenica.uti1. o b r a d i (). n aro čito ako nije o čig led n o šta treb a da u p o treb ite. Bolji p ristu p je da najp re izaberete k o m poziciju. To ilustruje n ared n i p rim er: //: polimorfizam/Kompozicija. iako je Psenica izvedena iz klase Zito i stoga je i dalje legitim an p o v ra tn i tip. i n = new PšenicaMl i n ( ) . Projektovanje pomoću nasleđivanja Kada shvatite polim o rfizam . Sy stem. class Glumac { publi c voi d glumi( ) . stvari m o g u bez p o tre b e d a se kom p lik u ju .

promeni(). } } class TuzanGlumac extends Glumac { public void glumi() { p r in t(“T u za nG lu ma c" ). a polja d a izrazite p ro m e n e stan ja“. to m o ra p o tp u n o da b u d e o d re đ e n o već prilikom prevođenja.M indV icw . p ro m e n a stanja povlači i p ro m e n u ponašanja.) N asu p ro t to m e. Vežba 16: (3) Prateći p rim e r iz d atotek e Kompozicija. } } /* Ispis: SrecanGlumac TuzanGIumac * ///:O b jek at Pozornica sadrži referencu na klasu Glumac koja je inicijalizovana o bjektom klase SrecanGlumac. Z nači.net.kreni().234 Misliti na Javi class SrecanGlumac extends Glumac { public void glumi() { pr in t( "S re ca nG lu ma c"). N apravite i m eto d e koje m o g u d a m en jaju ta stanja. po zornica. pozornica. } } class Pozornica { private Glumac glumac = new Sr ec an Gl um ac (). To o d re d u je p o n aša n je m eto d e kreni(). a u klasi Pozornica upotrebljava se k om pozicija kako bi n jen o stan je m o g lo da se m enja. (O vo se tak ođe naziva i ob razac State (S tanje). nap rav ite klasu SvemirskiBrod u kojoj se nalazi referenca na klasu Uzbuna koja m ože da prikaže tri različita stanja u zb u n e.kreni(). pozornica. do bili ste d in am ičk u fleksibilnost pri izvršavanju. U p re th o d n o m p rim e ru koristi se i je d n o i drugo: dve različite klase su nasleđene kako bi iskazale razliku u m etod i glum i().glumi (). P ogleđajte knjigu T hinking iti Patterns (ivith Java) na ađresi w w w . U ovom slučaju. public void p r om en i() { glumac = new T u za nG lu ma c( ). . p riliko m izvršavanja ne m ožete da m enjate šta ćete naslediti.java. } public void kreni () { glumac. referenca glumac m ože d a b u d e izm enjena tako da po kazu je na objekat klase TuzanGlumac. } } public class Kompozicija { public static void main(String[] args) { Pozornica pozornica = new Pozornica(). Ali p ošto referenca prilikom izvršavanja m ože da b u d e povezana s d ru g ačijim ob jek to m . O p šta sm ern ica je „upotrebljavajte nasleđivanje da izrazite razlike u p o n ašan ju . čim e se ponašanje m eto d e kreni() m enja.

To je tak o đ e zam ka..je“ jedini logični način da takve stvari u rad ite i da je bilo koji dru g i način projek to v an ja nejasan i sam im tim loš. kao što je p o k azan o n a n a red n o m dijagram u: Oblik nacrtajO obrisi() 7V Krug nacrtaj(] obrisi(] Kvadrat nacrtajO obrisif Trougao nacrtajf) obrisif) O vo m ože da b u d e o zn ačen o kao p o tp u n a relacija .je“. jer o bjekti izvedenih klasa m o g u savršeno d a se zam ene o sn o v n o m klasom .je" Krug. Kada to na ovaj način p o sm atrate. u izvedenoj klasi biće redefinisane sam o m eto d e u stanovljene u o sn o v n o j klasi. To se m ože nazvati relacijom . čini se da je p o tp u n a relacija .p o tp u n o g “ p ristu p a . pogledaćete oko sebe i u stan o v iti da je proširivan je interfejsa (što nažalost rezervisana reč extends p odstiče) sav ršeno rešenje o d re đ e n o g p ro b lem a. Kvadrat. jer je izvedena . To m ože da se p o sm a tra kao p o tp u n a za m en a .. Č im p o čn ete da razm išljate na taj način . N asleđivanje g a ran tu je da će bilo koja izvedena ldasa im ati interfejs osn ovn e klase i ništa m anje. pa kada ih koristite ne m o rate o n jim a im ati nikakve d o d a tn e inform acije: Obrati se Obliku Poruka relacija . jer o n e im aju p o tp u n o isti interfejs.Poglav[je 8: Poiimorfizam 235 Poređenje zamene i proširivanja Č in i se d a je najbolji p ristu p za pravljenje h ijerarh ije nasleđivanja u p o treb a .. Ako p ratite ovaj dijagram . Polim orfizam se stara o svem u d ru g o m .je kao“. uočićete da izvedene ldase tak ođ e neće im ati ništa više osim interfejsa o snovne klase. Linija ili novi tip Oblika O sn o v n a klasa m ože da p rim i svaku p o ru k u koju m ožete da pošaljete izvedenoj klasi. Treba sam o da u ra d ite svođenje naviše iz izvedene klase pa nikada više nećete m o rati da razm išljate o to m e s ko jim tip o m radite.. jer interfejs klase o d red u je šta ova h ijerarh ija predstavlja.. O d n o sn o .

U n a re d n o m odeljku p ok azu je m o kako se to radi. Svođenje naviše i podaci o tipu prilikom izvršavanja Pošto prilik o m svođenja naviše (k reta n ja uz h ije rarh iju nasleđivanja) gubite inform aciju o ta č n o m tip u .m ogao bi da b u d e tro u g ao .u p o treb ljav ate svodenje naniže (engl. je r osn o v n a klasa ne m ože da im a širi interfejs o d izvedene Idase.ali im a i d ru g e m o g u ćn o sti koje zahtevaju realizaciju d o d a tn ih m eto d a: Pretpostavimo da ovo predstavlja veliki interfejs „je kao" Proširivanje interfejsa Iako je ovo k o ristan i ra z u m a n p ristu p (u zavisnosti o d situacije). P rošireni deo interfejsa izvedene klase nije d o stu p a n o sno vn oj klasi. N aučili ste da je svođenje naviše uvek sig u rn o . .o d n o sn o za kretan je nazad niz h ijerarh iju n asleđivanja . pa će stoga svaka p o ru k a koju pošaljete preko interfejsa osn ov ne klase biti prihvaćena. Ali p rilik o m svođenja naniže ne zn ate da je neki oblik (na p rim er) zaista kru g . stoga nakon svodenja naviše ne m ožete da p ozivate nove m etode: Obrati se objektu klase Koristan Korisni deo Poruka KoriSugfdeo Ako u ovom slučaju ne obavljate svođenje naviše. to vas neče opterečivati.im a isti o sn o v n i interfejs . im a sm isla da za p o n o v n o d o b ijan je in form acije o tip u . downcast). ali često m ožete da d o đ e te u situaciju kada tre b a p o n o v o o tk riti taćan tip objekta kako biste mogli da p ristu p ite njegovim d o d a tn im m e to d am a. on im a svoje m ane. k vadrat iii nešto drugo.236 Misliti na Javi klasa p o p u t o sn o v n e klase .

ti m e typ e in fo rm a tio n ). Č in p ro veravanja tip o v a p rilik o m izvršavanja naziva se p o d a c i o tip o v im a p rilik o m izvršavanja (engl. x[l] -g(). // Prilikom prevođenja: metoda nije pronađena u klasi Koristan //! x [1] . m o ra d a p o sto ji n a čin za g aran to v an je ispravnog svođenja nan iže. p rilik o m izvršavanja se u tv rđ u je da li je to zaista onaj tip koji vi m islite d a jeste.java // Svođenje naniže i podaci o tipovima prilikom izvršavanja (RTTI). x[0]. M eđ u tim . Ako to nije slučaj. ( (Korisniji)x [1]). u Javi se p roveravaju sva svođenjal Iako naizgled obavljate o b ič n u konverziju. R T T I .u (). m o ra te da u p o tre b ite p o se b n u o p eraciju da biste dobili sig u rn o svođenje naniže. o n a takođe m ože da b u d e svedena naviše ka klasi Koristan. . U n ek im jezicim a (p o p u t C + + -a ). N ared n i p rim e r pokazuje kako RTTI radi: //: polimorf iz am /R TT I.r u n . To bi bilo veo m a opasno. // Svođenje naniže/RTTI ((Korisniji)x [0]).u ().u (). Pošto oba objekta u nizu pripad aju klasi Koristan.f(). new Korisniji () }. a ako pokušate da p o zovete m eto d u u() (koja postoji sam o u klasi Korisniji). Pošto je nasleđena. To m ožete da viđite u okviru inicijalizacije niza x u m etodi main().Poglavlje 8: Polimorfizam 237 D a b i se ovaj p ro b le m rešio. kako ne biste greškom u rad ili svođenje u p o g rešan tip i zatim poslali p o ru k u koju objekat n e m ože da p rim i. klasa Korisniji proširuje interfejs klase Koristan. d o ći će d o izuzetka tip a C lassC astE x cep tio n . // {ThrowsException} class Koristan { public void f() {} public void g() {} } class Korisniji extends Koristan { public void f() public void g() public void u() public void w() {} {} {} {} public void v () {} } public class RTTI Koristan[] { args) { public static void main(String[] x = { new Ko r i s t a n (). dobićete grešku p ri prevođenju. za oba m ožete da pozovete m etode f() i g(). // biće bačen izuzetak } } ///:Kao što se viđi s p re th o d n o g dijagram a.

Za o b rad u ovog izuzetka nije n e o p h o d n o da pišete poseban kod. P o red članova i p o ru k a zasebne klase. build) p rim era iz ove knjige kako očekuje da će ovaj p ro g ra m prilikom izvršavanja generisati izuzetak. U o b jek tn o o rije n tisa n o m p ro g ra m ira n ju im ate isti interfejs osn o v n e klase i različite oblike koji u p o treb ljav aju taj interfejs: različite verzije d in am ičk i pov ezan ih m etoda.MindView. dobićete izuzetak tipa C lassC astE xception. u zm ite u o b z ir i zajedničke o so b in e m e đ u klasam a kao i njihove m eđ u so b n e relacije. Rešenja odabranih vežbi data su u elektronskom dokum entu Thinking in Java Annotatcd Solution Guide.net.238 Misliti na Javi U koliko želite da p ristu p ite p ro širen o m interfejsu objekta klase K orisn iji. već sam o kao deo „veće slike“ relacija izm eđ u klasa. način da u stanovite tip pre nego što po kušate da obavite njegovo svođenje naniže. RTTI je više o d o bične konverzije. ali ne i klasi T ricik l. Pozovite m e to d u ra v n o te ž a () za svaki elem en t to g niza i p o gledajte rezultate. m e to d u ra v n o te ž a () d o d ajte klasam a U n icik l i B icikl. D a biste u p ro g ra m im a efikasno koristili p o lim o rfizam . koji se može kupiti na lokaciji www. o n o će b iti uspešno. Postoji. Ako je tip odgovarajući.oznaka {Throw sException} . n a p rim er. Svedite naniže. N apravite p rim e rk e sva tri tip a i svedite ih naviše n a niz tip a C ikl. Sažetak Po lim o rfizam znači „različiti o blici“.m o ra te da p ro širite svoje p o im an je p ro g ra m ira n ja. pro širiv i p ro g ra m i i lakše od ržav an je koda. K om pletno poglavlje Podaci o tipovim a p osvećeno je proučav an ju različitih vidova po d atak a o tip o v im a prilik o m izvršavanja u Javi. o n se i te kako isplati. V ežba 17: (2) K oristeći h ijerarh iju C ik l iz p rim e ra 1. U su p ro tn o m . na p rim er. K om en tar . U ov o m poglavlju videli ste da nije m oguće ra zu m e ti niti p rim e n iti p o lim o rfiz a m bez u p o treb e ap strakcije p o d ata k a i nasleđivanja.kazuje sistem u za au to m atizo v an o prevođenje i pakovanje (engl. . bolja organizacija koda. Postiže se brži razvoj p ro g ra m a. pozovite m e to d u ra v n o te ž a () i p o g led ajte šta se dešava. jer o n naznačava p ro g ram ersk u grešku koja je m ogla d a se desi bilo gde u p ro g ram u . Iako to iziskuje značajan n ap o r. p rim en ite svodenje naniže. n ared b a svvitch).a sam im tim i o b jek tn o o rijen tisan e teh n ik e . P o lim o rfizam je o so b in a koja ne m ože d a se p o sm a tra izolovano (kao što m ože.

Apstraktne klase i metode U p rim e ru sa in stru m e n tim a u p re th o d n o m poglavlju. N ajpre ćem o ra z m o triti apstraktne kla seko je su o tp rilik e na pola p u ta izm eđ u o b ičn e klase i interfejsa. p o p u t klase In s tru m e n t. Ako im ate a p stra k tn u klasu. S intaksa za deklaraciju a p strak tn e m eto d e je sledeća: abstract void f ().' To je n e p o tp u n a m etoda. U tim p rim e rim a . Java za to obezbeđuje m eh an izam koji se naziva apstraktna m etoda. prevodilac će prijaviti grešku. Ako kJasa sadrži je d n u ili više ap strak tn ih m etoda. jedin i razlog z ap rav ljen je zajedničkog interfejsa jeste da se o m o g u ći različito p onašanje svakog p o jed in ačn o g p o d tip a . C + + IMA sam o p o sred n u p o d ršk u za te koncepte. (U su p ro tn o m . zato što je nam en a klase I n s tr u m e n t da obezb ed i zajednicki interfejs za sve iz nje izvedene klase. Za program cre na C + f . ali tim e in fo rm ac iju odlažete sve do izvršavanja i od korisnika zahtevate p riličn o tem eljn o testiran je. Č in jen ica da o n i p o sto je u Javi. Uvek je bolje prijav iti p ro b lem e u vrem e prevođenja. m eto d e u osn o v n o j klasi I n s tr u m e n t uvek su bile . Na ovaj način se o b ezb eđ u je p o tp u n o s t apstra k tn e klase i vi ne m o rate da b rin ete o n jenoj ev en tu aln o j p o g rešn o j u p o treb i. n jen i o b jek ti gotovo n ik ad nem aju m kakvo značenje. prevodilac će prijaviti grešku. N e m o žete uvek k o ristiti čist interfejs. govori d a su ih pro je k tan ti jezika sm atrali d ovoljno b itn im da se za n jih ob ezbed i d ire k tn a p o d ršk a kroz rezervisane reči. A p strak tn u klasu prav ite kada želite d a s g ru p o m klasa rad ite p reko zajedničkog interfejsa. O n u spostavlja o sn o v n i izgled. T a k v i m e h a n i z m i n i s u t a k o C e s t i u p r o g r a m s k i m j e z i c i m a . o n a m o ra biti kvalifikovana kao ap strak tn a . o n a im a sam o deklaraciju bez tela. D ru g i način da to iskažete jeste da p roglasite klasu In s tru m e n t apstraktnotn osnovnotn klasom (ili je d n o sta v n o apstraktnom klasom). P r i m e r a RA DI.. Klasa koja sadrži ap strak tn e m eto d e naziva se apstraktna klasa. . tak o da znate šta je zajedničko za sve izvedene klase.lažne“ m etode.stoga pravljenje objekata te klase n em a sm isla i v ero v atn o ćete poželeti da sprečite korisnika da to uradi. Iako ćete biti skloniji p ravljenju interfejsa. To m o žete da p o stig n ete tak o što ćete svim m e to d a m a u klasi In s tru m e n t zadati da ispisuju p o ru k u o grešci.) Pošto je a p stra k tn a klasa n e p o tp u n a . šta bi p revodilac treb alo da u rad i kada n eko p okuša da napravi objekat takve klase? Pošto n e m ože da n ap rav i objek at a p strak tn e klase na siguran način. Tako In s tru m e n t služi sam o da se opiše interfejs.ike potpuno virtuelnim funkcijanui. a ne o d re đ e n a realizacija . Ako bi o n e ikad bile pozvane.Interfejsi Interfejsi i apstraktne klase pružaju strukturiraniji načiti razdvajanja interfejsa od realizacije. a p stra k tn a klasa je važna i n e o p h o d n a alatka za pravljenje klasa koje im aju neke nerealizovane m etode.u onc su iedn. p o sred i bi bila neka greška.

*. mi nd vi ew . Klasa In s tr u m e n t iz p re th o d n o g poglavlja lako m ože da b u d e p retv o re n a u a p stra k tn u klasu. To je k o risn o k ad a u klasi n e m a sm isla p ra v iti bilo kakve ap stra k tn e m etode. import polimorfizam. Sam o neke m e to d e će b iti a p stra k tn e .240 Misliti na Javi A ko a p stra k tn u klasu n asled ite i želite d a p rav ite objekte to g novog tipa. U koliko to ne u rad ite (a m o žete i tako d a o dlu čite). // Zauzima se memorija za svaki objekat klase Instrument public abstract void sviraj(Nota n).Nota.muzi ka.Print. public String sta() { return " In st rument". m o ra te da obezbedite definicije za sve a p stra k tn e m eto d e o sn o v n e klase. } . A p strak tn u klasu m o žete d a n ap ra v ite i tak o d a ne sadrži n ijed n u a p stra k tn u m eto d u . abstract class Instrument { private int i.u ti l.muzika4. Evo kako to izgleda: Sledi izm enjeni p rim e r sa o rk e stro m uz u p o tre b u a p strak tn ih klasa i m etoda: //: i nterfejsi/muzi ka4/Muzi ka4. ali ipak želite da sprečite pravljenje o b jek ata te klase.java // Apstraktne klase i metode package interfejsi. import static n e t .ne m o ra ju sve. te će vas prevodilac p risiliti i da tu klasu označite rezerv isano m reči a b s tra c t. ta d a i izvedena klasa o staje a p stra k tn a .

} public String sta() { return "Zicani".SREDNJE_C).s v i r a j () " + n ) . { } public String sta() { return "Duvacki". {} } public void nastimuj() } class Udaraljke extends Instrument { public void sviraj(Nota n) { print("U da ra lj ke . } static void sveMelodije(Instrument[] e) { for(Instrument i : e) melodi j a ( i ) .nastimuj()"). } class Duvacki extends Instrument { public void sviraj(Nota n) { print("D uv ac ki .s vi raj() " + n). } public String sta() { return "Udaraljke".s vir aj() " + n). . {} } public void nastimuj() } class Zicani extends Instrument { public void sviraj(Nota n) { print( "Z ic an i. sv ir aj() " + n ) . } {} { public void nastimuj() } class LimeniDuvacki extends Duvacki public void sviraj(Nota n) { print( "L im en iD uv ac ki. { } public String sta() { return "DrveniDuvacki".Poglavlje 9: Interfejsi 241 public abstract voiđ nastimuj(). } } class DrveniDuvacki extends Duvacki public void sviraj(Nota n) { pr in t( "D rv en iD uv ac ki.s v i r a j () " + n). } public class Muzika4 { // Ne vodi računa o tipovima pa će novi tipovi // koje dodamo sistemu i dalje pravilno da rade: static void melodijaflnstrument i) { / / ••• i. } public void nastimuj() { print("LimeniDuvacki.svi ra j( No ta.

U m eto d i main() pokažite da to radi. Takođe. ali izostavljate o d g o v araju ću realizaciju. }. P ozovite tu m e to d u u k o n stru k to ru o sn o v n e klase. new Udaral j k e ( ) . N asledite je i dodajte jednu m eto d u . Svedite tu referencu n an iže ka izvedenoj klasi i pozo v ite m eto d u . Vežba 1: (1) Izm enite vežbu 9 iz p re th o đ n o g poglavlja tako da klasa Glodar p ostane ap stra k tn a klasa. new Dr ve niDuvacki(). Interfejsi Rezervisana reč interface u n a p re đ u je k o n cep t apstrakcije. Vežba 3: (2) N apravite o sn o v n u k lasu s a p stra k tn o m m e to d o m ispisi() koju ćete redefinisati u izvedenoj klasi. R eđefinisana verzija te m eto d e treba da ispisuje v red n o st celob ro jn e prom enljive definisane u izvedenoj klasi. O b jasnite rezultate. new LimeniDuvacki(). Pravljenje ap stra k tn ih m eto d a i klasa je k o risn o je r izričito o d re đ u je ap stra k tn o st klase i objašnjava n je n u n a m e n u i k o risn ik u i p rev o d io cu . new Z i ca ni(). p retv o rite m e to d e klase Glodar u apstraktne.242 Misliti na Javi public static void main(String[] args) { // Svođenje naviše prilikom dodavanja u niz: Instrument[] orkestar = { new Du va ck i(). N aprav ite statičn u m e to d u čiji je a rg u m e n t referenca na o sn o v n u klasu. u kojoj uop šte nem a .tim e obezbedujete deo interfejsa. P rom enljivoj zad ajte n ek u vred n o st različitu o d nule na m estu definicije. R ezervisana reč abstract o m o gućava da u klasi n ap rav ite je d n u ili više m e to d a koje n em aju definicije . Vežba 2: (1) N ap ravite a p stra k tn u kiasu koja n em a n ijed n u a p stra k tn u m e to d u i uverite se da ne nije m o g uće n ap rav iti in stan ce te klase. } } /* Ispis: D u v a c k i .sviraj() SREDNJE_C DrveniDuvacki. s v i r a j O SREDNJE_C Ud ar aljke. U m etodi main() n ap rav ite o b jek at izvedenog tip a i p o to m pozo v ite njegovu m etodu ispisi(). G de god je m o g u će. Sada ubacite a p stra k tn u deklaraciju u o sn o v n u klasu i elim inišite p o treb u za svođenjem naniže. Vežba4: (3) N apravite a p stra k tn u klasu koja n em a n ijed n u m eto d u . R ezervisana reč interface o značava p o tp u n o a p stra k tn u klasu. je r om o g u čav aju lako p o m e ra n je zajedničkih m eto d a naviše u hijerarh iji nasleđivanja.sviraj() SREDNJE_C LimeniDuvacki. a p stra k tn e klase su korisne alatke za p o n o v n u p o d elu na p ro ste fak to re. sveMelodije(orkestar).sviraj() SREDNJE_C * ///:O b ra tite p a ž n ju n a to d a je izm e n jen a sam o o sn o v n a klasa.sviraj() S R E D N J E C Zi ca ni. koju će n ap rav iti naslednici te klase.

Izloženi k o n cep t je p rik aza n n a d ijag ram u p rim e ra s in stru m e n tim a: . dobijate p ak e tn i p ristu p . ispred rezervisane reči interface m o žete da d o d a te i rezervisan u reč public (ali sam o ako je taj interfejs definisan u dato teci istog im en a). ali n e i tela m etoda. (Neki o bjektn o orijentisani program ski jezici za istu n a m en u koriste rezervisanu reč protocol. Interfejs a u to ru o m o g u ćav a d a definiše izgled klase: im en a m eto d a. u p o treb ite rezervisanu reč im plem ents. sve ostalo je kao kod nasleđivanja. u m esto rezervisane reči class u p o treb ite rezervisanu reč interface. interface nije sam o a p stra k tn a klasa dovedena d o k rajn jih granica. T im e govorite: „njen izgled je definisan d a tim interfejsom . Interfejs se. liste arg u m e n a ta i p o v ra tn e tipove.) M eđ u tim . je r p o m o ć u njega m ožete d a n ap rav ite klasu koja se m o že svesti naviše p rem a više o sn o v n ih tipova. tak o da taj interfejs m ožete da upotrebljavate sam o u n u ta r istog paketa. U koliko je izostavite. koristi d a ustan o v i „k o m unikacioni p ro to k o l“ izm eđu klasa. Izuzev te izm ene. O n obezbeđuje sam o fo rm u . D a biste n ap ravili interfejs. ali su o n a im p licitn o (auto m atski) defin isan a kao statičn a i finalna. ali ne i realizaciju. O n vam om o g u ćav a da d obijete v arija n tu „višestrukog nasleđivanja“ C + + -a. a sada ću d efinisati kako će o n a da radf'. znači. Stoga svaki k o d koji upotrebljava određeni interfejs zna koje m etode interfejsa m ože da koristi i to je sve.Poglavlje 9: Interfejsi 243 nikakve realizacije. Interfejs n a m govori: „O vako će izgledati sve klase koje realizuju ovaj interfejs". Interfejs m ože d a sadrži i polja. D a biste nap ravili klasu koja zadovoljava o d re đ en i interfejs (ili g ru p u interfejsa). Kao i k od klasa.

već samo deklaracije: void sviraj(Nota n). } .java // Interfejsi.Nota. U s u p ro tn o m bi d ob ile p o d raz u m ev an i p ak etn i p ristu p . s v i r a j O " + n).244 Misliti na Javi Iz klasa DrveniDuvacki i LimeniDuvacki m ožete videti sledeće: kada realizujete interfejs. } } } public String t o S t r i n g O public void nastimuj() { print(this + " .*. m eđ u tim . import static net. // statična i finalna // Ne može da ima definicije metoda. javne čak i ako to ne učinite. package interfejsi. import polimorfizam. } class Udaraljke implements Instrument { public void sviraj(Nota n) { print(this + " . } } public void sviraj(Nota n) { print(this + " . } } } public String t o S t r i n g O public void nastimuj() { print(this + ". čim e biste um an jili nivo p ristu p a m e to d am a p rilik o m nasleđivanja. iako n ijedn a m eto d a interfejsa Instrument nije deklarisana kao jav na. } class Zicani implements Instrument { " + n). // Automatski javne void nastimuj().muzika. ta realizacija postaje običn a klasa k oja m ože d a se p ro širu je na uo bičajene načine. { return "Duvacki".mindview. interface Instrument { // Konstanta pri prevođenju: int IZNOS = 5.muzika5. } class Đuvacki implements Instrument { public void sviraj(Nota n) { print(this + " . sve m e to d e iz interfejsa m o ra ju da b u d u proglašene javn im . s v i r a j O " + n). nastimuj ()").Print. što Java prevodilac ne dozvoljava. D eklaracije m eto d a u interfejsu m ožete eksplicitno d a pro glasite jav n im . Stoga p rilik o m realizacije interfejsa. { return "Udaraljke". O n e su. to se a u to m atsk i obavlja: / / : interfejsi/muzika5/Muzika5.nastimuj()").util. { return "Zicani". Pored toga. s v i r a j O } public String t o S t r i n g O public void nastimuj() { print(this + " . To m ožete d a vidite u izm enjenoj verziji p rim e ra sa in stru m e n tim a . Z a p a m tite da je svaka m eto d a u interfejsu sam o deklaracija i prevodilac neće d o p u stiti n išta d ru g o .n a st im uj()").

ap stra k tn a klasa ili interfejs. Vežba 5: (2) U zasebn o m pak etu n ap rav ite interfejs koji sadrži tri m etode. jer se koristila u pravo na taj način. Nije b itn o da li obavljate svođenje naviše ka običnoj klasi Instrument. } } class DrveniDuvacki extends Duvacki public String toString() { { return "DrveniDuvacki". sv ir aj() SREDNJE_C Udar al jk e. P onašanje je id en tičn o . ne p ostoji nijedan trag o to m e da li je Instrum e n t„ o b ič n a “ klasa. sveMelodije(orkestar). new LimeniDuvacki (). { // Svođenje naviše prilikom dodavanja u niz: }. ne m o ra da se pojavi u ovom interfejsu. a p strak tn o j klasi Instrument ili interfejsu Instrument. u stvari.svi r a j () SREDNJE_C * ///:U ovoj verziji p rim era učinjena je još jed n a izm ena: m eto d a sta() prep rav ljen a je u toStringO. new DrveniDuvacki ().svir a j () SREDNJE_C Li me ni Duvacki. . new Udaralj k e ( ) . } public static void main(String[] args) Instrument[] orkestar = new { new Duvacki ().Poglavlje 9: Interfejsi 245 class LimeniDuvacki extends Duvacki public String t o S t r i n g O { { return "LimeniDuvacki“ . } } /* Ispis: D u v a ck i.SREDNJE_C).sviraj() SREDNJE_C DrveniDuvacki. U m eto di melodija(). new Zicani (). } } public class Muzika5 { // Ne vodi računa o tipovima pa će i novi tipovi // koje dodate u sistem ispravno raditi: static void melodija(Instrument i) { / / ••• i. } static void sveMelodije(Instrument[] e) { for(Instrument i : e) melodi ja ( i ).sviraj(Nota. Vežba 6: (2) D okažite da su sve m eto d e interfejsa au to m a tsk i javne. R ealizujte taj interfejs u nekom d ru g o m paketu. O statak p ro g ram a radi kao i ranije. sv ir aj() SREDNJE_C Z i c a n i . Pošto je toStringO d eo korenske klase Object.

P r i n t . Vežba9: (3) Izm enite p ro g ram Muzika5.*. p o d tip o v i Procesora m odifikuju String objekte (vodite raču n a o to m e da k o v arijan tn i m o g u biti p o v ra tn i tipovi. um esto interfejsa Instrument.Sendvic. Vežba 10: (3) Izm enite d ato tek u Muzika5. Vežba 8: (2) U datoteci polimorfizam. } Object obradi(Object ulaz) { return ulaz. Izm enite m eto d u m eiodija( ) tako da n jen a rg u m en t b u d e interfejs MozeDaSvira. Na p rim er.java n a p ra v ite interfejs p o d im e n o m BrzaHrana (sa o d o gov araju ćim m eto d am a) i p ro m e n ite Sendvic tako d a realizuje i interfejs BrzaHrana.246 Misliti na Javi Vežba 7: ( 1) Izm enite vežbu 9 iz pogiavlja Polim orfizam tak o da klasu Glodar p re tv o rite u interfejs.java package interfejsi.mindview. Potpuno razdvajanje Kad g od m e to d a rad i s klaso m u m esto sa interfejsom . m odifikuje ih i šalje na izlaz. U koliko biste baš h teli da p rim e n ite tu m e to d u na n ek u klasu koja nije u toj hijerarh iji. Izvedenim klasam a dodajte i interfejs MozeDaSvira.java d o d aju ći interfejs MozeDaSvira. ali ne i tip o v i arg um enata): //: interfejsi/klasaprocesor/Primeni. p retp o stav im o da im ate klasu Procesor s m e to d a m a im e ( ) i o b rad i( ) koja p rim a ulazne podatk e. O sn o v n a klasa se p ro širu je prilik o m pravljenja više različitih v rsta Procesora.klasaprocesor. Stoga m ožete da pišete kod koji je lakše u p o tre b iti više p uta.t o U p p e r C a s e O . class Procesor { public String ime() { return g e t C l a s s O . nem ate sreće. import java. D eklaraciju m eto d e sviraj( ) prebacite iz interfejsa Instrument u MozeDaSvira. } } class VelikimSlovima extends Procesor { String obradi(Object ulaz) { // Kovarijantno vraćanje return ((String)ul a z ) . g e t S i m p l e N a m e O . } } class MalimSlovima extends Procesor { String obradi(Object ulaz) { .util import static net. Udaraljke i Zicani. U ovom slučaju. u b acujući ga u listu iza rezervisane reči implements. Interfejs z n a tn o slabi to ograničenje.uti1 .java praveći a p stra k tn u klasu koja sadrži zajedničke m eto d e po tklasa Duvacki. o g ran ićen i ste na u p o tre b u te klase i n jen ih podklasa.

Ta m eto d a sadrži n ep ro m en ljiv deo a lg o ritm a koji treba izvršiti. a zatim ispisuje rezultat. P retp ostavim o da ste pronašli skup elektronskih filtara koji su p riv id n o p rik lad n i za m e to d u Primeni. M etoda split() je deo klase String. obradi(new Delilac(). u zavisnosti o d arg u m en ta objekta koji joj je p rosleđen. s ) .filtri. O vde je u p o treb ljen a za b rže pravljenje niza objekata tipa String.obradi() p rim a Procesorbilo koje vrste i p rim e n ju je ga na Object. definition. obradi (new Mal i m S l o v i m a O .obradi(): //: interfejsi/filtri/Talasnioblik. beliefs. O vde je S trategija objekat tipa Procesor.ime()).t oS tr in g(((String)ulaz). with. p rint(p.s p l i t (" ")). a vraća String[]. s ) . incorrect] * ///:M etoda Primeni.toLowerCase(). public static void main(String[] args) { obradi(new VelikimSlovima(). Pravljenje m etode koja se p o n aša različito. d o k p ro m en ljiv deo sadrži S trategija. O na p rim a String objek at i deli ga koristeči svoj arg u m e n t kao g raničn ik. } } public class Primeni { public static void process(Procesor p. S trategija je objekat koji prosledujete.obradi(s)). } } /* Ispis: Uključen procesor VelikimSlovima DISAGREEMENT WITH BELIEFS IS BY DEFINITION INCORRECT Uključen procesor MalimSlovima disagreement with beliefs is by definition incorrect Uključen procesor Delilac [Disagreement. naziva se p ro jektn i o b razac Strategy (strategija). o n sadrži kod koji treb a izvršiti. is. a u m etodi main() vidite tri različite Strategije p riin e n je ne na objekte tip a Strings. s ) . . } } class Delilac extends Procesor { String obradi(Object ulaz) // // na sastavne delove: { Argument metode split() je graničnik po kojem se znakovni niz deli return Ar ra ys . by. } public static String s = "Disagreement with beliefs is by definition incorrect". Object s) { print("Uključen procesor " + p.java package interfejsi.Poglavlje 9: Interfejsi 247 return ( (String)ulaz).

getSimpleName(). double gornjiL) donjiLom = donjiL.filtri. } } III-//-. { } public Talasnioblik obradi(Talasnioblik ulaz) { return ulaz.lom = lom. public Niskopropusni(double lom) { this. } } III-- Filtar im a iste elem ente interfejsa kao Procesor. } public Talasnioblik obradi(Talasnioblik ulaz) { return ulaz. gornjiLom.lom = lom.Filtar . } public Talasnioblik obradi(Talasnioblik ulaz) { return ulaz. } public Talasnioblik obradi(Talasnioblik ulaz) return ulaz. public Visokopropusni(double lom) { this.filtri. } } III-- //: i nterfejsi/filtri/Pojasni Propust. public class Filtar { public String ime() { return getC1ass().java package interfejsi.filtri. interfejsi/filtri/Filtar. private final long id = brojac++. public PojasniPropust(double donjiL.248 Misliti na Javi public class Talasnioblik { private static long brojac.java package interfejsi. // Lažna obrada { } } III-interfejsi/filtri/Visokopropusni. gornjiLom = gornjiL. public class Niskopropusni extends Filtar { double lom. } } III-//: interfejsi/filtri /N is ko pr op us ni. public class Visokopropusni extends Filtar { double lom.java //: package interfejsi. public String t o S t r i n g O { return "Talasnioblik " + id. public class PojasniPropust extends Filtar { double donjiLom.filtri.java package in terfejsi. ali pošto nije nasledio P rocesor-jer tvorac klase Filtar nije ni p o m islio kako biste vi heli da ga u p o treb ite kao P rocesor.

import static ne t. n a p rim er: //: interfejsi/i nterfejsprocesor/ProcesorZnakovni hNi zova. public static void main(String[] args) { Primeni. .obradi() d a se p o n o v o upotreb ljav a ta m o gde bi to trebalo. } public abstract String obradi(Object ulaz). u t i l .obradi (new Mal i m S l o v i m a O .java package interfejsi. public static String s = "If she weighs the same as a duck. public abstract class ProcesorZnakovnihNizova implements Procesor{ public String ime() { return g e t C l a s s O . Primeni . U suštini.obradi(new Delilac ().java package interfejsi.obradi() koja u zim a taj interfejs.interfejsprocesor. Object s) { print(''Uključen procesor " + p.Print. O b ratite p ažn ju na to da su i ulazi i izlazi tip a Talasnioblik.interfejsprocesor.*. s ) . import j a v a . o g ra n ičen ja b i bila to lik o oslabljena d a biste m ogli k o ristiti m eto d u Primeni. mi nd vi ew . she's made of wood". Object obradi(Object ulaz). Evo m o d ifik o v an ih verzija Procesora i Primeni: //: interfejsi/interfejsprocesor/Procesor.ime()).Poglavlje 9: Interfejsi 249 ne m ožete u p o tre b iti s m e to d o m Primeni. veza izm ed u Primeni.obradi() i Procesora jača je nego što je p o tre b n o . s). Primeni.u ti l. D a je Procesor interfejs.*.obradi(new Veli ki mS lo vi ma (). print(p. public interface Procesor { String ime().obradi (s)).getSimpleName(). iako bi to bilo lepo. a to sprečava k o d iz Primeni. } } ///= Prvi način na koji m o žete p o n o v o u p o treb iti k o d jeste o n aj kada p ro g ram e ri klijenti la p išu svoje klase tako d a b u d u usaglašene sa ov im interfejsom .java package interfejsi.obradi(). s ) .interfejsprocesor. } ///://: in te rf ej si/interfejsprocesor/Primeni. public class Primeni { public static void o b r a d i (Procesor p.

fi Itar = filtar. . a nije pravljena nova.interfejsprocesor. a.obradi((Talasnioblik)ulaz). duck. import interfejsi.. } { public Talasnioblik obradi(Object ulaz) return fi1ter. na prim er.toLowerCase().250 Misliti na Javi class VelikimSlovima extends ProcesorZnakovnihNizova { public String obradi(Object ulaz) { // Kovarijantno vraćanje return ((String)ulaz) .obradi(new FiltarAdapter(new Ni sk op ro pu sn i(1.java package interfejsi. p ro n a đ e n a je gotova b iblioteka. U takvim slučajevim a m o žete u p o tre b iti p ro jek tn i o b razac A dapter (a d a p te r).0)). Pr im en i.tollpperCase(). w ) . } } public class FiltarProcesor { public static void main(String[] args) { Talasnioblik w = new Talasnioblik().fi1t r i . public FiltarAdapter(Filtar filtar) this.*. she's. she's made of wood Uključen procesor Delilac [If.toString(((String)ulaz). of. SHE'S MADE OF WOOD Uključen procesor MalimSlovima if she weighs the same as a duck. the. class Fi1tarAdapter implements Procesor { Filtar filtar. weighs. Za elektron ske filtre. she. { } public String ime() { return f i l t a r .spl it(" ")). i m e O . } } class MalimSlovima extends ProcesorZnakovnihNizova { public String obradi(Object ulaz) { return ((String)ulaz). as. same. N avodim o način kako u A d ap teru pišete k o d koji če preuzeti postojeći interfejs i n ap rav iti interfejs koji vam je p o treb an : //: i nterfejsi/interfejsprocesor/ProcesorFi 1 tar. wood] * ///:M eđ u tim . made. često n e m ožete da m o đifik u jete klase koje h o čete da u p o tre b ite . } } /* Ispis: Uključen procesor VelikimSlovima IF SHE UEIGHS THE SAME AS A DUCK. } } class Delilac extends ProcesorZnakovnihNizova { public String obradi(Object ulaz) { return Arrays.

Prilagodite klasu tako da radi s m e to d o m interfejsprocesor... M ožda ste uočili i delegiranje u klasi FiltarAdapter.. u C + + -u se naziva višestruko nasleđivatije i sa so b o m nosi p riličn o o b im a n prtljag.o d n o sn o za njega se ne odvaja nikakvo m esto za skladištenje ... Vežba 11: (4) N apravite klasu s m e to d o m koja u zim a a rg u m e n t tip a String i daje rezultat u kojem su zam en jen a m esta svakog p ara znakova u to m a rg u m e n tu ...obradi( new FiltarAdapter(new PojasniPropust(3. Svi ostali nasledeni elem en ti m o raju da b u d u interfejsi.0. Ako n asleđujete nešto što nije interfejs . jer p o n ek ad treba reći da je . i Interfejs n i ......obradi()...0)).. čim e k o d postaje lakše p o n o v o upotrebljiv. Interfejs n O sno v na klasa neke izvedene klase ne m o ra da b u d e ni a p stra k tn a ni „konk retna" (klasa koja n em a a p strak tn e m eto d e).x tip a i a i b i c “. } } /* Ispis: Uključen procesor Niskopropusni Talasnioblik 0 Uključen procesor Visokopropusni Talasnioblik 0 Uključen procesor PojasniPropust Talasnioblik 0 * ///:U o v om p ristu p u A d ap teru . k o n stru k to r klase FiltarAdapter uzim a interfejs koji im ate .. To je k o risno.ništa nas ne sprečava da k o m b in u je m o više interfejsa.Poglav[je 9: Interfejsi 251 Primeni. U Javi m ožete da u rad ite isto. P r imeni. m ožete da nasledite sam o je d n u takvu klasu. pa se u Javi p rilik o m k o m b in o v an ja više interfejsa ne javljaju p ro b lem i koje sm o susretali u C + + -u : Apstraktna ili konkretna osnovna klasa i Interfejs I A ! • : Funkcije osnovne klase Interfejs 1 ...A i : Interfejs 2 . Višestruko nasleđivanje u Javi Pošto interfejs uopšte nem a nikakvu realizaciju .obradi(new FiltarAdapter(new Vi so ko pr op us ni(2. w ) . O vo k o m b in o v an je interfejsa više klasa.. .i p roizvodi objekat koji im a interfejs Procesor koji vam treba. je r svaka klasa m ože da im a različitu realizaciju neke m eto de.Filtar .... ali realizaciju m ože da im a sam o je d n a klasa. w ) . .Primeni..A ...0))... 4....... R azdvajanje interfejsa o d realizacije o m o gu ćav a d a isti interfejs b u d e p rim en jen na više različitih reaiizacija.... Sva im en a interfejsa m o ra ju biti razdvojena zarezim a posle rezervisane reči implements.

java // Više interfejsa interface MozeDaSeBori void boriSe(). public static void u(MozeDaPliva x) { x. } } } } ///:U g orn jem p rim e ru v idite da klasa H ero j k o m b in u je klasu A k c io n iju n a k sa interfejsim a M o zeD aS eB o ri. M o zeD aP Iiv a i M ozeD aL eti.svaki po staje nezavisan tip. // Tretiraj ga kao tip MozeDaLeti w(h). U n a re d n o m p rim e ru p rik a za n a je k o n k re tn a klasa k oja uz nekoliko interfejsa daje n o v u klasu: //: interfejsi/Avantura. p rv o m o ra te da navedete tu k o n k re tn u klasu. // Tretiraj ga kao tip MozeDaSeBori u(h).252 Misliti na Javi M ožete da n avedete koliko g o d želite interfejsa . t ( h ) . MozeDaLeti public void plivaj() public void leti () {} {} { } public class Avantura { public static void t(MozeDaSeBori x) { x.boriSe().plivaj(). { } class AkcioniJunak { public void boriSe() {} } class Heroj extends AkcioniJunak implements Mo ze D a S e B o r i . MozeDaPliva. p revodilac prijavljuje grešku. a posle nje interfejse. { } interface MozeDaPliva { void p l i v a j O .) Potpis m etode boriS e() isti je 11 interfejsu M ozeD aS eB ori i u kiasi A k cio n iju n a k . // Tretiraj ga kao tip AkcioniJunak { } } public static void w(AkcioniJunak x) { x. Kada na ovaj način k o n k re tn u klasu k o m b in u je te sa interfejsim a. } interface MozeDaLeti void leti (). (U su p ro tn o m . public static void m a i n ( S t r i n g [] args) Heroj h = new H e r o j (). ali pri to m ćete do b iti još jedan interfejs. Ako želite da n apravite objekat . public static void v(MozeDaLeti x) { x. // Tretiraj ga kao tip MozeDaPliva v (h ) . ka kojem m o žete da svedete naviše n o v u klasu. a m etoda b o riS e() ncpostoji u definiciji klase H eroj.boriSe().leti(). Interfejs m ožete da nasledite (kao što ćete ubrzo videti).

čim e au to m atski p ostaje i deo klase Heroj. d ru g i razlog za koriščenje interfeisa isti je kao i za korišćenje a p strak tn e osn ov ne klase: d a p ro g ra m e r klije n t ne m o že da n ap ravi objekat te klase i d a b u d e svestan kako je to sam o interfejs. o n m ože d a se p ro sledi bilo kojoj o d tih m eto d a.o n a dolazi u z klasu Akcionijunak. p a je m oguče n ap rav iti objekat te klase. M eđ u tim . Iako m eto d a boriSe() nije izričito definisana u klasi Heroj. i kako k o m b in u jete nekoliko interfejsa u jedan n o v interfejs. m orate da napravite klasu u kojoj postoje definicije svih m etoda. U klasi Avantura posto je četiri m eto d e čiji su a rg u m en ti razn i interfejsi k o n k retn e klase. Vežba 13: (2) N apravite interfejs koji nasleđuju dva d ru g a interfejsa. To će p o k a z a ti kak o in te rfejsi sp re ča v a ju „ P ro b le m ro m b a “ koji se javlja u C + + . zahvaljujući n ačin u n a koji su interfejsi u Javi p ro jekto vani. ako znate da će nešto b iti osn ov na klasa. } interface Smrtonosno { void u b i j (). . interface Cudoviste { void za p r e t i (). Z a p a m tite da je u g o rn je m p rim e ru po k azan suštinski razlog p o sto jan ja interfejsa: m o g u č n o st da se obavi svođenje naviše ka više o sn o v n ih tipova. U suštini. N eka treći interfejs nasledi ta dva. To se obavlja b ez p rep rek a i bez p o se b n o g angažovanja p ro g ram era. U oba slučaja do bićete n o v interfejs. p rv o p o kušajte d a to napravite kao interfejs.Poglavlje 9: Interfejsi 253 novog tip a. interfejsu lako d odajete nove deklaracije m eto d a. što znači da se m ože svesti naviše ka svakom o d tih interfejsa. uvek od a b e rite in te rfejse u m esto ap strak tn ih klasa. K ada se n aprav i objekat klase Heroj.u p rilik o m v iš e s tru kog n a sle đ iv a n ja .java // Proširivanje interfejsa nasleđivanjem. Z bog toga se javlja pitanje: da li u p o tre b iti interfejs ili a p stra k tn u klasu? A ko o sn o v n u klasu m ožete da naprav ite bez definicija m eto d a i bez p ro m en ljiv ih . (O to m e ćem o još govoriti u sažetku ovog poglavlja. kao što se vidi iz n ared n o g prim era : //: i nterfejsi/HororPredstava.java d o dajte interfejs p o d im e n o m MozeDaSePenje p rate ć i o b lik ostalih interfejsa u njoj.) Vežba 12: (2) U datoteci Avantura.: Proširivanje interfejsa nasleđivanjem P o m o ću nasieđivanja. } interface OpasnoCudoviste extends Cudoviste { void unisti ().

Sintaksa u p o tre b ljen a za interfejs Vampir m ože da se koristi sa n io kada nasledujete interfejse. w( v l a d ) .ubij(). U m eto d i m a in ( ) nap rav ite o bjek at te klase i prosled ite ga svakoj m eto d i. O n je realizovan u klasi Zmaj.254 Misliti na Javi class Zmaj implements OpasnoCuđoviste { public void zapreti() {} public void u n i s t i () {} } interface Vampir extends OpasnoCudoviste. Kao što vidite. z a p r e t i (). Vampir vlad = new Ve om aZ ao Va mp ir (). u( b a r n i ) . v( v l a d ) . Smrtonosno { void pijeKrv(). N asledite novi interfejs iz ta tri uz dod av an je jo š je d n e nove m etode. } } static void w(Smrtonosno s) { s. v( b a r n i ) . ali pošto interfejs m o že da se sastoji od više d ru g ih . Sada napišite četiri m etode o d kojih će svaka za arg u m en t im ati je d a n o d d atih interfejsa. N apravite klasu realizujući novoform ira n i interfejs i isto v rem en o nasleđujući k o n k retn u klasu. u(vlad). Vežba 15: (2) Izm en ite p re th o d n u vežbu praveći ap stra k tn u klasu i iz nje izvedite klasu. { } } } ///:Interfejs OpasnoCudoviste je je d n o sta v n o pro širen je interfejsa Cudoviste. static void v(OpasnoCudoviste d) { d.unisti (). im ena interfejsa sam o su razdvojena zarezim a.zapreti(). } class VeomaZaoVampir implements Vampir public void zapreti() public void ubij() {} {} {} public void u n is ti() {} public void pijeKrv() { } public class HororPredstava { static void u(Cudoviste b) { b. public static void main(String[] args) OpasnoCudoviste barni = new Zmaj(). Vežba 14: (2) N ap rav ite tri interfejsa o d kojih svaki im a po dve m etode. . d. p rilik o m pravljenja novog interfejsa rezervisana reč extends m ože da se o d n o si na više interfejsa. Uz rezervisanu reć extends m o žete da u p o treb ite sam o jed n u klasu.

U p re th o d n o m p rim e ru . interface II { void f(). } } class C2 implements II. } // preklopljena } class C3 extends C implements 12 { public int f(int i) { return 1. b u t vvith different return type Ako u p o tre b ite ista im ena m eto d a u različitim interfejsim a koje n am erav ate da kom b in ujete. interfejs M o zeD aS eB o ri i klasa A k c io n iju n a k im aju m e to d u id en tičn o g im en a . } // preklopljena } class C4 extends C implements 13 { // Identična. ) interface 13 { int f().java:23: f( ) in C cannot im p lem en t f ( ) in II.java:24: interjaces 13 a n d II are incompatible. ) interface 12 { int f (int i). . } } // Metode se razlikuju samo po povratnom tipu: //! class C5 extends C implements II {} //! interface 14 extends II. T rud ite se da to izbegnete. a p rek lo p ljen e funkcije ne m ogu da se razlikuju sam o p o p o v ra tn o m tip u .v o id b o riS e().Poglavlje 9: Interfejsi 255 Sukobljavanje imena prilikom kombinovanja interfejsa P rilik o m k o m b in o v a n ja više interfejsa m ožete d a se suočite s m alo m začkoljicom .java package interfejsi. uglavno m ćete u neti konfuziju i sm an jiti čitljivost p ro g ram a. 12 { public void f() {} public int f (int i) { return 1. realizacija i preklapanje n ezg o d n o izm ešani. U n ašem p rim e ru to nije p ro b lem . } class C { public int f() { return 1. Kađa se u kloni k o m e n ta r ispred poslednja dva reda p rim e ra . nije problem: public int f() { return 1. a ttem p tin g to use incom patible return type fo u n d : in t recjuired: void SukobljavanjeInterJejsa. p o ru k a o grešci sam a sve govori: SukobljavanjeInterfejsa. ali šta ako se m eto d e razlikuju p o p o tp isu ili p o v ra tn o m tipu? Sledi p rim e r: //: interfejsi/Sukobljavanjelnterfejsa. both define f( ) . 13 {} ///:- P ro b lem se javlja je r su redefinisanje. je r su m e to d e iste u obe klase.

n e x t ()). } cb. neka b u d e Readable (čitljiva): //: interfejsi/SlucajneReci. private static final private int brojac. N apišete m e to d u koja obavlja izvesne operacije. cb.nextlnt(samoglasnici. N a prim er.append(" "). V idećete d a Readable nije a rg u m e n t n ijed n e d ru g e m eto d e u stan d a rd n o j b iblioteci Jave . Scanner m ože da radi s više tipova. } char[] samoglasnici = "aei o u " .o ut.t o C h a r A r r a y ().nextInt(velikaslova. opštija i upotrebljivija. // Pokazuje kraj ulaza c b .ha sN ex t()) System .n ap rav ljen je sam o za Scanner. . U je d n o stav n im slučajevim a.nio. to se ra d i u o b lik u m e to d e koja p rihvata interfejs. private static final char[] malas = "abcdefghijklmnopqrstuvwxyz".append(mal as[sl ucajno.to Ch arArray().prin tl n( s.*.append(samoglasnici[slucajno. k o n stru k to r Java SE5 klase Scanner (o kojoj ćete više sazn ati u poglavlju Z n akovn i nizovi) p rim a interfejs Readable. T im e vaša m e to d a po staje fleksibilnija.brojac = brojac. private static final char[] velikaslova = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".u ti l.length)]). import ja va . { this. public class SlucajneReci implements Readable { private static Random slucajno = new Random(47). tako da Scanner ne m o ra da ograniči svoj a rg u m e n t n a o d re đ e n u klasu. U suštin i. return 10.1ength)]). // Broj dodatih znakova } public static void m a i n ( S t r i n g [] args) w h i 1e ( s . N a taj način . a ta m eto d a p rih v ata i interfejs koji vi zadate. i < 4. for(int i = 0.1en gt h) ]).append(velikaslova [s lucajno. Stoga se interfejsi o b ičn o u p o treb ljav aju u p re th o d n o s p o m e n u to m p ro jek tn o m o b rascu Strategy. a vam a ostavlja d a ga realizujete i m eto d i p ro sled ite svoj objekat. import java.*. { Scanner s = new Scanner(new S1 uc a j n e R e c i (10)).java // Realizovanje interfejsa tako đa bude usaglašen sa određenom metodom.toCharArray().nextInt(malas. i++) { cb. A ko prav ite n o v u klasu i h o ćete d a o n a b u d e u p o treb ljiv a s klasom Scanner. vi kažete: „M ožeš u p o tre b ljav a ti m o ju m e to d u s bilo kojim o b jek to m koji je usaglašen s m o jim interfejsom ".256 Misliti na Javi Prilagođavanje interfejsu Jedan o d najvažnijih razloga za u p o tre b u in terfejsa jeste m o g u ć n o st p o sto jan ja više realizacija istog interfejsa. public SlucajneReci(int brojac) public int read(CharBuffer cb) { iffbrojac— == 0) return -1.

v ideti d o k u m e n ta c iju klase CharBuffer) ili vraćate -1 kada ulaza više nem a.5166020801268457 0. System.u ti1 .*. public class Pri1agodjeniS1ucajniDouble extends S1ucajniDouble implements Readable { private int brojac.java // Pravljenje adaptera s nasleđivanjem.n ex tD ou bl e(). D akle.5309454508634242 0.Poglavlje 9: Interfejsi 257 } /* Ispis: Yazeruyac Fowenucor Goeazimom Raeuuacio Nuoadesiw Hageai kux Ruqicibui Numasetih Kuuuuozog Waqizeyoy * ///:Interfejs Readable zahteva sam o realizaciju m eto d e read().*.kako ćete postići da o n a radi s klasom Scanner? Evo jed n e klase koja pro izv o d i slučajne realne brojeve (s p o k retn im zarezom ): //: interfejsi/SlucajniDouble. i ++) S1ucajniDoubles sc = new S1uc aj ni Do ub le ().7271157860730044 0. u t i l . import j a va . napravili sm o novu klasu koja je i tip a S lu c a jn iD o u b le i tipa R eadable: //: interfejsi/PrilagodjeniSlucajniDouble.print(sc. ali se u ovom slučaju prilag o đ en a klasa m ože nap rav iti nasleđivanjem i realizacijom interfejsa R ead ab le. i < 7 .16020656493302599 0. } { public static void ma in ( S t r i n g [] args) for(int i = 0.next() + " "). public double next() { return sl uc aj an .nio.out.2678662084200585 0. . import java. koristeći pseu do višestruk o nasledivanje koje o m ogućava rezervisana reč in terfa ce.18847866977771732 0. P retp o stav im o da im ate klasu koja nije realizovala Readable . public class SlucajniDouble { private static Random slucajan = new Random(47). U m eto d i read(). } } /* Ispis: 0.java import ja v a . argum e n tu tipa CharBuffer dod ajete znakove (to se m o že u ra d iti n a nekoliko načina.2613610344283964 * ///:Fonovo sm o u p o treb ili p ro jek tn i o b razac A dapter .*.

V ežba 16: (3) N apravite klasu koja proizvodi niz znakova (objekata tip a ch a r).java // Upotreba interfejsa za pravljenje grupa konstanti.toString(next()) + 1 1 cb. N0VEMBAR = 11. SEPTEMBAR = 9.== 0) return -1.7271157860730044 0. FEBRUAR = 2.5309454508634242 0. 0KT0BAR = 10. naići ćete na ovakav k o d n apisan p re Jave SE5: //: interfejsi/Meseci.print(s. } } /* Ispis: 0.2613610344283964 * ///:Pošto na ovaj način svakoj postojećoj klasi m o žete d o d a ti interfejs. MART = 3.length().brojac = brojac. return rezultat.16020656493302599 0. Prilagodite tu klasu tako da se m ože u p o tre b iti za ulaz objekta tip a S can n er. package interfejsi. APRIL = 4. interfejs je korisna alatka za pravljenje g ru p a k o n sta n tn ih v red n o sti. U to m e leži m oć korišćenja interfejsa u m esto klasa. } public static void main(String[] args) while(s.~ O b ra tite p ažn ju na to da je i ovde u p o treb ljen uob ičajen i sti! pisanja statičn ih finalnih polja u Javi. znači da m etoda koja p rim a interfejs obezbeđuje i n ačin p rilag o đ en ja bilo koje klase za rad s to m m eto dom . D akle. { Scanner s = new Scanner(new Pr il ag odjeniSlucajniDouble(7)). JUNI = 6.nextDouble() + " ").append(rezultat). Polja u interfejsima Pošto su sva polja koja stavite u interfejs au to m atsk i statičn a i finalna.5166020801268457 0. MAJ = 5. JULI = 7. public interface Meseci int JANUAR = 1. DECEMBAR = 12. to je b io jed in i način da se postig ne efekat koji daje rezervisana reč e n u m u C -u ili C ++-U .2678662084200585 0. { } public int read(CharBuffer cb) { if(brojac-. Pre Jave SE5.hasNextDouble()) System. čije su v red n o sti inicijalizovane k o n stan ta m a —sve se piše velikim slovim a.258 Misliti na Javi public PrilagodjeniSlucajniDouble (int brojac) this. String rezultat = Double. AVGUST = 8.18847866977771732 0. { } ll l .out. .

Inicijalizacija polja u interfejsima Polja definisana u interfejsim a ne m o g u b iti p ra zn a finaln a polja. public class TestirajSlucajnePromenljive { public static void main(String[J args) { pri n t (S1ucajnePromenl j i v e . biće inicijalizovana kada klasa b u d e prvi p u t u čitana. Evo i jed n o stav n o g testa: //: interfejsi/TestirajSlucajnePromenljive. pa to nije p o tre b n o e k sp liđ tn o zadati.SLUCAJAN_DOUBLE).5939291E18 5.nextInt(10).mindview. pri n t (S1ucajnePromenlji ve . N a p rim er: //: interfejsi/SlucajnePromenljive. što će se desiti kada prvi p u t Jiudete p ristu p ili bilo koni polju. ) ///:Pošto su polja statičn a. V ežba 17: (2) D okažite da su p olja interfejsa au to m atsk i statičn a i finalna. pri nt(S1ucajnePromenlj iv e .*. .SL UC AJ AN _L ON G). double SLUCAJAN_DOUBLE = SLUCAJAN.nextLong() * 10.Poglavlje 9: Interfejsi 259 d o k se više reči u je d n o m id en tifik ato ru razdvaja p o tc rto m . int SLUCAJAN_INT = SLUCAJAN. n a rasp o lag an ju v am je m n o g o m o ćn ija i fleksibilnija rezervisana reč e n u m . print(S1ucajnePromenlji ve . već se čuvaju u sta tičn o m skladištu to g interfejsa.S LUCAJAN_FLOAT). Polja u interfejsu su a u to m a tski javna.net sadrže p o tp u n o pis starog n ač in a p ravljenja n a b ro jan ih tipova p o m o ć u interfejsa). M eđ u tim .Print.java import static n e t . p riliko m čitan ja starog koda v erov atn o ćete često nailaziti n a taj s ta ri id io m (d o d aci ove laijige na w w w . O d pojave Jave SE5. ) } /* Ispis: 8 -32032247016559954 -8. long SLUCAJAN_LONG = SLUCAJAN. p a više n e m a sm isla u p o treb ljav ati interfejse za k o n stan te.nextDouble() * 10.nextLong() * 10.java // Inicijalizacija polja u interfejsu pomoću // nekonstantnih inicijalizacionih vrednosti import java. ali m og u da b u d u inicijalizovana n ek o n sta n tn im izrazom .SLUCAJAN_INT). float SLUCAJAN_FLOAT = SLUCAJAN.779976127815049 * ///:O va polja nisu d eo interfejsa.util public interface SlucajnePromenljive { Random SLUCAJAN = new Random(47). Više p o jed in o sti o u p o tre b i rezervisane reči e n u m naći ćete u poglavlju N abrojani tipovi.uti1 .M indV iew .

public void primiD(D d) { dRef = d. } private class Dlmp implements D { public void f() {} } public class DImp2 implements D { public void f() {} } public D uzmiD() private D dRef. . class A { interface B { void f (). } ’ Z a h v a lju je m M a r tin u D a n e ru š to je p o s ta v io o v o p ita n je to k o m se m in a ra . dRef. } public class Blmp implements B { public void f() {} } private class BImp2 implements B { public void f() {} } public interface C { void f().java package interfejsi. } } interface E { interface G { void f (). T im e se o tk riv a nekoliko veom a k o risn ih osobina: //: interfejsi/ugnezdjivanje/Ugnezdjivanjelnterfejsa.ugnezdjivanje.260 Misliti na Javi Ugnežđivanje interfejsa Interfejsi3 m o g u da b u d u u g n ežden i u n u ta r d ru g ih klasa ili d ru g ih interfejsa. { return new DImp2(). } class Clmp implements C { public void f() {} } private class CImp2 implements C { public void f() {} } private interface D { void f().f().

Č em u služi p ri- . p o p u t n eugnežđ en ih interfejsa. kao što je slučaj s A.D: //! A.B { public void f() {} } class Clmp implements A. a2 . // Samo drugi A može nešto da uradi sa uzmiD(): A a2 = new A ( ) . //! class Dlmp implements A. uz mi D( )).C { public void f() {} } // Privatni interfejs može da se realizuje samo u klasi koja ga je definisala. // Ne može da bude privatan unutar interfejsa: //! private interface I {} } public class Ugnezdjivanjelnterfejsa { public class Blmp implements A. // Nije moguć pristup A. // Ne može da se pristupi članu interfejsa: //! a.G { public void f() {} } } public static void main(String[] A a = new A ( ) .D ad = a . // Vraća samo A.D (za ugnežđene interfejse koristi se ista sintaksa kao i za u gnežđene klase).f (). u z m i D ( ) .G { public void f() {} } class EImp2 implements E { public void g() {} class EG implements E.Poglavlje 9: Interfejsi 261 // Suvišan “public": public interface H { void f().DImp2 d i2 = a. } void g ( ) .p ri mi D( a.D: //! A. on i tak o đ e m ogu im ati javni ili paketni p ristu p . u z mi D( ).D { //! public void f() {} //! } class Elmp implements E { public void g() {} } class EGImp implements E. args) { } } ///:S intaksa ugnežđivanja interfejsa u n u ta r klase p riličn o je očig led n a i. Postoji nova začkoljica: interfejsi takođe m ogu da b u d u p rivatn i.uzmiD().

to je realizovanje p riv atn og interfejsa način da n am etnete p rim e n u definicija nekog interfejsa. Interfejsi i Proizvođači Interfejs bi trebalo da posluži kao p u t do više realizacija.java import static ne t.ovde se strogo p o štu ju . Pravila o interfejsim a . Šta m ožete da u rad ite s p o v ra tn o m v redno šću ove m etode? U m e to d i m ain() m o žete da uočite nekoliko po ku šaja da se ta p o v ra tn a v red n o st u p o treb i.*. ali n am klasa A. } interface ProizvodjacUsluga { Usluga uzmiUslugu (). sm a tram da m ožete naići na m esto na kom e će k o risn o d a vam posluži. U p rin c ip u . p riv atn i interfejsi ne m o gu da b u d u realizovani van klase u kojoj su definisani. Klasa A. interface Usluga { void me t o d a l ( ) . Evo jed n o g p rim era koji će pokazati stru k tu ru obrasca Factory Method: / / : interfejsi/Proizvodjaci. P o v ratn u v red n o st jed in o m ožete d a p red ate d ru g o m o b jek tu koji im a ovlašćenja da je koristi . m ed u tim . vaš kod bio p o tp u no izolovan o d realizacije interfejsa. tim e nećete dozvoliti svođenje naviše). U m esto da k o n stru k to r pozivate n e p o sred n o .DImp2. U početk u vam se m ože u čin iti da ove m o g u ćn o sti postoje sam o zbog k on sistentno sti sintakse.262 Misliti na Javi vatni ugnežđeni interfejs? M ogli biste p retp o stav iti kako o n m ože sam o da b u d e realizovan kao priv atn a ugnežđena klasa u klasi D lm p. Pošto ne p ostoji način da se spolja vidi kako ona. ali se svi o n i završavaju n eu sp eh o m . void me t o d a 2 ( ) . u stvari. } . pa je interfejs u g n ežđ en u n u ta r d ru g o g interfejsa au to m atsk i javan i ne m ože b iti proglašen p riv atn im .Print.tim e bi.DImp2 pokazuje d a o n takođe m ože biti realizovan i kao jav n a klasa.p o seb n o o n o da svi elem en ti interfejsa m o ra ju da b u d u javni .util. Takođe.mindview. teorijski. Klasa Ugnezdjivanjelnterfejsa p o k azu je različite načine na koje ugnežđeni interfejsi m o gu da b u d u realizovani.u ovom slučaju. što bi om ogućilo n e p rim etn u zam enu jed n e realizacije d ru g om . m ože da se up otrebljava sam o kao klasa tog o d ređ en o g tipa. a da p ri to m e ne do d ate i inform aciju o tip u (odnosno . kada zn ate da neka m o g u ćn o st postoji. Interfejs E po kazuje d a interfejsi m o g u d a b u d u ugn ežđen i jed an u n u ta r drugog. vi pozivate m eto d u za pravljenje proizvodn og objekta koji proizvodi realizaciju tog interfejsa . d ru g o m o b jek tu klase A p rek o m e to d e p rim iD ( ). P rilikom realizovanja interfejsa n e m o rate da realizujete i interfejse koji su u njega u gnežđeni. realizuje privatn i interfejs D. a tipičan način pravljenja objekata usklađenih sa interfejsom jeste p ro jek tn i obrazac Factory M ethod (P roizvodna m etoda). M etoda uzm iD() u n o si d o d a tn u d ile m u po p ita n ju p riv atn o g interfejsa: o na je javna m eto d a koja vraća referencu n a p riv a tn i interfejs.

na prim er.uti1. .metoda2(). } } public class Proizvodjaci { { public static void korisnikUsluge(ProizvodjacUsluga fabr) Usluga s = fa br . } public static void main(String[] args) // Realizacije su potpuno zamenljive: korisnikUsluge(new Realizacija2Proizvodjac ()).u zmiUslugu().Poglavlje 9: Interfejsi 263 class Realizacijal implements Usluga { Realizacijal() {} // Paketni pristup {print("Realizacijal me to da l1 ').*.Print.} {print("Realizacijal metoda2").metodal ().} public void metodal() public void metoda2() } class RealizacijalProizvodjac implements ProizvodjacUsluga { public Usluga uzmiUslugu() { return new Realizacijal().} {print("Realizacija2 metoda2"). da bi on m ogao da pozove odgovarajući k on stru ktor.java // Kostur za Igre napravljen pomoću Proizvodnih metoda. { korisnikUsluge(new RealizacijalProizvodjac ()). import static net.} public void metodal() public void metoda2() } class Realizacija2Proizvodjac implements ProizvodjacUsluga { public Usluga uzmiUslugu() { return new Re al izacija2(). } } class Rea1izacija2 implements Usluga { Realizacija2() {} // Paketni pristup {print("Realizacija2 metodal").mindview. za igranje šaha i dam e na istoj tabli: //: interfejsi/Igre. } } /* Ispis: Realizacijal metodal Realizacijal metoda2 Realizacija2 metodal Realizacija2 metoda2 * ///:Da n e m a obrasca Factory M ethod . s. S . Z ašto da čovek do d aje još jed an nivo posredovanja? Jedan od uobičajenih razloga je pravljenje zajedničkog kostura. P retp o stav im o da p ravite sistem za igranje igara. negde u k odu m orali biste da navedete tačan tip interfejsa U slu g a koji se prav i.

private static final int POTEZI = 4. public boolean potez() return ++potezi { print("Dama potez " + p o t e z ) . whi1e(s. } } /* Ispis: Dama potez 0 Dama potez 1 Dama potez 2 Šah potez 0 Šah potez 1 Šah potez 2 Šah potez 3 * ///:- .potez()) { } public static void main(String[] args) { igraj Igru(new P r o i z v o d j a c D a m a O ) . } } class sah implements Igra { private int potezi = 0.uzmiIgru(). } } class ProizvodjacDama implements Proizvodjaclgara { public Igra uzmilgru() { return new Dama().264 Misliti na Javi interface Igra { boolean potez(). igrajlgru(new Proizvodjacsah()). private static final int POTEZI = 3. } } public class Igre { public static void igrajIgru(ProizvodjacIgara proizvodjac) Igra s = pr oizvodjac. } class Dama implements Igra { private int potezi = 0. != POTEZI. { public boolean potez() return ++potezi print("šah potez " + potezi). } interface Proizvodjaclgara { Igra uzmilgru(). } } class Proizvodjacsah implements Proizvodjaclgara { public Igra uzmilgru() { return new sah(). != POTEZI.

Vežba 18: (2) N apravite interfejs Cikl s realizacijam a Unicikl. P ostoje i kom plik ov anije igre za koje bi se m ogao iskoristiti taj obrazac. M no gi su podlegli to m iskušenju i n apravili interfejse i Proizvođače gde go d su m ogli. Počnite o d klasa. Vežba 19: (3) P o m o ću p ro izv o d n ih m eto d a n ap rav ite zajednički k o stu r za bacanje n o včića i bacanje kocke.za svaki slu čaj“. u m esto svake klase g otovo uvek se m ože n a p ra viti interfejs i Proizvođač.n et. a bez prav o g razloga —p o su m n jać u u sve p ro jek te te osobe. Razlog: m o žd a će zatrebati dru g ačija realizacija. D o d atn a složenost je bitna. pa ako se ispostavi da su interfejsi n e o p h o d n i. Svaku apstrakciju treba da m otiviše o d re đ en a stv arn a p o treb a. p a tu ap strak ciju treb a d o d a ti uvek. ponovo sve p o d elite na p roste faktore. Bicikl i Tricikl. ko ji sc m o ž e k u p iti n a lo k a c iji w w w . Sažetak Lako je pasti u zam k u i sve interfejse p roglasiti d o b rim pa ih zbog toga uvek treb a p retp ostav iti k o n k re tn im klasam a. R e š e n ja o d a b r a n ih v e žb i d a ta su u e le k tr o n s k o m d o k u m e n t u T liitikin g in Java A n n o ta te d S olution G uide . . N aravno. N apravite Proizvođače za svaki tip Cikla i k o d koji u p o treb ljav a te Proizvođače.M in d V iew . N em ojte taj d od a tn i nivo indirekcije stavljati o d m a h i svugde. interfejse treba da d o d ate tek p rilik o m p o n o v n e p o d ele na proste faktore. U sledečem poglavlju videćete elegan tniji n ačin za realizovanje Proizvođača p o m o ć u a n o n im n ih u n u tra šn jih klasa.. U m esna sm ern ica je radije koristite klase nego interfejse. Interfejsi su od lične alatke. i ako m e neko n atera da p ro đ e m kroz n ju sam o da b ih na kraju shvatio kako je interfejs d o d a t . Ako vam zatreb aju .Poglavlje 9: Interfejsi 265 U koliko klasa Igre predstavlja složen deo k o d a. ali je lako p reterati s njih o v o m u p o tre b o m . je r tim e povećavate složenost. ovaj p ristu p om og ućav a p o n o v n u u p o tre b u tog koda s različitim v rstam a igara. To se pretv orilo u svojevrsnu p re ra n u o p tim izaciju p ro jek ta.

{ . N akon to g odeljka. u o d eljk u „Z ašto u n u tra šn je klase?“ naći ćete p rim ere koji će o b jasniti p re d n o sti u n u tra šnjih klasa. public class Posiljkal { class Sadrzina { private int i = 11.java // Pravljenje unutrašnjih klasa.Unutrašnje kfase D efiniciju klase m ožete da stavite u n u ta r definicije neke druge klase. N a p rv i pogled. a detaljnije istraživanje m ožete sm a tra ti referen tnim m aterijalo m . N aučičete d a u n u tra šn ja klasa p ru ža i više o d toga . m a d a niko n e jam či d a će takav i biti. D o k učite o u n u tra šn jim klasam a.tako što definiciju klase u m etn ete u sp o ljn u klasu: //: unutrasnjeklase/Posi1j k a l . { } String pr oc it aj Oz na ku() { return oznaka. Važno je shvatiti da su u n u tra šn je klase b itn o različite o d kom pozicije. pa navikavanje n a njih m ože d a p o traje. } } // Upotreba unutrašnjih klasa izgleda kao i upotreba // bilo koje druge klase unutar klase Posiljkal: public void posalji(String odr) Sadrzina c = new Sadrzina(). u o statk u poglavlja detaljnije je raz m o tren a sintaksa u n u tra šn jih klasa.o n a je svesna p risustv a klase koja je o k ru žu je i m ože s n jo m d a k o m u n icira. Iako su za većin u u n u tra šn je klase sasvim n o v k on cep t. Te m o g u ćn o sti su d o d ate rad i p o tp u n o sti jezika. N akon opisa o sn ov ne sintakse i sem an tike u n u tra šn jih klasa. U n u t r a Sn j a k l a s a j e v r e d n a . n jihova sv rh a često nije očigledna. } } class Odrediste { private String oznaka. Pravljenje unutrašnjih klasa U n u tra šn ju klasu prav ite baš kako biste očekivali . public int value() { return i. ali vam v ero vatno neće treb ati. naro čito ne isprva. u n u tra šn je klase izgledaju kao jed n o stav an m eh an iz am za sakrivanje koda: p rek o n jih u građ u jete klasu u n u ta r drug e klase. Z ato će vam p o četn i delovi poglavlja zasađ verovatno biti dovoljni. p o m o ć u n jih m ožete da pišete finiji i jasn iji ko d . inner class). Odrediste(String gde) oznaka = gde. z a t o St o o m o g u č u j e d a k l a s e l o g i č k i G R U PlSETE I DA k o n tro lišete n jih o v u m e đ u so b n u viđljivost. Takva klasa se naziva u n u tra šn ja klasa (engl.

Sy st em . } public void p o sa lji (String odr) Sadrzina c = sadr().proci tajOznaku()).posalji("Tanzanija"). { } public static void m a in (S tr in g[] args) Posiljka2 p = new Posi1j k a 2 ().0drediste d = q. U ovom slučaju.java // Vraćanje reference na unutrašnju klasu public class Posiljka2 { class Sadrzina { private int i = 11.posal ji (''Tanzani j a " ) . jed in a važna razlika je to što su im en a u g n ežđ en a u n u ta r klase P o s iljk a l.o ut. } } public Odrediste za(String s) { return new Od rediste(s). } } class Odrediste { private String oznaka. } public Sadrzina s a d r () { return new Sadrzina(). Posi1jka2.out.procitajOznaku()). U skoro ćete videti da to nije jed in a razlika. za("Borneo"). p. p. Odredi ste d = za (o dr ).Poglavlje 10: Unutrašnje klase 267 Odrediste d = new Odrediste(odr). { } } /* Ispis: Tanzanija * ///:U p o treb a u n u tra šn je klase u n u ta r m eto d e p o sa lji() izgleda kao i u p o tre b a bilo koje d ru g e klase. Spoljna klasa će ćešće im ati m e to d u koja v raća referencu n a u n u tra šn ju klasu. public int vrednost() { return i.println(d. System. } public static void main(String[] args) Posiljkal p = new Posiljkal(). { .Sadrzina c = q. Odrediste(String gde) { oznaka = gde. // Definisanje referenci na unutrašnje klase: Po si1jka2. } String procitajOznaku() { return oznaka. kao što se vidi u m e to d a m a za() i sad r(): //: unutrasnjeklase/Posiljka2.pri ntln(d. Posiljka2 q = new Posiljka2().sadr().

kao što se vid i u m e to d i m a in (). public boolean kraj() public void sledeci() {return i == obs.} } public Selektor selektor() return new S e le kt or Se kv en ce (). Kada n apravite u n u tra š n ju klasu. p a o b jek at u n u tra šn je klase m o že d a p ristu p a član o v im a objekta koji ga o k ru žu je . m e đ u tim . } ' U ovom pogledu. p o re d toga. jo š je d n a začkoljica.bez n ekih p o seb n ih kvalifikatora. Klasi Spoljna d o d ajte m e to d u koja vraća o b jek at tip a Unutrasnja.268 Misliti na Javi } /* Ispis: Tanzanija * ///:Ako želite da o bjek at u n u tra šn je klase n ap rav ite izvan neke n estatičn e m eto d e spoljne klase. Vežba I: (1) N apišite klasu Spoljna koja sadrži u n u tra š n ju klasu Unutrasnja. U m e to d i m a in ( ) n ap rav ite i inicijalizujte referencu n a o b jek at klase Unutrasnja.java // Čuva niz objekata interface Selektor { boolean kraj(). kao tip to g objekta m o rate d a navedete Im eSpoljneKlase. } public Object tekuci () {return obs[i].ImeU nutrašnjeKlase. private int sledeci = 0. Veza ka spoljnoj klasi D o sada izgleda d a su u n u tra šn je klase sam o teh n ik a za sakrivanje im en a i za organizaciju koda. U C++-U ne postoji veza sa okolnim objektom niti podrazum evana prava pristupa.length. void sledeci (). } public class Sekvenca { private Object[] obs. jer su o n e sam o m ehanizam za sakrivanje im ena. ugnežđene khise u C + + -u veom a se razlikuju. ali n e i n e o p h o d n a . Postoji.length) { i++. U n u trašn je klase.length) obs[sledeci++] = x. n jen o b jek at im a vezu sa objektom okolne klase k o ja g a je i napravila. } public Sekvenca(int velicina) public void dodaj(0bject x) { if(sledeci < obs. {obs = new O b j e ct [v el ic in a]. koja je k o risn a.} {i f (i < obs. im aju prava da p ristu p aju svim e lem en tim a o k ru žu ju ć e klase. . { } private class SelektorSekvence implements Selektor { private int i = 0.1 To pokazuje n a re d n i p rim er: //: unutrasnjeklase/Sekvenca. Object t e k u c i ().

kraj(). m e đ u tim .toString(i)). U m eto d i main() se. Na prvi pogled. Z atim se poziv an jem m eto d e selektor pravi Selektor koji se k oristi za p o m e ra n je p o o b jek tu klase Sekvenca i za p ristu p svakom elem en tu. P rilikom p ristu p a n ja članovim a spoljne klase up o trebljava se ta (skrivena) referenca. u n u tra šn ja klasa n estatičn a). tekuci() i sledeci() —o b raćaju referenci obs koja nije deo klase SelektorSekvence. ovaj scenario se odigrava bez intervencije p ro g ram era. O b ratite p ažn ju na to da se sve m eto d e . Sada k o n ačn o m ožete da shvatite zašto u n u tra šn ja klasa m ože da se n apravi sam o zaje d n o sa o b jek to m spo ljne klase (kada je. Za k o n stru k ciju objekta u n u tra šn je klase p o tre b n a je referenca na objekat spoljne klase i prevodilac će se p o b u n iti ako toj referenci ne m ože da pristu p i. Z nači. Selektor selektor = se kvenca. Ta o so b in a m ože da b u d e veom a p o g o d n a. kao što se vidi u p re th o d n o m p rim e ru . i < 10. b rin e o svim d etaljim a um esto vas. while(!selektor. već je p riv atn o polje o k oln e sp oljn e klase. D od ajte nekoliko p rim erak a te klase o b jek tu tipa Sekvenca i prikažite ih. o kojem ćete više saznati u nastavku knjige. a taj interfejs m ože biti arg u m en t m n o g ih m eto d a. Pošto je Selektor interfejs.out.dodaj(Integer. N apravite objekat tipa Unutrasnja i p rik ažite ga. njega m ogu da realizuju i m noge d ru g e klase na neki svoj način. čim e se prav i generički kod. n ak o n pravljenja objekta klase Sekvenca. u n u tra šn ja klasa im a au to m atsk i p ristu p članovim a klase koja je okružuje. . i++) { se kvenca. { Sy st em. for(int i = 0. Prevodilac se.tekuci() + " ").kraj()) sele kt or . Selektor om og u ćav a d a p rov erite d a li ste na k raju niza (m eto d a kraj()). kao što ćete videti. pravljenje klase SelektorSekvence izgleda p o p u t još jedne u n u tra šn je klase. Kako se to dešava? U n u trašn ja klasa skriveno čuva referencu na onaj objekat spoljne klase koji je tu u n u tra šn ju klasu n apravio. P ro u čim o je pažljivije. da pogledate tekući objek at (m e to d a tekuci()) i da se p o m erite na sledeći elem en t u n izu (m eto d a sledeci()). U našem p rim e ru . } } } /* Ispis: 0 1 2 3 4 5 6 7 8 9 * ///:Klasa Sekvenca ob u h v ata sam o n iz fiksne d u žin e elem enata tip a Object.println(selektor. Vežba 2: (1) N apravite klasu koja čuva jedan String i im a m eto d u toStringf) koja taj String prikazuje. p riv a tn a klasa SelektorSekvence pruža fu n k cio n aln o st interfejsa Selektor. U n u trašn ja klasa. a Unutrasnja m eto d u toStringO koja to polje prikazuje. na sreću.selektor(). Vežba 3: (1) Izm en ite vežbu 1 tako da Spoljna im a p riv atn o polje tipa String (koje inicijalizuje k o n stru k to r). u taj objekat d o daje nekoliko objek ata tipa String. m ože da p ristu p a m eto d am a i p oIjima spo ljne klase kao da p rip ad a ju njoj.s le de ci().Poglavlje 10: Unutrašnje klase 269 public static void main(String[] args) Sekvenca sekvenca = new Sekven ca (l O). U većini slučajeva. To je p rim e r p ro jek tn o g o brasca Iterator (ite ra to r). Za tražen je elem en ata niza p o sto ji interfejs Selektor. M ožete da pozovete m e to d u dodaj() kako biste d o d ali n o v elem en t tip a Object na kraj niza (ako u n je m u im a m esta).

kao u n a re d n o m p rim e ru : //: unutrasnjeklase/TackaNova.u m esto toga m o rate da u p o treb ite objekat spoljne klase.new Ako v am u u n u trašn jo j klasi treb a referenca n a objek at spoljne klase.java // Kvalifikovanje pristupa objektu spoljne klase. sin tak so m .th is: //: unutrasnjeklase/TackaThis.new.java // Neposredno pravljenje unutrašnje klase operatorom . (To se čak ne m ože reći.f(). kao što v idite u p re th o d n o m p rim e ru .Unutrasnja dni = dn. sp oljna().) . Evo p rim e ra koji po k azu je u p o tre b u . Da biste to postigli. args) { } } ///= N asup ro t očekivanju.this. u n u tr as nj a( ). dt i. T im e se rešavaju i p itan ja oblasti važenja za u n u tra šn ju klasu. pa se ne kaže dn.println("TackaThis. // Golo "this" bi bilo "this" od klase Unutrasnja { } } } public Unutrasnja unutrasnja() { return new U n u t ra sn ja ().Unutrasnja dti = d t . TackaNova.f () * ///:P onekad n ek om d ru g o m o b jek tu tre b a n are d iti da n ap rav i o b jek at neke o d svojih u n u trašn jih klasa.out.this i . } args) { public static void main(String[] TackaThis dt = new TackaThis().new Unutrasnja().U n u tr a s n ja ( ).270 Misliti na Javi Upotreba sintaksi . } } /* Ispis: TackaThi s . TackaThis. n avedite im e spoljne klase i iza nje tačk u i rezervisanu reč th is. public class TackaNova { public class Unutrasnja {} public static void main(String[] TackaNova dn = new TackaNova(). a ne p rilik o m izvršavanja. da biste d ire k tn o n apravili objekat u n u tra šn je klase ne treba da p ratite uob ičajenu m eto d u i da se o b ra tite im e n u spoljne klase T ackaN ova . D o b ijen a referenca če au to m atsk i biti ispravnog tipa.n ew pro sled ite referencu na taj drugi objekat spoljn e klase. p a nem a režijskih troškova za to.f()").nevv TackaN ov a . što se zna i proverava p rilik o m p rev o đ en ja. public class Unutrasnja { public TackaThis spoljna() return TackaThis. public class TackaThis { void f() { System.

public int vrednost() { return i.new Odrediste("Tanzanija“) .n ew p rim e n io u p rim e ru Pošiljka: //: unutrasnjeklase/Posiljka3. Odrediste(String gde) { oznaka = gde. zbog toga što objekat u n u tra šn je klase m o ra biti povezan sa sp o ljn o m klasom . što je pogodno za sakrivanje realizacije. ) String procitajOznaku() { return oznaka. } ///= - .java public interface Odrediste { String pr oc it aj Oz na ku().new Sadrzina(). Unutrašnje klase i svođenje naviše U n utrašn je klase dolaze d o izražaja kada počnete da prim enjujete svođenje naviše ka osnovnoj klasi.0drediste d = p. Prvo ćem o definisati zajedničke interfejse za p re th o d n e p rim ere: //: unutrasnjeklase/Odrediste.S elek torS ek v en ce d o d ajte m eto d u koja proizvodi referencu na sp o ljn u klasu Sekvenca. Evo kako bi se o p e ra to r . U o dvojenoj klasi n ap ravite instan cu u n u tra šn je klase. } { } public static void main(String[] args) Posiljka3 p = new Posiljka3(). ) ) class Odrediste { private String oznaka. njoj referenca na ob jek at spoljne klase nije p o tre b n a . ne m ožete d a n ap rav ite n i objekat u n u tra šn je klase.Poglavlje 10: Unutrašnje klase 271 Z nači. Vraća vam se sam o referenca na osn o vn u klasu ili interfejs.new public class Posiljka3 { class Sadrzina { private int i = 11.java // Pravljenje instanci unutrašnje klase operatorom .Sadrzina c = p. // Morate da upotrebite instancu spoljne klase // da biste napravili instancu unutrašnje klase: Posiljka3. (Efekat dobijan ja reference na interfejs o d objekta koji ga realizuje. u koliko prav ite ugtiežđenu klasu (sta tič n u u n u tra šn ju klasu). } } ///:V ežb a4 : (2) Klasi S ek ven ca. M eđ u tim . a posebno ka interfejsu. Posiljka3. Vežba 5: (1) N apravite klasu koja im a u n u tra šn ju klasu.) O vo biva zato što u n u trašnja klasa koja realizuje interfejs m ože biti p o tp u n o nevidljiva i n edo stup na. u suštini je isti kao i svođenje naviše ka osnovnoj klasi. ako n em ate o b jek at spo ljn e klase.

To znači da p ro g ra m e r klijent ne m ože p o tp u n o da . (Setite se d a su svi člano vi interfejsa au to m atsk i javni. } } public Odrediste odrediste(String s) { return new POdrediste(s). Sadrzina c = p.272 Misliti na Javi //: unutrasnjeklase/Sadrzina.java public class Posiljka4 { private class PSadrzina implements Sadrzina { private int i = 11. // Nije dozvoljeno -. m o g u će je da u o p šte ne m o žete d a otk rijete stvarni tip objekta. kao što je p rik aza n o u sledećem p rim eru : //: unutrasnjeklase/ProbnaPosiljka. Klasa P O d re d iste je zaštićena. } public String procitajOznaku() { return oznaka.sadr().java public interface Sadrzina ( int vrednost().new PSadrzina().m ogu im ati sam o javni ili paketni pristup. private POdrediste(String gde) { oznaka = gde.ne možete da pristupite privatnoj klasi: //! Posiljka4. klasa koje su u istom paketu kao i P osiljka4 (pošto rezervisana reč p ro te c te d takođe dozvoljava paketni pristu p ) i naslednika klase P osiljka4.PSadrzina pc = p. args) { } } III--- U klasi Posiljka4 d o d ato je nešto novo: u n u trašn ja klasa P S ad rzln a je privatna tako da niko osim klase P osiljka4 ne m ože da joj pristupi.) Kada d obijete referencu n a o sn o v n u klasu ili n a interfejs. } } public class ProbnaPosiljka { public static void main(String[] Posiljka4 p = new P o s i 1j k a 4 (). } } protected class POdrediste implements Odrediste { private String oznaka. od re di st e( "T an za nij a" ). O bičn e klase (koje nisu u n u trašn je) ne m ogu da b u d u privatne niti zaštićene . public int vrednost() { return i. Odrediste d = p. pa ne m ože da joj p ristu p a niko osim klase P osiljka4. } public Sadrzina sadr() { return new PSadrzina(). 1III-Sada S a d rz in a i O d re d is te p red stav ljaju interfejse d o stu p n e p ro g ra m e ru klijen tu koji koristi našu biblio tek u klasa.

K oncept u n u tra šn jih klasa o buhvata još dosta toga i postoji više d rug ih . Rešavate složen p ro b lem i želite da n ap rav ite klasu koja će vam p o m o ći u njegovom rešavanju. V ežba 8: (2) U tv rd ite d a li spo ljn a ldasa im a p ris tu p p riv a tn im elem en tim a svoje u n u tra šnje klase. U trećem p ak etu nasledite svoju kJasu i. realizujete interfejs tak o da m ožete da n ap rav ite i v ratite referencu. iz perspektive p ro g ra m e ra klijenta. ukoliko: 1. po pravilu biće sa „običnim " u n u tra šn jim Jdasama koje su jednostavne i lako se razum eju. kao što se vidi u klasi P ro b n aP o siljk a. A n o n im n u klasu koja obavlja k o n stru k ciju p o m o ć u inicijalizacije instance (an on im n e u n u tra šn je klase ne m o g u da im aju k o n stru k to re ). 3. Ka priv atn oj u n u trašn jo j klasi (ili ka zaštićenoj u n u tra šn jo j klasi ako niste neki o d naslednika). P rogram i koje ćete pisati i čitati. N ap rav ite u n u tra šn ju klasu čija m eto d a m en ja polje spo ljne kJase i poziva m e to d u spo ljne kJase. Tako nešto m ožete da u rad ite iz dva razloga. Klasu d efin isanu u n u ta r neke oblasti važenja u m etodi. u n u ta r m eto d e. U d ru goj m e to d i spoljne kJase n a p ra v ite objek at u n u tra šn je ldase i pozo vite n je n u m e to d u . 4. ali ne želite da o n a b u d e jav n o d o stu p n a. Pored toga. V ežba 7: (2) N aprav ite Idasu koja im a p riv a tn o p o lje i p riv a tn u m eto d u . D o dajte zaštićenu u n u tra šn ju Jdasu koja realizuje taj interfejs. a u k ojim a se pojavljuju u n u trašn je klase. T im e se takođe Javinom prevodiocu om ogućava da pravi efikasniji kod. Unutrašnje klase u metodama i oblastima važenja Na osnovu o noga što ste dosad videli.Poglavlje 10: Unutrašnje klase 273 poznaje te ćlanove. Privatne u n u trašn je klase stoga o m ogućavaju p ro jek tan tu klase da p o tp u no spreči zavisnost o d tip a i da p o tp u n o sakrije p o d atk e o realizaciji. ako želite. u stvari. koristite: u n u trašn je kJase m o g u da b u d u napravljene u n u ta r m etoda ili čak u proizvoljnoj oblasti važenja. A n o n im n u klasu koja p ro širu je klasu koja n e m a p o d razu m ev an i kon struk to r. U n are d n im p rim e rim a . 6. Klasu defin isanu u n u ta r m etode. A nonirniiu klasu koja realizuje interfejs. je r ne m ožete da p ristu p ite n jen o m im enu . V ežba 6: (2) N apravite interfejs koji sadrži b arem je d n u m e to d u u so pstv eno m paketu. A n o n im n u klasu koja inicijalizuje polja. ne m ožete d a obavite n i svođenje naniže. Kao što je ranije p okazano. a zatim pok ažite dejstvo na objekat spo ljn e kJase. skrivenih načina kako da ih. p re th o d n i p ro g ra m će biti izm enjen tako da koristi: 1. niti m ože d a im p ristu p a bez ograničenja. 2. 5. proširivanje interfejsa je beskorisno. je r o n ne m ože da p ristu p i ostalim m eto d am a koje nisu deo javnog interfejsa. stekli ste p red stav u o uobičajenoj u po treb i u n u tra šnjih klasa. 2. v ratite o bjek at zaštićene u n u tra šn je kJase. . svodeći naviše na interfejs to k o m vraćanja.

O b ratite p ažnju na to da ste za im ena u n u trašn jih klasa u svim klasam a u istom poddirek to riju m u m ogli da koristite identifik ato r POdrediste. } String uzmiKarticu() { return id. public class Posiljka5 { public Odrediste odr(String s) { class POdrediste implements Odrediste { private String oznaka. } public String procitajOznaku() { return oznaka. } } KarticaZaPracenje ts = new KarticaZaPracenje("slip"). N aravno. } } return new POdrediste(s). KarticaZaPracenje(String s) { id = s.java // Ugnežđivanje klase unutar metode. } public static void main(String[] args) { Posiljka5 p = new Posiljka5(). String s = ts . a da ne đ o đ e d o sukoba im ena. to što je im e klase POdrediste navedeno u n u ta r m eto d e odr() ne znači da o bjekti klase POdrediste n akon p o v ratk a iz te m eto d e neće biti ispravni.java // Ugnežđivanje klase unutar oblasti važenja public class Posiljka6 { private void unutrasnjePracenje(boolean b) { if(b) { class KarticaZaPracenje { private String id. } . O b ra tite p až n ju na svođenje naviše u n ared b i return . a ne deo klase Posiljka5.uzmiKarticu().m eto d a odr() vraća sam o referencu na o sn o v n u klasu.odr("Tanzanija"). klasu Odrediste.274 Misliti na Javi Prvi p rim e r prikazu je pravljenje cele klase čija je oblast važenja je d n a m eto d a (um esto da je oblast važenja d ru g a klasa). Odrediste d = p. Z bog toga klasi POdrediste ne m o žete da p ristu p ite izvan m eto d e odr(). } } ///= Klasa POdrediste je deo m eto d e odr(). To je lokalna unutrašnja klasa: //: unutrasnjeklase/Posiljka5. N ared n i p rim e r p o kazuje kako u n u tra šn ju klasu m ožete da u g nezdite u n u ta r proizvoljne oblasti važenja: //: unutrasnjeklase/Posi1jka6. private POdrediste(String gde) { oznaka = gde.

Vežba 11: (2) N ap rav ite p riv atn u u n u tra šn ju klasu koja realizuje jav n i interfejs.prati (). sa dr (). O n a . ista je kao svaka d ru g a o b ičn a klasa. kažete: „Sam o tren u ta k . Vežba 10: (1) P onovite p re th o d n u vežbu. Sadrzina c = p . { { // Umetanje definicije klase } public static void main(String[] args) Posiljka7 p = new Posiljka7(). ali tad a. { 1 } ///:- M etoda sad r() k o m b in u je generisanje p o v ratn e v red n o sti i d e fin iđ ju klase koja p red stavlja tu p o v ra tn u vrednost! Pored toga.java // Metoda koja vraća anonimnu unutrašnju klasu. } public void p r a t i () ( un utrasnjePracenje(true). m e đ u tim . To n e znači da se klasa uslovno p rav i .o n a će b iti prevedena zajedno sa svim o stalim . klasa je anotiim na —n em a im e. sada ću da u b acim definiciju klase“. Vežba 9: (1) N ap rav ite interfejs s najm an je je d n o m m e to d o m i realizujte ga definišući u n u tra šn ju klasu u n u ta r neke m eto d e koja vraća referencu n a vaš interfejs. public class Posiljka7 { public Sadrzina sadr() return new Sadrzina() private int i = 11. // U ovom slučaju je potrebna tačka i zarez.Poglavfje 10: Unutrašnje klase 275 // Ovde ne možete da je koristite! Izvan je oblasti važenja: //! KarticaZaPracenje ts = new KarticaZaPracenje("x"). . public int vrednost() { return i. izgleda kao da počin jete da pravite n o v objek at klase Sadrzina. N apišite m e to d u koja vraća referencu n a in stan cu p riv atn e u n u tra šn je klase. } public static void main(String[] args) Posiljka6 p = new PosiljkaG(). p. svedenu naviše ka interfejsu. } }. ali definišite u n u tra šn ju klasu u nekoj oblasti važenja u o k v iru m etode. Anonimne unutrašnje klase N are d n i p rim e r izgleda p o m alo ču d n o : / / : unutrasnjeklase/Posiljka7. nije d o stu p n a izvan oblasti važenja u n u ta r koje je definisana. { } } /// = Klasa KarticaZaPracenje je u g n ežđ en a u n u ta r oblasti važenja n a re d b e if. D a stvari b u d u jo š gore. Pokažite da je u n u tra šn ja klasa p o tp u n o sakrivena tako što ćete p o k u ša ti d a svedete nan iže ka njoj. p re nego što d o d e te do tačke i zareza. O sim toga.

klasa Sadrzina je napravljen a p o m o ću p o d razu m ev an o g k o n stru k to ra. public class Po si1j ka8 { public Omotac omot(int x) { // Poziv konstruktoru osnovne klase: return new Omotac(x) { // Prosleđivanje argumenta konstruktoru. .java public class Posiljka7b { class MojaSadrzina implements Sadrzina { private int i = 11. Iako je O m o ta c obična klasa s realizacijom .vrednost() * 47.java // Proširena verzija programa Posiljka7.java // Anonimna unutrašnja klasa koja poziva konstruktor osnovne klase. } }. } } ///= U a n o n im n o j u n u trašn jo j klasi.sadrzina(). // Potrebna je tačka i zarez } public static void main(String[] Posiljka8 p = new Posiljka8(). public int vrednost() { return i. kao što je u gornjem p rim e ru p a ra m e ta r x pro sleđ en n a re d b o m n ew O m o ta c (x ). } { } public Sadrzina sadrzina() public static void main(String[] args) Posi1jka7b p = new Po si lj ka 7b (). N aredni p ro g ra m pokazuje šta da rad ite ako vaša osn o v n a klasa zahteva k o n stru k ciju sa arg u m en to m : //: unutrasnjeklase/Posi1jka8. Sintaksa za a n o n im n u u n u tra š n ju klasu je sk raćeni oblik za: //: unutrasnjeklase/Posiljka7b. args) { } } ///:O dg o varaju ći a rg u m en t sam o p ro sled ite k o n stru k to ru osno v ne klase. Omotac w = p . Sadrzina c = p. o n a se u p o treb ljav a i kao zajednički interfejs za svoje izvedene klase: //: unutrasnjeklase/Omotac.java public class Omotac { private int i.276 Misliti na Javi O va č u d n a sintaksa znači: „N ap rav i o b jek at a n o n im n e klase koja nasleđuje ldasu Sadrzina“ R eferenca koju vraća o p e ra to r new a u to m a tsk i se svodi naviše na referen cu klase Sadrzina. } { return new Mo ja Sa dr zi na (). { public int vrednost() return super. om ot (l O).

} . } public static void main(String[] args) Posiljka9 p = new Posiljka9(). public int vrednost{) } { return i. U koliko to zaboravite. Z n ak tačka i zarez n a k raju a n o n im n e u n u tra šn je klase n e označava kraj tela klase. public String procitajOznaku() }. da bi bilo m alo zanim ljivije. prevodilac zahteva da taj objekat b u d e finalan.mindview. Odrediste d = p.P r in t.java. Ali šta ako treba da obavite neku aktivnost sličnu k o n struktoru? Pošto je klasa an o n im n a. D akle. gornji p ristu p je u redu. d obićete grešku p rilikom prevođenja.*.Poglavlje 10: Unutrašnje klase 277 public 0motac(int x) { i = x. O n označava kraj izraza koji u d ato m slučaju sadrži i a n o n im n u klasu. k o n stru k to r u njoj ne m ože da im a im e (jer o n o ne postoji!). u p o tre b a tačke i zareza p o tp u n o je ista kao i bilo gde d ru g d e u p ro g ram u . import static n e t . } public abstract void f (). } } ///:P rim etili ste kako O m o ta c im a k o n stru k to r koji zahteva a rg u m en t. Z bog toga je a rg u m e n t m etode o d r() finalan. i = " + i). I I : unutrasnjeklase/KonstruktorAnonimne. Na sledeći način m ožete efektivno da napravite k o n stru k to r za a n o n im n u u n u trašn ju klasu p o m o ću bloka za itiicijalizaciju instancv.uti 1 . abstract class Osnovna { public Osnovna(int i) { print("Konstruktor klase Osnovna. D okle god sam o dodeljujete vrednosti poljim a. Inicijalizaciju o b jek ta a n o n im n e klase m o žete d a obavite n a m e stu n a k o m e definišete polja: //: unutrasnjeklase/Posi1jka9.java // Pravljenje konstruktora za anonimnu unutrašnju klasu. // Kraća verzija datoteke Posiljka5.java // Anonimna unutrašnja klasa koja obavlja inicijalizaciju. { } } III-- Ako definišete a n o n im n u u n u tra šn ju klasu u kojoj želite da ko ristite objekat definisan izvan nje. } private String oznaka = odr. public class Posiljka9 { // Argument koji koristite u anonimnoj unutrašnjoj // klasi mora da bude finalan: public Odrediste odr(final String odr) { return new Odrediste() { { return oznaka.odr("Tanzanij a " ) .

101. p ro m en ljiv a i nije m o rala d a b u d e finalna.278 Misliti na Javi pufalic class KonstruktorAnonimne { public static Osnovna uzmiOsnovnu(int i) { return new Osnovna(i) publ ic void f () { print("U anonimnoj f()").java // Upotreba "inicijalizacije instanci" za konstrukciju // anonimne unutrašnje klase. } private String oznaka = odr. public String p r o c it aj Oz na ku() { return oznaka. public class PosiljkalO { public Odrediste odr(final String odr. f(). { } } /* Ispis: Konstruktor klase Osnovna. Evo kako izgleda naša Pošiljka sa inicijalizacijom instance. // Inicijalizacija instanci za svaki objekat: { { { troskovi = M a t h . p o što se u p o treb ljav aju u n u ta r a n o n im n e klase.395F). if(troskovi > 100) System. } public static void main(String[] args) Osnovna osnovna = uz mi Os no vn u( 47 ). Odrediste d = p. } }. final float cena) return new Odrediste() private int tr o s k o v i .r ou nd (c en a). } public static void main(String[] args) PosiljkalO p = new Posiljkal0(). n ik a d a se ne upotrebljav a n ep o sre d n o u n u ta r te an o n im n e Idase.println("Prekoračen b u d ž e t !"). //: unutrasnjeklase/PosiljkalO. i = 47 Unutar inicijalizatora instance U anonimnoj f() *///■■U ovom slučaju. } } }. { { print("Unutar inicij a l izatora instance"). o s n o vn a. lako se i p rosleđuje osnovn o m k o n stru k to ru a n o n im n e klase.out. { } } /* Ispis: Prekoračen budžet! * ///:- . od r( "T an za ni ja ". Im ajte u v id u da arg u m en ti m eto d e o d r() m o ra ju b iti finalni.

*. void m e t o d a 2 ( ) . } interface ProizvodjacUsluga { Usluga uzmiUslugu (). p ošto o ne m o g u da p ro šire klasu ili d a realizuju interfejs. O vakav p ristu p .mindview. b lo k za inicijalizaciju in stan ci ne m ožete da preklopite pa ćete im ati sam o jed an takav k o n stru k to r. Vežba 12: (1) P onovite vežbu 7 k oristeći a n o n im n u u n u tra šn ju klasu. } class Realizacijal implements Usluga { private Realizacijal() public void metodal() public void metoda2() {} {print("Realizacijal metodal"). N apravite d ru g u klasu koja im a m e to d u koja vraća referencu na prv u klasu.java import static net. A ako realizujete interfejs. Vežba 13: (1) P onovite vežbu 9 koristeći a n o n im n u u n u tra šn ju klasu. Vežba 15: (2) N apravite klasu koja im a n ep o d razum evan i konstruktor. A n o n im n e u n u tra šn je klase su p o nešto o g raničenije nego o bično nasleđivanje. Ponovo o proizvodnim metodama P ogledajte koliko lepše izgleda p rim e r interfejsi/Proizvodjaci.} {print("Realizacijal me to da 2“). naravno. m ožete da realizujete sam o jed an .} { { public static ProizvodjacUsluga proizvodjac = new ProizvodjacUsluga() public Usluga uzmiUslugu () return new Re al iz ac ij al (). } . im a o gran ičen ja.java tako da interfejse OpasnoCuđoviste i Vampir realizujete p o m o ć u a n o n im n ih klasa. Stoga blo k za inicijalizaciju in stan ci efektiv n o predstavlja k o n stru k to r a n o n im n e u n u tra šn je klase. ali ne oboje.Prin t . N apravite objekat koji ćete v ratiti koristeći an o n im n u u n u tra šn ju klasu koja nasleđuje p rv u klasu. interface Usluga { void m e t o d a l (). n are d b u if).uti1 .java kada se u p o tre b e a n o n im n e u n u tra šn je klase: / / : unutrasnjeklase/Proizvodjaci.Poglavjje 10: Unutrašnje klase 27 9 U n u ta r b loka za inicijalizaciju in s ta n đ uočavate kod koji ne m ože da bu d e u p o treb ljen za inicijalizaciju polja (preciznije. ali ne i p od razum evani. Vežba 14: (1) P repravite p ro g ram interfejsi/HororPredstava.

*. s. } class Dama implements Igra { private Dama() {} private int potezi = 0. } public class Proizvodjaci { public static void korisnikUsluge(ProizvodjacUsluga fabr) { Usluga s = fa br . D obija se i sm islenija sintaksa.mi nd vi ew . pa je ovde n ap rav ljen kao statičn o polje u realizaciji interfejsa Usluga.Print. Pored toga.java // Kostur za Igre napravljen pomoču unutrašnjih klasa. } }. me to da 2( ).} {print("Realizacija2 metoda2"). interface Igra { boolean potez(). public boolean potez() { . često je p o tre b a n sam o jed a n p ro izv o d n i objekat. import static net. private static final int POTEZI = 3. i n em a p o treb e da se im e n o v an a klasa p rav i kao Proizvodač.u zmiUslugu(). } interface Proizvodjaclgara { Igra uzmilgru().proizvodjac ()). I p rim e r interfejsi/Igre. } } /* Ispis: Realizacijal metodal Realizacijal metoda2 Realizacija2 metodal Realizacija2 metoda2 * ///:Sada k o n stru k to ri za klase Realizacijal i Realizacija2 m o g u b iti p riv a tn i. // Realizacije su međusobno potpuno zamenljive: korisnikUsluge(new Realizacija2.java m ože biti poboljšan p o m o ću a n o n im n ih u n u tra šn jih klasa: //: unutrasnjeklase/Igre.u ti l. s.280 Misliti na Javi class Realizacija2 implements Usluga { private Realizacija2() public void metodal() public void metoda2() {) {print("Realizacija2 metodal"). } public static void main(String[] args) { korisnikUsluge(new Realizacijal.me to da l( ).proizvodjac ()).} { { public static ProizvodjacUsluga proizvodjac = new Pr oi zv od j a c U s l u g a O public Usluga uzmiUslugu () return new Realizacij a 2 ().

< I } public static Proizvodjaclgara proizvodjac public Igra uzmilgru() { return new Danu: ( n d jacIg araO { }.jte interfejse ako baš ne ■ »risteći a n o n im n u u n u - iz poj-ia • . i 'j pr r"ite klase. uz mi lg ruO .oristeći a n o n im n u u n u - . igrajIgru(Sah. Igra s = proizv od ja c. while(s. tra šn ju klasu. { private int potezi = 0. a ne interfejse.proi zvodjac). private static final public boolean potez() return ++potezi print("Sah potez " + potezi). } public class Igre { public static void igrajIgru(ProizvodjacIgai . return ++potezi != POTEZI. V ežba 16: (1) P repravite rešenje vežbe 18 iz po^lavlj. } class Sah implements Igra { private Sah() {} int POTEZI = 4. { } } /* Ispis: Dama potez 0 Dama potez 1 Dama potez 2 Šah potez 0 Šah potez 1 Šah potez 2 Šah potez 3 * ///:N e zab orav ite savet s k raja p re tb o d n o g poglnv! U k oliko projekat zahteva interfejs. V ežba 17: (1) P repravite rešenje vežbe tra š n ju klasu.potez()) :) { public static void ma in (String[] args) igrajlgru(Dama.proizvodjac). . } }.Pc>t. != POTEZI. to će v am biti m o rate. •i. /(■djacIgaraO { 1 public static Proizvodjaclgara proizvodjac = nt'V I public Igra uzmilgru() { return new Sah().jHVli' l( ‘n u tra šn je klase 281 print("Dama potez " + potez).

o d n o sn o n estatičn a u n u tra šn ja klasa ne m o že d a im a statič n e p o d atk e . u n u tra šn ju klasu m ožete da proglasite statičn o m . Iz objekta u g n ežđ en e klase ne m o žete d a p ristu p ite o b jek tu sp o ljn e klase. { } public String procitajOznaku() public static void f() {} static int x = 10. D a biste shvatili značenje kvalifikatora sta tic kada se p rim e n i na u n u tra šn je klase. { } 2 O tprilike slično u gnežđ enim klasam a u C + + -u . Za pravljenje o b jek ta u g n ežđ en e klase nije p o tre b a n o b jek at spo ljne klase. Polja i m e to d e nestatičn e u n u tra šn je klase m o g u d a b u d u sam o n a sp o ljn o m n iv ou klase. private POdrediste(String gde) oznaka = gde. O n a se o b ičn o naziva ugnežđena klasa2.java // Ugnežđene klase (statične unutrašnje klase) public class Posiljkall { private static class PSadrzina implements Sadrzina { private int i = 11. 2 . {} { return oznaka. . M eđ u tim . } // Statična unutrašnja klasa može da sadrži druge statične elemente: } I public static Odrediste odr(String s) { return new POdred is te (s ). static class DrugiNivo { public static void f() static int x = 10. tj. sem što te klase ne m o gu p ristu p a ti priv atn im član ov im a kao u Javi. ovo ne važi. public int vrednost() { return i. setite se da objekat obične u n u tra šn je klase im p licitn o čuva referencu n a o b jek at spoljn e klase koja ga je napravila.282 Misliti na Javi Ugnežđene klase A ko vam n e treb a veza izm eđu n jen ih o b jek ata i o b jek ata sp oljn e klase. U gnežđene klase se još p o n e č em u razlik u ju o d n e statič n ih . } } protected static class POdrediste implements Odrediste { private String oznaka. o b ič n ih u n u tra šn jih klasa. u g n e žđ e n e (statičn e u n u tra šn je ) klase m o g u sve to da sadrže: //: unutrasnjeklase/Posiljkall. U gnežđena klasa znači da: 1. Kada kažete da je u n u tra šn ja klasa statičn a. } public static Sadrzina sadr() return new PSadrzina(). statična polja niti statičn e u n u tra šn je klase.

Vežba 18: (1) N ap rav ite k lasu koja sađrži u g n ež đ en u klasu. Odrediste d = od r( "T an za ni ja "). Pošto je klasa statičn a. U m eto d i m a in ( ) n ap rav ite in sta n c u te u g n ežđ en e klase. ali statičn a u n u tra šn ja klasa m ože da b u d e deo nekog interfejsa.p ri nt ln ("Z dr av o!"). Klase unutar interfejsa U n u ta r interfejsa ne m ožete d a pišete bilo kakav ko d . args) { } } } /* Ispis: Zdravo! * ///:K lasu je u m esn o staviti u interfejs o n d a kad a h o ć e te da n ap rav ite zajednički k o d koji će b iti korišćen sa svim različitim realizacijam a to g interfejsa.Poglavjje 10: Unutrašnje klase 283 public static void main(String[] Sadrzina c = s a d r ( ) . ko risteći u g n ežđ en e klase. N astavite dalje ovako. zbog čega je a n alo g n a sta tič n im m eto d am a. u o b ičn o j (n estatičn o j) u n u tra šn jo j klasi veza ka spoljn o j klasi o stv aru je se p rek o p o se b n e reference th is. Pogledajte im en a d ato tek a .o ut . z d r a v o ( ) . Svaka klasa k o ju stavite u n u ta r interfejsa a u to m atsk i postaje jav n a i statična. args) { } 1 ///=U m e to d i main() nije p o tre b a n o b jek at klase P osiljk all. u m esto toga u p otreb ljavate n o rm a ln u sin tak su za p ristu p sta tič n o m članu d a biste pozvali m eto d e koje v raćaju reference na objekte klase Sadrzina i Odrediste. Kao što ste videli u p re th o d n o m delu poglavlja. . U u n u tra šn jo j klasi čak m o žete d a realizujete o k ru ž u ju ć i interfejs. S tatičn a u n u tra šn ja klasa nem a tu p o se b n u referen cu . Vežba 19: (2) N ap rav ite klasu koja sađrži u n u tra š n ju klasu koja i sam a sadrži u n u tra šn ju klasu. o n a ne n aru šav a p rav ila o interfejsim a .statična u n u tra šn ja klasa se sam o u m eće u im en sk i p ro s to r interfejsa.java // {main: K1asaUInterfejsu$Test} public interface K1asaUInterfejsu { void z d r a v o ( ) . class Test implements K1asaUInterfejsu public void zdravo() { Sy st em . i to n a ovaj način: //: unutrasnjeklase/KlasaLIInterfejsu. { } public static void main(String[] new Te st () .class koje prev o dilac pravi.

M an a takvog p ristu p a je d o d a tn a količina p re v ed en o g koda koji m o ra te d a vučete n aokolo. R ealizujte interfejs i m e to d i p ro sled ite in sta n c u te realizacije. Pristupanje spoljašnjosti iz višestruko ugnežđenih klasa Bez o b zira n a to koliko d u b o k o je u n u tra šn ja klasa u g n ežđ en a. R ealizujte interfejs i n a p ra vite in sta n c u te u g n e ž d en e klase. o n a m ože tra n sp a re n tn o da p ristu p i svim član o v im a svih klasa u k o jim a je u g n ežđ en a. ali ne m o ra te d a je u k lju čite u gotov pro izvod .out. args) { ZaTestiranje t = new Z a Te st ir an je ().println("f()"). class PVU { private void f() class A { private void g() {} {} 1 Još je d n o m z a h v a lju je m M a r tin u D a n e ru . Vežba20: (1) N ap rav ite interfejs koji sadrži u g n e žđ en u klasu. ali u U n ix u /L in u x u p re tv o rite $ u izlaznu sekvencu). } } } } /* Ispis: f() * ///:O v im p ra v ite zase b n u klasu p o d im en o m ZaTestiranje$Tester (da b iste p o k re n u li p ro g ra m . n apišite java ZaTestiranje$Tester. kao što se vidi iz n a re d n o g p rim e ra :3 //: unutrasnjeklase/PristupPriVisestrukomllgnezdjivanju. . Ako to pred stav lja p ro b lem .284 Misliti na Javi N a p o četk u ove knjige savetovao sam vam da u svaku klasu u b acite m e to d u m a in () za n jen o testiranje. p re nego što sve u p ak u jete.f 0 . public static class Tester { public static void main(String[] t. za čuvanje koda za testiran je k o ristite statič n u u n u tra š n ju klasu: //: unutrasnjeklase/ ZaTestiranje. sam o u k lo n ite ZaTestiranje$Tester.java // Stavljanje koda za testiranje u statičnu unutrašnju klasu // (main: ZaTestiranje$Tester} public class ZaTestiranje { public void f() { System. Vežba 21: (2) N ap rav ite interfejs koji sadrži u n u tra šn ju klasu sa sta tič n o m m e to d o m što poziva m e to d e to g interfejsa i p rik azu je rezu ltate.class. O vu klasu m o žete d a k o ristite za testiran je.java // Ugnežđene klase mogu da pristupe svim članovima // na svim nivoima klasa u koje su ugnežđene.

O vaj p rim e r tak o d e p o k azu je sin ta k su koja je p o tre b n a za g rađ en je o bjekata v išestru k o u g n ežđ en ih u n u tra š n jih klasa p ri p ra v ljen ju o b jek ata različitih klasa. Stoga. dakle.Poglavlje 10: Unutrašnje klase 285 public class B { void h() { g(). D akle.new A(). P itanje koje zadire u srž u n u tra šn jih klasa glasi: ako m i je p o tre b n a sam o referenca na interfejs.da se isto v rem en o n asledi više o d jed ne k o n k re tn e ili a p s tr a k tn e klase . U n u tra šn je klase. f0. M oglo bi se reći d a je u n u tra šn ja klasa n alik p ro z o ru u sp o ljašn ju klasu. } } } } public class PristupPriVisestrukomUgnezdjivanju { public static void m a i n (String[] args) PVU pvu = new P V U () .B pvuab = pvua. p a p ri p ozivu k o n stru k to ra ne m o ra te da n azn ačite im e klase.n e w daje o d g o v araju ću o b last važenja.B m e to d e g() i m o g u d a b u d u po zv an e b ez ikakvih kvalifikatora (i p o re d činjenice d a su p riv atn e). ali to i dalje nije o d g o v o r n a p itanje: zbog čega o n e postoje? Z bog čega su se p ro je k ta n ti Jave toliko p o m u č ili d a jeziku d o d a ju ovu su štin sk u m ogućnost? U n u tra šn ja klasa o b ič n o n asleđ u je klasu ili realizuje interfejs i ra d i sa o b je k to m sp o ljn e klase u n u ta r koje je nap rav ljen a.A. Po če m u se.A pvua = pvu. f() Zašto unutrašnje klase? D o sad je bilo p u n o sintakse i sem an tik e koje o p isu ju način na koji u n u tra šn je klase rade. pvuab.new B(). PVU. u n u tra šn ja klasa koja realizuje interfejs razlikuje o d spoljne klase koja realizuje taj isti interfejs? O d g o v o r glasi: ne m o žete uvek da k o ristite p o g o d n o sti interfejsa . efektiv n o o m o g u ć av a ju da nasledite više klasa koje n isu interfejsi. o n d a .A ko vam je sam o to p o treb n o . PVU. o n d a tako i u ra d ite “. Bez m o g u ć n o sti koje p ru ž a ju u n u tra šn je klase . najznačajniji razlog za p o sto jan je u n u tra šn jih klasa m o že d a se fo rm u liše na sledeći način: Svaka u n utrašnja klasa tnože nezavisno od drugih da nasledi realizaciju. D eo p ro b lem a rešavaju interfejsi. u n u tra šnja kiasa nije ograničena tim e što je spoljna klasa već nasledila neku realizaciju. . zašto n e n a p rav im spoljašnju klasu tako da realizuje taj interfejs? O d g o v o r je: . d o k u n u tra šn je klase efektivno d ozvoljavaju „višestruko nasleđivanje realizacije“.neki p ro b le m i p ri p ro jek to v a n ju i p ro g ra m ira n ju bili bi nerešivi. S intaksa . { } } ///= Iz p rim e ra vid ite da u klasi PV U. led an način za p o sm a tra n je u n u tra šn jih klasa je u p o tp u n ja v a n je rešen ja za p ro b le m v išestru k o g nasleđivanja.h().A .p o n ek ad m o ra te da rad ite s realizacijam a.

uz i m a B ( x ) . U g o rn je m p rim e ru . n arav no .n ap ra vi B( )). M eđ u tim . { { } } lll--~ P ri to m e se. package unutrasnjeklase. O b ič n o sam a p riro d a p ro b le m a u p u ću je na p rav u o d lu k u : da li da u p o tre b ite je d n u klasu ili u n u tra šn je klase. I jed a n i d ru g i će raditi. p o d ra z u m e v a d a je s tru k tu ra vašeg p ro g ra m a takva da o b a način a b u d u logična. u z i m aA (x ).java // Ova načina na koje klasa mo že da realizuje više interfejsa. goto v o d a i n e m a nikakve razlike iz m e đ u ta dva p ristu p a . } } . s tačke gledišta realizacije.java // Ako su u pitanju konkretne ili apstraktne klase unutrašnje klase su // jedini način za dobijanje efekta "višestrukog nasleđivanja realizacij e " . uz im aB (y . ra z m o trim o situ aciju u kojoj im a m o dva interfejsa koja nekako m o ra m o d a realizu jem o u jed n o j klasi. uz i m a A ( y ) . Y y = new Y ( ) . } } public class Visestrukilnterfejsi static void uzimaA(A a) {} static void uzimaB(B b) {} public static void main(String[] args) X x = new X (). B {} class Y implements A { B napraviB() { // Anonimna unutrašnja klasa: return new B() {}. class D {} abstract class E {} class Z extends 0 { E napraviE() { return new E() {}. m o ra te u p o tre b iti u n u tra šn je klase: //: unutrasnjeklase/VisestrukaRealizacija. ako u m esto interfejsa im ate a p stra k tn e ili k o n k re tn e klase i ako vaša klasa m o ra nek ak o da realizuje i je d n e i d ru g e.286 Misliti na Javi D a b ism o ovo d etaljnije p ro u čili. Z b o g fleksibilnosti interfejsa m o žete da b irate je d n u o d dve m o g u ćn o sti: je d n a klasa ili u n u tra šn je klase: //: un ut ra sn je kl as e/ Vi ses tr uk iI nt er fe js i. interface A {} interface B {} class X implements A.

P rim e ra radi. m o rali biste d a kažete „Sekvenca je Selektor“ i za o đ re đ e n u sekvencu bi m o g ao d a p o sto ji sam o je d a n Selektor. B. U m eto d i m a in ( ) n ap rav ite g ru p u o bjekata klase A i jed a n objek at klase B. Zaključci i povratni pozivi Z n klju ča k (engl. Izbacite neke reference n a U iz objekta B.je“. V ežba 23: (4) N apravite interfejs U koji im a tri m etode. U je d n o j spoljnoj klasi m o žete d a im ate više u n u tra šn jih klasa. P ri ra d u sa u n u tra šn jo m klaso m n em a p o ten cijaln o zb u n ju ju ć e relacije .. od kojih svaka čuva svoje inform acije koje zavise od in fo rm ac ija u o b jek tu spo ljn e klase. N apravite klasu A s m e to d o m koja v raća referencu na U tako što prav i a n o n im n u u n u tra šn ju klasu. p o što o n a sadrži delove in fo rm a c ija iz o b jek ta spoljne klase („oblast važenja u kojoj je bio n ap rav ljen “ ) i au to m a tsk i čuva i referencu na ceo o b jek at sp o ljn e klase u k om e im a dozvolu da radi sa svim član o v im a. Vežba 22: (2) U d a to teci Sekvenca. 3 . T ren u ta k p rav ljen ja o b jek ta u n u tra šn je klase nije vezan za pravljenje o b jek ta spoljašnje klase. d ru g u m e to d u koja postavlja na v re d n o st null o d re đ e n u referencu u n izu (o d ređ en u a rg u m e n to m m eto d e) i treću m e to d u koja se kreće kroz niz i poziva m eto d e iz U.java nism o ko ristili u n u tra šn je klase. closure) jeste o b jek at k om e m o žete da p ristu p a te i koji čuva in fo rm acije iz ob lasti važenja u kojoj je b io nap rav ljen . da u p ro g ra m u Sekvenca. U je d n o m o b jek tu spoljne klase m ožete d a im ate više in stan ci u n u tra šn je klase. u kojoj se nalazi niz čiji su elem en ti reference na objekte klase U. u n u tra šn ja klasa je zaseban en titet. 2 . U p o tre b ite B za p o v ra tn e pozive u sve objekte klase A. o d ko jih svaka realizuje isti interfejs ili nasleđuje istu klasu na različit način . M ogli biste.napraviE()). Klasa B bi treb alo d a im a je d n u m e to d u koja p rih v ata i sm ešta u niz reference na U. o n a bi n a p ra v ila Selektor koji se kreće u n a zad kroz sekvencu. args) { } } ///:A ko se n iste susreli s p ro b k m o m „višestrukog n asleđivanja realizacije“. d o b ijate sledeće d o d a tn e m ogućno sti: 1. čak i p riv atn im . takode. 4 . obrnutiSelektor( ).Poglavlje 10: Unutrašnje klase 287 public class VisestrukaRealizacija { static void uzimaD(D d) {} static void uzimaE(E e) {} public static void main(String[] Z z = new Z ( ) . P o p u n ite B referencam a n a U koje su n ap rav ili o bjekti klase A. O va v rsta fleksibilnosti je m o guća sa m o p ri u p o tre b i u n u tra šn jih klasa. U b rzo sledi p rim er. uzimaE(z. da im ate još je d n u m e to d u . uz i m a D ( z ) .java realizujte m e to d u obrnutiSelektor( ). . N ap rav ite d ru g u klasu. Iz ove definicije v id ite da je u n u tra šn ja klasa o b je k tn o o rijen tisa n i zaključak. sve ostalo ste sasvim lo g ičn o m ogli da p ro g ra m ira te i b ez u p o tre b e u n u tra šn jih klasa. U koliko ko ristite u n u tra šn je klase.

} // Veoma jednostavna. { m p .*. } } public void povecaj() static void f(MojaPovecaj mp) } // Ako vaša klasa mora da realizuje metodu p o v e c a j () // na neki drugi način. } private class Zakljucak implements MozeDaSePoveca { p u b l ic void povecaj () { // Specificirajte metodu iz spoljne klase.u ti l. // beskonačnu rekurziju: Pozv an a2 . p o v e c a j (). to je veo m a m o ćan kon cep t. Kao što ćete v ideti u n astav k u knjige. { { i++. i = 0. samo realizuje interfejs: class Pozvanal implements Mo zeDaSePoveca { private int. Evo je d n o sta v n o g p rim e ra : //: un utrasnjeklase/PovratniPozivi.Print. public void povecaj() { i++. pr i n t ( i ) . m n o g o fleksibilnije i daleko sig u rn ije nego pokazivač. callbacks) bili su je d a n o d n ajo zb iljn ijih a rg u m e n a ta u p rilog u k ljučivanja neke vrste m e h a n izm a pokaziv ača u Javi. mi nd vi ew . interface MozeDaSePoveca { void povecaj(). import static n e t . m o ra te se o slo n iti na to da će se p ro g ra m e r lepo p o n ašati i d a neće zlo u p o tre b iti pokazivač. po ve caj(). p a pokazivači n isu u ld ju čen i u jezik. P o m o ć u p o v ra tn ih poziva.povecajO.java // Upotreba unutrašnjih klasa za povratne pozive package unutrasnjeklase. print(i). Ako se p o v ra tn i p ozivi realizu ju p o m o ć u p okazivača.288 Misliti na Javi Povratni p o ziv i (engl. } } class MojaPovecaj { { print("Druga operacija"). inače ćete dobiti } } . Z aključak koji o bezb eđ u je u n u tra šn ja klasa sav ršeno je rešenje za p o v ra tn i poziv. u Javi se teži ka još većoj o p rezn o sti. private void povecaj() super.t hi s. morate da upotrebite unutrašnju klasu: class Pozvana2 extends MojaPovecaj private int i = 0. K ao što ste d o sada videli. nekom se o b jek tu daje in fo rm acija koja m u o m o g u ćav a d a n ešto kasn ije pozove n azad objekat koji m u je u p u tio p o v ra tn i poziv.

} } public class PovratniPozivi { args) { public static void main(String[] Pozvanal cl = new Pozvanal(). Da biste om o gućili bilo kakvu vezu sa sp o ljašn jim sv eto m . poziva2.Poglavlje 10: Unutrašnje klase 289 MozeDaSePoveca uzmiReferencuZaPovratm'Poziv() return new Z a k l j u c a k O . Poziva pozival = new Poziva(cl).ali sig u rn u p o v ra tn u vezu. Poziva poziva2 = new Poziva(c2.uzmiReferencuZaPovratniPoziv()). po zi va 2. pa m o rate da ob ezbed ite p o seb n u realizaciju p o m o ću u n u tra šn je ldase. kr en i(). U klasi Pozvana2 sve je p riv a tn o osim m e to d e uzm iReferencuZaPovratniPoziv( ). { class Poziva { private MozeDaSePoveca referencaZaPovratniPoziv. } { referencaZaPovratniPoziv. po zi va l. Kada klasu Pozvana2 nasled im o iz klase MojaPovecaj. U pogled u pisanja p ro g ra m a . f( c2 ). Svako ko d o b ije referencu na . M o j a Po ve ca j. kr en i(). U ovom p rim e ru v id ite kako v am Javini interfejsi p o m a ž u da p o tp u n o razdvojite interfejs i realizaciju. Klasa Pozvana2 nasleđuje klasu MojaPovecaj u o k v iru koje već p o sto ji m eto da povecaj( ) čiji zadatak n em a nikakve veze sa o n im koji o ček u je m o o d interfejsa Povecaj. O b ra tite p až n ju na to da p ravljenjem u n u tra šn je klase n iti p ro širu jete niti m en jate interfejs spo ljn e klase. klasa Pozvanal je o čigledno jed n o stav nije rešenje. U n u trašn ja klasa Zakljucak sam o realizuje interfejs MozeDaSePoveca da bi obezbedila p o v ratn u vezu ka klasi Pozvana2 . kr en i(). Poziva(MozeDaSePoveca cbh) void kreni() { referencaZaPovratniPoziv = cbh. n jen u m e to d u povecaj( ) ne m ožem o da redefinišem o tako da m ože đa se k oristi s in terfe jso m MozeDaSePoveca. Pozvana2 c2 = new Pozvana2(). n e o p h o d a n vam je interfejs MozeDaSePoveca.kreni ().povecaj (). } } /* Ispis: Druga operacija 1 1 2 Druga operacija 2 Druga operacija 3 * ///:Ovaj p rim e r tak ođe po k azu je d o d a tn e razlike izm eđ u realizovanja interfejsa u spoljnoj i u n u tra šn jo j klasi. po zi va l.

D a biste razu m eli na koji način u n u tra šn je klase o m o g u ćav aju je d n o sta v n o pravljenje i u p o tre b u k o stu ra upravljanja.net). Prvo ćem o definisati interfejs koji opisuje bilo kakav upravljački događaj. P ro jek tn i o b razac razdvaja o n o što se m en ja o d o n o g a što se ne m enja. application fram ew ork) jeste klasa ili sk u p klasa koje su projekto v an e da reše o d re đ e n i p ro b lem . Unutrašnje klase i kosturi upravljanja Kao k o n k re tn iji p rim e r u p o tre b e u n u tra šn jih klasa m o že d a se p rim e n i p o stu p a k koji ću nazvati kostur upravljanja (engl. K ostur p ro g ra m a p rim e n ju ie te tak o što nasled ite jed n u ili više klasa i redefinišete neke m eto d e. K ostur u p rav ljan ja je p o seb an tip k o stu ra p ro g ra m a . N ared n i k o stu r up ravljan ja ne sadrži k o n k re tn e in fo rm acije o to m e čim e upravlja. . Javina bib lio tek a Swing je k o stu r u p rav ljanja koji efikasno rešava p ro b lem grafičkog korisn ičk og o k ru ž e n ja . o n a poziva je d n u ili više m e to d a koje se m o g u redefinisati. p rilik o m realizacije o n o g dela alg o ritm a koji je n azvan a k cija(). narav n o . u p o treb ljav a tu referencu za p o v ra tn i p oziv u klasu Pozvana. K od koji n ap išete u red efin isan im m e to d a m a p rilagođava o p šte rešenje koje p ru ž a k o stu r aplikacije d a bi rešio specifičan p ro b le m . To je p rim e r p ro je k tn o g ob rasca Tem plate M eth o d (šab lo nska m eto d a ) (videti T h in kin g in Patterns (w ith Java) n a adresi w w w . o đ n o s n o u m o g u ć n o sti d a p rilikom izvršavanja d in am ičk i o d lu čite koje ćete funkcije pozvati. K osturprogram a (engl. tako da u n jem u m o ra d a b u d e deo realizacije: //: unutrasnjeklas e/ up rav lj ac :D og ad ja j. package unutrasnjeklase. d a b i dovršila akciju to g alg o ritm a. p ri čem u često ko risti u n u tra šn je klase. sistem čija je o sn o v n a funkcija d a reaguje n a d o gađ aje naziva se sistem kojim upravljaju događaji (engl.. sam o d a pozove m e to d u p ovecaj( ) i to je sve (za razliku o d pokazivača koji bi om o g u ćio p o tp u n u slo b o d u ). o n o što se n e m en ja je Š ablonska m e to d a . Š ablonska m eto d a sadrži o sn o v n u stru k tu r u a lg o ritm a. nešto kasnije. u k o m e se za p rav ljenje grafičkog k o risn ičk o g o k ru ž en ja (G U I) svuda ko riste p o v ra tn i pozivi.java // Zajedničke metode za bilo koji upravljački događaj. a m en ja ju se m eto d e koje se m o g u redefinisati. O n je napisan u oblik u a p stra k tn e klase.sp rem n i“. P rem d a te rm in . a o sn o v n a n a m e n a m u je da se o d g o v o ri na d ogađaje. je r je njegovo p o d razu m ev an o ponašanje da upravlja oslanjajući se na vrem e. Jeđan o d n ajvažnijih p ro b le m a p rilik o m pravljen ja p ro g ra m a je grafičko k o risn ičko o k ru žen je (G U I). u n ašem slučaju on će biti zasnovan na časovniku.M indV iew .upravljac. ra z m o trim o k o stu r u p rav ljan ja čiji je zad atak da izvrši dog ađaje svaki p u t kada su . K o n stru k to r klase Poziva d o b ija referen cu n a interfejs M ozeDaSePoveca (p re m d a referencu za p o v ra tn i poziv m o žete d a p rih v atite u bilo k o m tre n u tk u ) i p o to m ..sprem an “ m ože da o značava bilo šta. kojim skoro p o tp u n o u prav ljaju događaji.a ne kao pravi interfejs. Te in fo rm acije se daju to k o m nasleđivanja. V red n o st ove teh n ik e p o staće jasnija u poglavlju Grafička korisnička okruženja. Z načaj p o v ra tn ih poziva leži u njihovoj fleksibilnosti. control fram ew ork). event-driven system ).290 Misliti na Javi interfejs MozeDaSePoveca m ože. Kao što ćete v ideti u poglavlju Grafička korisnička okruženja. u o v o m slučaju.

Stoga m erač v rem e n a m ožete p o n o v o d a p o k ren ete n ak o n o d ig rav an ja d o g ađ aja . M eto d a sp rem an ( ) govori da li je došlo v rem e da se p o k re n e akcija( ). public void dodajDogadjaj(Dogadjaj c) { 1 istaDo ga dj aj a.* .util za čuvanje objekata klase Dogadjaj: private List<Dogadjaj> 1 istaDogadjaja = new A r r a y L i s t< Do ga dj aj >().Poglavlje 10: Unutrašnje klase 291 public abstract class Dogadjaj private long dogVreme. foreach sintaksa pribavlja sukcesivne Dogadjaje iz Liste. Z a sada. p a se o b jek at Dogadjaj in o že p o n o v o u p o tre b iti. N aredna d ato tek a sadrži stvarni k o stu r u p ra v lja n ja koji u p rav lja d o g ađ ajim a i poziva ih. sta r t( ) je zasebna m eto d a. a rem ove( ) u k lan ja d ati Događjaj iz Liste.java // Generički kostur za sve upravljačke sisteme. o kojoj ćete više sazn ati u poglavlju Č uvanje objekata. d o v o ljn o je da iz m e to d e ak cija( ) pozovete sta rt( ). M eto d a spreman( ). public D o ga dj aj(1ong vremeKasnjenja) st a r t ( ) . //: unutrasnjeklase/upravljac/Upravljac. U m esto da b u d e u k lju čen a u k o n stru k to r. O b jek ti klase Dogadjaj čuvaju se u k o n te jn e rsk o m o b je k tu tip a List<Dogadjaj> (čita se „lista dogad aja"). dovoljno je zn ati da m eto d a a d d ( ) d o d aje Dogadjaje na kraj Liste. s iz e ( ) d a je b ro j stavki u Listi.u ti1 . } III-- K o n stru k to r sam o zapisuje tre n u ta k (m e re n o o d tre n u tk a n a sta n k a o b jek ta) k ad a želite da b u d e p o k re n u t Dogadjaj. n arav n o . package unutrasnjeklase. N a prim er. } public abstract void akcija(). da biste dobili događaj koji se p onavlja. { protected final long vremeKasnjenja. public class Upravljac { // Klasa iz paketa java. import j a va . } publi c voi d p o k r e n i () { while(listaDogadjaja.nanoTime() + vremeKasnjenja.vremeKasnjenja = vremeKasnjenja.size() > 0) // Napravite kopiju da ne biste modifikovali // dok birate elemente iz nje: for(Dogadjaj d : new Arra yL is t< Do ga dj aj >(lis t aD og ad ja ja )) listu . ad d( c).nanoTime() >= dogVreme. kako bi izvršavanje d ogađaja bilo zasnov ano na nečem d ru g o m . } public boolean spreman( ) { return System. } public void start() { // Omogućava ponovno pokretanje dogVreme = System. i zatim poziva m e to d u sta r t( ) koja tek u će m v re m e n u d o d aje v rem e kašnjenja i tako se d obija v rem e k ad a će se dog ađ aj o d ig rati.upravljac. { this. m ože da b u d e redefinisana u izvedenoj klasi.

m e đ u tim . tražeći Dogadjaj koji je spreman( ) za p o k re tan je . U n u tra šn je klase o m o g u ćav aju da p o m o ć u sam o jed n e klase n a p ra v ite više izvedenih verzija o sn o v n e klase D o g a d ja j.akcija(). o v aj p ro b le m sa m u v e k v o leo đ a re ša v a m .spreman()) d. To i jeste srž ovog p o stu p k a. da isk o ristim svoj te rm in . Bez ov ih m o g u ćn o sti.292 Misliti na Javi if(d. O n e o m o g u ća v a ju dve stvari: 1. o n p o tie e iz m o je ra n ije kn jig e C + + Insiilc & O u t . 2. K o stur u p rav ljan ja o m o g u ću je d a se taj različiti k od lako razdvaja. uključivanje zv o nca i p o n o v n o p o k re ta n je sistem a. 1 i s t a D o g ad ja ja .upravljac. O d n o sn o .java // Ov im se pravi poseban program za upravljački sistem koji se ceo nalazi // u jednoj klasi.p ri nt ln (d). klasa U p ra v Ija n je S ta k le n o m B a sto m je izvedena iz Idase U p rav ljac: //: u n u t ra sn je klas e/Upravlja njeStaklenomBastom.*.r em ov e(d ). Za svaki tip akcije napravićete nov u u n u tra š n ju klasu izvedenu iz klase D o g ad ja j i k o d za u p rav ljan je n apisati u n u ta r m e to d e ak cija( ). U n u tra šn je klase p o je d n o sta v lju ju o v u realizaciju. čim e kap su lirate sve što je za tu realizaciju p o treb n o . o ut . R a z m o trim o je d n u realizaciju k o stu ra u p rav lja n ja k oja u p rav lja fu n k cijam a staklene bašte. Z a svaki Dogadjaj koji je spreman( ). Kao što je za k o stu r u p rav ljan ja u o b ičajen o . public class Upra vljanjeS ta kl en om Ba st om extends Upravljac { private boolean svetlo = false. } } } III-M eto d a pokreni( ) k ru ži k ro z k o p iju listeDogadjaja. isp isuju se p o d aci objektov om m e to d o m toStrin g( ) i poziv a m eto d a akcija( ). } lz n e k o g ra z lo g a . p ro g ra m bi m ogao da p o sta n e to lik o k o m p lik o v an a a biste m o rali d a p o tra ž ite altern ativ u . private class UkljuciSvetlo extends Dogadjaj public Uk lj uciSvetlo(long vremeKasnjenja) public void akcija() { { { s u p e r( vr em eK as nj en ja). U viđate d a za sad a ne zn ate n išta o to m e šta tačno klasa Dogadjaj radi. import un utrasnjeklase. C elu realizaciju p ro g ram a koji upotreb ljav a k o stu r u pravljanja m ožete da sm estite u je d n u klasu. uklju čiv an je vode i term o stata. a vi ste u m o g u ć n o sti d a lako p ristu p ite č la n o v im a sp o ljn e klase. „vektor p ro m e n e “ p red stav lja različite akcije različitih v rsta objekata klase Dogadjaj koje definišete praveći različite p o tk lase za dogadaje. Unutrašnje klase omogućavaju da kapsulirate razlićitu // funkcionalnost za svaki poseban tip dogadjaja. Java o m o g u ć a v a m n o g o b o lje re šen je . N a o v o m m e s tu n a scen u stu p a ju u n u tra šn je klase. . k ako „razdvaja o n o što se m en ja o d o n o g što o staje isto “.4 Svaka akcija je p o tp u n o različita: paljen je svetla. { S y s t e m . U n u trašn je klase se up o treb ljav aju d a iskažu više različitih akcija koje su p o tre b n e za rešavanje problem a. Z atim se Događjaj uklanja iziiste.

{ { su pe r(vremeKasnjenja). pali svetlo.Poglavlje 10: Unutrašnje klase 293 // Ovde treba da bude kod za upravljanje hardverom // kojim se fizički svetlo = true. { // Ovde treba da bude kod za upravljanje hardverom.} // Ovde treba da bude kod za upravljanje hardverom. { // Ovde treba da bude kod za upravljanje hardverom. { { } public void akcija() termostat = "Noć". } } } public class IskljuciVodu extends Dogadjaj public IskljuciVodu(long vremeKasnjenja) public void akcija() voda = false. } private String termostat = "Dan". } public String t o S t r i n g O return "Noćni { režim termostata". public class TermostatNoc extends Dogadjaj public T e r m o s t a t N o c (1ong vremeKasnjenja) su pe r( vr e m e K a s n j e n j a ) . public class UkljuciVodu extends Dogadjaj public UkljuciVodu(long vremeKasnjenja) public void akcija() voda = true. } } private boolean voda = false. } public String t o S t r i n g O { return "Svetlo je isključeno". svetlo = false. { { (super(vremeKasnjenja). } } } public class IskljuciSvetlo extends Dogadjaj public IskljuciSvetlo(long vremeKasnjenja) public void akcija() { // Ovde treba da bude kod za upravljanje hardverom. public class TermostatDan extends Dogadjaj public TermostatDan(long vremeKasnjenja) s u p e r ( v r em eK as nj en ja). { { super(vremeKasnjenja). { { . } public String toString() { return "Voda u stakleniku je puštena". // kojim se fizički gasi svetlo. } public String t o S t r i n g O { return "Svetlo je uključeno". } public String t o S t r i n g O { return "Voda u stakleniku je zatvorena".

U stv a rn o m p ro g ra m u . // Ponovo pokreni ovaj događaj dodajD ogadjaj(thi s ) . for(D ogadjaj d : 1is ta D o g ad jaja) { dodajDogadjaj ( d ) . } p ublic void a k c ija ( ) { dodajDogadjaj(new Z von o(vrem eKasn jen ja)). } } p ub lic c la s s R e sta rt extends Dogadjaj { p riv a te D ogad jaj[] lis ta D o g a d ja ja . } p ublic void a k c ija ( ) { for(D ogadjaj d : 1ista D o g ad jaja) { d . } p ublic S trin g to S tr in g () { return "R e starto van je sistem a ". } p ublic void a k c ija ( ) { S y s te m . voda i term ostat p rip a d a ju sp o ljn o j klasi UpravljanjeStaklenomBastom. th is . ) p ublic S trin g to S tr in g () { return "Dnevni režim term o stata". termostat = "Dan". većina m eto d a ak cija( ) bi uključivala n eku vrstu up rav ljan ja h ard v ero m . } 1 } / / / =- P rom enljive svetlo. } s t a r t ( ) . } } // Primer metode a k c ija ( ) koja ubacuje // novu a k c iju u li s t u događaja. . } p ublic S trin g to S tr in g () { retu rn "Z a v rš a v a n je ". // Ponovo pokreni svaki događaj dodajD ogadjaj(d). } } p ub lic s t a t ic c lass Z avrsi extends Dogadjaj { p ub lic Z a v rs i(lo n g vremeKasnjenja) { super(vrem eKasnjenja).lis ta D o g a d ja ja = 1ista D o g ad jaja. a ipak u n u tra šn je klase m o g u d a im p ristu p e bez u p o tre b e k valifikatora i bez p o sebn ih dozvola. s t a r t O . } p ub lic S trin g to S trin g O { retu rn "Z vo n c e !". p ub lic R e sta rt(lo n g vremeKasnjenja) { super(vrem eKasnjenja).e x it(0 ).294 Misliti na Javi p ublic void a k c ija ( ) { // Ovde treba da bude kod za u p ra v lja n je hardverom. p ub lic c lass Zvono extends Dogadjaj { p ublic Zvonoflong vremeKasnjenja) { super(vrem eKasnjenja).

a takođe izgleda kao da im a i sve m eto d e spoljne klase UpravljanjeStaklenomBastom.dodajDogadjaj(gc.p o k re n i( ) .new U k lju c iS v e tlo (2 0 0 ).Zavrsi( new In te g e r(a rg s [ 0 ] ) ) ) . u m eto d i Restart. gc.new R estart(2000. gc. O b ra tite p a žn ju na to da u n u trašn ja klasa izgleda gotovo kao v išestruko nasleđivanje: klasa Zvono im a sve m eto d e kao i klasa Dogadjaj. ali se klase Zvono i Restart izdvajaju.u p ra v lja c . Klasa Zvono pokreće zvonce i u listu događaja dodaje još jed an objekat klase Zvono. } } /* Is p is : Zvonce! Noćni režim termostata S v e tlo je uključeno S v e tlo je is k lju če n o Voda u stak len ik u j e uključena Voda u stakleniku j e is k lju če n a Dnevni režim termostata R estarto van je sistema Završavanje .new Zvono(900)) . D ogadjaj[] 1i staDogadjaja = { gc. // {A rg s: 5000) import u n u tra s n je k la s e . gc. kako bi se sistem s v rem en a n a v rem e po no vo p o k ren u o . O vo je p rim e r p ro je k tn o g ob rasca C om m a n d (n a re d b a ) .* . p u b lic c lass U p ra vlja cStak le n eBaste { p u b lic s t a t ic void m a in (S trin g [] args) { UpravljanjeStaklenomBastom gc = new UpravljanjeStaklenom Bastom (). gc. N a red n a klasa kon fig u riše sistem tako što p rav i o bjek at klase UpravljanjeStaklenomBastom i d o d ajte razn e v rste obj'ekata Dogadjaj. 1is ta D o g a d ja ja )) .akcija( ) u listu takođe m ožete da d o d a te i o bjekat klase Restart.new I s k l ju c iS v e tlo (4 0 0 ).new TermostatDan(1400) }.dodajDogadjaj(gc.svaki o b jek at klase listaDogadjaja jeste zah tev kap su liran kao objekat: // : u n u tra sn je k lase/ U p ra vljacS tak len eB aste.Poglavlje 10: Unutrašnje klase 295 Većina klasa izvedenih iz klase Dogadjaj slične su. gc.1ength = = 1) gc.new I s k l j u c i Vodu(800). // Umesto u p is iv a n ja direktno u program.new U kljuciV od u(6 00 ).dodajD ogadjaj( new U pravljanjeStaklenom Bastom . i f ( a r g s . g c . na ovom mestu b iste mogli // da u č ita te k o n fig u ra c iju iz tekstu alne datoteke: gc.new Term ostatNoc(O). gc. Pošto je Restart sam o jo š je d n a v rsta klase Dogadjaj. Klasa Restart do b ija niz objek ata Dogadjaj koje d od aje upravljaču.jav a // K o n fig u riši i pokreni sistem staklene bašte. tako da će p o n o v o zazvoniti nešto kasnije.

} } III-- . P rob lem je što ta .u m e sto da u p išem o do gađaje direk tn o u p ro g ra m . Vežba 24: (2) U d a to teci UpravljanjeStaklenomBastom.java tako d a u p o treb ljav a te nove o b jek te tip a Dogadjaj. p ro č ita će m o n jih o v u in icijalizacion u listu iz datoteke. Restart će o k o n čati p ro g ra m posle tolik o m ilisek u n d i. } p ub lic s t a t ic void m a in (S trin g [] args) { ImaUnutrasnju iu = new ImaUnutrasnju ( ) .su p e rO . (To se u p o trebljava p rilio m testiran ja. K onfigurišite d a to te k u UpravljacStakleneBaste. N apišite n o v u verziju p ro g ra m a UpravljacStakleneBaste. NaslediUnutrasnju i i = new N a s le d iU n u tra s n ju (iu ). c la s s ImaUnutrasnju { cla s s Unutrasnja {) 1 public c la s s NaslediUnutrasnju extends Im aUnutrasnju.tajna“ referenca na sp oljn i objekat m ora da b u d e inicijalizovana. U po glavlju Grafička korisnička okruženja videćete kako se u n u tra šn je klase je d n o sta v n o u p o treb lja v aju za o p isiv an je akcija grafičkog o k ru žen ja. K ada p ro čitate i to poglavlje.. U je d n o m vež b an ju iz poglavlja Javin u la zn o -izla zn i sistem baš se to zah teva o d vas. n aro čito kada se koriste u n u ta r k o stu ra up rav ljan ja.) N aravno.Unutrasnja { //! N aslediU nu trasn ju() { } // Ne može da se prevede NaslediUnutrasnju(Im aUnutrasnju iu ) { iu . pa o n a u k lju č u je sve p o tre b n e događaje. b ićete uvereni u n jih o v u v red n o st. D ogađaj Restart se p o k reće više p u ta. a u izvedenoj klasi više ne postoji p o d raz u m e v a n i objek at za koji bi o n a bila povezana. U koliko zad ate b ro j m ilisek u n d i kao a rg u m e n t n a k o m a n d n o j liniji. a o n svaki p u t učitava klasu listaDogadjaja u o b jek at UpravIjanjeStaklenomBastom. Vežba 25: (3) U d atoteci UpravljanjeStaklenomBastom. to se m ože p o stići i n a fleksibilniji n ačin . O vaj p rim e r b i treb alo d a vas uveri u v re d n o st u n u tra š n jih klasa.java // N asleđ ivanje unutrašnje k lase.296 Misliti na Javi O va klasa je o d g o v o rn a za in icijalizaciju sistem a. Nasleđivanje unutrašnjih klasa Pošto k o n stru k to r u n u tra šn je klase m o ra da b u d e p o vezan s referen co m na objekat spoljne klase. Rešenje je u p o tre b iti sin tak su koja izričito o d re d u je povezivanje: //: un u trasn jek lase/N asled iU n u trasn ju.java d o d a jte u n u tra šn je klase tip a Dogadjaj koje u k lju ču ju i isključuju v en tilato re.java n asledite klasu UpravljanjeStaklenomBastom da b iste d o d a li u n u tra šn je klase tip a Dogadjaj koje u klju čuju i isključuju g e n erato re v o d e n ih kapljica.java tako da u p o tre b ljav a te nove o b jek te tip a Dogadjaj. p ri n je n o m n asleđ iv an ju stvari se m alo k o m p lik u ju .

n asled ite sp o ljn u klasu i p o to m redefin išete u n u tra šn ju ? O d n o sn o . a ne m o ž e te sam o d a p ro sled ite referen cu sp o ljn o m ob jek tu . u k o n stru k to ru m o ra te d a u p o tre b ite sintaksu: ReferencaN aSpoljnuKla s u .red efin isanjem “ u n u tra šn je klase k ao da je o n a m eto d a spoljne klase. ali . Kada d o đ e v rem e d a se n a p ra v i k o n stru k to r. import s t a t ic n e t. } } p ub lic s t a t ic void m a in (S trin g [] args) new V e li k o J a j e ( ) . } } public J a j e ( ) { p r i nt("Novo J a j e ( ) “ ) . d a li je m o g u će redefin isati u n u tra š n ju klasu? Č in i se da bi to b io m o ć an k o n cep t.Zum anceO * ///:- . z = new Zumancef).m in d v ie w . N ap rav ite d ru g u klasu koja sadrži u n u tra šn ju klasu n asled en u iz prve u n u tra šn je klase. Da li unutrašnja klasa može da se redefiniše? Šta se dešava k ad a n a p ra v ite u n u tra š n ju klasu.Zu m an ce()" ) . Pored toga.u til.ja v a // Unutrašnja k lasa ne može da bude re d e fin isa n a poput metode.. { } } /* Is p is : Novo J a j e ( ) Jaje. p o d ra z u m e v a n i k o n stru k to r v am ne o d govara.s u p e r(). u su štin i se ništa ne postiže: //: u n u tra sn jek lase/V eli k o Ja je . T im e o b ezb ed u jete n e o p h o d n u referen cu i m o ć i ćete da prevedete p ro g ra m . * . Vežba 26: (2) N ap rav ite klasu koja sad rži u n u tra š n ju klasu koja im a n e p o d ra zu m e v a n i k o n stru k to r (o naj koji p rim a a rg u m e n te ).Poglavlje 10: Unutrašnje klase 297 V idite da klasa NasleđiUnutrasnju p ro širu je sam o u n u tra šn ju klasu. } } p ub lic c la s s V e lik o Ja je extends J a j e { p ub lic c la s s Zumance { p ublic ZumanceO { pri n t("V e l i ko Jaje. c la s s J a j e { p riv a te Zumance z.Z u m a n c e ()" ) . P r i n t . ali ne i spoljašnju. protected c la s s Zumance { p u b lic Zumance() { p r in t("Ja je .

f( ) " ) . f ( ) .Zumance( ) jeste poziv iz k o n stru k to ra Velikojaje2. } } p ub lic V e lik o Ja je 2 () { ubaciZumance(new Zumancef)) . f ( ) * ///:Sada klasa VelikoJajež. . Ipak. O vaj p rim e r sam o pokazuje da se p rilik o m n asleđ iv an ja spoljašnjiJi klasa n išta p o seb no ne dešava u u n u tra šn jim .Z u m a n c e ()" ) . m ogli biste očekivati d a će b iti po zv an a . c la s s Ja je 2 { p rotecteđ c la s s Zumance { p u b lic Zumance{) { p rin t("Ja je 2 .Z u m an ce (). } p u b lic void ubaciZumance(Zumance zz) { z = zz.g ().. S o b ziro m na to d a se p rav i klasa Velikojaje. e 2 . m o g u će je izričito n asleđivanje u n u tra šn je klase: //: u n u tra sn je k la se / V e lik o Ja je 2 . * . publ ic J a je 2 () { print("N o vo J a j e 2 ( ) " ) . ali to se n e dešava.Zum ance. I sam i v idite d a će p rilik o m poziva m eto d e g( ) biti p o zvana red efin isan a verzija m e to d e f ( ). svaka u svom im e n sk o m p ro sto ru .Zum ance()" ) . D ru g i poziv k o n s tru k to ru o sn o v n e klase Jaje2.Zumance { p ub lic ZumanceO { p r i n t ( " V e l i koJaje2.Zumance() V e lik o Jaje 2 .f( ) biće u p o treb ljen a redefinisana verzija m eto d e f ( ).m in d v ie w . p u b lic void f ( ) { p r in t("Ja je 2 . } } p ub lic c la s s V e lik o Ja je 2 extends Ja je 2 { p u b lic c la s s Zumance extends Jaje2.Zuinance. P r in t . Kada m eto d a g ( ) pozove m e to d u z .298 Misliti na Javi Prevodilac au to m atsk i prav i p o d raz u m ev an i k o n stru k to r koji poziva p o d ra z u m e v a n i k o n stru k to r o sno v n e klase. } } /* Is p is : Jaje2. } p u b lic s t a t ic void m a in (S trin g [] args) { Ja je 2 e2 = new V e lik o J a je 2 ( ) .ja v a // P ra v iln o n asleđ ivan je unutrašnje klase import s t a t ic n e t.f()" ) .redefinisana“ verzija klase Zumance. kao što v id ite iz rezu ltata.Zumance ek sp licitn o p ro širu je klasu Jaje2. } p u b lic void g () { z . } } } p riv a te Zumance z = new ZumanceO.Z u m a n c e .Zum ance() Vel i k o Ja je 2 . } p u b lic void f ( ) { p r i n t ( " V e li koJaje2.u til.Zum ance() Novo Ja je 2 ( ) Jaje2. M etoda ubaciZumance( ) om o g u ćav a d a klasa VelikoJaje2 je d a n o d svojih u n u tra šn jih ob jekata klase Zumance svede naviše ka referenci z u klasi Jaje2.Zumance i redefiniše n jen e m e to d e. Dve u n u tra šn je klase su p o tp u n o o d v o jen i en tite ti.

} p u b lic s t a t ic void m a in (S trin g [] args) { LokalnaUnutrasnjaKlasa l i c = new Lo k a ln aU n u trasn jaK la sa(). // Pristu p an je lo k a ln o j fin a ln o j return broj++. } }. Evo p rim e ra gde se p o re d i p ravljenje lokalne u n u tra šn je klase i a n o n im n e u n u tra šn je klase: //: u n u trasn jeklase/Lo kalnalln u trasn jaK lasa.u til. } public in t nex t() { p rin tn b (im e ). L okalna u n u tra šn ja klasa ne m ože im ati specifik ato r p ristu p a . p o što o n a nije deo sp oljne klase. Counter u zm iB ro jac(fin al S trin g ime) { // Lokalna unutrasnja klasa: c la s s Lokaln iB ro ja c implements Brojac { pu b lic L o k a ln iB ro ja c () { // Lokalna unutrasnja klasa može imati konstruktor p ri nt ('' Lokal ni Brojac ( ) " ) . u n u tra šn je klase se prave i u n u ta r blokova koda. import s t a t ic n e t. . in te rfa c e Brojac { in t n e x t(). // Pristu p an je lo k aln o j fin a ln o j return broj++.Poglav[je 10: Unutrašnje klase 299 Lokalne unutrašnje klase Kao što je rečeno. * .java // Čuva sekvencu Objekata. ali m ože p ristu p a ti fin aln im p ro m en ljiv a m a u tek u ćem b lo k u k o d a i svim član o vim a o k ru ž u ju ć e klase. pub lic c la s s LokalnaUnutrasnjaKlasa { p riv a te in t broj = 0. P r in t . } p ub lic in t n ex t() { p rin tn b (im e ). } // Is to sa anonimnom unutrašnjom klasom: B rojac L o k a ln iB ro ja c 2 (fin a l Strin g ime) { return new B ro ja c () { // Anonimna unutrašnja klasa ne može imati imenovani // konstruktor. return new L o k a ln iB ro ja c ( ) . nego samo i n i c i j a l i z a t o r in stan ce: { pri nt ("B r o ja c O " ) . najčešće u n u ta r tela m eto d e.m in d v ie w .

vero v atn o p o g a đ a te da i za u n u tra šn je klase m o ra p o sto jati njihova d ato tek a .class LokalnaUnutrasnjaKlasa.class.class: Bro jac. jer a n o n im n a u n u tra šn ja klasa m ože im ati sa m o inicijalizaciju instance. D ru g i razlog za p ravljenje lokalne u n u tra šn je klase u m esto a n o n im n e u n u tra šn je klase bila bi p o tre b a da se n ap rav i više o b jek ata te klase. a zatim im e u n u tra šn je klase. } } /* Ispis: LokalniBrojac() Brojac() Lokalna unutrašnja 0 Lokalna unutrašnja 1 Lokalna unutrašnja 2 Lokalna unutrašnja 3 Lokalna unutrašnja 4 Anon im na unutrašnja 5 Anonimna uriutrašnja 6 An on im na unutrašnja 7 Anon im na unutrašnja 8 Anonimna unutrašnja 9 * ///:B ro ja c vraća sledeću v ređ n o st u sekvenci. c l ass Lokal naUnutrasnjaKlasa$lLokalniBrojac. Pošto im e lo k aln e u n u tra šn je klase nije d o s tu p n o izvan te m etode. R ealizovan je i kao lokalna klasa i k ao a n o n im n a u n u tra š n ja klasa. Identifikatori unutrašnjih klasa Pošto za sv ak u kiasu p ostoji d a to tek a .objekat tip a C lass).300 Misliti na Javi Brojac cl = 1 ic. m eta klasa . for(int i = 0.class u kojoj se ćuvaju sve in fo rm acije o pravljenju ob jekata tog tip a (p o m o ć u tih in fo rm acija se d obija tzv. je d in o o p ra v d a n je za u p o tre b u te klase u m esto a n o n im n e u n u tra š n je klase bila bi p o tre b a za im e n o v a n im ko n stru k to ro m i/ili p rek lo p ljen im k o n stru k to ro m . O b e te klase je d n a k o se p o n ašaju i im aju iste m o g u ćn o sti.klasa .n ex t( )).n ex t( )). for(int i = 0 . i++) p r in t( c2 . i < 5.uzmiBrojac("Lokalna unutrašnja "). N a p rim er.jav a biće n ap rav ljen e sledeće d a to te k e .class LokalnaUnutrasnjaKlasa$l. Im ena tih d a to tek a /k lasa d o b ijaju se p o p recizn o j fo rm u li: im e spo ljn e klase posle koga dolazi znak $. i <5.uzmiBrojac("Anonimna unutrašnja "). c2 = 1 ic. i++) p r i n t( cl . u p ro g ra m u L o k a ln a U n u tra s n ja K lasa.

cla ss.Poglavlje 1 Unutrašnje klase 301 U koliko su u n u tra šn je klase a n o n im n e . Isp ostavilo se d a se u C + + -u v išestru k o nasleđivanje p riličn o teško upotreb ljava. N ačin generisanja in te rn ih im en a je jed n o stav an . N a p rim er. 1 o se b u d e te sretali sa njim a. n jih o v a u p o tre b a je 1 f anje pro je k to v an ja. 1ln Java A n n o ta ted S olu - S d r u g e s tra n e .MindView. Rešenja odabranih vežbi data su u elektronskom dokum entu Thin tions G uide . A ko su u n u tra šn je klase u gn ežđ en e u n u ta r d rugil in n ira šn jih klasa. ili i je d n o i d ru g o isto v re ire U o v o m tre n u tk u . n p revo dilac n a više način a m e n ja vaše u n u tra šn je klase kako bi m ogle d a rade.u tra šn ju klasu. ali isto\’i n en o ro b u s ta n i sp o so b an da o b ra d i većinu situ aciia. p revodilac k o risi’ i-rojeve kao n jihove id e n tifikatore. generisan e d ato te k e će a u to m a tsk i b iti nezavisne o d p latfo rm e. $ je m e ta z n a k u U n ix o v im k o m a n d n im o k ru ž e n ji >a ćete p o n e k a d im a ti p ro b le m a p rilik o m lis ta n ja d a to te k a .i i/vo rn im kodom . bilo bi d o b ro d a p o zn ajete b a re m n jih o v u sin tak su i sem an tik u. ( i zajed no rešavaju isti p ro b lem koji je i C + + p o k u šao d a reši p o m o ć u v išestru ko g nasieđivanja. sve više ćete ih prih v atati. d o k su Javini in terfejsi i u n u tra š n je Iđase m n o g o p ristu p ačn iji. u C ++-U ne p o sto ji ništa nalik njim a. P r e tp o sta v lja m d a to p ita n je u S u n u n isu ni ra z m a tra li. Iako su te m o g u ć n o sti p riličn o jasne.5 Pošto je to sta n d a rd n a teh n ik a • /■ ■ ■ o delu im en a u Javi. S v re m e n o m ćete sve b olje p rep o zn av ati situa c u k o jim a tre b a da k oristite in terfe js ili u r. O v o je p o m a lo č u d n o . . m z . koji se može kupiti na lokaciji www.net. d o d a ju se o d g o v araju ća im en a n a k o n znaka $ i id en tifik ato ra spoljni!. je r k o m p a n ija S u n ra đ i u U n ix u .) Sažetak Interfejsi i u n u tra šn je Jdase n a p re d n iji su k o n cep ti o d on ih ii p o sto je u m n o g im O O P jezicim a. m isleći d a ćete se i ro d n o u s re d s re d iti n a d a to te k e s. p o p u t p o lim o rfiz m a.

P vthnn i Ruby. U sam jezik je u g ra đ en tip niza. čiji su o sn o v n i tip o v i L ist.' k o n tejn ersk e klase su jedna o d n ajsn ažnijih alatki za p ro g ra m ira n je . u k o n te jn e r m o žete staviti pro izv o ljan broj p ro izv o ljn o velikih objekata. P ored o stalih svojih obeležja —na p rim er. O vi tip o v i objek ata p o z n a ti su i p o d im e n o m klase kolekcija.k o n tejn e r“. a u o p štije m slučaju. referenci n a o b jek te).Čuvanje objekata P r il ič n o je je d n o s t a v a n pro g ra m KOJI k o r is t i t a Cn o o d ređ en bro j o b je k a t a p o znatog v rem en a trajanja. u p o z n a ć e m o vas sa ostalim k o n te jn e rim a i s p o je d in o stim a o njih o v o j fu n k c io n a ln o sti i n ač in im a korišćenja. Set. B avićem o se k o n te jn e rim a koje ćete u p o treb ljav ati u sv ak o d n ev n o m p ro g ra m ira n ju . m eđu kojim a Perl. Stoga. niti kog su o n i tipa. nećete znati koliko vam o b jekata treb a. D a biste rešili ovaj p rob lem . o k o m e je već bilo reči. a M ap (m ap a) je asocijativan niz koji služi za ču vanje p aro v a m e đ u so b n o asociran ih objek ata . Java n u d i nekoliko n ačin a za ču vanje o b jek ata (o d n o sn o .Javine k o n tejn ersk e klase a u to m a tsk i podešavaju svoju veličinu. d o k pišete p ro g ram . u bilo kom tren u tk u . m o ra te b iti u stan ju d a n ap rav ite proizvoljan broj objekata. ali p o što se naziv C olle c tio n u Javinoj biblioteci k o risti za ozn ačav an je o d re d e n o g p o d sk u p a te biblioteke. U p ro g ram im a p o prav ilu o b ičn o p rav ite nove objekte n a o snovu nekog k riteriju m a koji je p o zn at sam o u v rem e njegovog izvršavanja. Ali n iz im a n e p ro m e n ijiv u v eličinu. u tre n u tk u p isan ja p ro g ra m a vi n e zn ate koliko o b jek ata će vam biti p o tre b n o . Većina jezika im a neki n ač in za rešavanje ovog tem eljn o g p ro b le m a. Iako u Javi n e m a ju d ire k tn u p o d ršk u kroz rezervisane reči.. koristiću precizniji p ojam . bilo gde. K o n tejneri o m o g u ćav aju n a p red n ije način e za sm eštan je o b jek ata i p o m o ć u njih m o žete d a rešite izn e n a đ u ju ć e veliki bro j p ro b lem a. ne m o ra te zn ati koliki k o n te jn e r treb a da n ap rav ite. Kasnije. Za rešavanje ovog p ro b lem a. za razliku o d nizova. b ib lio tek a Javinih u slu žn ih klasa im a p rilič n o zao k ru žen sk u p kontejnerskih k'lasa. u poglavlju D etaljno razm atranje kontejnera. U građenu p o dršk u za kontejnere im aju b ro jn i jezici. ne m o žete se o slo n iti n a to d a ćete svakom o b jek tu m oći da p ristu p ate preko neke reference kojoj je dodeljen o ime: MojaKlasa referenca po što n ik a d a nećete zn ati koliko će vam o b jek ata zaista treb ati. zato je n ep ro m enljiva veličina niza pretešk o og ran ičen je. niti treb a li v am n eki n a p re d n iji n ačin sklad išten ja objek ata. Dakle. U ovom poglavlju steći ćete o sn o v n a zn an ja p o tre b n a za rad s Javinom b ibliotekom k o n tejn era u tip ič n im p rim e n a m a . Sve d o k p ro g ram ne po čne da se izvršava. . je r p rim e tn o sk raću ju v re m e pisan ja p ro g ram a. Set (sk u p ) ne m o že da sađrži p o n o v ljen e elem en te. Q u e u e (za redove za čekanje) i M ap. N iz je najefikasniji n ačin ču vanja g ru p e o b jek ata i p re p o ru č u je se za čuvanje g ru p e p ro stih tip o v a.

Z a poćetak. i++) O v d e bi d o b r o d o š lo p re k la p a n je o p e ra to ra . ali bez uglastih zag rad a. ova glasi @SuppressWarnings (. sm estite u njega objekte m eto d o m a d d ( ).izuzetak to k o m izvršavanja“ (engl.s iz e (). a n jen a rg u m e n t p o k azu je d a n e želim o ispisivanje sam o u p o zo ren ja „unchecked". u k o n tejn e r se stavljaju i iz njega vade o bjekti tip o v a Jabuka i Narandza. K o n te jn e rsk e k la se u je z ic im a C + + i C # p ro iz v o d e č istiju s in ta k s u z ato što se u p o tre b lja v a p re k la p a n je o p e r a to r a . baš kao u slučaju niza. koje k azuje d a nije ja sn o koji se tip (Jab u k a ili N a ran d za) d o b ija iz k on tejn era: //: cuvanje/JabukelN arandzeBezGenerickihTipova. ArrayList. recim o d a n am tre b a k o n te jn e r sa ob jek tim a tip a Jabuka i da ćem o u p o tre b iti o sn o v n i k o n tejn e r za sve n am en e. Pošto u p rim e ru nisu u p o tre b lje n i g en eričk i tip o v i.* .Poglavlje 11: Čuvanje objekata 303 Generičke klase i kontejneri za bezbedan rad s tipovima Pre Jave SE5. izuzeci će b iti p redstavljeni u poglavlju O brada grešaka pom oću izuzetaka. } } c la s s Narandza {} p u b lic c lass JabukelNarandzeBezGenerickihTipova { @SuppressWarnings("unchecked") pu b lic s t a t ic void m a in (S trin g [] args) { A rra y L is t jabuke = new A r r a y L is t ( ) . a kasnije da ih izvadite m e to d o m g e t( ) uz korišćenje indeksa. // Nema prepreke da se jabukama dodaju Narandže: jabuke. N a p rim er. . c la s s Jabuka ( p riv a te s t a t ic long b ro jac. K orišćenje klase ArrayList je jed n o stav n o : tre b a d a n ap rav ite kontejner. p ub lic long id ( ) { retu rn id . f o r ( i n t i = 0. sm atrajte da je ArrayList „din am ičk i niz koji se au to m atsk i p ro širu je“. Javin p rev o d ilac će vas u p o zo riti n a grešku.u n ch eck ed “ ). U ovom p rim e ru . p riv a te fin a l long id = brojac++. A n otacije p o č in ju zn a k o m @ i p rim a ju a rg u m en t. f o r ( i n t i = 0 .add(new Ja b u k a O ).. i < 3 . o vde sm o u p o treb ili p o se b n u anotaciju Jave SE5. u t i l .add(new N arandzaO ). D a b ism o sprečili ispisivanje to g u p o zo ren ja. i++) jabuke.2 ArrayList im a i m e to d u siz e ( ) k oja vraća tren u tn i bro j elem en ata i tim e vas sprečava d a slu čajn o d o đ ete d o k raja i p ro u zro k u je te . jed an o d p ro b lem a p rilik o m k o rišćen ja k o n tejn era b io je to što je prevodilac d o p u šta o u m e tan je pogrešn o g tip a u k ontejner. // (ThrowsExceptionj import j a v a .java // Jednostavan primer s kontejnerom (napisan tako da prevo d ilac // daje upozorenja). i < ja b u k e .. ru n tim e exception).

) P ošto ArrayList sadrži Jdase Object.g e t (i)). f o r ( i n t i = 0. u t i l . f o r ( i n t i = 0 . nego i objekte tip a Narandza. U v re m e izvršavanja. Klase Jabuka i Narandza se razliku ju . P rim e ra rad i. i < j a b u k e . i < 3 . m e to d o m add() k o n tejn e ra ArrayList u njega m o žete d o d a v ati ne sam o objekte tipa Jabuka. i d ( ) ) . u p ro tiv n o m . U is to m p o g la v lju v id e ć e te i d a s u Jav in i g e n e rič k i tip o v i p o d e s n i za m n o g o više o d k o n te jn e ra koji se s ta ra ju za bezb e d a n ra d s tip o v im a . au to m atsk i n asleđ ujete Object. ceo izraz m o ra te zatvo riti u zagrade da b i se to svođ en je obavilo p re p o ziv an ja m e to d e id() za klasu Jabuka.o u t . p išete ArrayList<Jabuka> u m esto sam o ArrayList. // Sintaksom foreach: fo r(Jab u k a c : jabuke) S y s t e m . p ublic c la s s JabukelNarandzePoinocuGenerickihTipova { p ub lic s t a t i c void m a in (S trin g [] args) { ArrayList<Jabuka> jabuke = new A rrayList< Ja b u k a > (). k ad a o b jek at tip a Narandza p o k u šate da svedete na tip Jabuka. n e m a ju n išta zajedničko.304 Misliti naJavi ( ( Ja b u k a )ja b u k e . i++) jabuke. } ' N a k ra ju p o g la v lja Cetterički tipovi r a z m o tr ić e m o d a li je to b aš to lik o te ž ak p ro b le m .s iz e ( ) . a da se n e p o b u n i n i p rev od ilac u v rem e prev o đ en ja.o u t. da b iste definisali ArrayList p red v iđ en za čuvanje objekata tip a Jabuka. izazvaćete sin ta k sn u grešku.java import j a v a .add(new Ja b u k a O ). // Narandza se o tk riv a tek p rilik o m iz vršavan ja } } /* (Po k re n ite da b is te v id e li r e z u lta t) * / / / ■ - Više o a n o ta c ijam a u Javi SE5 saznaćete u poglavlju Atiotacije.p r in t ln ( c . sem što p o tič u o d n a tklase Object. (N e zaboravite: uk olik o izričito ne n avedete klasu o d koje nasleđujete. . i d ( ) . javiće se greška u o b lik u p re th o d n o s p o m e n u to g izuzetka. Kada m e to d o m get() k o n te jn e ra ArrayList p o k u šate d a p rib av ite o n o što su p o v ašem m išljen ju o b jek ti tip a Jabuka. ni izvršno o k ru žen je Jave u v rem e izvršavanja. U poglavlju G enerički tipovi sazn aćete d a pravljenje klasa p o m o ć u odg ov arajućeg Javin o g m e h a n iz m a u m e d a b u d e složeno.p rin tl n (jab uk e.g et ( i ) . U glaste zagrade o k ru ž u ju p ara m etre tipa (m o že ih b iti više) a o n i zadaju tip(ove) koje taj p rim e rak k o n te jn era m o ž e da p rim i.add(new N arandzaO ). // Greška koja se p r i j a v l j u j e u vreme prevođenja: // jabuke.id ( )) . N adalje. ali d a je p rim e n a je d n o m d efin isanih generičkih ldasa najčešće je d n o stav n a . v ratiće v am se referenca na Object koji m o ra te svesti n a tip Jabuka. M eh an izam g eneričk ih tip o v a vas već u vrem eprevođenja sprečava da u k o n te jn e r stavite pog rešan tip o b je k ta .* .' Evo p re th o d n o g p rim e ra n ap rav ljeno g p o m o ć u generičkih tipova: //: cuvanje/JabukelNarandzePom ocuGenerickihTipova. i++) S y ste m .

Poglavlje 11: ujvanje objekata 305 } /* Is p is : 0 1 2 0 1 2 * ///:Sada će p revo d ilac sprečiti stavljenje o b jek ta tip a N a ra n d /a m eđ u ja b u k e .add(new B re b u rn ()). nego je i sintaksa p rilik o m u p o tre b e objek ata u n jem u ćistija. ne sa m o da p rev o d ilac zbog gen eričk ih tip o v a p roverava tip o b jek ata koji stavljate u ko n tejn er.add(new Fud zi( ) ) . o n a obavlja svođenje k a<ta vi pozovete g et(). P rim e r p o k azu je i sledeće: ako v am ne tre b a in d ek s svakop (’lem en ta. .p r in tln (c ). P ošto Lista zna koji tip sadrži. p o što svođenje naviše rad i i s gen eričk im p o v im a kao i sa o stalim tip o v im a: //: cuvanje/GenerickiTipoviISvodjenjeNavise. jabuke.java import java. u k o n te jn e r o d re đ e n d a sadrži objekte tip a Ja b u k a m o žete d o d av ati i p o d tip o v e klase Ja b u k a .add(new G re n iS m itO ). fo r(Jab u k a c : jabuke) S y s te m . ne m o ra te u k o n te jn e r stavljati sa m o taj tip.add(new G a la ( ) ) . D akle. p a će se ta greška p rijav iti u v rem e p rev o đ en ja. } } /* Is p is : (uzorak) Greni Smi t@7d772e G ala@llb86e7 Fudzi @35ce36 Breburn@757aef * ///•D akle. jabuke. a ne u v rem e izvršavanja.util c la s s c la s s c la s s c la s s GreniSm it extends Jabuka {} Gala extends Jabuka {} Fudzi extends Jabuka {} Breburn extends Jabuka {} p u b lic c la s s G e n erick iT ip o vilS vo d je n je N avise { p u b lic s t a t ic void m a in (S trin g [] args) { ArrayList<Jabuka> jabuke = new ArrayList<Jabuka>( jabuke. K ada tip o b jek ta u k o n te jn e ru zadate kao g enerički p ara m t ■ir. O b ra tite p až n ju i na to da p rilik o m v ađ en ja stavki iz Liste vi e nije p o tre b n o svođenje tip o v a. za izb o r svakog ele m e n ta u Listi m ožete u p o tre b iti sin tak su foreach.o u t . jabuke.

Set (skup) ne m ože da sadrži p o n o v ljen e elem ente. izražena u o b lik u o sn o v n ih in terfe jsa bibliote'ke: 1. zato što objekat traži p o m o ć u ključa.306 Misliti na Javi Ispis proizvodi p o d ra z u m e v an a m e to d a toStringO klase Object. a TreeMap im a m etode koje interfejs Map ne sadrži. svedete ga naviše na odgovarajući interfejs i zatim u ostatku k o d a u p o treb lja v ate taj interfejs. M apa om ogućava pronalaženje objekta p o m o ć u n je m u p rid ru ž e n o g drugog objekta. N ju nazivaju i asocijativan niz. Heš kodove ćem o detaljno razm o triti u p o glavlju D etaljno razm atranje kontejnera. 2. Interfejs Collection p o o p šta v a ideju sekvence . Dakle. pa n a neki n ačin p rid ru ž u je brojeve o b jek tim a. koja ispisuje im e klase i heksadecim alni h e š k d d o b jek ta (koji g en eriše m eto d a hashCode()).način a čuvanja g ru p e o b jekata. Mape su m o ć n e p ro g ra m sk e alatke. a da jedino m esto na kojem ćete sp o m e n u ti tačan tip koji u p o treb ljav ate b u d e m esto pravljenja instance. Vežba 1: (2) N apravite n o v u klasu MorskoPrase sa član o m int brojPrasadi koji se inicijalizuje u k o n stru k to ru . N aprav ite n o v k o n te jn e r tip a ArrayList i d o d ajte nekoliko o b jek ata klase MorskoPrase u listu. koja o m o g u ćav a p ro n alažen je objekta p om oću njegovog ključa. Dakle. Map (mapa): g ru p a p aro v a o b je k a t-k lju č . D o d ajte klasi m e to d u sk a ce( ) koja ispisuje broj m o rsk o g p raseta i da li on o skače. obično pravite o b jek at k o n k re tn e klase. LinkedList im a d o d a tn e m e to d e k oje interfejs List ne sadrži. ArrayList o m o g u ćav a p ro n alažen je objekta p o m o ć u njegovog indeksa. Iako to nije uvek m oguće. k ao što se u rečniku definicija traži p o m o ć u reči. a Queue (red) daje elem ente red o m koji zadaje disciplina čekanja (o b ičn o istim red o m kojim su elem enti u m etan i). ovako m o žete n a p ra v iti Listu: List<Jabuka> jabuke = new A rray List< Ja b u k a > (). bilo bi id ealn o da veći d eo vašeg k oda rad i s tim interfejsim a. In terfejs k o ristim o da b ism o realizaciju m enjali sam o na m estu pravljenja u koliko n a k n a d n o o d lu č im o da je izm enim o. Na prim er. zato što neke klase im aju d o d a tn u fu n k cio n aln o st. ili rečnik. zato što objekte aso cira (p rid ru ž u je ) d ru g im o b jek tim a. Sada u p o tre b ite m e to d u g e t( ) da b iste se kretali kroz listu i pozivali m etodu skace( ) svakog o b jek ta tip a MorskoPrase. Povedite računa o to m e da je ArrayList sveden naviše na List. List (lista) m o ra d a čuva elem ente u o d re đ e n o m redosledu. Ovaj pristu p neće rad iti uvek. nećete m oći d a svedete naviše na opštiji interfejs. A ko v am tre b a ju te m eto d e. Collection (kolekcija): g ru p a p o je d in a č n ih e lem en ata na koje je često p rim en jen o jedno ili više pravila. a zatim se svaki elem en t u rezu ltu ju će m k o n te jn e ru ispisuje: . su p ro tn o n a č in u na koji sm o radili u p re th o d n im p rim e rim a . To se rad i ovako: List<Jabuka> jabuke = new Link ed List< Jab uk a> (). Osnovni pojmovi Kontejnerska b iblioteka Jave 2 obavlja z ad a tak „čuvanja objek ata" i deli ga u dva zasebna pojm a. Evo jednostavnog p rim e ra u k o jem se C ollection (ovde predstavljen ArrayListom) p u n i Integer objektim a.

u t i 1.util.addAU() p rim a o b jek at tip a Collection i niz ili listu e le m e n ata razd vojenih zarezim a. čije elem en te d o d aje tom k o n tejn eru . . o dgovarao bi svaki ob jek at klase nasleđ en e o d to g in terfejsa. import j a v a .java tako da se za c upotrebljava Set. Evo p rim e ra u koje m su p rik a za n e obe te m eto d e. 5 )) . i++) c . 5. p o što Liste dozvoljavaju p o stojan je d u p lik ata. 4.java // Dodavanje grupa elemenata objektima tip a C o lle c tio n . ali ArrayList predstavlja najosno vniji tip sekvence. Dodavanje grupa elemenata M eto d e za d o d av an je g ru p a elem en ata k o n te jn e ru (potklasi interfejsa C ollection) im aju i klasa Arrays i klasa C ollections paketa java.o u t. // Automatsko pakovanje fo r (In te g e r i : c) S y s te m . add() uvek znači . u t i l p u b lic c la s s Jed n o stavnaK o lekcija { p u b lic s t a t ic void m a in (S trin g [] args) { C ollection< Integer> c = new A rra y L is t< In te g e r> (). kao i k o n v en cio n aln ija m eto d a addAll() k o ju sadrže svi tipo vi k o n tejn era: //: cuvanje/DodavanjeGrupa. 3. Im e m e to d e add() n av o d i na p o m isa o d a o n a u kolekciju (Collection) d o d aje n o v elem e n t. Vežba 3: (2) Izm en ite p ro g ra m unutrasnjeklase/Sekvenca. 6. CoIlections.a d d (i). 7.. 3. 1 1 ). p u b lic c la s s DodavanjeGrupa { p u b lic s t a t i c void m a in (S trin g [] args) { C o l1ection<Integer> k o le k c ija = new A rra y L is t< In te g e r> (A r ra y s . 2.p rin t(i + " . kao u p re th o d n o m p rim e ru .Poglavlje 11: Čuvanje objekata 307 / / : cu vanje/JednostavnaKolekcij a . 1. Vežba 2: (1 ) Izm enite p ro g ra m JednostavnaKolekcija. U slučaju klase ArrayList i svih vrsta Listi. * ///:P ošto se u o v om p rim e ru u p o treb ljav aju sam o m eto d e interfejsa Collection. ja va import j a v a .asList() p rim a niz ili listu e le m e n ata razd v ojen ih zarezim a (koristeći arg u m e n te pro m enljive d u žin e) i p retv ara ih u o b jek at tip a List. U n astav k u poglavlja n au čićete da u p o treb ljav ate fleksibilniji Iterator. i < 10.d o d ati“. f o r ( i n t i = 0. 4. K roza sve kolekcije m o žete p rolaziti sin ta k so m foreach. u d o k u m e n ta c iji je p recizn o naved en o da add() „čini d a ovaj p rim e ra k klase C ollection sadrži d a ti e le m e n t“.java tako da m u m ožete d o dati p ro izvoljan bro j elem en ata.* .a s L is t(l. koji elem e n t d o d a je kolekciji sam o ukoliko se o n ta m o već n e nalazi. 2. 8. 9. To je u ra đ e n o zbog sk u p a (potklase Set). } } /* Is p is : 0. M etoda Arrays. M e đ u tim .

jo s C e lih B ro je v a ). K atkada to izaziva p rob lem : / / : cuvanje/KaoNekakvaLista. 15).a s L is t(jo s C e lih B r o je v a )) .add() . 17. 19. import j a v a . ali je u to m slučaju on predstavljen nizom . C o llectio n s. kao Listu.java // A rr a y s . . s e t ( l . 10 } . } } III-K o n stru k to r za Collection m ože p rim iti d ru g i CoIIection koji u p o treb ljav a za so p stvenu inicijalizaciju. new S l o t a ( ) .addAlI() rad i m n o g o b rž e . M e đ u tim . 99). 8. pa nije fleksibilna kao Arrays.addA l 1 (A r r a y s .asList() jeste to što o n a sa m o nagađa koji je rezu ltu ju ći tip Liste i ne obraća pažnju na to čem u je d o d elju jete. 11.308 Misliti na Javi In te g e r[] jo sC elih B ro jeva = { 6. što u v rem e izvršavanja izaziva grešku „ U n su p p o rte d O p e ra tio n “. new P r s a c ( ) ) .izmenjen jedan element // 1i s t a . l i s t a . // Pravi li s t u "podržanu" nizom: List<Integer> l i s t a = A rra y s .delete() .addAll() kao a rg u m e n t m o že p rim iti sam o d ru g i o b jek at tip a Collection.ad d A ll (k o le k c ija . 13.a d d A ll(k o le k c ija .asList() i ColIections. kolekcija.asList() m o žete u p o tre b iti za p rav ljen je ulaza za k o n stru k tor. 9.a s L is t ( // new S la b ( ) . U koliko takvoj listi pok ušate da d o d ate . // OK -. // Neće se p r e v e s t i: // List<Sneg> sneg2 = A r r a y s . new K ru p a n (j). 18.a s L is t ( new K rp e (). 20). tim e biste pokušali da pro m en ite veličinu niza. a l i ovako ne možete // n a p ra viti objekat tip a C o lle c tio n : C o lle c tio n s . p a Arrays. // Greška pri iz vršav an ju zato što se // pripadnom nizu ne može m enjati v e lič in a .addAll() koje p rim a ju liste arg u m e n ata p rom enljive dužine. a njegovu veličinu ne m o žete m en jati. 7.u t il class c la s s c lass c la s s c la s s c lass Sneg {} Prsac extends Sneg {} Slab extends Prsac {} Krupan extends Prsac { } Krpe extends Sneg {} S lo ta extends Sneg { } pu b lic c la s s KaoNekakvaLista { p ub lic s t a t ic void m a in (S trin g [] args) { List<Sneg> snegl = A r r a y s . p a to m p ristu p u treb a d ati p red n o st.a s L is t(1 6 .asList() m ožete u p o tre b iti i n ep o sred n o .ili o d u z m e te . a je d n a k o je lako n ap rav iti Collection bez elem enata i zatim pozvati Collections. M eto d a član Collection. // Radi znatno brže.elem en te.a s L is t () samo nagađa o kojem se tip u ra d i. 12. add(21). Izlaz m etod e Arrays. O g ran ičen je m eto d e Arrays.addAII(). 14. ColIections.

asList() m o žete staviti . u t i 1 import s t a t ic n e t. M ap e su k om p liko v an ije (v idećete).a d d ("k u č e "). m apa.a d d C 'm a čk a ").a d d A ll (sneg3. { } s t a t ic Map popuni(Map mapa) { mapa.put C'pacov'1 . Ispisivanje sadržaja kontejnera Sadržaj k o n te jn e ra se ispisuje lepo bez ikakve p o m o ći. .asList(). Arrays. k o le k c ija . new S l a b ( ) .addAIl() lepo rad i je r iz p rv o g arg um e n ta zna koji je ciljni tip..u til.asList() im a sam o tip o ve klase Prsac. To se naziva ek sp licitn o zadavanje tipa argum enta. "Zb u n jen i" ) . } } ///:Kada p okušava d a n ap rav i sneg2.sm ernicu “ koja će p rev o d io cu sao p štiti stv a rn i ciljni tip rezu ltu ju ćeg tip a List koji pro izv odi Arrays.m in d v ie w .put("mačka“ . a Javina s ta n d a rd n a b ib lio tek a ne om o gu ćav a njiho vu a u to m a ts k u inicijalizaciju d ru gačije sem p rek o sadržaja neke d ru g e M ape.< Sneg> asList( Krupan( ) ) . u sred in u Arrays. d o k CoUections. public c la s s Is p is iv a n je K o n te jn e ra { s t a t ic C o lle c tio n popuni(C ollection< String> k o le k c ija ) kolekci ja. "M ica'1 ). return k o le k c ija . new e k s p lic itn im argumenta: Arrays. * . kolekci ja .u til.L is t< S n e g > // C o lle c tio n s . // Daćemo smernicu // zadavanjem tip a List<Sneg> sneg4 = new S 1 a b (). import j a v a . P r in t . mapa. Kao što vidite u p rim e ru o p rav ljenju liste sneg4. u t i 1. a n e List<Sneg>.a d d C 'k u č e "). new K ru p an O ).Poglavlje 11: Čuvanje objekata 309 // Pre vo d ila c će s a o p š titi: // found : j a v a .a d d A ll () neće se z b u n iti: List<Sneg> sneg3 = new A rrayList< Sn eg > (). pa p ra vi List<Prsac>. C o lle c tio n s . za razliku o d nizova gde m o ra te u p o tre b iti Arrays.toString( ). kolekci ja.ja va // Sadržaj kontejnera se automatski is p is u je u č it ljiv o m o b lik u . Evo p rim e ra koji isto v re m e n o ilu stru je i najvažnije vrste k o n te jn e ra u Javi: / / : c u va n je / Isp isiv a n je K o n te jn e ra . " L e s i " ) .add C 'pacov'1 ).put("kuče". List<Prsac> // req uired : ja v a .

mačka. mačka. R azlik u ju se p o b ro ju elem enata koji se čuv aju u svakoj lo k a d ji k o n tejn era. ali i da različite realizacije sk u p o v a e lem en te skladište na različite način e. kuče. Mapa na svakoj lokaciji sadrži dva objekta. nego LinkedList sadrži više operacija o d tip a ArrayList.. pacov=Zbunjeni} {mačka= Mica. o d kojih svaki realizuje m e to d u add() za d o d av an je n o v ih elem enata. T ip HashSet skladišti elem en te na p riličn o k o m p lik o v an način koji će biti detaljn ije o p isan u poglavlju D etaljno razm atranje kontejnera . Iz rezultata p ro g ram a vidite da p o d razu m ev an o ponašanje što se tiče ispisivanja (izlaz m eto d e toString() svakog k o n tejn era) daje priličn o čitljive rezultate. } p u b lic s t a t ic void print(popuni(new print(popuni(new p rin t(p o p u n i(new print(popuni(new print(popuni(new print(popuni(new p rin t(p o p u n i(new print(popuni(new m a in (S trin g [] args) { A rrayList< Strin g> ( ) ) ) . HashSet<String> ( ) ) ) . return mapa. String> ( ) ) ) . V rednosti o bjekata koji se čuvaju u Mapi ispisuju se u n u ta r vitičastih zagrada. Razlika izm eđu njih nije sam o u p erfo rm an sam a za o d re d e n e vrste o p eracija. R ezultat p ro g ra m a p o kazuje da svaki skup (Set) m ože sad ržati sam o po jed an p rim e ra k id e n tič n ih elem enata. String> ( ) ) ) . “ B o b i"). Set (sk u p ). koji u m eta n je o b jek ata dozvoljava san io na je d n o m . LinkedHashMap<String. v rednosti n ad esn o o d tog znaka).310 Misliti na Javi m apa. p ri čem u su ključevi i n jim a p rid ru ž e n e v red n o sti povezane zn ak o m jednakosti (ključevi nalevo. ključ i n jem u p rid ru ž e n u vrednost. TreeMap<String. to je sam o d ru g i n ačin p o sm a tra n ja sekvence. L in k e d L is t< S tring> ( ) ) ) . a vađ en je objek ata sam o na d ru g o m . HashMap<String. koji čuva g ru p u elem enata u zad ato m redosledu. pacov=Zbunjeni} {pacov=Zbunjeni. mačka= M ica. kuče] [pacov. mačka. String> ( ) ) ) .kraju“ k o n tejn era. K ategorija C ollection čuva sam o je d a n elem en t u svakoj lokaciji. ArrayList i LinkedList su (o čig led n o ) tipovi k ategorije List. pacov] [pacov. Prva m eto d a popuni() radi sa svim tip o v im a kategorije Collection. HashSet. a iz rezu ltata p ro g ra m a vidite d a oba čuvaju elem en te u p o re tk u u m etan ja . p ri čem u su elem enti m eđ u so b n o razdvojeni zarezom . O va k ategorija o b u h v ata interfejse: List (lista). pa zato nije p rik a z an ). kuče=Bobi} * ///:O v im su prik azane dve o sn o v n e k ategorije u Javinoj b iblioteci k o n te jn e ra .k raju “ (za p o tre b e ovog p rim era . mačka. LinkedHashSet<String> ( ) ) ) . V rednosti objekata koji se čuvaju u nekom o d k o n tejn era iz kategorije Collection ispisuju se u n u ta r uglastih zagrada. kuče] {kuče=Bobi.. } } /* Is p is : [pacov. mačka= M ica. kuče. TreeSet<String> ( ) ) ) . koji dozvoljava d o d av a n je sam o je d n o g e lem en ta iste v re d n o sti i Queue (red ). TreeSet i LinkedHashSet tipovi su k ategorije Set.put(''kuče". O n jim a ćem o više g o v o riti u n astavku poglavlja.zasad je d ovoljno znati da ta te h n ik a o m o g u ćav a naj- . kuče] [kuče. kuče=Bobi.

U koliko im ate M a p u u kojoj su im e n a država p rid ru ž e n i im e n im a n jih o v ih glavn ih g rad ova i želite d a saznate koji je glavni g ra d G ruzije. Z atim ispišite sadržaj svakog od tih kontejnera.. U M a p am a se ključevi i v re d n o sti ne čuvaju u o n o m p o retk u kojim su u m e ta n i. HashMap o b ezb edu je n ajb ržu te h n ik u p retraživ an ja.put(ključ. M ap a (koja se naziva i asocijativan niz) o m o g u ćav a p ro n alažen je o b jek ta p o m o ć u njegovog ključa. i vraća se na p o eeta k liste sa im en im a likova kada d o đ e d o n jen og kraja. ali su njegove m o g u ć n o sti veće nego o ne tip a ArrayList. izv rstan je za p ristu p a n je elem en tim a n a su m ič n im red osled o m . ArrayList. HashSet. ali je sporiji p rilik o m u m eta n ja i u k lan jan ja elem en ata iz sred in e Liste. Vežba 4: (3) N apravite generatorsku klasu koja vraća im ena (kao objekte tipa String) likova vašeg o m iljeno g film a (ili Snežane i sedam p atuljaka ili Ratova zvezda. U p o treb ite taj g e n erato r za p o p u n ja v an je o b ičn o g niza i po jed n o g p rim e rk a tipova ArrayList. U g o rn je m p rim e ru sa m o su d o davan i p aro v i k lju č -v re d n o st. Liste Liste čuv aju elem en te u o d re đ e n o m p o retk u . P o red toga. pri če m u se p rik azu ju p arovi k lju č -v re d n o st. p ri če m u je zad ržan a b rz in a p retraž iv a n ja tip a HashMap. To će b iti p o k a zan o kasnije. U p rim e ru su u p o treb lje n a tri o sn o v n a tip a Mapa: HashMap. a ni u m e ta n je i uldan jan je elem enata iz sred in e Liste ne košta m n o g o .gotovo kao da je u p ita n ju indeks niza. m o žete u p o tre b iti TreeSet koji objekte čuva u rastu će m p o re tk u p o ređ en ja.get(ključ) daje v red n o st p riđ ru ž e n u d a to m ključu. kao u jed n o stav n o j bazi p o d atak a . d o k redo sled elem en ata u to m sk u p u n em a značaja). LinkedHashSet i TreeSet. LinkedList je relativ no sp o r p rilikom p ristu p a n ja elem en tim a n a su m ičn im red o sled om . ni ta m a p a ne čuva svoje elem en te u lako razu m ljiv o m p o retk u . zato što realizacija tip a H a sh M a p u p o treb ljav a veom a brz alg o ritam koji o d ređ u je taj p oredak. Map. TreeMap i LinkedHashMap. takođe. iako red o sled njegovog skladištenja izgleda b esm islen (često je važno sa m o da li je objek at član o d re đ en o g sk u p a iz kategorije Set. nije važno) svaki p u t kada pozovete next(). M ap e sam e u m e ju d a isp išu svoj sadržaj. vrednost) u m eće u m a p u v re d n o st (o n o što hoćete d a u sk lad ištite) i p rid ru ž u je je o đ re đ e n o m k lju ču (p o m o ć u kojeg ćete tu v re d n o st p ro n aći). ili LinkedHashSet koji ih čuva u re d o sle d u kojim su bili u m etan i. Im a jte u v id u da ne m o ra te zad ati veličinu M ap e (n iti se za to u o p šte starajte). Kao i HashSet. je r p retraživ an ja n ije bilo. U m ap i tip a TreeMap ključevi su p o ređ a n i u ra stu ćem p o re tk u . a u m a p i tip a LinkedHashMap u p o re tk u u m etan ja. Map.G ruzija“ . Z bog takvog p o n ašan ja M ap a p rih v ata sam o po jed an p rim e ra k svakog ključa.Poglavlje 11 : Čuvanje objekata 311 b rže vađenje elem enata. O b jek at p rid ru ž e n k lju ču jeste njegova vrednost. je r o n a svoju veličinu podešava a u to m atsk i. . Interfejs List kategoriji C ollection do đ aje više m e to d a za u m e ta n je i uklan jan je elem enata iz sred ine Liste. p retraživ an je ob avljate p o m o ću ključa . Postoje dva tip a Liste: • O sn o v n i tip. LinkedList. • T ip LinkedList o b ezb eđ u je o p tim a la n sekvencijalni p ristu p . A ko je p o re d a k skladištenja važan.

rem o ve(h ). // S o r tir a n je u mestu p r i n t ( “ s o rtira n a s u b L is t: " + s u b ). kopija = new A rra y L ist< P e t> (p e ts). c o n ta insA l 1 (s u b )) .u til. p rin t("1 2 : " + p e ts. s o r t (s u b ).rem o ve (2 ). p r in t ( " 8 : " + p e ts ). k o p ija . p rin t("s u b : " + su b ). p e ts . 4 ). p rin t("1 0 : " + p e ts . // Za metodu c o n ta in s A ll() poredak n ije važan: p r i n t ( " l l : " + p e ts. List<Pet> pets = P e t s . C o lle c tio n s . p r in t("1 3 : " + k o p ija ). o p isa n u u poglavlju Podad o tipu u n astavku knjige. in dex O f(p)) .312 Misliti na Javi U n a re d n o m p rim e ru uvešćem o b ib lio tek u typeinfo. p r in t (" s u b L is t : " + s u b ). // Umeće tamo gde pokazuje indeks p r in t (" 9 : " + p e t s ). rem ove(p)) . * .c o n ta in s (h )) . p r in t ( " 5 : " + p e ts.ad d(3 .a d d (h ). rand ). // Napravi novu kopiju k o p ija. // U k la n jan je na osnovu objekta Pet p = p e ts .c o n ta in s A l1(s u b )) . p ets. . List<Pet> kop ija = new A rra y L ist< P e t> (p e ts).s h u ffle (s u b . a s L is t (p e ts . nego sam o da (1) p o sto ji klasa Pet i ra zn i n jen i p o d tip o v i.g e t (1 ). p r i n t ( " l : " + p e ts ). c o n ta insA l1(s u b )) . in d ex O f(cym ric)) .m in d v ie w . Hamster h = new H am ster(). Ta b ib lio tek a sad rži h ije ra rh iju klasa Pet (k u ćn i lju b im ac) i neke alatke za n a su m ič n o generisanje Pet objek ata. import j a v a .ja v a import ty p e in fo .p e ts . new M o u se()). i d a (2) statičn a m eto d a Pets.pets.a r r a y L is t ( 7 ) . p e ts . P r i n t .* . p ets. // Automatski podešava svoju v e lič in u p r in t ( " 2 : " + p e ts ). List<Pet> sub = p e t s .* .g e t (4 )) . p r in t ( " 6 : " + p e ts. import s t a t ic n e t. C o lle c tio n s . Pet cymric = new C ym ric (). p u b lic c la s s O b elez jaL ista { pu b lic s t a t ic void m a in (S trin g [] args) { Random rand = new Random(47).r e ta i nAl 1 (s u b ) . p r in t ( " 4 : " + p + " " + p e ts . // Izmešaj print("izm ešana su b L is t: " + s u b ).g e t(2 ). p r in t ( " 3 : " + p e ts .arrayList() vraća ArrayList p o p u n je n n a su m ičn o iza b ra n im Pet o bjektim a: //: cu van je /O b e le z ja Lista . Z asad ne m o ra te zn ati sve p o jed in o sti. // U klanjan je na osnovu indeksa p r in t("1 4 : " + kopij a ) . sub = A rra y s . rem ove(cym ric)) . u t i l .s u b L is t ( l. // Mora b i t i tačno određeni o bjekat: p r in t ( " 7 : " + p e ts .

Mutt.Listu k u ćnih ljubim aca. Cymric. is.Poglavije I I : ' vanje objekata 31 3 kopi ja. Pug. // Ukloni sve elemente p rin t("1 9 : " + p e t s ) . Mutt] 12: true sub: [Mouse. Pug. Pug] fa ls e [] true [Manx. Pug] [R a t. Cymric. M utt. Pug] su b L is t: [Manx. tj. Mouse. M utt. Cymric. Za razliku o d niza. new M o use()).ad d A l1(2. p e t s . Manx. Pug] 9: [R a t. Mouse] 10: true so rtira n a su b L is t: [Manx. // U klanja samo objekte koji i. Lista dozvoljava d od a\ j i uklanianie elem enata . Mouse. O b je c t[] o = p e t s .a r r a y L is t ( 4 ) ) . Mutt] 11: true izmešana s u b L is t: [Mouse. Pug. Pug] 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: [Mouse. P e t[] pa = p ets. Mouse. Cymric. p r i n t ( “ 21: " + p e ts ). k o p ij a . Cymric. Pug.t o A r r a y ().c le a r O . Mouse.Empty( ) ) . Pug] [R a t. Cymric. p rin t("2 0 : " + p e ts . Manx. Cymric. Manx.a d d A ll( P e t s . Pug] 2: [R a t. M utt.ačrio odgovaraju p rin t("1 5 : " + kopi j a ) . ) } /* Is p is : 1: [R a t.toA rray(new P e t [ 0 ] ) . u p ro g ram u su naredb e p rin t n u m erisan e. objekata tipa Pet. Pug. Mutt. // Ukloni jedan elemeni p r in t("1 6 : " + k o p ija ). p rin t("2 2 : " + o [ 3 ] ) . Pug] [R a t. s u b ). p rin t("2 3 : " + pa[ 3 ] . Mutt. Hamstei 3: tru e 4: Cymric 2 5: -1 6: fa ls e 7: true 8: [R a t. Manx. Cymric. Prvi red rezultata pokazuje prvobit. Cymric. Manx. k o p ija. Cymric. Mouse. EgyptianMau] EgyptianMau 14 * ///:Da histe svaki red rezultata m ogli da dovedete u vezu sa izvorn im ko do m . Pug. // Umeće l i s t u u sredinu p rin t("1 7 : " + k o p ija ). s e t ( l.is E m p ty ()) . Pug. Mouse. Pug] [R a t. p r in t ("1 8 : " + p e ts . Cymric. R at. Mutt.rem oveAl 1 (s u b ). p e t s . i d ( ) ) .

I p o n ašan je m eto d e removeAll() zavisi o d m e to d e equals(). ako n a p ra v im n o v takav o b jek at i p ro sled im ga m eto d i indexOf(). Kao što joj i englesko ime kaže. i o b rn u to . C etrn a e sti red ispisa p rik a z u je rezu ltat u k lan jan ja elem en ta na o sn o v u njegovog indeksa. te za p ro n ala že n je in d ek sa elem en ta i u k lan jan je e lem en ta iz Liste na o sn o v u reference. M eto d a retaiuAll() zapravo spro v o d i o p e ra c iju „preseka skupova". M eto d a subList() služi za pravljenje isečka veće liste. T akođe. pa je p riro d n o da se d o b ija rezultat true kada se isečak p rosledi m e to d i containsAll() za tu veću listu. Da li to znači da n ik a d a ne treb a u m e tati elem en te u sred in u ArrayListe i d a treb a p reći na LinkedList čini takvo nešto zatreba? Ne . u m e ta n je i u k lan jan je iz sredin e liste jeftin a je o p eracija (sem u o v o m slučaju . p o što vas indeksi oslob adaju brige o p o n a ša n ju m e to d e equals(). D akle. R ezultat dodavanja jed n o g objekta tipa Hamster vidite u red u 2 . ali iz toga sledi zaključak: za tip LinkedList.shuffle() (za m ešan je e lem en ata) na p o d listi sub. o bjekti tip a String (znak o vni nizovi) je d n a k i su u koliko je sadržaj o b a zn ak o v n a niza id en tičan .314 Misliti na Javi i nakon što je napravljena.sort() (za so rtira n je ) i Collections. što je jed n o stav n ije nego u k lan jan je na o sn o v u reference objekta.net/B ooks/B etterJava). rezu ltu ju će po našanje se m en ja u zavisnosti o d m eto d e equals(). Z an im ljiv o je da pri to m p o re d ak nije važan . kao što v idite iz reda 9 rezu ltata i koda koji m u p re th o d i. To je n jen a osnovn a vrednost: sekvenca koja se m ože m odifikovati. I o p et. .ob jek at je d o d a t na kraj liste. o na u o b je k tu kopija zadržava sve elem en te koji su i u p o d listi sub. E lem en t je m o gu će u m e tn u ti u sred in u Liste. Za d ru g e klase. M etoda subList() pro izv o d i listu povezanu sa o rig in a ln o m listom . m e to d o m indexOf() m o žete sazn ati njegov in d ek s (red n i b ro j) u Listi. ako im ate referencu nekog objekta.u red o v im a 11 i 12 rezu ltata vid ite da na rezu itat m e to d e containsAll() ne utiče po zivanje m eto d a C ollections. P rim e ra radi. da ne bi bilo iznen ađ en ja. U koliko o bjek at ho ćete d a uk lonite. Z ato se izm en e u vraćen o j listi od ražav aju na o rig in alnoj. Svaki o b jek at tip a Pet p o definiciji je jed in stv en . p o vedite ra č u n a o to m e da se p o n aša n je Lista m en ja u zav isn o sti o d m eto d e equals(). p ri čem u au to m atsk i podešava svoju veličinu. k ad a se u sre d in u liste p ristu p a nasu m ič n o ). o n a iz Liste uklanja sve o b jek te koji su joj p ro sleđ en i u a rg u m e n tu sub. U ovom slučaju. equals() se m o že dru g a čije d efinisati. pa ako n a p rav ite m n o g o u m e ta n ja u sre d in u ArrayListe ia k o p ro g ram p o č n e d a u spo rav a. Iz redova 7 i 8 rezu ltata vidi se d a je usp elo u k lan jan je o b jek ta koji tačn o o d g o v ara jed n o m o b jek tu u Listi. m o ž d a je za to kriva vaša realizacija Liste (takva uska grla se najbolje p ro n alaze p ro fajlero m . kao što se vidi iz red a 4 rezu ltata. M eto d a equals() (d eo k orenske ldase Object) u p o treb ljav a se za ispitivanje da li je o d red e n i elem en t d eo Liste. kao što ćete v ideti u d o d a tk u na lokaciji http://M indV iew . pa će i p okušaji u k lan jan ja tog objekta m e to d o m remove() v ra titi false (što zn ači da u k lan jan je nije uspelo). ali za ArrayList to je sku pa o p eracija. O p tim iz acija je složen p o sao i n ajbolje je ne baviti se n jo m d o k vas p ro g ra m n a to ne n atera (m a d a nije loše zn ati o čem u se rad i). M eto d o m contains() m o žete saz n ati d a li je o d re đ e n i elem en t deo Liste. n jen rezu ltat će b iti -1 (što znači d a taj n o v i nije p ro n a đ e n ). p ro sled ite njeg o v u referen cu m eto d i remove(). č a k i ako u listi već p o sto je dva o b jek ta tip a Cymric.o to m e p ro sto tre b a da v o d ite raču n a.

Poglavlje I I : Čuvanje objekata

315

M eto d a set() je loše n azv an a, je r ju je m og uće p o m e ša ti s klasom Set - tu bi bolji naziv bio ,,replace“ (zam en i), p o što o n a e lem en t d ato g in d ek sa (p rv i a rg u m e n t) zam en juje d ru gim arg u m e n to m . S ed am n aesti red ispisa p rik az u je da za Liste p o sto ji p rek lo p ljen a m eto d a addAll() koja služi za u m e ta n je nove liste u sred p rv o b itn e , u m esto o b ičn o g d o dav an ja na kraj p rv o b itne o n o m m e to d o m addAll() koja je deo klase Collection. R edovi ispisa 18 -2 0 p o k a z u ju rezultate m eto d a isEmpty() i clear(). R edovi ispisa 22 i 23 p o k a z u ju kako svaki k o n te jn e r (o bjekat tip a Collection) m eto d o m toArray() m o žete p re tv o riti u niz. Ta m e to d a je preklop ljena; verzija koja ne p rim a arg u m e n te vraća niz elem en ata tip a Object, ali ako prek lo pljen oj verziji p ro sled ite niz ciljnog tip a, o n a će n a p ra v iti niz to g tip a (u ko liko o n zadovolji p ro v eru tip ov a). Ako je niz pro sleđ e n kao a rg u m e n t p re m a li za sk ladištenje svih ob jekata u Listi (kao što je ovde slučaj), m e to d a toArray() će n a p ra v iti n o v n iz od g o v araju će veličine. Pet ob jek ti im aju m e to d u id() - v id ite d a je p o zv an a za je d a n o d o b jek ata u rezu ltu ju će m nizu.

Vežba 5: (3) Prepravite p ro g ra m ListFeatures.java tako da um esto objekata tipa Pet u p o trebljava cele brojeve (setite se au to m atsk o g pakovanja!) i objasnite sve razlike u rezultatim a.

Vežba 6: (2) P rep ravite p ro g ra m ListFeatures.java tako d a u m esto objek ata tip a Pet u p o treb ljav a zn ak o vne nizove (o b jek t tip a String) i o b jasn ite sve razlike u rezultatim a. Vežba 7: (3) N ap rav ite klasu, a zatim inicijalizovan niz o b jek ata te klase. P o p u n ite tim n izo m jed n u Listu. N aprav ite p o d sk u p liste m e to d o m su bL ist( ), a zatim ga u k lo n ite iz nje.

Iteratori
U svakoj kon tejn ersk o j klasi m o ra p o sto jati n ačin d a se elem enti d o d a ju i izvade. O sn o v n i za d atak k o n te jn e ra i jeste da n ešto sadrži. U klasi List, o b jek ti se u m eć u m eto d o m a d d (), a m eto d a g e t ( ) je jed an o d n ačin a da se pro čitaju. Ako p o č n ete da razm išljate na višem niv o u o k o n tejn ersk o j biblioteci, pojavljuje se jed a n n eđ o statak : m o ra te ta č n o zn ati tip k o n tejn era d a biste ga koristili. To na prv i po gled ne izgleda loše, ali šta ako n ap išete k o d za Listu, a kasnije o tk rijete da bi isti k o d treb alo da p rim e n ite na sk u p (Set)? Ili, p rim e ra radi, želite da nap išete generički kod koji ne zna (ili m u nije b itn o ) s kojim tip o m k o n tejn era radi, kako biste m ogli da ga koristite s različitim tip o v im a k o n te jn e ra a d a ga pri to m n e pišete ponovo? O vakva apstrak cija se p o stiže k o rišćen je m iteratora (i to je p ro je k tn i obrazac). Ite ra to r je o bjek at čiji je zad atak da se p o m e ra kroz niz o b jek ata i d a izabere svaki o bjek at u to m n izu, p ri čem u p ro g ra m e r k lijent ne zna (ili m u nije važno) kakva je s tru k tu ra tog niza. P ored toga, ite ra to r se o b ič n o naz.iva lak o b jek at (engl. light-w eight), je r koristi m alo resursa. Z b o g toga ćete za iterato re često v iđati naizgled ču d n a o g ran ičen ja; na p rim er, Javin Iterator m ože da se kreće sa m o u je d n o m sm e ru . Sa ite ra to ro m ne m ožete b o gzn a šta da rad ite, o sim da:

1. Z a tra žite o d k o n te jn e ra da vam m e to d o m iterator( ) p ro sledi Iterator. D obijeni Iterator je sp re m a n da v ra ti prv i elem en t niza posle prv og poziva njegove m eto d e n e x t(). 2. D obijete sledeći o b jek at u n izu p o m o ć u m e to d e n e x t().

316

Misliti na Javi

3 . U stanovite da li im a j o š ob jekata u n iz u p o m o ć u m e to d e h a s N e x t( ). 4. U k io n ite posled nji elem en t koji je ite ra to r v ra tio p o m o ć u m e to d e r e m o v e ( ). D a b ism o videli kako o n radi, o p e t će m o u p o tre b iti kJasu P et i n jen e m e to d e , o p isan e u poglavlju Podaci o tipu:
//: c u va n je / Je d n o s ta v n a lte ra c ija .ja v a import ty p e in fo .p e ts .* ; import j a v a . u t i l .* ; p ub lic c lass Je d n o s ta v n a lte ra c ija { pu b lic s t a t ic void m a in (S trin g [] args) { List<Pet> Ijub im ci = P e t s .a r r a y L is t (1 2 ) ; Iterator< Pet> i t = lj u b i m c i. it e r a t o r ( ) ; w h ile (it.h a s N e x t ()) { Pet p = i t . n e x t ( ) ; S y s te m .o u t.p rin t(p .id () + + p + " ");

}
S y s te m .o u t.p rin tln (); // Je d n o s ta v n iji p ris tu p , kada j e moguć: fo r (P e t p : Iju b im c i) S y s te m .o u t.p rin t(p .id () + + p + " "); S y s te m .o u t.p rin tln (); // It e r a t o r može i da u klan ja elemente: i t = 1ju b im c i. i t e r a t o r ( ) ; f o r ( i n t i = 0 ; i < 6 ; i++) { it .n e x t (); it .r e m o v e ();

}
S y s te m .o u t.p rin tln (l ju b im c i) ;

}
} /* Is p is : 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:E g yp tianMau ll:H am ster 0 :Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:E g yp tianMau ll:H am ster [Pug, Manx, Cymric, R at, EgyptianMau, Hamster]

* ///:Uz ite ra to r ne m o ra te da b rin e te o b ro ju ele m e n ata u k o n tejn e ru . U m esto vas, o to m e vode ra ču n a m e to d e h a s N e x t( ) i n e x t ( ). V idite da je foreach sin tak sa p rik la d n ija za je d n o sta v n o k re tan je u n a p re d kroz L istu, ukoliko ne p okušavate d a m o d ifik u jete sam L ist objekat. Ite r a to r takođe uklanja p o sled nji ele m e n t pro izv ed en m e to d o m n e x t(), što znači da n e x t() m o ra te pozvati p re nego što pozovete rem o v e().'1

rem ov e() spada u takozvane o p cio n e m etod e (im a ili još), što znači da je ne m o raju realizovati sve realizacije Ite ra to ra . O tom e govorim o u poglavlju Detaljno raztnatranje kontejnera. Kako svi stand ard ni kon tejn eri Java biblioteke realizuju rem o v e(), o tom e ne m o rate da b rin ete fdok ne dodete do sp o m e n u to g poglavlja).

Poglavlje I 1; Čuvanje objekata

317

K orišćenje k o n tejn e ra i k re tan je k ro z njega d a b i se izvršavale operacije n ad svakim e le m e n to m v eo m a je m o ć n a te h n ik a i zapazićete d a se često p rim e n ju je u ovoj knjizi. P ogledajm o sada kako izgleda m eto d a ispisiS ve() koja rad i sa svim v rstam a ko ntejnera:
// : c u v a n je / Ite ra cija K ro z S ve V rs te K o n te jn e ra .ja va import ty p e in fo .p e ts .* ; import j a v a . u t i l .* ; p u b lic c la s s Ite ra c ija K ro z S ve V rste K o n te jn e ra { p u b lic s t a t ic void is p is iS v e (Ite r a to r < P e t> i t ) w h ile (it.h a s N e x t ()) { Pet p = i t . n e x t ( ) ; S y s te m .o u t.p rin t(p .id () + + p + 1 1 ");

{

}
S y s te m .o u t .p r in tln ();

}
p ub lic s t a t ic void m a in (S trin g [] args) { ArrayList< Pet> ljubim ci = P e t s . a r r a y L i s t ( 8 ) ; LinkedList<Pet> 1jubiinci LL = new LinkedList< Pet> (1 ju b im ci) ; HashSet<Pet> ljubim ciH S = new HashSet< Pet> (ljubim ci) ; TreeSet<Pet> ljubim ciTS = new T reeSet< Pet> (lju b im ci) ; is p i si S v e (lju b im c i. i t e r a t o r ( ) ) ; i s p is iS v e (l jubim ci L L .i t e r a t o r O ) ; is p is iS v e ( lj u b im c iH S . it e r a t o r ( ) ) ; is p is iS v e ( lj u b im c iT S .it e r a t o r ( )) ;

}
} /* Ispis: 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 4:Pug 6:Pug 3:Mutt l:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat 5:Cymric 2:Cymric 7:Manx l:Manx 3:Mutt 6:Pug 4:Pug 0:Rat

* ///:U oćili ste d a m eto d a ispisiS ve() ništa ne zna o vrsti sekvence kroz koju prolazi, a to pokazuje p rav u sn ag u Ite ra to ra : m o g u ć n o st da razdvoji o p eraciju pro laska kroz sekvencu o d njen e stru k tu re . Z ato se k atk ađ kaže da ite ra to ri objedinjuju pristup kontejneritna. V ežba 8: (1) P repravite vežbu 1 tako da se za k reta n je kroz L istu u p o tre b lja v a Ite ra to r kada se pozove skoci(). V ežba 9: (4) P repravite p ro g ram u n u tra sn je k la se /S e k v e n c a .ja v a tako da S ekvenca radi sa Ite ra to ro m u m esto sa S electo ro m . V ežba 10: (2) P repravite vežbu 9 iz poglavlja P olim orfizam tako da se G lo d a ri čuvaju u Array L isti i da se za k retan je kroz niz G lo d a ra u p o tre b ljav a Ite ra to r. V ežba 11: (2) N apišite m e to d u koja u p o treb ljav a I te r a to r za p ro lazak kroz k o n tejn er (objekat tipa C o lle c tio n ). M e to d o m to S trin g O ispišite sadržaj svih o b jekata u k o ntejneru . P o p u n ite o b je k tim a sve vrste k o n tejn era i n a svaki o d njih p rim e n ite svoju m eto d u .

318

Misliti na Javi

Listlterator
Za liste p o sto ji n a p red n iji iterato r, Listlterator. D ok se Iterator m ože p o m e ra ti sam o u n a p re d , Listlterator je d v o sm eran . T akode, u m e da pro izv ed e indekse sledećeg i p re th o d n o g elem e n ta u o d n o su n a m esto n a koje ite ra to r p ok azu je u listi, kao i d a m e to d o m set() z a m e n i p o sled n ji e lem en t koji je p osetio. P ozivom m e to d e listIterator() nap rav ićete Listlterator koji p ok azu je n a p o č eta k Liste, a zadavanjem arg u m e n ta n (kao u listlterator(n)) nap ra v iće te Listlterator koji p o činje p o k azu ju ći n a in d eks n u listi. Evo p rim e ra u k o jem su p o k az an e sve n av ed ene m o gu ćn osti:
//: c u v a n je / Ite ra c ij a L i s t e . ja va import ty p e in fo .p e ts .* ; import j a v a . u t i l .* ; p u b lic c la s s It e r a c i ja L is t e { p u b lic s t a t i c void m a in (S trin g [] args) { List<Pet> 1jubimci = P e t s .a r r a y L is t ( 8 ) ; Lis tIte ra to r< P e t> i t = 1ju b im c i.1 i s t I t e r a t o r ( ) ; w h i1 e (it.h a s N e x t()) S y s t e m .o u t .p r in t(it.n e x t () + " , “ + it.n e x tln d e x () + " , " + it.p r e v io u s In d e x () + " ; " ) ; S y s te m .o u t .p r in tln (); // Unazad: whi1e ( i t.h a s P re v i ous( ) ) S y s t e m .o u t .p r in t (it .p r e v io u s ( ).id ( ) + " " ) ; S y s te m .o u t .p r in tln (); S y s te m .o u t.p rin tln (lju b im c i); i t = 1ju b im c i.1 i s t I t e r a t o r ( 3 ) ; w h ile (it.h a s N e x t ()) { it .n e x t (); i t . s e t ( P e t s . randomPet( ) ) ;

}
S y s te m .o u t.p rin tln (lju b im c i);

}
} /* Is p is : Rat, 1, 0; Manx, 2, 1; Cymric, 3, 2; Mutt, 4, 3; Pug, 5, 4; Cymric, 6,

5;
Pug, 7, 6; Manx, 8, 7; 7 6 5 4 3 2 1 0 [R a t, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx] [R a t, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster, EgyptianMau]

* ///:M e to d o m Pets.randomPet() zam e n jen i su svi o bjekti tip a Pet u Listi o d lokacije 3 u n ap re d .

Vežba 12: (3) N ap rav ite i p o p u n ite je d n u celo b ro jn u listu (List<Integer>). N apravite d ru g u c e lo b ro jn u listu iste veličine i u p o tre b ite Listlteratore za čitan je elem en ata iz prve Liste i u m e ta n je u d ru g u o b rn u tim red osled om . (O vaj zadatak bi treb alo da rešite na više načina .)

Poglavlje 11: Čuvanje objekata

319

Ulančana lista
I klasa LinkedList realizuje osn o v n i interfejs List kao ArrayList, ali o d re đ e n e o p eracije (u m e ta n je u sre d in u Liste i uklan jan je iz nje) obavlja efikasnije n ego ArrayList. S d ru g e stra n e , m an je je efikasna za o p eracije p ristu p a n ja nesekvencijalnim red o sled o m . LinkedList d o d aje i m e to d e koje o m o g u ćav aju d a je u p o tre b im o kao stek, k ao red za čekanje (Queue) iii d v o stra n i red za čekanje (engl. double-ended queue, deque). N eke o d ovih m e to d a su p se u d o n im i (alijasi) ili m e d u so b n e n e z n a tn e varijacije, d a bi se đ o b ila im en a p o z n ata u k o n tek stu o d red en e u p o tre b e (n a ro čito u re d o v im a ček an ja). N a p rim er, getFirst() i elem ent() iden tičn e su - o n e vraćaju čelo (p rv i elem en t) liste, a da ga ne u k lo n e, i gen erišu izuzetak NoSuchElementException ako je Lista p razn a. M eto d a peek() je n jihov a varijacija koja vraća null ako je lista p razn a. Id e n tič n e su i m eto d e removeFirst() i remove() —o n e u k lan jaju i v raćaju kao rezu ltat čelo liste, i g enerišu izuzetak NoSuchElementException ako je lista p raz n a, d o k n jih ov a varijacija poll() 11 to m slučaju vraća null. addFirst() um eće elem en t n a p o četak liste. offer() je ista kao add() i addLast(). Sve o n e d o d aju e lem en t na rep (kraj) liste. removeLast() uklanja i vraća poslednji elem en t liste. N ared n i p rim e r p ok azu je o snovne sličnosti sp o m e n u tih m eto d a i razlike iz m e d u njih. U n je m u se ne ponavlja p o n ašan je p rik azan o u p ro g ra m u MogucnostiListe.java:
//: cuvan je/M eto deK laseLin kedlist.java import ty p e in fo .p e ts .* ; import j a v a . u t i l .* ; import s t a t ic n e t.m in d v ie w .u til. P r in t . * ; pub lic c la s s M etodeKlaseLinkedList { p u b lic s t a t ic void m a in (S trin g [] args) { Lin k e d L ist<Pet> Ijubim ci = new L in k e d L is t< P e t> (P e ts .a rra y L is t( 5 ) ) ; p r i n t ( l ju b im ci) ; // Id e n tičn e : p r i n t ("1 ju b im c i. g e t F ir s t ( ) : " + 1ju b im c i. g e t F i r s t ( ) ) ; p r i n t ( " l jubim ci .e le m e n t(): 1 1 + 1jubim ci .e le m e n tO ); // R azlik e samo u r e a k c iji na praznu li s t u : p r in t ( " lj u b im c i. peek( ) : " + lju b im c i. peek( ) ) ; // Id e n tič n e ; u k lan jaju i vraćaju prvi element: p r i n t ( " l jubim ci .rem o ve(): " + lju b im c i.re m o ve O ); p r i n t ("1 ju b im c i. rem oveFirst( ) : " + 1ju b im c i. rem o veFirst( ) ) ; // R azlik e samo u r e a k c iji na praznu li s t u : p r i n t ( " l ju b im c i. p o l1( ) : " + 1ju b im c i.p o ll( ) ) ; p r in t ( lju b im c i) ; 1ju b im c i.add First(new R at( ) ) ; p r in t (" P o s le ad d Fir s t ( ) : " + lju b im c i); 1ju b im c i. o f f e r ( P e t s . randomPet( ) ) ; p r in t (" P o s le o f f e r ( ) : " + lju b im c i);

320

Misliti na Javi

1ju b im ci.a đ d (P ets.ran d o m Pet()) ; p rin t("Po s 1 e a d d (): " + lju b im c i); 1jubim ci.addLast(new H a m s te r()); p r in t("P o s le a d d L a st(): " + lju b im c i); p r i n t ( " l jubim ci .re m o v e L a st(): 1 1 + 1ju b im c i. removeLast ( ) ) ;

}
} /* Is p is : [R a t, Manx, Cymric, Mutt, Pug] 1jubim ci . g e t F i r s t ( ) : Rat 1jubim ci ,e le m e n t(): Rat 1ju b im c i.p e e k (): Rat lju b im c i.re m o ve (): Rat 1ju b im c i.re m o v e F irs t(): Manx 1ju b im c i. pol 1 ( ) : Cymric [M utt, Pug] Posle a d d F ir s t (): [R at, M utt, Pug] Posle o f f e r ( ) : [R at, Mutt, Pug, Cymric] Posle a d d (): [R at, Mutt, Pug, Cym ric, Pug] Posle a d d La st(): [R at, Mutt, Pug, Cymric, Pug, Hamster] 1ju b im ci.re m o v e La st(): Hamster

* ///:R ezultat m etode Pets.arrayList() p ro sle đ u je m o k o n s tru k to ru liste LinkedList da bism o je p o p u n ili. U d o k u m e n ta c iji o in terfe jsu Queue videćete m eto d e elem ent(), offer(), peek(), poll() i remove() koje su klasi LinkedList d o d a te da bi ta klasa m ogla da b u d e reaIizacija red a čekanja. K om pletni p rim e ri redova čekanja dati su u n astavku poglavlja.

Vežba 13: (3) U p rim e ru unutrasnjeklase/UpravljacStaklenika.java, klasa Upravljac u p o treb ljav a listu ArrayList. Isk o ristite u m esto nje listu LinkedList, a za k ru žen je kroz sk u p događaja p rim e n ite Iterator. Vežba 14: (3) N apravite p ra z n u listu LinkedList<Integer>. U sred in u Liste d o d ajte Integere pomoću Listlteratora.

Pravljenje steka od ulančane liste
Stek se p o n ek ad naziva LIFO k o n te jn e r (engl. last-in, first-out, poslednji koji uđe, prvi izlazi). To znači da o n o što p o sled n je stav ite na stek (za to se tra đ ic io n a ln o koristi o p eracija p ush) prvo m ožete da sk in ete s njega (za to se tra d ic io n a ln o koristi op eracija pop). Stek se često p o re d i sa sto g o m - p o sled n ji naviljak sena koji bacite na v rh stoga, prv i ćete sk in u ti s njega. Klasa LinkedList im a m eto d e koje d ire k tn o realizuju stek, pa u m esto da p rav ite poseb n u klasu steka, m ožete u p o tre b iti u la n č a n u listu. U n ekim slučajevim a ipak je bolje n a p ra v iti klasu steka:
//: n e t/m in d view /u til/Sta ck .java // P r a v lje n je steka od objekta tip a L in k e d L ist. package n e t.m in d v ie w .u til; import ja v a .u t il.L in k e d L is t ;

Poglavlje 1I : Čuvanje objekata

321

p u b lic c la s s Stack<T> { p riv a te LinkedList<T> s k la d is te = new L i nkedList<T> (); p u b lic void push(T v) { s k la d is te .a d d F ir s t ( v ) ; } p u b lic T peek() { return s k l a d i s t e . g e t F i r s t ( ) ; } p u b lic T pop() { return s k la d is te .re m o v e F irs t( ) ; } p u b lic boolean empty() { return s k la d is te .is E m p ty ( ) ; } p u b lic S trin g to S trin g O { return skl adi s te . to S tr i ng ( ) ;

}

} ///:O v im sm o dali najjed n o stav n iji p rim e r definicije generičke klase. O n o <T> n a k o n im e n a klase, k azuje p rev o d io cu d a će ovo b iti pa ra m etrizo va n i tip, i d a je p a ra m e ta r tip a - k o ji će b iti zam e n jen stv a rn im tip o m kada klasa b u d e u p o tre b lje n a - o n o T. U su štin i, to k azu je „d efinišem o Stack koji čuva objekte tip a T“. Taj Stack se realizuje u la n č a n o m listo m kojoj je tak o đ e rečen o da čuva tip T. O b ra tite p ažn ju na to d a p u sh ( ) u zim a o b jek at tip a T koji v raćaju p e e k ( ) i p o p ( ). M eto d a p e e k ( ) vraća najviši elem en t a d a ga ne skida s v rh a steka, d o k ga p o p ( ) u k lan ja i vraća. A ko želite d a se o g ran ič ite sam o n a fu n k c io n a ln o st steka, nasleđivanje nije p rik la d n o , zato što bi d a lo klasu sa svim o stalim m e to d a m a u lan čan e liste (videćete u p o glavlju D etaljno razm atranje kontejnera d a su tak v u g rešku n ap rav ili p ro je k ta n ti b iblioteke Java 1.0 u klasi java.util.Stack). Evo je d n o sta v n o g p rim e ra ove nove klase Stack:
//: cu van je/Stek T est.ja va import n e t.m in d v ie w .u til.* ; p u b lic c la s s StekTest { p u b lic s t a t ic void m a in (S trin g [] args) { Stack<String> stek = new S tack < Strin g > (); fo r (S t r in g s : "Moj pas ima buve". s p li t (" “ ) ) s t e k .p u s h (s ); w hi1e ( ! stek.em pty( ) ) System .out. p r i n t ( s t e k .pop() + " " ) ;

}
} /* I spi s : buve ima pas Moj

* ///:U koliko u svom k o d u h o ćete da u p o tre b ite ovu klasu Stack, m o raćete p o tp u n o da specificiratc n jen paket - ili p ro m e n ite im e klase —kada je b u d e te pravili; u p ro tiv n o m , vero v a tn o ćete izazvati suk o b s klasom Stack iz pak eta java.util. P rim e ra radi, ukoliko u g ornji listing uvezem o ja v a .u til.* , m o ra će m o da u p o treb ljav a m o im en a p aketa kako b ism o sprečili d v o sm islen o st im en a i sukobe:
//: cuvanje/StekSukob.java import n e t.m in d v ie w .u til.* ; p u b lic c la s s StekSukob { p u b lic s t a t ic void main (S tr in g [] args) { n e t.m indview .u t i 1. Stack< String> stek =

322

Misliti na Javi

new n e t.m in d v ie w .u til.S ta c k < S trin g > (); f o r (S tr in g s : "Moj pas ima b u ve". s p l i t (" " ) ) s te k .p u s h (s ); w h ile (!s te k .e m p ty ()) Sy ste m .o u t.p rin t(s te k .p o p () + " " ) ; S y s te m .o u t.p rin tln (); ja v a .u til.S ta c k < S trin g > stek2 = new ja v a .u til.S ta c k < S tr in g > (); fo r (S tr in g s : "Moj pas ima b u v e ".s p li t (" " ) ) ste k 2 .p u s h (s ); whi1e ( ! stek2 . empty( ) ) Sy ste m .o u t.p rin t(stek 2 .p o p () + " " ) ;

}
} /* Is p is : buve ima pas Moj buve ima pas Moj

* ///:O b e klase Stack im aju isti interfejs, ali u p ak e tu java.util ne p o sto ji zaje dn ički interfejs Stack - verovatno zato što je o rig in a ln a, loše p ro jek to v an a klasa java.util.Stack u Javi 1.0 usvojila to im e. Iako java.util.Stack p osto ji, LinkedList p ravi bolji stek, p a p re d n o s t treb a dati p ristu p u o stv aren o m u pak etu net.mindvievv.util.Stack. Izb o r realizacije klase Stack „kojoj treb a dati p re đ n o s t“ in ožete k o n tro lisa ti eksp licitn im uvozom :
import n e t.m in d v ie w .u til.S ta c k ;

Sada će svako upu ćiv an je na klasu Stack izabrati verziju net.m indview .util, a da biste izabrali java.util.Stack, m o ra te u p o tre b iti p o tp u n o im e koje o b u h v a ta i im e paketa.

Vežba 15: (4) U p ro g ram sk im je z iđ m a stekovi se često u p o treb ljav aju za izračun avan je v red n o sti izraza. Izraču n ajte sledeći izraz koristeći paket net.m indview.util.Stack, gde + znači „stavite n a stek sledeće sIovo“, a - zn ači „skinite v rh steka i ispišite ga“: - - + r + u —+ l+ e + s— “ ,,+ U + n + c — t e + r + t — + a -+ i-+ n + t+ y ---- 1

Funkcionalnost skupa
Skup (Set) ne m o že da sadrži više o d je d n e in stan ce v re d n o sti objekta. U k oliko p ok u šate da d o d ate više od je d n e instance ekviv alen tno g objekta, Set će sprečiti d u p liran je . Set se najčešće u p otreb ljav a za u tv rd iv an je p rip a d n o sti, pa je lako saznati da li je o d re đ e n i o b jek at u o d re d e n o m sk u p u . Z ato je za Set pretraživ an je o b ič n o najvažnija o p eracija, pa se najčešće b ira realizacija HashSet, o p tim iz o v an a za b rz o pretraživ anje. Set (sku p ) im a isti interfejs kao Collection, što znači da nem a d o d a tn ih fu nk cija kao što im aju dve različite liste. S kup je isti kao kolekcija, sam o se različito p o n aša. (O vo je p rim e r savršenog korišćenja n asledivanja i p o lim o rfizm a: za izražavanje d rug ačijeg pon ašanja.) Set u tv rđ u je p rip a d n o st na o sn o v u ,,v red n o sti“ objekta. O b jašn je n je o d čega se sastoji v re d n o st objekta složeno je, kao što ćete v ideti u poglavlju D etaljno razm atranje kontejnera.

Poglavlje I 1: Čuvanje objekata

323

Sledeći p rim e r pokazuje po n ašan je sk u p a HashSet sa c elo b ro jn im (Integer) objektim a:
//: cu van je/Skup C elihBrojeva.java import ja v a . u t i l p ub lic c ia s s SkupCelihBrojeva { p u b lic s t a t ic void m a in (S trin g [] args) { Random slu cajan = new Random(47); Set<Integer> skupcelihb = new H ashSet< Integer> (); f o r ( i n t i = 0; i < 10000; i++) sk u p c e lih b .a d d (s lu c a ja n .n e x tln t(3 0 )); S y ste m .o u t.p rin tln (s k u p c e lih b );

1
} /* Is p is : [15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13, 28, 20, 25, 10, 5, 0]

* ///:U skup je d o d a to deset hiljada slu čajnih b ro jev a izm eđ u 0 i 29, pa je lako zam isliti kako svaki o d tih b rojeva im a m n o g o d u p lik ata. Pa ipak, p rilik o m ispisa se vidi d a skup sadrži sam o po je d n u in stan cu o d ređ e n e v red n o sti. P rim etili ste da brojevi u rezu ltatu n em aju sm isleni p o red ak . U zrok to m e je tran sfo rm isan je ključa (engl. hashing), koje HashSet u p o treb ljav a rad i veće b rzin e - o n o je o b jašn jen o u poglavlju D elaljno razm atranje kontejnera. R edosled koji o država HashSet razlikuje se od redosleda u TreeSet ili LinkedHashSet, p o što svaka realizacija skladišti elem en te n a različit način. TreeSet ih čuva u ređ en e u c rv e n o -c rn o j s tru k tu ri stabla, d o k HashSet p rim e n ju je tra n sfo rm isan je ključa, p ro je k to v an o specijalno rad i b rzo g pronalaženja. I LinkedHashSet up o trebljav a je u c rv en o -crn o j s tru k tu ri stabla, d o k HashSet p rim e n ju je tran sfo rm isan je ključa rad i brzog p ro n ala že n ja , ali n a izg led p o m o ć u u lan ča n e Iiste od ržava elem en te u p o re tk u u m etan ja. A ko ho ćete da rezultati b u d u u ređ en i, m o žete u p o tre b iti TreeSet u m esto HashSeta:
//: cuvanje/UredjenSkupCelihBrojeva.ja va import j a v a . u t i l .* ; pu b lic c la s s UredjenSkupCelihBrojeva { p ub lic s t a t ic void m a in (S trin g [] args) { Random slu cajan = new Random(47); SortedSet<Integer> skupcelihb = new T reeSet< In teg er> (); f o r ( i n t i = 0; i < 10000; i++) sk u p c e lih b .a d d fs lu c a ja n .n e x tln t(3 0 )); System .out. pri n tln (s k u p c e lih b );

}
} /* Is p is : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

* ///:-

324

Misliti na Javi

M e đ u n ajče šćim o p era c ija m a koje ćete obavljati jeste u tv rđ iv an je p rip a d n o sti sk u p u p o m o ć u m e to d e contains(), ali p o sto je i operacije koje će vas p o d se titi na Venove dijag ram e koje ste m o ž d a učili u o sn o v n o j školi:
// : cuvanje/O peracijeSaSkupovim a.java import j a v a . u t i l .* ; import s t a t i c n e t.m in d v ie w .u til. P r i n t . * ; p u b lic c la s s OperacijeSaSkupovima { p u b lic s t a t i c void m a in (S trin g [] args) { Set<String> skupl = new H ashSet< String> (); C o lle c tio n s .a d d A ll(s k u p l, " A B C D E F G H I J K L ".s p lit(" " ) ) ; sk u p l.a d d ("M "); p r in t (" H : " + s k u p l.c o n ta in s (" H ")); p r in t (" N : " + s k u p l.c o n ta in s (" N ")); Set<String> skup2 = new H ashSet< String> (); C o lle c tio n s .a d d A ll(s k u p 2 , "H I J K L " . s p l i t ( " " ) ) ; p rin t("sk u p 2 deo skupal: 1 1 + sk u p l.co n tain sA U (skup2)) ; sk u p l.rem oveC 'H "); p r in t("s k u p l: " + s k u p l); p rin t("sk u p 2 deo skupal: " + sk u p l.c o n ta in sA ll (skup2)) ; sk u p l.rem o veA ll(sk u p 2 ); p rin t("sk u p 2 uklonjen iz skupal: " + sk u p l); C o lle c tio n s .a d d A ll(s k u p l, "X V Z " . s p l i t ( " " ) ) ; p r i n t ( " 'X Y Z' dodati skupul: " + skupl) ;

}
} /* Is p is : H: true N: fa ls e skup2 deo skupal: true sk u p l: [D, K, C, B, L, G, I , M, A, F, J , E] skup2 deo skupal: fa ls e skup2 uklonjen iz skupal: [D, C, B, G, M, A, F, E] 'X Y Z' dodati skupul: [Z, D, C, B, G, M, A, F, Y, X, E]

* ///:Im e n a m e to d a lako će ra z u m e ti o n i koji zn aju engleski. Im a ih jo š nekoliko i njih ćete naći u d o k u m e n ta c iji JD K-a. Lista je d in stv en ih ele m e n a ta u m e d o b ro d a p osluži. N a p rim er, recim o kako h oćete da ispišete sve reči d ato tek e OperacijeSaSkupovima.java. Za o tv ara n je i učitavanje dato tek e u skup u p o tre b ić e m o uslu žn i p ro g ra m net.mindview.TextFile (p red stav ićem o ga u nastavku knjige):
// : cu van je /Je d in s tve n e R e c i. ja va import j a v a . u t i l .* ; import n e t.m in d v ie w .u til.* ;

Poglavlje 11: Čuvanje objekata

325

p u b lic c la s s Jed in stven eR e ci { p u b lic s t a t i c void m a in (S trin g [] args) { Set<String> re c i = new TreeSet<String>( new T e x tFile ("O p e ra c ije Sa Sk u p o vim a .ja va ,,> "\W + ")); S y s t e m .o u t .p r in t ln (r e c i);

}
} /* Is p is : [A, B, C, C o lle c tio n s , D, E, F, G, H, HashSet, I , J , K, L, M, N, O peracijeSaSkupovim a, Is p is , P r in t , S e t, S t r in g , X, Y, Z, add, addA ll, arg s, c la s s , co n tain s, c o n ta in s A ll, cuvanje, deo, d o d a ti, f a ls e , import, iz , ja v a , main, mindview, n e t, new, p r in t, p u b lic , remove, removeAll, skupl, skupal, skupul, skup2, s p l i t , s t a t i c , tru e , uklonjen, u t i l , void]

* ///:-

TextFile je n asleđ en iz klase List<String>. K o n stru k to r TextFile o tv a ra d a to tek u i deli je na reči u sk lad u s regularnim izrazom \W + , koji zn ači „jed n o ili više slova“ (reg u la rn i izrazi su o b jašn je n i u poglavlju Z n a ko vn i nizovi). R ezultat se p red aje k o n s tru k to ru sk u p a TreeSet koji sadržaj Liste d o d a je sebi. P ošto je u p ita n ju TreeSet, rezu ltat je u re d en . U o v o m slučaju, u red iv an je se obavlja leksikografski, p a su velika i m ala slova u zaseb n im g ru p a m a . U ko liko b iste h teli abecedno uređ iv an je, k o n s tru k to ru sk u p a TreeSet p ro sled ite String.CASE INSENSITIVE ORDER Comparator (com paratorje objek at koji u sp o stavlja p o red ak ):
//: cuvanje/JedinstveneReciA becedno.java // Abecedno is p is iv a n je . import j a v a . u t i l .* ; import n e t.m in d v ie w .u til.* ; p u b lic c la s s JedinstveneReciAbecedno { p u b lic s t a t ic void m a in (S trin g [] args) { Set<String> reci = new T reeSet< Stri n g > (S tring.CASE_INSENSITIVE_ORDER); r e c i . addAl1( new T e x tFile ("O p e ra c ije Sa Sk u p o vim a .ja va ", "\W + ")); S y s t e m .o u t .p r in t ln (r e c i);

}
} /* Is p is : [A, add, ad d A ll, args, B, C, c la s s , C o lle c tio n s , con tain s, c o n ta in s A ll, cuvanje, D, d o d a ti, E, F, f a ls e , G, H, HashSet, I , import, iz , J , ja v a , K, L, M, main, mindview, N, n et, new, OperacijeSaSkupovima, Is p is , P r in t , p u b lic , remove, rem oveAll, S e t, skupl, skupal, skupul, skup2, s p l i t , s t a t i c , S tr in g , tru e , uklonjen, u t i l , void, X, V, Z]

* ///:-

Comparatori će biti d e taljn o raz m o tren i u poglavlju N izovi. Vežba 16: (5) N ap rav ite sk u p (Set) sam o g lasn ik a. P rep rav ite p ro g ra m JedinstveneRec i.ja v a tako d a p reb ro ji i ispiše b ro j sam o g lasn ik a u svakoj ulaznoj reči, kao i u k u p a n bro j sam o g lasn ik a u u lazn o j dato teci.

326

Misliti na Javi

Funkcionalnost mape
M ap iran je je d n ih objek ata n a d ru g e m o že biti izu zetn o m o ć a n n ačin rešavanja p ro g ram ersk ih zadataka. P rim e ra rad i, u z m im o p ro g ra m za ispitivanje slučajnosti brojeva iz Javine klase R a n d o m . U id ea ln o m slučaju, R a n d o m bi davala savršeno raspodeljene slučajne brojeve, ali da biste to ispitali, m o ra te d a generišete više slu čajn ih brojeva i da izb ro jite o n e koji p rip a d a ju različitim opsezim a. M a p a rešava taj zad atak s lakoćom ; u ovom slučaju, ključ je bro j koji p ro izv o d i klasa R a n d o m , a v re d n o st je bro j p u ta koliko se taj broj pojavio:
//: c u v a n je / S ta tis tic k iP o d a c i.ja v a // Jednostavan prikaz rada HashMape. import j a v a . u t i l .* ; p ub iic c lass S t a tis t ic k iP o d a c i { pu b lic s t a t ic void m a in (S trin g [] args) { Random slu cajan = new Random(47); Map<Integer,Integer> m = new H ashM ap< Integer,Integer> (); f o r ( i n t i = 0; i < 10000; i++) { // P r a v lje n je broja između 0 i 20: in t s = s lu c a ja n .n e x tln t (2 0 ); In teg er ucestanost = m .g e t(s ); m .put(s, ucestanost = = n u ll ? 1 : ucestanost + 1 );

}
S y s te m .o u t.p rin tln (m );

}
} /* Is p is : {15=497, 4=481, 19=464, 8=468, 11=531, 16=533, 18=478, 3=508, 7=471, 12=521, 17=509, 2=489, 13=506, 9=549, 6=519, 1=502, 14=477, 10=513, 5=503, 0=481}

*///■■U m eto d i m a in (), a u to m atsk o pak o v an je p retv ara slu čajn o g en erisan in t u referencu objekta tip a In te g e r koja se m ože staviti u m a p u tipa H ash M a p . (U k o n tejn e r ne m ožete da stavite v re d n o st p ro sto g tip a, već sam o referencu na objekat.) M eto d a g et() vraća n u ll ukoliko takvog ključa nije b ilo u k o n te jn e ru (što znači da je taj broj prv i p u t p ro n a đ e n ). U p ro tiv n o m , m eto d a vraća p rid ru ž e n u In te g e r v re d n o s t ključa koja se povećava za jedan (a u to m a tsk o pakovanje p o n o v o p o jed n o stav lju je izraz, ali se obavlja p retv aran je u In teg e r i iz njega). Evo p rim e ra u kojem se o b jek ti tip a P et p ro n a la ze p o m o ć u tek stu aln o g opisa, tj. objek ata tip a S trin g . P okazan o je i kako se m e to d a m a c o n tain sK e y () i c o n tain sV a lu e () ispitu je da li M ap a sađrži o d ređ e n i ključ, o đ n o sn o v red n o st:
//: cuvanje/M apaljubim aca.java import ty p e in fo .p e ts .* ; import j a v a . u t i 1 .*; import s t a t ic n e t.m in d v ie w .u til. P r i n t . * ;

Poglavlje 11 : Čuvanje objekata

327

p u b lic c la s s Mapaljubimaca { p u b lic s t a t i c void m a in (S trin g [] args) { Map<String,Pet> mapaljubimaca = new HashMap<String,Pet>(); mapaljub im aca.put("M oja mačka", new C a t (" M ic a " )) ; mapaljub im aca.put("M oj pas", new D o g ("B ru n o ")); m apaljubim aca.put("Moj h rčak ", new H am ste r("Bo ško ")); p rin t(m ap alju b im aca); Pet pas = m apaljubim aca.get("Moj p a s "); p r in t ( p a s ) ; print(m apaljubim aca.containsKey("M oj p a s " ) ) ; p rin t(m a p alju b im a c a .c o n ta in sV a lu e (p a s));

}
} /* Is p is : {Moja mačka=Cat Mica, Moj hrčak=Hamster Boško, Moj pas=Dog Bruno} Dog Bruno true true

* ///:M ap e jc lako p ro š iriti n a više d im en zija, kao i nizove i kolekcije; sam o n a p ra v ite M a p u čije su v re d n o sti d ru g e M a p e (a v re d n o sti tih M a p a m o g u b iti d ru g i k o n te jn e ri, čak i d ru ge M ap e). D akle, m o ć n e s tru k tu re p o d ata k a p rave se veom a lako i brzo, p o m o ć u k o m b in o v an ja k o n te jn e ra . N a p rim er, p re tp o sta v im o da p ro g ra m treb a d a p ra ti o so b e koje im a ju više k u ć n ih Ijubim aca - sam o vam treb a M a p < P e rso n , L i s t < P e t » :
//: cuvanje/M apaLista.java package cuvanje; import ty p e in fo .p e ts .* ; import j a v a . u t i l .* ; import s t a t i c n e t.m in d v ie w .u til. P r i n t . * ; p ub lic c la s s MapaLista { pu b lic s t a t ic Map<Person, List< ? extends P e t » 1jud iSljub im cim a = new HashMap<Person, L ist< ? extends P e t » ( ) ; s t a t ic { 1jud iSljub im cim a.pu t(new P e r s o n ("Z o r a "), A rra y s .a s L is t(n e w Cymric("Mol i “ ) ,new M u t t("Ž a r k o ''))); 1ju d iS l jubimcima.put(new P e rs o n (''K a ta "), A rra y s .a s L is t(n e w C a t (“ Ž e l j k a " ) , new C a t ( " E lz a " ) , new D o g C 'M a rg a re ta "))); 1ju d iS1 jub im cim a.put(new Person( " M ir n a " ) , A r r a y s .a s L is t ( new PugC'Lui i l i Luis D is a lić Meh"), new C a t("S ta n e i l i Smradić el Negro"), new C a t( "P i nkola " ) ) ) ; 1jud iS1 jub im cim a.put(new Person( “ L u k a "), A r r a y s .a s L is t (new R a t ( " F a z i" ) , new R a t ( " F i z i " ) ) ) ; 1ju d iS l jubimcima.put(new P e r s o n (" Is a k " ), A rra y s .a s L is t(n e w R a t("P e g a v i“ ) ) ) ;

328

Misliti na Javi

p ub lic s t a t i c void m a in (S trin g [] args) { p r i n t ( " l j u d i : " + 1judiS1jubim cim a. keySet( ) ) ; p r in t ( " lj u b im c i: " + 1ju d iS lju b im c im a .v a lu e s ()); fo r(Perso n osoba : 1ju d iS lju b im c im a .k e y S e t()) { p rin t(o so ba + " im a :"); fo r (P e t ljubim ac : lju d iS lju b im c im a .g e t(p e rs o n )) p r in t ( " " + lju b im a c);

) /* Is p is : l j u d i : [Person Luka, Person M irna, Person Is a k , Person Zora, Person Kata] lju b im c i: [[R a t Fa z i, Rat F i z i ] , [Pug Lui i l i Luis D is a lić Meh, Cat Stane i l i Smradić el Negro, Cat P in k o la ], [Rat P e g a v i], [Cymric M o li, Mutt Ž a rk o ], [Cat Ž e ljk a , Cat E lz a , Dog M argareta]] Person Luka ima: Rat Fazi Rat F iz i Person Mirna ima: Pug Lui i l i Luis D is a lić Meh Cat Stane i l i Smradić el Negro Cat Pinkola Person Isak ima: Rat Pegavi Person Zora ima: Cymric Moli Mutt Žarko Person Kate ima: Cat Ž e ljk a Cat Elza Dog Margareta

* ///:-

Mapa m ože da vrati skup svojih ključeva, kolekciju svojih v re d n o sti ili sk u p svojih p arova. M etoda keySet() p rav i sk u p svih ključeva u m ap i ljudiSljubimcima, koja se u foreach n ared b i u p o treb ljav a za ite rira n je k ro z Mapu. Vežba 17: (2) K lasu MorskoPrase iz vežbe 1 stavite u m a p u tak o da im e o b jek ta klase MorskoPrase kao String b u d e ključ za o b jek at koji stavljate u tab elu . U zm ite Iterator za sk u p koji daje m e to d a keySet( ) i u p o tre b ite ga za k retan je k ro z m a p u i p ro n alažen je o b jek ta klase MorskoPrase za svaki ključ, p o to m ispišite svaki ključ i p o zo v ite m e to d u sk a ce( ) za svaki objekat. Vežba 18: (3) P o p u n ite m a p u HashMap p a ro v im a k lju č -v re d n o st. Ispišite rezu ltate tako
da po k ažete u re đ e n je p o heš k o d u . Izvadite p arove i u red ite ih p o k ljuču, a rez u ltat stavite u m a p u LinkedHashMap. Pokažite d a je red o sled u m e ta n ja zad ržan .

Vežba 19: (2) P o n o v ite p re th o d n u vežbu sa sk u p o v im a HashSet i LinkedHashSet. Vežba 20: (3) P rep rav ite vežbu 16 tako d a se b ro ji učestalo st pojave svakog sam oglasnika.

Poglavije 11: Čuvanje objekata

329

Vežba 21: (3) K oristeći Map<String,Integer> i o b lik p ro g ra m a JedinstveneReci.java,
napišite p ro g ra m koji b ro ji učestalo st pojave reči u dato teci. U red ite rezu ltate m e to d o m

C ollections.sort() kojoj je d ru g i a rg u m e n t String.CASE_ INSENSITIVE_ORDER (d a bi
se d o b ilo u ređ en je p o abecedi) i p rik ažite rezu ltat.

Vežba 22: (5) P reprav ite p re th o d n u vežbu ta k o d a u p o treb ljav a klasu koja sadrži String i po lje b ro jača za skladištenje svih različitih reči, i Set tih o b je k a ta za o d ržav an je liste reči. Vežba 23: (4) N a o sn o v u p ro g ra m a StatistickiPodaci.java na p išite p ro g ra m koji staln o
izvršava test i prov erav a da li se u rezu ltatim a n ek i b ro j p ojavljuje češće o d d ru g ih .

Vežba 24: (2) P o p u n ite m a p u LinkedHashMap k lju čev im a tip a String i o b je k tim a p o svom izb o ru . P o to m izdvojite parove, u re d ite ih p o k ljuču i p o n o v o u m e tn ite u Mapu. Vežba 25: (3) N apravite M ap<String,A rrayL ist<Integer». O tv o rite te k stu a ln u d ato teku p ro g ra m o m net.mindview.TextFile i u čitajte je reč p o reč (k ao d ru g i a rg u m e n t k o n stru k to ra TextFile u p o tre b ite \W +). P rebrojte reči to k o m u čitav a n ja i za svaku reč u d ato teci, zapišite u listi ArrayList<Integer> koliko se p u ta p o jav ila - to je, efektivno, m esto u d a to teci gde je ta reč p ro n a đ e n a .

Vežba 26: (4) P reprav ite rezu ltu ju ću Mapu iz p re th o d n e vežbe tak o d a p o n o v o u sp o stavite p o re d a k reči iz o rig in aln e datoteke.

Pravljenje reda za čekanje (od ulančane liste)
Red za čekanje (engl. queue) je FIFO k o n te jn e r (engl. first-in , fir s t-o u t- p rv i koji u đ e, prvi izlazi). To znači da elem en te stavljate s je d n o g k raja, a sk id ate s d ru g o g , tj. o n i izlaze red o sled o m kojim su stavljani. R edovi za čekanje se o b ičn o k o riste za p o u z d a n o p reb acivanje o b jekata iz je d n o g dela p ro g ra m a u d ru g i. K ao što ćete v id eti u p oglavlju Paralelno izvršavanje, redovi za čekanje su n aro čito važni u p a ra le ln o m p ro g ra m ira n ju , p o što bezb e d n o p reb acu ju objekte iz je d n o g posla (engl. task) u d ru g i. L in k ed L ist im a m eto d e koje o p o n ašaju red za ček an je i realizuje interfejs Queue, pa se m ože u p o tre b iti za realizovanje reda za čekanje. Pošto je L in k e d L ista svedena naviše na Q u e u e , u ovom p rim e ru u p o treb ljen e su m e to d e specifične za red za čekanje u in terfejsu Q ueu e:
//: cuvanje/QueueDemo.java // P r a v lje n je reda za čekanje od klase L in k e d L ist svođenjem naviše // na Queue. import ja v a . u t i l p u b lic c la s s QueueDemo { p u b lic s t a t ic void printQ(Queue redZaCekanje) { w hile(redZaC ekanje.peek() != n u ll) System .out.print(redZaC ekanje.rem ove() + " " ) ; S y s te m .o u t .p r in tln ();

}
p u b lic s t a t ic void m a in (S trin g [] args) { Queue<Integer> redZaCekanje = new L in k e d L ist< In te g e r> ();

330

Misliti na Javi

Random slu cajan = new Random(47); f o r ( i n t i = 0; i < 10; i++) re d Z a C e k a n je .o ffe r(s lu c a ja n .n e x tln t(i + 1 0 )); printQ (redZaC ekan je); Queue<Character> rcZnakova = new LinkedList<Character>; fo r (c h a r znak : ,lB ro n to sa u ru s".to C h arA rray()) rc Z n ak o va.o ffe r(z n ak ); p rin tQ (rcZ n ak o va);

}
} /* Is p is : 8 1 1 1 5 14 3 1 0 1 B r o n t o s a u r u s

* ///:M eto d a o ffe r ( ) je d n a je o d o n ih specifičnih za k lasu Queue; o n a u m eće elem en t na re p red a za čekanje ako m o že, ili vraća false. M eto d e p e e k ( ) i elem en t( ) v raćaju čelo red a za čekanje, a da ga ne uklone, ali p e e k ( ) v raća null ako je red za čekanje p ra za n , d o k elem en t( ) g eneriše izuzetak NoSuchElementException. M eto d e p o lI( ) i rem ove( ) u k la n ja ju i v ra ća ju čelo red a za čekanje, ali p o ll( ) v raća null ako je red za čekanje p ra za n , d o k rem ove( ) u to m slučaju generiše izu zetak NoSuchEIementException. A u to m atsk o pak o v an je a u to m atsk i p retv ara int rezu ltat m e to d e n e x tln t( ) u objek at tip a Integer koji zahteva redZaCekanje, k ao i char znak u Character o b jek at koji zahteva rcZnakova. Interfejs Queue sužava p ristu p m e to d a m a liste LinkedList tak o da b u d u d o s tu p n e sam o p rik la d n e m e to d e , p a baš i n iste u isk u šen ju d a u p o treb ljav ate m eto d e liste LinkedList (ovde biste redZaCekanje zaista m o g li da svedete u n a za d na LinkedList, ali to v am je b a re m o težan o ). Im ajte u v id u da m e to d e specifične za Queue p ru ž aju p o tp u n u i sa m o sta ln u fu n k cio n a ln o st. D ru g im rečim a, m o žete n ap rav iti u p o treb ljiv red za čekanje a da ne p rim e n ite n ije d n u m e to d u klase Collection, o d koje je Queue n asleđen.

Vežba 27: (2) N apišite klasu Naredba koja sadrži je d a n String i im a m e to d u operacija( ) koja ga p rik azuje. N apišite d ru g u klasu s m e to d o m koja p o p u n jav a Queue o b jek tim a tip a Naredba i vraća taj red za čekanje. P o p u n jen Queue p ro sled ite m eto d i u trećoj klasi koja u zim a o b jekte reda za čekanje i poziva n jihove m e to d e operacija( ).

Prioritetni red čekanja (PriorityQueue)
„P rvi izlazi o naj koji je p rv i ušao “ (engl. first-in first-o u t, FIFO) o p isu je n a jtip ič n iju discip lin u čekanja. A ko im a m o g ru p u elem en ata u red u za čekanje, discip lin a čekanja o d re đ u je koji ele m e n t sledeći izlazi iz reda. Po p rin c ip u FIFO, sledeći elem en t tre b a da b u d e o naj koji n a jd u ž e čeka. P rioritetni red čekanja kazuje d a iz reda p rv o izlazi ele m e n t koji im a najveću p o tre b u (p rio rite t) d a izađe. N a p rim e r, na a e ro d ro m u se iz red a za čekanje izvlači p u tn ik čiji se a vio n u p ra v o sp rem a za p o letan je. Ako n a p rav ite sistem za ra z m e n u p o ru k a, neke p o ru k e su važnije o d d ru g ih i treb a ih p re o b ra d iti, bez o bzira na to kada su stigle. Klasa PriorityQueue d o d a ta je Javi SE5 da bi se n ap rav ila au to m a tsk a realizacija takvog p o n ašan ja.

Poglavlje 1I : Čuvanje objekata

331

K ada m eto d o m offer( ) p o n u d ite (engl. offer) n ek i o bjek at klasi PriorityQueue, o n će biti so rtira n i u b ačen n a odgovarajuće m esto to g red a za čekanje.5 P ri p o d ra z u m e v a n o m so rtira n ju (u ređ iv an ju ) u p otrebijava se prirodni redosled o b jek ata u re d u za čekanje, ali p o redak m ožete da izm enite svojim Comparatorom. PriorityQueue se sta ra d a p ri pozivan ju m eto d e p eek ( ), poII( ) ili rem ove( ), o d nje dobijete e lem en t s n ajvišim p rio rite to m . V eom a je lako n ap rav iti p rio rite tn i red za čekanje koji ra d i sa u g ra đ e n im tip o v im a kao što su Integer, String ili Character. U n a re d n o m p rim e ru , p rv i sk u p v re d n o sti čine id en tič n i slučajn i bro jev i iz p re th o d n o g p rim era , p a se m o žete uv eriti d a o n i iz p rio rite tn o g rad a za čekanje izlaze u d ru g o m p o retk u :
//: cuvanje/PriorityQueueDem o.java import j a v a . u t i l p u b lic c la s s PriorityQueueDemo { p u b lic s t a t ic void m a in (S trin g [] args) { PriorityQueue<Integer> p rio rite tn iR e d = new PriorityQ u eu e< Integer> (); Random slu cajan = new Random(47); f o r ( i n t i = 0; i < 10; i++) p r io r ite tn iR e d .o ff e r (s lu c a ja n .n e x tIn t(i + 1 0 )); QueueDemo.pri ntQ (pri o ri te tn i Red); List< Integer> c e liB r o je v i = A rra y s .a s L is t(2 5 , 22, 20, 18, 14, 9, 3, 1, 1, 2, 3, 9, 14, 18, 21, 23, 25); p rio rite tn iR e d = new P r i o r i tyQueue<Integer>(celi B r o j e v i) ; QueueDemo.printQ(priori te tn iR e d ); p rio rite tn iR e d = new PriorityQ ueue<Integer> ( cel iB r o je v i , s i z e ( ) , Col le c t io n s .r e v e r s e O r d e r O ); p r io r i te tn i Red.addAl1( c e li B r o je v i) ; QueueDemo.pri n tQ (p rio ri te tn iR e d ); S trin g c in je n ic a = "EDUCATION SHOULD ESCHEW OBFUSCATION"; List< String> strin g s = A r r a y s .a s L is t (c in je n ic a . s p lit ( " " ) ) ; PriorityQ ueue<String> stringPQ = new P r io r i tyQueue<Stri ng>(stri n g s ); QueueDemo.printQ(stringPQ); stringPQ = new PriorityQ ueue< String> ( s t r in g s .s iz e O , Col le c tio n s .re v e r s e O rd e rO ); strin g PQ .ad dA l1( s t r in g s ) ; QueueDemo.printQ(stringPQ); Set<Character> skupZnakova = new HashSet<Character>(); fo r(c h a r c : c in je n ica.to C harA rray( ) ) skupZnakova.add(c); // Automatsko pakovanje PriorityQueue<Character> characterPQ =
U stv a ri, o v o zavisi o d realizacije. A lg o ritm i p rio r ite tn ih re d o v a za č e k a n je o b ič n o s o rtira ju e le m e n te o d m a h n a k o n u m e ta n ja (o d rža v a ju ć i gomilti), ali iz b o r n a jv a žn ije g e le m e n ta m o g u o b a v iti i n a k o n u k la n ja n ja . K oji se a lg o rita m k o risti, v a ž n o je ak o se p rio r ite t o b je k ta m o ž e p r o m e n iti d o k o n čeka u re d u .

332

Misliti na Javi

new PriorityQueue<Character>(skiipZnakova); QueueDemo.printQ(characterPQ);

}
} /* Is p is :

0 1 1 1 1 1 3 5 8 14 1 1 2 3 3 9 9 14 14 18 18 20 21 22 23 25 25 25 25 23 22 21 20 18 18 14 14 9 9 3 3 2 1 1
A A B C C C D D E E E F H H I I L N N 0 0 0 0 S S S T T U U U W W U U U T T S S S O O O O N N L I I H H F E E E D D C C C B A A A B C D E F H I L N O S T U W

* ///:V idite d a su d u p lik a ti dozvo ljen i i d a n a jm a n je v re d n o sti im a ju najviši p rio rite t (u tip u

String, i razm aci se b ro je k ao v re d n o sti, i im aju viši p rio rite t o d slova). D a b iste videli kako svojim o b jek to m tip a Comparator m o žete izm en iti red o sled so rtira n ja , treći poziv k o n stru k to ra PriorityQueue<Integer> i d ru g i p o ziv k o n stru k to ra PriorityQ ueue<String> u p o treb ljav aju Comparator o b rn u to g red o sled a koji daje m eto d a C ollections.reverseO rder( ) - d o d a ta u Javu SE5. U p o sled n jem o deljku d o d a je se HashSet koji elim in iše d u p lik a te znakova (Character), sam o d a bi b ilo m alo zanim ljivije. Integer, String i Character ra d e s kJasom PriorityQueue zato što njihove klase već
im aju u g rađ e n svoj p riro d n i p o re d a k . U koliko u p rio rite tn o m re d u za čekanje ho ćete da u po treb ljav ate sopstvene Jdase, m o ra te d o d a ti i fu n k c io n a ln o st koja p ro izv o d i p riro d n i p o red a k ili o b ezb ed iti svoj Comparator. U p o glavlju D etaljtio razm atranje kontejnera n aći ćete i ta n a n iji p rim e r koji to p o k azu je .

Vežba 28: (2) P o m o ć u m eto d e o ffe r( ), p o p u n ite p rim e ra k kJase PriorityQueue brojevim a tipa D ouble n ap rav ljen im p o m o ć u klase java.util.Random. Z atim u k lo n ite elem en te m e to d o m p o ll( ) i p rik ažite ih.
V ežba 29: (2) N aprav ite je d n o sta v n u klasu koja n asleđ u je O b je c t i n e m a članova, i p okažite d a ne m ožete usp ešn o d o d a ti više ele m e n a ta te Jdase p rio rite tn o m redu za čekanje. To će b iti p o tp u n o o b jašn je n o u poglavlju D etaljno razm atranje kontejnera.

Poređenje kolekcija i Iteratora
Collection je ko renski interfejs koji o p isu je o n o što je zajed n ičk o svini k o n tejn erim a sekvenci. M ožete ga sm a tra ti „slu čajn im in terfe jso m “ koji je n astao zbog m e đ u so b n e sličnosti d ru g ih interfejsa. Sem toga, klasa java.util.AbstractCollection im a p o d ra z u m e v an u realizaciju Jdase Collection, p a n ove p o d tip o v e o d AbstractCollection m ožete p raviti b ez n e p o tre b n o g d u p lira n ja koda. Jedan o d a rg u m en ata za pravljenje interfejsa jeste to da o n o m o g u ćav a pisanje opštijeg koda. A ko je k o d nap isan za interfejs a ne za realizaciju, p rim en ljiv je n a više tipova objekata.6 U koliko n ap išem m e to d u koja u zim a Collection, ta m eto d a se m ože p rim en iti na
6 Im a lju d i koji z ag o v a ra ju a u to m a ts k o p ra v lje n je in te rfe js a za svaku m o g u ć u k o m b in a c iju m e to d a u klasi - p o n e k a d i za s v ak u k la su . S m a tr a m k a k o in te rfe js tre b a d a z n a č i više o d m e h a n ič k o g d u p iir a n ja k o m b in a c ija m e to d a , p a o b ič n o p rv o s a g le d a m v re d n o s t k o ju če in te rfe js d o n e ti i tek ta d ga p ra v im .

Poglavlje 11: Luvanje objekata

333

svaki tip koji realizuje Collection - a to svakoj novoj klasi p ru ž a m o g u ćn o st da realizuje Collection da bi m ogla b iti u p o tre b lje n a s m o jo m m eto d o m . Z anim ljivo je p rim e titi da s ta n d a rd n a biblioteka C + + -a za svoje k o n tejn ere n em a zajed nk ku o sn o v n u klasu - sve što im je zajedničko, postiže se ite ra to rim a . M ožda b i u Javi bilo p a m e tn o slediti p rim e r iz C + + -a i izraziti sličnost k o n tejn era ite ra to ro m , a ne kolekcijom . M eđ u tim , ta dva p ristu p a su povezana, p o što realizovanje klase Collection znači i o bezbedivanje m eto d e iterator( ):
//: c u v a n je / P o re d je n je ln te rfe js a iIte ra to ra .ja v a import ty p e in fo .p e ts .* ; iirport j a v a . u t i l .* ; p u b lic c la s s P o r e d je n je ln t e r fe js a iIt e r a t o r a { p u b lic s t a t ic void is p is i(Ite r a to r < P e t> i t ) { w h ile (it.h a s N e x t ()) { Pet p = i t . n e x t ( ) ; S y s te m .o u t .p r in t(p .id () + + p + " ");

}
S y s te m .o u t .p r in tln ();

}
p u b lic s t a t ic void is p is i(C o lle c tio n < P e t> lju b im c i) fo r (P e t p : lju b im c i) S y s te m .o u t.p rin t(p .id () + + p + " "); S y s te m .o u t .p r in tln ();

}
p u b lic s t a t i c void m a in (S trin g [] args) { List<Pet> lis ta lju b im a c a = P e t s .a r r a y L is t ( 8 ) ; Set<Pet> skupljubimaca = new HashSet<Pet>( lis t a lju b im a c a ); Map<String,Pet> mapaljubimaca = new LinkedHashM ap<String,Pet>(); S t r in g [] imena = ( " R a lf , E r ik , Robin, L e js i, " + " B r i t n i , Sima, Tufna, P a p e r j a s t " ) . s p l i t ( " , " ) ; f o r ( i n t i = 0; i < im ena.length; i++) m ap alju b im aca.p u t(im en a[i], 1i s ta lju b im a c a .g e t( i ) ) ; i s p i s i (1i s t a lju b i m aca); is p is i(s k u p lju b im a c a ); i spi s i (1 i s ta lju b im a c a .i t e r a t o r ( ) ) ; i s p is i(s k u p ljub im aca.i t e r a t o r ( ) ) ; S y s te m .o u t.p rin tln(m apaljubim aca); System .o ut.p ri n tln(m apalju bim aca.keySet( ) ) ; i s p i s i (mapaljubim aca.v a l ues( ) ) ; is p is i(m a p a lju b im a ca .v a lu e s( ) . i t e r a t o r ( ) ) ;

}
} /* Is p is : 0 :Rat l:Manx 2:Cymric 3:Mutt 4:Pug 4:Pug 6:Pug 3:Mutt l:Manx 5:Cymric 0 :Rat l:Manx 2:Cymric 3:Mutt 4:Pug 4:Pug 6:Pug 3:Mutt l:Manx 5:Cymric 5:Cymric 6:Pug 7:Manx 7:Manx 2:Cymric 0:Rat 5:Cymric 6:Pug 7:Manx 7:Manx 2:Cymric 0 : Rf! 1

{R alf= R at, Erik=Manx, Robin=Cymric, Lejsi= M utt, Britni= Pu g, Sima=Cymric, Tufna=Pug, Paperjast=Manx}

334

Misliti na Javi

[ R a lf , E r ik , Robin, L e js i, B r i t n i , Sima, Tufna, P a p e rja st] 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

* ///:O be verzije m e to d e isp isi( ) ra d e i sa o b je k tim a tip a Map i s p o d tip o v im a o d Collection. I interfejs Collection i Iterator o d elju ju m e to d e is p is i( ) o d p o zn av an ja k o n k re tn e realizacije p rip a d n o g k o n tejn era. U ov o m slučaju, ob a p ristu p a su jed n ak a. U stvari, Collection je n ešto bolji p o što se m ože iterirati (im a svojstvo Iterable), p a se u realizaciji ispisi(C ollection) m o že u p o tre biti foreach sintaksa, zbog čega je k o d n ešto čistiji. U p o treb a Iteratora p o staje obavezna k a d a realizu jete stra n u k lasu (o n u koja nije p o d tip o d Collection), u kojoj b i bilo teško ili b esm islen o realizovati interfejs Collection. P rim era radi, ako Collection realizu jem o n asleđ iv an jem klase koja sadrži Pet objekte, m o ra m o realizovati sve m e to d e in terfejsa Collection, čak i ako n a m n e tre b a ju u m e to d i isp isi( ). Iako je to lako n ap rav iti p o m o ć u n asleđ iv an ja klase AbstractCollection, ipak m o rate da realizujete i iterator( ) i s iz e ( ), d a b iste o b ezb ed ili m e to d e koje AbstractColIection ne realizuje, ali ih u p o tre b ljav a ju d ru g e m eto d e u AbstractCollection:
//: cu van je/Sekven caKolekcija.java import ty p e in fo .p e ts .* ; import j a v a . u t i l . * ; public c la s s SekvencaKolekcija extends A bstractC o l1ection<Pet> { p riv a te P e t[] ljubim ci = P e ts .c r e a te A r r a y (8 ); p ublic in t s iz e () { return 1ju b im c i.le n g th ; } public Iterator<Pet> it e r a t o r ( ) { return new Iterato r< P et> () { p riv a te in t indeks = 0; public boolean hasNext() { return indeks < 1ju b im c i.le n g th ;

}
p ublic Pet n ex t() { return 1jub im ci[index+ + ]; } p ublic void remove() { // N ije realizovano throw new UnsupportedO perationException();

} }; }
public s t a t ic void m a in (S trin g [] args) { SekvencaKolekcija c = new S e k v e n c a K o le k c ija (); P o r e d je n je ln t e r fe js a iIt e r a t o r a .i s p is i ( c ) ; P o r e d j e n j e ln t e r f e j s a il t e r a t o r a . is p is i( c . it e r a t o r ( ) ) ;

}
} /* Is p is : 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat l:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

* ///= -

Poglav[je 11: Čuvanje objekata

33 5

M eto d a rem ove( ) je d n a je o d o p c io n ih o p eracija, s k ojim a ćem o vas u p o z n a ti u poglavlju D etaljno razm atranjc kontejnera. O vde je nije n e o p h o d n o realizovati, p a ćete izazvati izuzetak ako je pozovete. Iz ovog p rim e ra m o žete v id eti sledeće: ako realizujete Collection, realizujete i iterat o r ( ), a realizovanje sa m o m e to d e itera tor( ) zah teva tek m alo m an je posla o d nasleđivan ja klase AbstractCoIlection. M e đ u tim , u k o lik o vaša klasa već nasleđuje d ru g u klasu, n e m o že naslediti i AbstractCollection. U to m slučaju, da biste realizovali Collection, m o ra li biste d a realizujete sve m e to d e to g in terfejsa. Tada bi bilo m n o g o lakše naslediti Collection i d o d a ti m o g u ć n o st p rav ljen ja iteratora:
//: cu vanje/SekvencaBezKolekcije.java import ty p e in fo .p e ts .* ; import j a v a . u t i l . * ; c la s s Sekvencaljubim aca ( protected P e t [] lju b im ci = P e t s .c r e a te A r r a y (8 );

}
pub lic c la s s SekvencaBezKolekcije extends Sekvencaljubimaca ( p u b lic Iterator< Pet> it e r a t o r ( ) ( retu rn new Ite rato r< P e t> () ( p riv a te in t indeks = 0; p u b lic boolean hasNext() { return indeks < 1ju b im c i.le n g th ;

}
p ub lic Pet n ex t() { return 1jub im ci[indeks+ + ]; } p ub lic void remove() { // N ije realizo vano throw new UnsupportedO perationException();

} }; }
p u b lic s t a t ic void m a in (S trin g [] args) { SekvencaBezKolekcije nc = new Se k v e n ca B e z K o le k c ije (); P o r e d je n je ln t e r f e js a iIt e r a t o r a .i spi s i ( n c . i t e r a t o r ( ) ) ;

}
} /* Is p is : 0:Rat l:Manx Z:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx

* ///:Pravljenje Iteratora je n ajrazd v o jen iji način povezivanja sekvence i m eto d e koja p rim a tu sekvencu, a pri to m se klasa sekvence o g ran ičav a z n a tn o m anje nego kada se im plem e n tira klasa Collection.

Vežba 30: (5) Izm en ite p ro g ra m ColIectionSequence.java tako d a ne nasleđ uje AbstractCollection, nego da realizuje Collection.

336

Misliti na Javi

Foreach i iteratori
D o sad sm o foreach sin tak su u g lav n o m up otreb ljav ali s nizovim a, ali o n a rad i i sa svim o b jek tim a Collection. Z apravo, već ste videli nekoliko p rim e ra za to u k o jim a se u p o tre bljavala ArrayList, ali ovo je o p šti dokaz:
//: cu van je/Fo rEachK o lek cije.java // Sve k o le k c ije rade s foreach sintaksom. import ja v a . u t i l p u b lic c la s s ForEachK olekcije { p u b lic s t a t ic void m a in (S trin g [] args) { C ollection< String> cs = new L in k e d L ist< S trin g > (); C o lle c tio n s .a d d A l1(c s , "Take the long way h o m e ".s p lit(" “ ) ) ; fo r (S tr in g s : cs) "); S y s te m .o u t.p rin t(.... + s +

}
} /* Is p is : 'Take' 'th e ' 'lo n g ' 'way' 'home'

* ///:P ošto je cs tip a Collection, ovaj k o d do k azuje da sve kolekcije m o g u da rad e s foreach sintak so m . O vo fu nkcion iše zato što je Java SE5 uvela nov interfejs nazvan Iterable koji sadrži m eto d u iterator( ) za pravljenje Iteratora. Za k retanje kroz sekvencu, foreach u p o treb ljav a interfejs Iterable. D akle, ako n a p rav ite klasu koja realizuje Iterable, m o žete je u p o tre b iti u foreach naredbi:
/ / : c u v a n je / Ite ra b i1n aK lasa.java // Sve što j e ite ra b iln o funkcioniše s foreach sintaksom. import j a v a . u t i l .* ; p u b lic c la s s Ite ra b iln a K la s a implements Iterable< String> { protected S t r in g [] rechi = ("And th a t is how " + "we know the Earth to be banana-shaped." ) . s p li t ( " " ) ; p u b lic Iterator< String> it e r a t o r ( ) { return new Ite ra to r< S trin g > () { p riv a te in t indeks = 0; p u b lic boolean hasNext() { return indeks < r e c h i.le n g th ;

}
p u b lic S trin g n ex t() { return r e c h i[ i ndeks++]; } p ub lic void remove() { // N ije realizovana throw new UnsupportedO perationException();

}
};

}

Poglavlje 11: Čuvanje objekata

337

p u b lic s t a t ic void m a in (S trin g [] args) { f o r (S t r in g s : new It e r a b iln a K la s a ()) S y ste m .o u t.p rin t(s + " " ) ;

}
} /* Is p is : And th a t is how we know the Earth to be banana-shaped.

* ///:M eto d a iterator( ) vraća in sta n cu a n o n im n e u n u tra šn je realizacije klase Iterator<String> koja daje svaku reč niza. U m e to d i m a in ( ) m o žete v id eti da IterabilnaKIasa zaista ra d i u foreach naredbi. U Javi SE5 ite rab iln o je više klasa, p rv en stv en o sve klase C ollection (ali n e M a p e ). Na p rim e r, ovaj p ro g ra m p rik azu je sve p ro m en ljiv e o k ru ž en ja o p erativ n o g sistem a:
//: cuvanje/Prom enljiveO kruzenja.java import j a v a . u t i l . * ; p u b lic c la s s PromenljiveOkruzenja { p u b lic s t a t ic void m a in (S trin g [] args) { fo r(M ap .En try stavka: S y s te m .g e te n v ().e n try S e t()) S y s te m .o u t.p rin tln (s ta v k a .g e tK e y () + " : " + s ta v k a .g e tV a lu e O );

{

} }
} /* (Po k re n ite da b is te v id e li re z u lta te ) *///:-

System .getenv( )' vraća Mapu; en tryS et( ) p rav i sk u p (Set) e lem en ata Map.Entry, a p o što je sk u p iterab ilan , m ože se u p o treb iti u fo reach petlji. F oreach n ared b a rad i s nizovim a i sa svim što je iterab iln o , ali to ne znači d a je svaki niz au to m a tsk i iterab ilan , niti da se obavlja ikakvo a u to m atsk o pakovanje:
/ / : c u v a n je / N iz N ije lte ra b ila n .ja v a import j a v a . u t i l .* ; p u b lic c la s s N iz N ije lte r a b ila n { s t a t i c <T> void test(Iterab le< T > ib ) fo r(T t : ib ) S y s te m .o u t.p rin t(t + " " ) ;

{

}
p u b lic s t a t ic void m a in (S trin g [] args) { t e s t ( A r r a y s . a s L i s t ( l, 2, 3 ) ) ; S t r in g [] znakovni_nizovi = { "A ", " B " , "C" } ; // Niz radi u foreach naredbi, a l i n ij e it e r a b ila n : // ! te s t(z n a k o v n i_ n iz o v i); // Morate ga i z r i č i t o p r e t v o r iti u nešto it e r a b iln o : t e s t(A r r a y s .a s L is t(z n a k o v n i_ n iz o v i)); Ova metoda nije postojala pre Jave SE5, pošto se smatralo da bi bila previše usko povezana sa operativnim sistemom, pa bi se kršilo pravilo„napiši jednom, izvršavaj bilo gde“. Činjenica da metoda sada postoji k.izuje da su projektanti Jave nakon pojave .NET-a postali pragmaličniji.

338

Misliti na Javi

}
} /* Is p is : 1 2 3 A B C

* ///:Pokušaj da se niz p ro sle d i kao ite rab ila n arg u m e n t, n e uspeva. N e p o sto ji a u to m atsk a konverzija u Iterable; m o ra te je o bav iti ru čn o .

Vežba 31: (3) Izm en ite polimorfizam/oblik/GeneratorSlucajnihOblika.java tako da
p o sta n e iterab ilan . M orate d o d a ti k o n s tru k to r koji p rim a broj elem en ata koji ite ra to r treb a d a n ap ra v i p re zaustavljanja. D o kažite d a to radi.

Adapterska metoda
Šta ako im a te ite ra b iln u klasu i h teli b iste d a d o d a te je d a n ili više n o v ih n ačin a u p o tre b e te klase u fo reach naredbi? P rim e ra rad i, p re tp o sta v im o d a b iste hteli d a b irate h o ćete li k roz listu reči ite rira ti u n a p re d ili u n azad . U koliko sam o n asledite tu klasu i redefinišete m e to d u iterator( ), zam en ićete p o sto je ću m e to d u i nećete m o ći d a b irate. Jed n o rešenje sam n azvao A dapterska m etoda. „A dapterski“ d eo p o tiče iz p ro je k tn ih o b razaca, p o što m o rate o b ezb ed iti o d re đ e n i interfejs d a biste zadovoljili foreach n ared b u . K ada im ate je d a n interfejs a tre b a v am d ru g i, p ro b le m ćete rešiti u koliko napišete adapter. O vde h o ć u da dodam m o g u ć n o st pravljenja iterato ra u n azad p o d ra z u m e v a n o m ite rato ru u n a p re d , p a ne m o g u da ga redefinišem . U m esto toga, d o d ać u m e to d u koja proizvodi itera b ila n o b jek at koji se p o to m m ože u p o tre b iti u foreach naredb i. Kao što ćete videti, tim e d o b ija m o više n ačin a u p o tre b e fo reach sintakse:
//: cuvanje/AdapterskaMetoda.ja va // "Adapterska metoda" omogućava upotrebu foreach // sin tak se s dodatnim vrstama it e r a b iln ih objekata. import j a v a . u t i l .* ; c la s s ReversibleArrayList< T> extends ArrayList<T> { p u b lic R e versib le A rrayList(C o llectio n < T > c) { s u p e r(c ); } p u b lic Iterable<T> obrnuto() { retu rn new Iterable< T> () { p u b lic Iterator<T> it e r a t o r ( ) { return new Iterator< T > () { in t tekuci = s iz e () - 1; p u b lic boolean hasNext() { return tekuci > -1; } p u b lic T n ex t() { return g e t(te k u c i— ) ; } p u b lic void remove() { // N ije realizovano throw new UnsupportedO perationException();

}
};

}
};

} }

} }.a s L is t("T o be or not to b e " .p rin t(s + " " ) .asLi st(w o rd s )) .]. } p ub lic void remove() { // N ije realizovano throw new UnsupportedO perationException().sh u ffle (iz m e s a n a . import j a v a . . public boolean hasNext() { return tekuci > -1. } public S trin g n ex t() { return r e c h i[te k u c i.p r in tln (). Ali u koliko za taj objek at po zovete m e to d u o b r n u t o ( ). // D ajte ga iterab iln om objektu po svom izboru f o r (S t r in g s : ra l . Na taj način . S y s te m . klasi Ite ra b iln a K la sa . u t i l . p u b lic c la s s V is e s tru k o Ite ra b iln a K la s a extends Ite ra b iln a K la s a { p u b lic Iterable< String> obrnutoO { return new Iterab le < S trin g > () { p ub lic Iterato r< Strin g > it e r a t o r ( ) { return new Ite ra to r< S trin g > () { in t tekuci = re c h i. C o lle c tio n s .1. new Random(47)). } } /* Is p is : To be or not to be be to not or be To * ///:A ko o b jek at ra l sam o stavite u foreach n a re d b u .ja v a // Dodavanje v iš e adapterskih metoda.. dob ićete (p o d raz u m ev an i) ite ra to r u n a p re d . s p l i t ( " " ) ) ) .le n g th .o u t.ja v a m o g u se d o d a ti dve adap tersk e m etod e: //: c u va n je / V is e s tru k o Ite ra b iln a K la s a . // Metodom it e r a t o r ( ) grabi se običan it e r a t o r : fo r (S t r in g s : r a l) S y s te m .obrn utoO ) Sy ste m . } p u b lic Iterable< String> slu c a jn o () { return new Ite ra b le < S trin g > () { p u b lic Iterato r< Strin g > it e r a t o r ( ) { List< String> izmesana = new A rrayLi st< Strin g > (A rrays. } }.o u t.Poglavjj'e I 1: Čuvanje objekata 339 p u b lic c la s s AdapterskaMetoda { p u b lic s t a t ic void m a in (S trin g [] args) { R eversib leA rrayList< Strin g > ra l = new R eversib leA rrayList< Strin g > ( A rra y s .* . o n a će d a ti d rug ačije p o n ašan je.p rin t(s + " " ) .o u t .

340 Misliti na Javi return iz m e s a n a . { { In te g e r[] nizcb = { 1. } } /* Is p is : banana-shaped. 3.o u t. } .p rin tln ("P re mešanja: " + l i s t a l ) . f o r (S tr in g s : mic) S y ste m . List< Integer> 1ista 2 = A r r a y s . f o r (S tr in g s : m ic.shuffIe( ) n e u tič e n a o rig in a ln i niz.s lu c a jn o O ) S y ste m . kao što vidite: //: cuvan je/M o d ifik o van jeN iz o vaK ao Listi. s lu c a ja n ). S y s te m . } p ub lic s t a t ic void m a in (S trin g [] args) { V ise s tru k o Ite ra b iln a K la s a mic = new V is e s tr u k o It e r a b iln a K la s a ().o u t.o u t.* . List< Integer> l i s t a l = new A rra y L is t< In te g e r> (A r ra y s .p rin tln ().p rin tln ("n iz : " + A rra y s . o n a bi m odifiko v ala p rip a d n i niz. C o ll e c t io n s . 4. 6.p rin t(s + " " ) .o u t. * ///:O b ra tite p a ž n ju n a to da d ru g a m e to d a . ra n d o m ( ).s h u f f le (lis t a 2 . s lu c a ja n ). n e p ra v i so pstveni Iterator nego vraća o n aj iz izm ešane Liste. u t i l . 7.o b rn u to ()) Sy ste m . 5. to S tr in g (n iz c b )) .o ut. s h u f f le ( li s t a l. O vo je ta č n o sam o zato što m e to d a slu cajn o() o m o ta v a ArrayList oko rezu ltata m eto d e Arrays. System . be to Earth the know we how is th a t And is banana-shaped.o u t. System . nego sam o m eša reference u o b jek tu izmesana. 9.a s L is t (n iz c b ).o ut.o u t. S y s te m . C o lle c t io n s . } }. pu b lic c la s s M odifikovanjeN izovaKaoListi p ublic s t a t ic void m a in (S trin g [] args) Random slucajan = new Random(47).a s L is t(n iz c b )).o u t. Da je Lista nap rav ljen a m eto d o m Arrays. 10 } . S y s te m . S y s te m .java import j a v a .asList( ). S y s te m . Earth th a t how the be And we know to And th a t is how we know the Earth to be banana-shaped. f o r (S tr in g s : m ic .asList( ) izm ešan a d ire k tn o . 2.p rin tln ().t o S t r in g (n iz c b )).p rin tln("N ako n mešanja: " + l i s t a l ) .o u t.ite r a to r ().p rin t(s + " " ) . S y s te m .p rin tln ("n iz : " + A r r a y s . 8.p rin tln("N ako n mešanja: " + l i s t a 2 ) .p rin tln ("P re mešanja: " + 1i s t a 2 ) .p rin t(s + " " ) . Iz rezu ltata vid ite da m e to d a C ollections.o u t.

i p o k a žite da u fo reach n ared b am a funkc irogramu-SekvencaBezi SekvencaBezKolekcije u sve te varijante. 5. M e đ u tim . izlaz m eto d e A rrays. 8. 7. 3. P o p u t niza. >je d ru g im objek tim a. lavaju svoju veličinu n akon d o d a v a n ja i u ld an jan ja elem en ata. '/. Kolekcije. 9. Sažetak Java im a više n a čin a za ču v an je objekata: 1 . 6. U p o treb ite listu ArrayList ako često k o risfite često um ečete i u k lan jate elem en te n sredini 5 .ja Arrays. lista tak o đ e povezuje n u m eričk f m o g u se sm a tra ti u re đ e n im k o n te jn erim a . 5.asList( ) p re d ai r ■ >ostruktoru ArrayList( ). a n e želite d a se m o d ifik u je o rig in a b r liz. 2. 8.| '<' HashMap čuva svoje elem en te u u re d e n o m red o sled u . n iz : [9. 2. dok ite e M a p cuva ključeve u u re đ e n o m red o sledu i zato nije ta k o b rz a krtO ria sh M . 4. d o k m a p a sad rži povezane parove. a LinkedList ako 'L ist. Vežba 32: (2) N a o sn o v u p rim e ra VisestrukoIterabilrmJHa«. N iz povezuje n u m e rič k e in d ek se sa o b jek tim a. 2. n a p rav ite n jeg o v u k op iju u d ru g o m k o n te jn e ru . 2.java d o d a jte m e to d e o b rn u to ( ) i slu ca jn o ( ). 6. pa n ak o n u zim a n ja o b jek ta iz niza ne m o ra te da v ršite k rziju tip o v a. 4.. P o m o ču Javinih g en eričk ih tip o v a zadajete tip objekta koji ćc u v ati u k o n te jn e ru . 8.in 6. 9.. N iz m ože da b u d e v iše d im e n z io n ala n i da sadrži p ro ste tipove. m ešan je m o đ ifik u je p o re d a k niza nizcb. i o b rn u to . 5. nizovi i liste a ristu p . 2. 2. 3. 7.Pog). M e li m . 9] 10] 4.asList( ) pravi o b jek at tip a List koji u p o treb ljav a p rip a d n i n iz k ao svoju fi?iči< i ealizaciju. . 10. Nakon mešanja: [4. R edovi za ček an je i stekovi p rav e se p o m o ć u l c i . Mapa je način za povezivanje objekai. 3.. 4. 5. a o n p rav i ArrayList koja referen cira elem en te niza nizcb iije tih referenci n e m o difikuje niz. 6. 5.-. 8. 10. * o b jek tim a. :tih i u r .a s l > . 6.ie i • ' :'vanje objekata 341 } /* Is p is : Pre mešanja: [1 . p a u njega ne m o žete staviti p o g rešan tip i ne m o ra te da i iijate tip elem en ata kada ih izvadite iz njega. 1. 8j * ///:U p rv o m slučaju. 6. ali se a u to m a tsk o p akov an je stara za p rev o đ en je p ii. 7. 7. Nakon mešanja: [9. ne m o žete d a m u p ro m en ite veličinu. 7. Im a jte u v id n . 3. I kolekcije i M ap e a u to m atsk i : rii. 9. . 1. ali tra n sfo rm ' ■ ev o b ezbeđ u je b rz p ristu p . 1. >zc b ) u p o tre b ite d irek tno. uk o lik o rez u ltat m e to d e A rra y s. . 3. 3. a i realizujte Iterable. 8] 10] 10. 4. 10] Pre mešanja: [1 . u. K o n tejn er r»e uiože ad rži p ro ste tipove. Klasa HashMap je p ro jek to v an a za b rz p ristu p . b. 2. ■ . . K olekcija sadrži p o jed in ač n e elem en te. 4. O n sad o b jek te p o z n ato g tip a.. i o m o tačk e tipove koji se čuvaju u k o n te jn e ru . U koliko bilo kako izm e n ite tu Listu. 3. 6. n iz : [1.

s iz e .. . 8.. public c la s s KontejnerskeMetode { p ub lic s t a t ic void m a in (S trin g [] args) { R azlikeKon tejnerskih M etoda..J 1 Proizvodi 1 ir f L J 51 C *• J C l ""S '" i . U n jim a se vide i interfejsi koje realizuje p o je d in a klasa ili interfejs: //: cuvanje/KontejnerskeM etode.. Klasa LinkedHashSet čuva svoje elem en te u u re đ e n o m red o sled u . ad d A ll.. d o k TreeSet čuva e lem en te u u re đ e n o m red o sled u .util. Strelice s p u n o m lin ijo m u k azu ju da klasa m ože da prav i o b jek te klase na koju po k azu je strelica. Iterator Collection f* Map . r e t a in A U . Set i Queue. Isp rek id an e p ra zn e strelice u k azu ju da o d re đ e n a klasa realizuje interfejs.. bilo koja kolekcija m ože da pravi Iterator.'A.concurrent nisu p rik aza n e n a d ija g ra m u ).. U n jem u su sa m o interfejsi i klase koje ćete red o v n o sretati.. J ..* . List. Hashtable i Stack.u til. hashCode. Na p rim er. T ačkastim o k v irim a obeleženi su interfejsi. N ajčešće ćete u p o tre b lja v ati k o n te jn e re oivičene d eb e lo m p u n o m lin ijo m . con tain s. Set čuva sam o objekte različitih v red n o sti.m in d v ie w .. d o k List m o že da n ap rav i Listlterator (kao i ob ičan Iterator. N em a p o tre b e da se u n o v im p ro g ra m im a k o riste stare klase Vector. remove. Klasa HashSet o b e z b e đ u je p ro n alažen je m a k sim a ln o m b rz in o m . Listlterator i« 1 i ArrayList / i Q ueue • HashMap TreeMap 1 f LinkedList PriorityQueue LinkedHashMap Alatke HashSet ► i Comparator ! IjnkedHashSet TreeSet Collections Arrays V idite d a p o sto je sam o četiri k o n tejn ersk e k o m p o n e n te : Map. it e r a t o r . ovde ga sam o p ozivam d a b ih d o b io rezu ltate. p o što je List izvedena iz Collection). a o k v irim a s p u n o m lin ijo m o b ičn e (k o n kre tn e ) klase...342 Misliti na Javi 7.. rem oveAll. isEmpty.. Evo p rim e ra u kojem se vidi razlika izm eđ u m e to d a razn ih klasa.java import n e t. toA rray] . K od je naveden u poglavlju G enerički tipovi ... Pogledajte p o jed n o stav ljen d ijag ram Javinih k o n te jn e ra (bez a p stra k tn ih klasa i starih k o m p o n e n a ta )..m ain (args).... equals. 1 } /* Is p is : (prim er) C o lle c tio n : [add. Proizvodi Proizvodi .. c o n ta in s A ll. c le a r .. i sam o dve ili tri realizacije svake o d njih (rea liza đ je klase Queue iz pak eta java.

p o l1L a s tE n try . f ir s t K e y . h igher. dodaje: [p o llL a s t. dodaje: [] In t e r f e j s i u k la s i LinkedHashMap: [Map] SortedMap extends Map. c e ilin g E n tr y .Poglavlje 11: Čuvanje objekata 343 In t e r f e j s i u k la s i C o lle c tio n : [ It e r a b le ] Set extends C o lle c tio n . remove. n a v ig a b le T a ilS e t. C loneable. f i r s t E n t r y . put. removeLast. con tain sV alu e. n avig ab leTaiIMap. dodaje: [o f f e r . lo w erEn try. removeLastOccurrence] In t e r f e j s i u k la s i L in k e d L ist: [ L i s t . peek. e n try S e t. f i r s t . a d d F irs t. push. C loneable. la stK e y . dodaje: [] In t e r f e j s i u k la s i S e t: [C o lle c tio n ] HashSet extends S e t. descendingKeySet. subSet. la stln d ex 0 f] In t e r f e j s i u k la s i L is t : [C o lle c tio n ] A rra y L is t extends L is t . RandomAccess. element. element. C loneable. higherKey. S e r ia liz a b le ] Queue extends C o lle c tio n . indexOf. Cloneable. p o ll] In t e r f e j s i u k la s i Queue: [C o lle c tio n ] PriorityQ ueue extends Queue. p o l lF i r s t . za p ravljenje fu n k cio n aln e realizacije reda za čekanje (Queue). g e tLa st. comparator. Deque. s e t. rem oveFirst. p e e k F irs t. flo o rE n tr y . o f f e r F i r s t . dodaje: [ensu reC apacity. navigableSubMap. headMap. addLast. t a il S e t ] In t e r f e j s i u k la s i T reeSet: [N avig a b leS et. comparator. m e to d e interfejsa Collection nisu p o treb n e. dodaje: [] In t e r f e j s i u k la si HashSet: [S e t. h ig h erEn try. lovver. la s t . la s t E n t r y . headSet. C loneable. c e ilin g K e y] In t e r f e js i u k la s i TreeMap: [NavigableMap. f lo o r . peek. dodaje: [descendingEntrySet. d escen d in g lte rato r. C loneable. la stK e y . g e t F ir s t . dodaje: [ p o llL a s t . g et. dodaje: [] In t e r f e j s i u k la s i LinkedHashSet: [S e t. rem oveFirstO ccurrence. p u tA ll. List i Collection se z n a tn o razlik u ju . p o l lF i r s t . S e r ia liz a b le ] LinkedHashMap extends HashMap. isEmpty. keySet. headMap. s u b L is t. subMap. pop. navigableSubSet. containsKey. S d ru g e stran e . Cloneable. S e r ia liz a b le ] TreeSet extends S e t. dodaje: [comparator] In t e r f e j s i u k la s i Prio rityQ u eu e: [S e r ia liz a b le ] Map: [ c le a r . flo o rK e y. dodaje: [subMap. equals. S e r ia liz a b le ] Lin k e d L ist extends L is t . values] HashMap extends Map. p o l l . d escen d in g lterato r. m eto d e in terfe jsa Queue su sam o staln e. s iz e . . N ajzad. trim ToSize] In t e r f e j s i u k la s i A rra y L is t: [ L i s t . dodaje: [] In t e r f e j s i u k la s i HashMap: [Map. c e ilin g . g et. f ir s t K e y . o ffe rL a s t. o f f e r . hashCode. peekLast. iako List zahteva m e to d e koje su u interfejsu Collection. S e r ia liz a b le ] * ///:V idite da svi sku p ovi (o b jek at tip a Set) sem tip a TreeSet im a ju p o tp u n o isti interfejs kao Collection. p ol1F i rs tE n try . ta ilM a p . S e r ia liz a b le ] LinkedHashSet extends HashSet. S e r ia liz a b le ] L is t extends C o lle c tio n . comparator. tailM ap] In t e r f e js i u k la s i SortedMap: [Map] TreeMap extends Map. navigableHeadMap. navigableHeadSet. jed in a d o d irn a tačk a klasa Map i C ollection jeste činjenica da Map m ože da pravi kolekcije p o m o ć u m eto d a en tryS et( ) i v a lu es( ). dodaje: [1 i s t l t e r a t o r . lowerKey.

344 Misliti na Javi Obratite pažnju na interfejs java.net. kako budete više saznavali o kontejnerima paketa java.util (naroćito u poglavlju Dctaljno razmatranje kontejnera). ali ne i uz LinkedList. Oduvek je bilo teško projektovati biblioteke kontejnera.util.RandomAccess koji je prikačen uz ArrayList. jer treba zadovoljiti međusobno suprotstavljene sile. Time se pruža informacija algoritmima čije če se ponašanje dinamički menjati u zavisnosti od upotrebe određene Liste. koji se može kupiti n a lokaciji www. Zato poneki kompromis ne bi trebalo da vas iznenadi. Javini kontejneri su osnovne alatke kojima svoje programe možete učiniti jednostavnijim. Međutim. snažnijim i delotvornijim. . ali mislim da ćete njene ldase brzo početi da nabavljate i upotrebljavate.MindView. Uza sve to. Rešenja odabranih vežbi su u elektronskom dokum entu The Thinking in Java Annotated Solution Guide. Možda će vam trebati malo vremena da se naviknete na određene aspekte ove biblioteke. videćete da nije problematična samo čudna struktura nasleđivanja. Ova organizacija je malo čudnija od objektno orijentisane hijerarhije.

P r o g ra m e r n a je/. O poravljan je o d grešaka je najvažnije za svaki p ro g ra m koji pišete. Koncepti C i d ru g i stariji jezici često su im ali i po nekoliko šem a za o b ra d u grešaka koje su p o p ra vilu bile u tv rd e n e d o g o v o ro m . a po se b n o je v a žn o u Javi. Izuzetke nije tolik o teško savlad ati. a sp ro v o d i je prev odilac Jave. M eđ u tim . ne m o g u se sve greške o tk riti p ri p re v o đ e n ju . P o b o ljšan o op o ravljan je o d grešaka je d a n je o d n ajb o ljih n ačin a za po većanje ro b u sn o sti k o d a.. P ošto je o b ra d a izuzetaka je d in i zvan ični način n a koji Java prijavlju je greške. D a biste napravili robustan sistem.Da. U glavn om se vraćala p o seb n a v red n o st ili se p o stavljao in d ik ato r. o d n o sn o nisu bile deo p ro g ram sk o g jezika. R ešenje je d a se p o stu p k u o b ra d e grešaka o d u z m e p riro d n o st i da se ojača fo rm aln o st. O vaj način . svaka njegova kom p onenta m ora biti robusna. p o u z d a n ih p ro g ra m a p o m o ć u m an je k o d a nego što je tr e n u tn o m oguće. Z b o g toga ne iznen a đ u je što n isu proveravali uslove p o d ko jim a je nastajala greška (a p o n e k a d su uzroci greške bili previše glupi d a bi se p ro v erav ali). u ovoj k njizi ne m o že biti m n o g o p rim e ra n a p isa n ih bez nje. N ajb o lje bi bilo k ad a b iste sve greške m og li d a o tk rijete to k o m prev o đ en ja. je r se obrada izuzetaka (engl. n a p rim e r. M eđ u tim . ali u m om k od u ih n e m a “. o d n o s n o in d ik a to r i odlu čiv ao d a li je sve u red u. i u z povećavan je v ero v atn o će da se u aplikaciji neće p o jav iti greška koja nije o b rađ e n a. a sp a d a ju m e đ u elem en te Jave o d kojih p ro jek ti im aju tre n u tn e i p rim e tn e koristi. P ošto su p ro gram e.iku C . fo rm a ln im p o stu p c im a . o d b ijali su da p riz n a ju istinu: ovakav p ristu p isp rav ljan ju grešaka u m n o g o m e je og ran ičav ao pisanje velikih. N eki p ro b lem i se m o ra ju rešavati za v rem e rad a. a Javina p retež n o n a C + + . im a d u g u isto riju . . o n i o m o g u ć u ju v in o v n ik u greške da p ro sled i odg ov araju će in form acije p rim a o c u k oji će znati kako d a se n a p rav i n a č in iz b o ri s teškoćom .Obrada grešaka pomoću izuzetaka O S N O V N A M U D R O ST JAVE GLASI DA K O D KOJI JE LOSE N A PISA N N EC E N I BITI IZVRSAVAN. U o v o m p oglavlju u p o zn aje te se s p rav ilim a rad a sa izuzecim a i n a č in o m n a koji m o žete da g en erišete sopstvene izuzetke k ad a se neka o d vaših m eto d a splete. exception handling) sreće jo š u o p e ra tiv n im sistem im a iz šezdesetih g o d in a p ro šlo g veka.ri i dalje m ogli da o d ržav aju sistem e n ap isan e o p isa n o m te h n ik o m .1 Kada biste bili d o v oljn o pažljivi d a tražite grešku posle svake m eto d e. čak i u n a re d b i on error goto iz p ro g ra m sk o g jezika BASIC. gde je je d a n o d p rim a rn ih ciijeva pravljenje p ro g ra m sk ih k o m p o n e n a ta za v iš e k ra tn u u p o tre b u .U (iako više podseća n a o b jek tn i Pascal). to k o m g o d in a o tk riv e n o je da p ro g ra m e ri koji koriste b ib lio tek u o b ič n o sebe sm a traju n epogrešivim i razm išljaju u stilu: . p re nego što u o p šte p o k u šate da p o k re n e te p ro g ra m . a p rim alac bi p o sm a tra o v red n o st. zapravo. Java om o gu ćav a d a k o m p o n e n te p o u z d a n o dojave svoje p ro b le m e k lijen tsk om k o d u tak o što o bezb eđ u je d o sled an m o d el prijavljivanja grešaka p o m o ć u izuzetaka. greške se m ožd a dešavaju d ru g im a. C iljevi o b ra d e grešaka u Javi su p o jed n o stav ljiv an je pravljen ja velikih. m o ž e d a z atra ž i p o v r a tn u v re d n o s t fu n k c ije p r in t f ( ). sn a ž n ih p ro g ra m a koji bi se lako održavali. vaš k o d bi se p retv o rio u nečitljivu n o ć n u m o ru . Tako se o b ra d a grešaka u jeziku C + + zasnivala na jeziku A da.

m o žd a u to m tr e n u tk u n e m a te d o v o ljn o in fo rm ac ija d a biste rešili p ro b lem . šta zaista zn ači k ad a je delilac nula? M ožda znate. O n skraću je pisan je k od a i o d v aja k o d k oji o p isu je šta želite d a u ra d ite to k o m n o rm a ln o g izvršavanja. d o b ro je prov eriti delilac u n ap red . kako ćete se izb oriti s d eliocem koji je n u la.. više n e m o rate da p rov erav ate greške p rilik o m p oziva m e to d a . p o što izuzetak g a ra n tu je d a će ih neko uh v atiti.izbacite“ iz tek u ćeg k on tek sta. . U to m tre n u tk u . Kao jed n o sta v a n p rim e r g en erisan ja izuzetka. Z bog tog a ga p ren o site n a viši nivo i p re d a je te n e k o m e ko je d o v o ljn o stru č a n da ga reši. čiji je z ad a ta k d a reši p ro b lem p rim e n o m d rugačijeg p ristu p a p ro b le m u . Osnovni izuzeci Vanredno stanje (engl. M e đ u tim . K ada se pojavi p ro b lem .346 Misliti na Javi Reč . ako je to n eo ček iv an a v re d n o st. m o ra li b iste d a tra ž ite o d re đ e n u g rešku i d a se s n jo m b o rite n a nekoliko m esta u p ro g ra m u . throw ing an exception). K ada n astan e izuzetak. s kojim m o žete d a se izb o rite u tek u ćem o k ru že n ju . a to je tzv. P rob lem rešavate na je d n o m m estu . o d k o d a koji se izvršava k a d a n ešto k ren e n aop ak o. M eđ u tim . O b ičn o je k o d za u p isivanje.. n e m o žete nastav iti o b ra d u zato što n e m a te n e o p h o d n e in fo rm acije da biste se izb o rili s p ro b le m o m u tekućem okruženju. u k o n tek stu p ro b lem a koji p o k ušavate da rešite o d re đ e n o m m e to d o m . dešava se n ekoliko stvari o d je d n o m . o p e ra to ro m new . P o tom se ak tu eln a p u ta n ja izvršavanja (o n a koja se ne m ože n astav iti) zaustavlja. M o žete sam o d a iskočite iz tekućeg o k ru ž en ja i da p ren esete p ro b le m u više o k ru žen je. Ipak. M ožete da pošaljete in fo rm ac ije o grešci u više o k ru žen je ako na p rav ite o bjekat koji p red stavlja te in fo rm acije i zatim ga . exception handler). exceptional condition) jeste p ro b le m koji sprečava n astavak ra d a tekuće m e to d e ili p ro g ra m sk o g blo k a. k o n tro lu izvršavanja p re u z im a m e h a n iz am o b ra d e izuzetaka i p o čin je da traž i odg ov arajuće m esto s kog bi se nastav ilo izvršavanje p ro g ra m a . ali ćete sig u rn o zn a ti d a p ro g ra m ne m ože tek tako da nastav i rad . što ćete h teti d a p ro v erite p re n eg o što p rek o te reference p o k u šate da pozovete neku m eto d u . Kada n astu p i v an re d n o stanje. To se dešava kada se p o jav i izuzetak. p o sm a tra jm o referencu na objekat koja se zove t. To se zove generisanje izuzetka (engl. a referenca n a o bjekat izuzetka izbacuje se iz tre n u tn o g ok ru žen ja. D a n e m a izuzetaka. Sa izuzecim a. čitanje i p ro n a la že n je grešaka m n o g o p reg led niji kad a se k oriste izuzeci nego kada se p rim e n ju je sta ri n a č in ra d a s greškam a. M o ra te se zau sta v iti i n ek o n egde m o ra sm isliti šta d a se rad i. M ože se desiti d a v am b u d e p ro sleđ e n a referenca koja nije inicijalizovana. Prvo. D a b i se izbeglo d eljenje n u lo m . Evo k ako izgleda: if(t = = n u ll) throw new Nul1P o in te rE x c e p tio n (). Jednostavan p rim e r je deljenje. s n jo m ne m o žete d a se izbo rite i zbog toga m o ra te da generišete izu zetak u m e sto da nastavite s to m p u ta n jo m izvršavanja. To o dg o v araju će m esto je blok za obradu izuzetaka (engl. V ažno je razlikovati v a n re d n o stanje o d u o b ičajen og p ro b lem a. m o žda n ećete zn ati kako d a ga o tk lo n ite . ili d a p ro sto nastav i izvršavanje o d neke d ru g e tačke. exception handler). blok za obradu izuzetaka (engl.izuzetak“ se k o risti u sm islu „o g rađ u jem se o d tog a“. p rav i se objekat izuzetka na isti n ačin kao svi d ru g i Javini o bjekti: u d in am ičk o j m em o riji. Još je d n a p riličn o k o risn a o so b in a izuzetaka jeste da o n i o b ičn o p o jed n o stav lju ju kod za o b ra d u grešaka.

izuzeci se uvek prave u dinam ičk o j m em o riji p o m o ć u o p e ra to ra new . p o što (u z m alo pažnje) u p ro g ra m u m o žete im a ti više m esta o p o rav k a. O b ič n o ćete generisati d ru g ačiju klasu izuzetaka za svaki tip greške. a izuzeci čuvaju te tran sak cije: „ . O b rad u izuzetaka p ojednostavljeno m ožete shvatiti kao drugačiji m eh a n iza m vraćanja rezultata. d o b ijen u referencu ćete p roslediti rezervisanoj reči th ro w .o s n o v n a p rem isa tran sak cija jeste d a u d is trib u ira n o m izraču n av an ju m o ra m o im ati o b ra d u izuzetaka.) Pored toga. u ra z g o v o ru o b ja v lje n o m n a www. . izuzetak će p o n iš titi taj n e u sp eh i v ra titi se n a p o z n a tu stab iln u ta č k u u p ro g ra m u . n aro čito u C -u . a d ru g i im a arg u m e n t tip a zn ako v nog niza u koji se m o g u sm estiti važne in fo rm acije o izuzetku: throw new Nul 1Po in terEK cep tio n C 't = n u l l " ) . T im e se postiže da se taj objekat v rati iz m etode. Ako b ilo šta p o đ e p o zlu. Jed an o d n ajvažn ijih asp ek ata izuzetaka jeste sledeći: u koliko se d o g o d i nešto loše. o n i p ro g ra m u n e dozvoljavaju d a n astavi izvršavanje svojom u o b ič a jen o m p u ta n jo m . Svaka sličn o st sa o b ič n im p o v ra tk o in iz m e to d e tu se i završava. (O brešćete se u o d g o v araju ćem b lo k u za o b ra d u izuzetaka koji n a steku s p o ziv im a p ro c e đ u ra m ože da b u d e u daljen više nivoa o d m esta gde je izuzetak nastao. Koje je to m esto. biće u sk o ro p o kazano. gde se ne m ože p rim o ra ti p ro g ra m d a p re k in e sa izvršavanjem k a d a n astan e p ro b le m .acmqucue. p a je p ro b le m e bilo m o g u će d u g o ig n o risati i ta k o zapasti u p o tp u n o n eo d g o v arajuće stanje. N akon što o p e ra to ro m new n ap ra v ite objekat koji pređstavlja izuzetak. p ro sto ćem o o d b ac iti sve to izračunavanje. kao što će u sk o ro biti p ok azan o . A ko n išta d ru g o . ili (u idealn o m slučaju) da n a te ra te p ro g ra m d a reši p ro b le m i v ra ti se u o d re đ e n o stab iln o stanje. a m eto d a ili p rogram ski b lo k se n ap u štaju . Izuzeci o m o g u ć av a ju d a sve što rad ite sm a tra te tran sak cijo m . to je zaista bio p ro b lem ."2 Izuzetke m o žete sm a tra ti i u g ra đ e n im siste m o m za p o n ištav an je. vraća se objekat izuzetka. Argumenti izuzetka P o p u t b ilo kog Javinog objekta.org. P ro b lem se. što je korenska klasa svih izuzetaka.. A ko je d a n d eo p ro g ra m a zakaže. U svakom slučaju. raz m a tra n a n ek o m d ru g o m m estu . m ad a ovu analogiju n e bi trebalo da shvatate suviše doslovno. izuzeci o m o g u ćav a ju d a prisilite p ro g ra m d a se zaustavi i sao p šti šta n e valja. R ezervisana reč th ro w p ro u zro k u je brojna zanim ljiva dešavanja. Taj o p e ra to r zau zim a p ro s to r u m em o riji i poziva k o n stru k to r. m ožete d a generišete proizvoljan objek at tip a T h ro w a b le . Z n ak ovn i niz se k asnije inože izdvojiti p o m o ć u razn ih m eto d a. I o b ičn i p ro g ram sk i blokovi m o g u se p rek in u ti generisanjem izuzetka. p o što se m e sto p o vratk a p o tp u n o razlikuje od m esta p o v ratk a iz u o b ičajen o g poziva m eto d e. iako o n a o b ičn o nije p ro jek to vana da vraća taj tip objekta. U svim sta n d a rd n im izu zecim a p o sto je dva k o n stru k to ra: jed a n je p o d razu m ev an i. d o b itn ik T ju rin g o v e n a g ra d e za d o p r in o s n je g o v o g tim a u o b la sti tra n s a k c ija . n ek im č u d o m . J Izjavio D ž im G re j.Poglavlje 12: Obrada grešaka pomoću izuzetaka 347 O v im se g eneriše izu zetak koji u tek u ćem o k ru ž e n ju o m o g u ću je odbacivanje o d g o v o rn o sti za ra z m a tra n je ove tem e.. T ransakcije su rač u n a rsk i ekvivalent u g o v o rn o g prava. U jezicim a kao što su C i C + + .

Blokovi za obradu izuzetaka G enerisani izuzetak m o ra negde da se završi. guarded region). B lokovi za o b ra d u izuzetaka slede o d m a h n ak o n isp itn o g b loka i o zn ačen i su rezervisan o m reči catch: tr y { // Kod k o ji može da generiše izuzetke } c a tc h (T ip l id l) { // Obrada izuzetaka tip a 1 } catch(Tip2 id2) // Obrada izuzetaka tip a 2 } catch(Tip3 id3) { // Obrada izuzetaka tip a 3 } // i t d .348 Misliti na Javi Inform acije o grešci su p redstavljene i u n u ta r o b jek ta izuzetka i im p lic itn o u im e n u klase izuzetka. Blok try A ko se n alazite u n u ta r m eto d e i g en erišete izu zetak (ili neka d ru g a m e to d a k o ju p ozivate iz te m e to d e generiše izuzetak). (T ip izuzetka je često jed in a inform acija. p rv o m o ra te da ra z u m e te p o ja m čuvane oblasti (engl. je r se njegova sv rh a ne p rep liće s p ro v erom grešaka. iza koga sledi k o d koji o b ra đ u je te izuzetke. Z avršiće se u bloku za obradu izuzetaka (engl. m o rali ste svaki p oziv m eto d e da o k ru ž ite k o d o m za p rip re m u i isp itiv an je grešaka. izu zetak će p ro u z ro k o v a ti n a p u šta n je m eto d e. d a bi neko u višem o k ru ž en ju shv atio šta da ra d i s vašim izu zetk o m . To je d eo k o d a koji m o že d a g en eriše izuzetke. Isp itn i b lo k je o b iča n p ro g ra m sk i b lo k isp red koga se nalazi rezervisana reč try : tr y { // Kod k o ji može da generiše izuzetke ) Kada ste pažljivo tražili greške u p ro g ra m sk o m jezik u koji ne p o d rža v a o b ra d u izuzetaka. try block). z ato što isp ro b av ate razn e pozive m eto d a. m o žete d a uv ed ete sp ecijalan b lo k u n u ta r te m eto d e koji će h vatati izuzetak. To se zove ispitni blok (engl. . Uz p o stu p a k o b ra d e grešaka koji se koristi u Javi. exception handler).. čak i ako ste istu m e to d u pozivali n ekoliko p u ta . sve što treb a ispitati sm ešta se u isp itn i blok. p o što se u n u ta r objekta izuzetka retk o čuva nešto k o risn o . To znači da se k o d m n o g o lakše piše i čita. .) Hvatanje izuzetka D a b iste videli kako se hvata izuzetak. a svi izuzeci se h v ataju na istom m estu . A ko ne želite da th r o w izazove izlazak iz m e to d e. Takav b lo k p o sto ji za svaki tip izuzetka koji želite d a o b rad ite.

D ru g i n a čin je d a se isp itn i b lo k sm esti u n u ta r petlje w h ile koja ulazi u taj b lo k sve d o k re z u lta t n e p o sta n e zadovoljavajući.3 gde se p retp o sta v lja d a je grešk a to lik o velika d a n e m a n a č in a v ra titi se n a m esto gde se desio izuzetak. nije toliko k o risn o u p raksi. ali v a m za o b ra d u sv ih tre b a sa m o je d a n blok. n a k o n čega se p o n o v o p o k u šav a s izvršavanjem neisp ravn e m eto d e p o d p retp o sta v k o m d a će p o n o v lje n o izvršavanje b iti uspešno.uzetaka očekuje d a u rad i n ešto kako bi rešio situ aciju . To otežava p isanje i o d ržav an je koda. Iako nastavljanje na prv i po gled izgleda privlačno . Java p o d ržav a m o d e l prekidanja (engl. n a k o n čega se sm a tra d a je izu ze tak o b ra đ e n . P y th o n . U koliko h o će te d a n astav ite izvršavanje. Ako n asta n e izuzetak. i da neće d a se v ra ća nazad . C # . Izvršava se sam o p rv i o d go v araju ći blok. id2 itd. P o to m se izvršava taj b lo k . pa m o žete da p rav ite sop stv en e izuzetke koji će n azn ačiti p o se b n e p ro b le m e n a koje vaša biblioteka m ože d a naiđe. znači da se i d alje n ad a te kako ćete n astav iti izvršavanje n ak o n o b ra d e izuzetka. Ako k o ristite ovaj m o d el. m e h an iza m njegove o b ra d e tra ž i p rv i b lo k čiji a rg u m e n t o d g o v a ra tip u izu zetka. term in a tio n ). T raženje blo kova za o b ra d u izuzetak a zaustavlja se p o izv ršav an ju to g b loka. . p o p u t a rg u m e n ta m eto d e. O b ra tite p a ž n ju n a to d a u n u ta r isp itn o g b lo k a n ekoliko poziv a različitih m eto d a m o ž e da generiše isti izuzetak. n e m o jte g en erisati izu zetak k ad a n aiđ ete n a grešku. Id en tifik ato r (id l. p o stu p a k se. A lternativa se naziva nastavljanje (engl. N ajvažniji razlog v ero v atn o je povezanost koja nastaje: nastavljački b lo k za o b ra d u m o ra d a zn a gde je izu zetak n asta o i m o ra sad ržati negeneričk i kod specifičan za m e sto p o jav ljiv an ja izuzetka. Blokovi za o b ra d u izuzetaka m o ra ju da slede o d m a h posle isp itn o g bloka. n aro čito u velikim sistem im a gde se izuzetak m o že p o jav iti na m n o g im m estim a. D itd .Poglavlje 12: Obrada grešaka pomoću izuzetaka 349 Svaka o d red n ica catch (b lo k za o b ra d u izu zetak a) n alik je m aloj m e to d i koja p rih v a ta sam o je d a n a rg u m e n t o d re d e n o g tip a. razlikuje o d n a re d b e Switch u kojoj je n a k o n svake o d re d b e case p o tre b n a n are d b a break da b i se sprečilo izvršavanje o stalih grana.) m o že se k o ristiti u n u ta r p ro ced u re. već p o zovite m e to d u koja rešava p ro b lem . ali a rg u m e n t ip ak m o ra d a postoji. Prekidanje ili nastavljanje? Postoje dva o sn o v n a m o d e la u te o riji o b ra d e izuzetaka. čak su i p ro g ra m e ri koji su ko ristili m o d el nastavljanja n a k raju o d ustajali od toga i počeli da k o riste isključivo m o d e l p rek id an ja. Istorijski gled an o . Id e n tifik a to r se p o n e k a d n e k o risti je r tip izu zetka p ru ža d o v oljn o in fo rm ac ija za o b ra d u . O n aj koji je g en erisao iz u ze tak o d lu č io je d a n e p o sto ji način za izlazak iz te situacije. ' K ao i v e ćin a je z ik a. P ro je k ta n ti h ije ra rh ije izuzetaka u Javi nisu m ogli da p red v id e sve greške koje b iste m o g li h te ti d a prijavite. resum ption). To zn ači da se o d blo k a za o b ra d u i/. in e đ u k o jiin a su C + + . Pmvljenje sopstvenih izuzetaka N iste p rim o ra n i d a k o ristite sam o p o sto jeće Javine izuzetke.

Ako rezultate šaljete u System. try { s e d .out. u o vo m slu čaju nećete d ob iti k o n stru k to r Je d n o s ta v a n lz u z e ta k (S trin g ). To je. N aravn o. najvažnija o so b in a izuzetka je im e klase. gde ga a u to m atsk i hvata i ispitu je sistem ove knjige za ispisivanje rezultata. ako je m og uće iz o n e ćije je značenje blisko sm islu novog izuzetka (m a d a to često nije m o gu će). ali o n se u p rak si retko k oristi. p a je u najvećem b ro ju slučajeva izuzetak p o p u t p rik azan o g sasvim zadovoljavajući.e rr. m o žd a ćete grešku hteti da pošaljete u s ta n d a rd n i izlazni to k za greške.p rin tln (''U h v a tio sam ga! " ) . M ožete n ap rav iti i klasu izuzetaka s k o n stru k to ro m koji im a a rg u m e n t tip a S trin g: //: iz u zeci/P o tp u n iK o n stru k to ri. o n i neće b iti p re u sm e re n i zaje dn o s p o d ac im a iz to ka System . M eđ u tim . O vde se rezu ltat štam p a na konzoli.out koji m o že biti p re u sm eren . o b ičn o . c lass Jednostavanlzuzetak extends Exception { } p ublic c la s s Nasleđivanjelzuzetaka { p ub lic void f ( ) throvvs Jednostavanlzuzetak { System . } p u b lic s t a t ic void m a in (S trin g [] args) { Nasleđivanjelzuzetaka sed = new N a sle đ iv a n je lz u z e ta k a (). Kao što ćete videti. } } . } catch(JednostavanIzuzetak e) { S y s te m .err. N ajp rostiji način za pisanje n ovog tip a izuzetka jeste p re p u s titi p re v o d io c u d a n a p ra v i p o d ra z u m e v a n i k o n stru k to r. što g otovo da ne zahteva p isan je koda: //: iz u zeci/N asleđ ivan jelz uz etak a. throw new Jednostavanlzuzetak ( ) .350 Misliti na Javi Vašu klasu izuzetka m o ra te d a izvedete iz neke o d po sto jećih klasa izuzetaka. tako što ćete je upisati u to k p o d atak a System.err.f ( ) .java c la s s Mojlzuzetak extends Exception { pu b lic M ojlzuzetakO {} pu b lic M ojIzu zetak(Strin g poruka) { su per(poruka). o n će a u to m a tsk i (i nevidljivo) p ozvati p o d raz u m e v an i k o n stru k to r osn o v n e klase. } } } /* Is p is : Bacam Jednostavanlzuzetak iz f ( ) Uhvatio sam ga! * ///:K ada p revodilac n ap rav i p o d razu m ev a n i k o n stru k to r. pa je veća verovatnoća da će ih k o risn ik p rim etiti.java // P r a v lje n je sopstvenih izuzetaka.o u t.prin tln("Bacam Jednostavanlzuzetak iz f ( ) " ) . bolje m esto za slanje inform acija o grešci o d to k a System.

p rin tln ("Iz b acu jem Mojlzuzetak iz metode f ( ) " ) .m ain (Potp u n iK on stru k tori.f(P o tp u n iK o n s tru k to ri.g (P o tp u n iK o n stru kto ri.Poglavlje 12: Obrada grešaka pomoću izuzetaka 351 p ub lic c lass PotpuniKonstruktori { pu b lic s t a t ic void f ( ) throws Mojlzuzetak { System .ja v a :ll) at Potpu niK on stru k tori. in fo rm ac ije odlaze u sta n d a rd n i izlazni to k za greške. throw new M ojIzuzetak("N astao u metodi g ( ) " ) . D odelite k o n stru k to ru za Exception arg u m en t tip a String. } } } /* Is p is : Izbacujem Mojlzuzetak iz metode f ( ) MojIzuzetak at P o tp u n iK o n s tru k to ri. j a v a :24) * ///:D o d a ti kod je k ratak i sadrži sam o dva k o n stru k to ra koji d efin išu n ačin p rav ljen ja izuzetka tip a Mojlzuzetak. throw new M o jIz u z e ta k ().o u t). U hvatite izuzetak u o đ red b i catch i o d štam p ajte arg u m e n t tip a String. } catch(M ojIzuzetak e) { e . M ed u tim . ako pozovete p o d ra z u m e v a n u verziju: e .o u t). U blok ov im a za o b ra d u izuzetaka poziva se jed n a o d Throvvable m eto d a: printStackTrace( ).out i au to m atsk i hvataju i isp isu ju na izlazu. Kao što vidite iz rezultata. p o m o ć u rezervisane reči super. O vde se in fo rm ac ije o p o lo žaju na steku izvršavanja šalju u to k po d atak a System.p rin tS ta c k T ra c e (S y s te m .o u t. tim e se d o b ijaju in fo rm acije o n iz u m e to d a koje su bile pozivane pre dolaska na m esto gde se desio izuzetak. } p ub lic s t a t i c void m a in (S trin g [] args) { try { f(). } pu b lic s t a t ic void g () throws Mojlzuzetak { Syste m . } try { g(). j a v a : 15) at Potpuni Konstruktori.p rin tln ("Iz b acu jem Mojlzuzetak iz metode g ( ) " ) .o u t. eksp lic itn o poziva k o n stru k to r o sn o v n e klase sa a rg u m e n to m tip a String.p rin tS ta c k T ra c e ( ) . . Vežba 1: (2) N apravite klasu s m e to d o m main( ) koja generiše izuzetak klase Exception u n u ta r bloka try.m ai n(Potpuni K o n s tru k to ri. U d ru g o m k o n stru k to ru se. D od ajte o d re d b u finally i o d šta m p a jte p o ru k u da biste dokazali da ste bili gde treba. } catch(M ojIzuzetak e) { e .java :1 9 ) Izbacujem Mojlzuzetak iz metode g () M ojlzuzetak: Nastao u metodi g () at Po tp u n iK o n stru k to ri.p rin tS ta c k T ra c e (S y s te m .

* . printStackTrace(new P r i n t W r i t e r ( t r a g ) ) . Izuzeci i zapisivanje Izlaz biste m o gli i da zapišete (engl.352 Misliti na Javi Vežba 2: (1) D efinišite referen cu n a o b je k at i in icijalizujte je vre d n o šć u null. e le m e n ta rn o zapisivanje je to lik o je d n o sta v n o da ga već ovde m o žem o u p o treb iti.u t il. p u b lic Z a p is iv a n je lz u z e tk a () { S trin g W r ite r trag = new S t r in g W r it e r ( ) .t o S t r in g O ). 2005 4:02:31 PM Z a p isivan je lz u z e tk a <init> .* . io .e rr. N ap išite m e to d u koja šta m p a saču vani znakovni niz. log) p o m o ć u m e to d a klase java. } c a tc h (Z a p isiva n je Iz u z e tk a e) { S y ste m .p r in tln ("U h v a tio " + e ). N apravite b lo k try-catch da biste isp ro b ali n o v izuzetak. c la s s Z ap isivan jelzu zetak a extends Exception { p riv a te s t a t i c Logger zapisnik = L o g g e r. //: iz u z e c i/ Z a p isiva n je lz u z e ta k a . } } } /* Is p is : (85% podudarnih podataka) Aug 30.p rin t1 n (''U h v a tio " + e ) .ja va // Izuzetak k oji se p r i j a v l j u j e preko Zapisnika. } try { throw new Z a p is iv a n je lz u z e tk a ( ) .g e tL o g g e r("Z a p is iv a n je Iz u z e tk a ").lo g g in g .net/B ooks/B ettcrJava.util. S ada sm estite k o d u b lo k try--catch d a biste u h v atili izuzetak. z a p is n ik .logging. U p o treb ite p etlju while koja se p o navlja sve d o k n e p resta n e generisan je izuzetka. N apišite k o n stru k to r za tu klasu koji p rih v a ta a rg u m e n t tip a String i sm ešta ga u objekat s referencom tip a String. P okušajte da pozo v ete m e to d u p o m o ć u te reference. } c a tc h (Z a p isiva n je Iz u z e tk a e) { S y s te m . 1 } p u b lic c la s s Z ap isivan je lzu zetak a { p u b lic s t a t i c void m a in (S trin g [] args) { try { throw new Z a p is iv a n je lz u z e tk a ().s e v e r e (t r a g . import ja v a . Vežba 5: (3) N ap rav ite o b ra d u izuzetka p o m o d e lu nastavljanja. Iako je zapisivanje d etaljn o o b jašn je n o u d o d a tk u n a lokaciji h ttp ://M indV iew . import j a v a . Vežba 4: (2) N ap rav ite so p stv en u k lasu izuzetaka k o rišćen jem rezervisane reči extends. Vežba 3: (1) N apišite k o d za g en erisan je i hv atan je izuzetka tip a ArrayIndexOutOfBoundsException (indeks n iza izvan d o zv o ljen ih g ran ica).e r r.

io .java // Z a p is iv a n je uhvaćenih izuzetaka. tj. e .lo g g in g .ja va :1 9 ) Uhvatio LoggingException Aug 30. ob jek at tip a Logger sa a rg u m e n to m tip a String (o b ičn o im e n o m p ak eta i klase u k o jim a je n asta la greška) koji svoj izlaz šalje u System.t o S tr i ng( ) ) . p u b lic c la s s Zapisivanjelzu zetaka2 { p r iv a te s t a t i c Logger zapisnik = Lo gger. } c a tc h (N u llPointerEx ception e) { z a p is ilz u z e ta k (e ).io. } } } /* Is p is : (90% podudarnih podataka) Aug 30. Iako je p ris tu p u p o tre b lje n u klasi Zapisivanjelzuzetka veo m a k o m fo ra n .Poglavlje 12: Obrada grešaka pomoću izuzetaka 353 SEVERE: Z ap isivan jelzu zetk a a t Z ap isivan je Iz u z e ta k a . zato što svu in fra s tru k tu ru zapisivanja u g ra đ u je u sam izuzetak i stoga rad i a u to m a tsk i b ez ikakve interven cije p ro g ra m e ra klijenta.io. pa p o ru k u za zap isn ik m o ra te d a generišete u b lo k u za o b ra d u izuzetaka: //: iz u z e c i/ Z a p is i va n jelzu zetak a2 . import j a v a .m a in (Z a p isiva n je Iz u z e ta k a .getLogger( ) p ra v i zap isn ik (engl. * . 2005 4:02:31 PM Z ap isivan jelzu zetk a <init> SEVERE: Z ap isivan jelz u z etk a a t Z ap isiva n je Iz u z e ta k a . 2005 4:07:54 PM Z apisivan jelzu zetaka2 z a p isiIz u z etak .err. stack trace) na m e stu gde je izu zetak bačen . zapi sni k .u t il.p rin tS tack T race(n e w P r in tW r it e r ( t r a g ) ) .getLo gg er("Zapisi va n je lz u z e ta k a 2 "). izlaz se m ože p re tv o riti u String m e to d o m to S trin g ( ). s e v e r e (tr a g .* . Za prav ljen je zn a k o v n o g niza p o ru k e za zapisnik. import ja v a . s t a t i c void z a p isiIz u z etak (Ex cep tio n e) { S trin g W r ite r trag = new S t r in g W r it e r ( ) . češće se dešava d a hvatate i zapisujete tu đ e izuzetke. m o ra m o u p o tre b iti p rek lo p ljen u printStackTrace( ) koja kao a rg u m e n t p rim a o b jek at java.ja va :2 4 ) Uhvatio Z a p isivan jelz u z etk a * ///:S tatičn a m e to d a Logger. logger). U za p isn ik se najlakše u p isu je ta k o d a se pozove m e to d a p rid ru ž e n a niv o u p o ru k e k o ju treb a zapisati. D a b ism o d o b ili String. (Sve će to b iti d e taljn o o b ja šn je n o u poglavlju Javin ulazn o -izla zn i sistem .PrintWriter. ovde je u p o tre b ljen a m e to d a sev ere( ).StringWriter.m a in (Z a p isiva n je Iz u z e ta k a . } p u b lic s t a t ic void m a in (S trin g [] args) { try { throw new Nul1Po in terE x cep tio n ( ) . hteli b ism o d a u p o tre b im o ispis steka (engl. ali m eto d a printStackTrace( ) p o d ra z u m e v a n o n e daje String.) U koliko PrintWriter k o n s tru k to r u p re d a m o o b jek at tip a java.

N u l 1PointerException a t Z a p isivan je Iz u z etak a2 . P r i n t . } try { h () . p u b lic M ojIzuzetak2() {} p u b lic M o jIzuzetak2 (Strin g poruka) { su per(po ruka). import s t a t ic n e t.o u t). } catch(M ojIzuzetak2 e) { e . 47).m in d v ie w .p rin tS ta c k T ra c e (S y s te m . in t x) { super(poruka). } p u b lic S trin g getMessage() { return "D etaljn a poruka: " + x + " "+ super. .la n g . } pu b lic s t a t ic void m a in (S trin g [] args) tr y { f0. throw new M o jIzu zeta k2 (). { } try { g(). throw new M ojIzuzetak2("Nastao u metodi h ( ) " .p rin tS ta c k T ra c e (S y s te m . } } p u b lic c la s s DodatniElementi { p ub lic s t a t ic void f ( ) throws MojIzuzetak2 { p rin t("Iz b acu jem MojIzuzetak2 iz metode f ( ) 1 1 ).354 Misliti na Javi SEVERE: java .m ain (Z ap isivan jeIz u z etak a2 . } p ub lic s t a t ic void h () throws MojIzuzetak2 { p rin t("Iz b acu jem MojIzuzetak2 iz metode h ( ) " ) . t h is .x = x. } pu b lic s t a t ic void g () throws MojIzuzetak2 { p rin t("Iz b acu jem MojIzuzetak2 iz metode g( ) " ) .o u t). } catch(M ojIzuzetak2 e) { e. M ožete da d o d a te sopstvene k o n stru k to re i članove: //: izuzeci/D o d atn iElem enti. getM essage(). p ub lic M o jIzuzetak2 (Strin g poruka. * . c la s s MojIzuzetak2 extends Exception { p riv a te in t x.java // Dodatno r a z v ija n je k lasa izuzetaka.ja va :1 6 ) * ///:P o stu p ak pravljenja so p stvenog izu zetk a m o že se p ro širiti.u til. } } p ub lic in t vred n o st() { retu rn x. throw new M ojIzuzetak2("Nastao u metodi g ( ) " ) .

java :3 9 ) Izbacujem MojIzuzetak2 iz metode h () M ojIzuzetak2: D etaljna poruka: 47 Nastao u metodi h () at D odatn iElem enti. P ored toga. N aravno. u deklaraciji m etode. D efinicija vaše m e to d e m ogla b i d a izgleda ovako: void f ( ) throws P r e v e lik i. S y s te m .v r e d n o s t ()). iza koje sledi spisak svih m o g u ć ih tipov a izuzetaka. Specifikacija izuzetaka U Javi bi tre b alo da o bav estite p ro g ra m e ra k lijen ta koji poziva vašu m e to d u o izuzecim a koje o n a m o že da generiše. uz m e to d u koja čita v re d n o st i d o d a tn i k o n stru k to r koji je postavlja. Prem ali. Java o b ezb eđ u je sin ta k su (i prim orava vas da je k o ristite) koja o m o g u ću je da učtivo kažete p ro g ra m e ru k lijen tu koje izuzetke g eneriše o d re đ e n a m eto d a. . (Tako se k oristi većina izuzetaka u Javinim b ib lio tek am a.v re d n o s t() = " + e . Pošto je izuzetak sam o vrsta objekta. red efin isan a je m e to d a Throwable. mai n(DodatniE1em enti.m ain(Dodatni Elem en ti. Ipak. . im ajte u v id u da p ro g ra m e ri k lijenti koji k oriste vaše pak ete m o žd a neče ni p rim e titi ulepšavanje.java :2 2 ) at Dodatni E lem e n ti. p o što o n aj koji poziva m e to d u ta d a ta č n o zna kako d a u h vati sve m ogu će izuzetke. To je učtivo. To je specifikacija izuzetaka i pojavljuje se n ak o n spiska arg u m e n a ta . } } } /* Is p is : Izbacujem MojIzuzetak2 iz metode f ( ) MojIzuzetak2: D etaljna poruka: 0 null at D o d atn iElem en ti.p rin tS ta c k T ra c e (S y s te m . java :3 4 ) Izbacujem MojIzuzetak2 iz metode g () MojIzuzetak2: D etaljna poruka: 0 Nastao u metodi g () a t D od atn iElem en ti. DeljenjeNulom { / / .java:44) e . M eto d a getM essage( ) liči na m e to d u to S trin g ( ) za klase izuzetaka. ako je d o stu p a n izvorni k o d .g(D odatniElem en ti. p ro g ra m e r k lijent bi m ogao da ga pregleda i p ro n a đ e sve n a red b e throw.h (D o datn iElem enti. D ok ažite d a o n e rade.getM essage( ) d a b i se d obila zanim ljivija d etaljn a p o ru k a .m ain(D odatniElem enti. Da bi se sprečilo pojavljivanje p ro b lem a .f(D o d atn iElem en ti.o u t).) V ežba 6: (1) N ap rav ite dve nove klase izuzetaka koje sam e a u to m a tsk i zap isu ju svoje izuzetke. p o što če v ero v atn o očekivati generisanje izuzetka i n išta više. java :2 6 ) a t DodatniElem enti.v re d n o s t() = 47 * ///:Klasi izuzetka d o d a to je polje x.java:30 ) at D odatniElem enti. .p r in tln ("e .Poglavlje 12: Obrada grešaka pomoću izuzetaka 355 } catch(M ojIzuzetak2 e) { e . Vežba 7: ( 1) Izm enite vežbu 3 tako d a o d re d b a catch zapisuje izuzetke.e r r. ali se b iblioteke često ne isp o ru č u ju sa izv o rn im k o d o m . Specifikacija izuzetaka k o risti d o d a tn u rezerv isan u reč throws. p o stu p a k p ro širen ja klasa izuzetaka m o žete još da nastavite.

o u t. N e m o žete d a lažete u specifikaciji izuzetka. . To je važ no i za p rav ljenje apstraktnih o sn o v n ih klasa i interfejsa čije će izvedene ldase ili realizacije m o ž d a gen erisati izuzetke. iako se to zap rav o ne dešava. naziv aju se provereni izuzeci. Isp ro b ajte svoju klasu i njen izu zetak u o d redbi try-catch. što će b iti o p isan o kasnije). ali m o žete da p o zo vete m e to d e njene natklase T h ro w ab Ie : S trin g getM essage( ) S trin g g etL o caIized M essag e() O n e d aju d e ta ljn u p o ru k u ili p o ru k u koja je p rilag o đ e n a o d re d e n o m lo k aln o m geografsk o m p o d ru č ju . S trin g to S trin g ( ) . koji b i ev en tu a ln o m ogli da slede. P ošto je klasa E x c e p tio n o sn o v a svih klasa izuzetaka koje su p ro g ra m e ru važne. P revodilac vam veru je i p rim o ra v a k o risn ik e d a s v ašo m m e to d o m ra d e kao da o n a zaista generiše taj izuzetak. Izuzeci koji se p roveravaju i n a m e ć u u v rem e p rev o đ en ja.p rin tln ("U h va ćen iz u z e ta k " ). ali je o sn o v a Exc e p tio n p rim e n ljiv a na skoro sve p ro g ra m e rsk e ak tiv n o sti): catch (Ex cep tion e) { Sy ste m . Vežba 8: (1) N apišite klasu s m e to d o m koja g eneriše izuzetak tip a d efin isan o g u vežbi 4. To se rad i h v atan jem o sn o v n o g tip a izuzetka klase E x c ep tio n (p o sto je i d ru g i tip o v i o sn o v n ih izuzetaka. p a kasn ije zaista m o žete d a gen erišete izuzetak n e m en ja ju ć i p o sto jeći kod. O je d n o j stvari m o žete lagati: m o žete tv rd iti d a se izu zetak generiše. p rev o d ilac će to o tk riti i sao p štiće v a m d a m o ra te o b ra d iti izu ze tak ili specifikacijom izu zetk a n azn ačiti d a ga vaša m e to d a m o ž e g enerisati. ako napišete: void f () { / / . Java je m č i d a će o d re đ e n nivo isp ra v n o sti izuzetaka b iti g a ran to v an to k o m prevođenja. . U k oliko k o d u n u ta r vaše m e to d e p ro u z ro k u je izuzetke. Hvatanje bilo kog izuzetka M oguće je n a p ra v iti b lok koji hvata bilo koji tip izuzetka. a m eto d a ih n e o b rad i. ovim p o stu p k o m ne d o b ija te m n o g o o d re đ en ijih in fo rm ac ija o izuzetku. } N a ovaj n a č in biće uhvaćen svaki izuzetak.356 Misliti na Javi M eđ u tim . pa bi ovakav blok tre b a lo staviti na kraj liste za o b ra d u . T im e se izbegava p re u z im a n je n ad ležn o sti o d blok o v a za o b ra d u k o n k re tn ih izuzetaka. to znači da m e to d a ne generiše nikakve izuzetke (sem izuzetaka n asle d en ih o d klase R u n - timeException koji se i bez specifikacije izuzetka m o g u gen erisati b ilo gde. P ok ušajte da je prevedete bez sp ecifik a đ je izuzetka i pog led ajte šta će vam reći prevodilac. D o d a jte o d g o v a raju ć u specifikaciju izuzetka. T im e se p o stiže u tisa k da je m e to d a m esto n a sta n k a izuzetka. P o d ržav an jem specifikacija izuzetaka o d d n a d o v rh a .

Stek izvršavanja p rik a zu je red osled poziva m eto d a koje su dovele d o m e sta gde je n a stao izuzetak.ja v a :8 ) * ///:- . e .Poglavlje 12: Obrada grešaka pomoću izuzetaka 357 V raća k ra ta k opis objekta. a d ru g a i tre ć a o m o g u ć u ju d a izab erete to k p o d a ta k a (u poglavlju faviti ulazno-izlazni sistem o b jasn iće m o zašto su p o d rž a n e dve vrste to k a ). čija je v red n o st o b jek at koji p red stav lja k lasu d a to g o b jek ta. p u b lic c la s s MetodeKlaseException ( p ub lic s t a t ic void main (S t r in g [] args) try { { throw new Exception("Evo iz u z e tk a '').m ain(M etodeKlaseException. p r i n t ( "getM essage(): " + e.u til . P r in t . Prva verzija k o risti sta n d a rd a n izlazni to k za greške. void p rin tS ta c k T ra c e () void p rin tS tack T race(P rin tS tream ) void p rintS tack T race(jav a. } } }/ * Is p is : Uhvatio sam izuzetak getMessage( ) : Evo izuzetka getLo calized M essag e(): Evo izuzetka t o S t r in g ( ) : j a v a . u k lju ču ju ći i d e ta ljn u p o ru k u ako p o sto ji. iz tip a Object koji je o sn o v n i tip svih o b jek ata.p rin tS ta c k T ra c e (S y ste m .java // Prikaz metoda klase MetodeKlaseException.Exception: Evo izuzetka p rin tS ta c k T r a c e (): j a v a . p rin t("g e tLo c a liz e d M e s sa g e (): " + e . d o b ija ju se i neke d ru g e m eto d e. O vo je korisn a funk cija u slučajevim a kad a aplikacija p o n o v o izbacuje p o sto je ć u grešku ili izu zetak (u sk o ro će b iti više reči o ovom e). 1ang. * . } catch(Exception e) { p rin t("U h v a tio sam iz u z e ta k ").o u t).P rin tW riter) Š tam p a ju opis o b iek ta i položaj n astan k a izuzetka n a stek u izvršavanja.g etL o ca lized M essa g ef)). P o red toga. ThrowabIe fillInStackTrace() In fo rm a c ije o tekuće m sta n ju slojeva steka beleži u o b je k tu tip a Throwable. p r in t("to S tr in g (): " + e ) .io . import s t a t ic n et. O n d a m o žete d a ispitate o b jek at tip a Class i p o m o ć u m e to d e getN am e( ) sazn ate im e klase i p ak eta. p r in t (" p r in t S t a c k T r a c e (): " ) .g etM essag e()) .1ang. Exception: Evo izuzetka at MetodeKlaseException.m in d view . Jedna k o ja b i m o g la d a b u d e k o risn a za izuzetke jeste getC lass( ). Evo p rim e ra koji ilustru je korišćenje o sn o v n ih m e to d a klase Exception: //: izuzeci/M etodeK1aseException. ili m eto d o m getSim pleN am e( ) saznate sam o im e klase. p a i o b jek ata tip a Throwable.

} p u b lic s t a t ic void main ( S t r i ng[] args) { f 0. je r je svaka n a d sk u p p re th o d n e . ali u p o tre b ite sam o je d n u odre d b u catch koja će u h v atiti izuzetke sva tr i tipa.ou t. U m eto d i m a in ( ) p o zo v ite m e to d u .g e tS ta c k T ra ce O ) System . System. } s t a t ic void h () { g ( ) . m e to d o m getStackTrace( ). N ap rav ite klasu s m e to d o m koja generiše sva tr i tipa izuzetaka.printl n ("------------------------------------. Poslednji ele m e n t niza." ) . ) catch (Exception e) { for(StackTraceElem ent ste : e .o u t. o d ko jih svaki p red stav lja p o jed an njegov sloj. O n a vraća n iz elem en ata steka. h ()." ) .358 Misliti na Javi V idite d a m e to d e re d o m o b e zb e đ u ju sve više info rm acija. p u b lic c la s s KoJeZvao { s t a t i c void f ( ) { // G eneriši izuzetak da bi na stek iz vrš a v a n ja upisao njegov // položaj nastanka try { throw new E x ce p tio n (). E le m en t b ro j n u la je n a v rh u steka i pred stav lja p o sled n ji p oziv m e to d e u to m n iz u (tačk u u kojoj je ovaj o b jek at izuzetka n a p rav ljen i bačen ). N ared n i p ro g ra m daje p ro stu ilustraciju: //: izuzeci/KoJeZvao.java // Programski pristup podacima o položaju nastanka izuzetka // na steku izvršavanja. jeste p rv i p oziv m e to d e u to m n izu.out. ) } s t a t i c void g () { f ( ) . Položaj nastanka izuzetka na steku izvršavanja In fo rm a đ ja m a koje daje printStackTrace( ) m o že se p ristu p iti i d ire k tn o .p rin tln ("-------------------------------.getM etho dN am e()) .p rintln (ste. o n a j koji je n a d n u steka. Vežba 9: (2) N ap rav ite tri nova tip a izuzetaka. g(). } } /* Is p is : f mai n f 9 mai n f 9 . S y s te m .

java // Prikaz metode f i 11In Stack T race() p u b lic c lass Ponovnogenerisanje ( pu b lic s t a t ic void f ( ) throws Exception { S y ste m . in fo rm acije koje štam p a te o n je m u u m eto d i printStackTracef ) p rip a d a ć e m estu porekla izuzetka.Poglavlje 12: Obrada grešaka pomoću izuzetaka 359 h mai n * ///:O vde sm o ispisali sam o im e m eto d e.p rin tln ("P ra v im izuzetak u metodi f ( ) “ ) . čuvaju se svi pod aci o izuzetku.println("Generisan je izuzetak"). } } p ub lic s t a t ic void h () throws Exception { try { f0 . Pošto već im ate referen cu n a aktueln i izuzetak. throw e. } p u b lic s t a t ic void g () throws Exception { tr y { f0. throw e. a ne m e s tu na k o jem ga p o n o v o generišete.e r r.out. sam o je p o n o v o izbacite: catch (Exception e) ( System. } catch(Exception e) { S y s te m . e . throw new Exception("Izbacen iz f ( ) " ) . izuzetak se p ro sled u je b lo k o v im a za o b ra d u izuzetaka u sledećem niv ou o k ru žen ja. N ove inform acije o sta n ju steka m o žete da up išete p o zivan jem m e to d e filllnStackTrace( ) koja vraća objek at izuzetka. Evo kako to izgleda: / / : izuzeci/Ponovnogenerisanje. n a ro č ito ako k o ristite klasu Exception za hvatan je svih izuzetaka. P o re d toga.o u t).p r in tS ta c k T r a c e ()" ) .o u t.p r in tln ("U metodi g ( ) . } catch(Exception e) { . ali vi m o žete d a ispišete ceo StackTraceElement koji sadrži d o d a tn e p o datk e. } P o n o v n im g en erisan jem . n a p rav ljen tako što su in fo rm acije o tek uće m sta n ju steka stavljene u stari objek at izuzetka. pa b lo k u višem o k ru ž e n ju koji hvata o d ređ en i tip izuzetka m ože da ih izdvoji iz tog objekta.p rin tS ta c k T ra c e (S y ste m . e . Ponovno generisanje izuzetka P o n ek ad ćete poželeti d a p o n o v o generišete izuzetak koji ste u p rav o uhvatili. A ko p o n o v o generišete tekući izuzetak. Sve kasnije n ared b e catch za isti b lo k try i dalje se z an e m a ru ju .

printStackTrace() java. M oguće je p o n o v o gen erisati izu zetak koji je različit o d o n o g koji je uhvaćen.lang.java:20) at Ponovnogenerisanje.fillInStackTrace().java:29) Uhvatio izuzetak u metodi main: printStackTrace() java. e.printStackTrace() java.println("Uhvatio izuzetak u metodi main: printStackTraceO").f(Ponovnogenerisanje.java:35) Uhvatio izuzetak u metodi main. } try { h().printStackTraceO").lang.printStackTrace(System.Exception: izbacen iz f() at Ponovnogenerisanje.java:7) at Ponovnogenerisanje.main(Ponovnogenerisanje.err.printStackTrace(System.lang. To p ro uzro k u je isti efekat k ao k o rišćen je m e to d e fillIn S ta ck T rac e ( ): g u b e se in fo rm acije o izv o rn o m p o rek lu izuzetka. e.printStackTrace(System.out).f(Ponovnogenerisanje. e.java:35) * ///:Red gde se poziva m eto d a fillIn S ta c k T ra c e () p o staje novo m esto p o rek la izuzetka. } } public static void main(String[] args) try { { g () .main(Ponovnogenerisanje. printStackTrace() java.f(Ponovnogenerisanje.java:24) at Ponovnogenerisanje.java:7) at Ponovnogenerisanje.java:11) at Ponovnogenerisanje.out. } } } /* Ispis: Pravim izuzetak u metodi f() U metodi g().h(Ponovnogenerisanje. a p re o sta ju in fo rm a c ije koje p rip a d aju n o v o m generisanju: .main(Ponovnogenerisanje.out).Exception: Izbacen iz f() at Ponovnogenerisanje. e. e.println("Uhvatio izuzetak u metodi main: printStackTrace()").g(Ponovnogenerisanje. } catch(Exception e) { System.g(Ponovnogenerisanje.out.lang. e.java:29) Pravim izuzetak u metodi f() U metodi h().main(Ponovnogenerisanje.out). throw (Exception)e.Exception: Izbacen iz f() at Ponovnogenerisanje.360 Misliti na Javi System.java:11) at Ponovnogenerisanje.h(Ponovnogenerisanje.Exception: Izbacen iz f() at Ponovnogenerisanje. } catch(Exception e) { System.println("U metodi h().java:7) at Ponovnogenerisanje.

throw new IzuzetakJedan("izbačen iz f ( ) " ) .N ovog. oomoću izuzetaka 361 //: izuzeci/PonovnogenerisanjeNovog.java:25) * ///:K onačan izuzetak zna sam o da je stigao iz u n u tra šn je g b lo k a try .printStackTrace(System.out. pa ih sakupljač sm eča a u to m atsk i briše.out.f(Ponovnogenerisan .out).java // Ponovno generisanje objekta koji se razlikuje or5 '^ivaćenog.o u t). } } class IzuzetakDva extends Exception { public IzuzetakDva(String s) { super(s). e . e . p r i n t S t r i k lr a c e ( ) " ) . e .njeNovog.p rin tS ta c k T ra c e () IzuzetakDva: iz unutrašnjeg bloka t r y at PonovnogenerisanjeNovog.p rin tS ta c k T ra c e (S y s te m . e .priri: ackTrace()").main(Ponovnogene. } } public class PonovnogenerisanjeNovog { public static void f ( ) throws IzuzetakJedan { System.main(Ponovnogenc . .Poglavlje 12: Obrada grešak<i. N e m o ra te u o pšte da b rin e te o b risa n ju p re th o đ n o g izu zetk a ili bilo kog d ru g o g izuzetka. throw new IzuzetakDva("iz unutrašnjeg bloka uy").println( "Uhvaćen u unutrašnjem bloku try. .java:20) Uhvaćen u spoljnom bloku t r y .out. } catch(IzuzetakJedan e) { System.java:15) at PonovnogenerisanjeNovog. } } } /* Is p is : Pravim izuzetak u metodi f ( ) Uhvaćen u unutrašnjem bloku t r y . { } } catch(IzuzetakD va e) { System .jeNovog. a ne iz f ( ).println("Pravim izuzetak u metodi f ( ) “ ) . p rin tS tack T race( IzuzetakJedan: izbačen iz f ( ) at PonovnogenerisanjeNovog. class IzuzetakJedan extends Exception { public IzuzetakJedan(String s) { super(s). Ti su ob jekti n a p rav ljen i o p e ra to ro m nevv u d in am ičk o j m em o riji. pri n tln ( "Uhvaćen u spoljnom bloku t r y . } public static void main(String[] args) try { try { f(). e. e.

} return r e z u lt a t . A ko h o ćete da u lan čite d ru g e tipove izuzetaka. a n e k o n stru k to ro m . f o r (0 b je c t [] obj : p o lja ) { re z u lta t. // Ilu s t r u je ulančavanje izuzetaka. Evo p rim e ra koji o m o g u ćav a d in am ič k o d o d av an je p o lja o b je k tu tip a DinamickaPolja u v rem e izvršavanja: //: iz u zeci/D in am ick aPo lja.a p p e n d (o b jl[ 1 ] ) . append( " : " ) . re z u lta t. e q u a ls ( p o l j a [ i ] [ 0 ] ) ) return i . * . Z anim ljivo je p rim e titi d a jed in e p o tk la se o d Throwable koje u k o n s tru k to ru p rim a ju a rg u m e n t uzrok jesu tr i o sn o v n e klase izuzetaka: E rror (p o m o ć u koje JVM prijavljuje sistem ske greške). if ( b r o jP o lj a = = -1) . Exception i RuntimeException.u til.java // Klasa koja sebi dinamički dodaje p o lja . ne izgubivši p o d a tk e o p rv o m . re z u lta t. p ub lic D in a m ick a Po lja(in t p o cetn aV elicin a) { p o lja = new O b je c t[p o c e tn a V e lic in a ][2 ].le n g th .m in d v ie w .4.362 Misliti na Javi Ulančavanje izuzetaka Č esto je p o tre b n o u h v atiti je d a n izu zetak i g en erisati d ru g i. r e z u lt a t . import s t a t ic n e t. i++) if ( i d . cause). Predviden o je d a uzrok b u d e p rv o b itn i izuzetak. P r i n t . i < p o cetn aV e licin a. return -1. P re objavljivanja JD K -a 1. } p riv a te in t getFieldNum ber(String id ) throws NoSuchFieldException { in t b ro jP o lja = h a s F ie ld (id ) . ali sada sve p o tk lase o d Throvvable im aju o p ciju d a u k o n s tru k to ru p rim e o b jek at uzrok (engl.to se naziva ulančavanje izuzetaka.a p p e n d (o b j[ 0 ] ) . i < p o lja . t o S t r i n g ( ) .a p p e n d (“ \ n " ) . } p riv a te in t h a s F ie ld (S trin g id ) { f o r ( in t i = 0. iako p rav ite i g en erišete d ru g i izuzetak. u ra d ite to m e to d o m in itC au se( ). p ro g ra m e ri su sam i m o rali da p išu k o d koji će očuvati p o d a tk e o p rv o b itn o m izu zetk u . n u ll } . čijim p ro sleđ iv an jem zadržavate položaj prv o g izuzetka na steku. f o r ( i n t i = 0. } p ublic S trin g to S trin g O { S trin g B u i1der re z u lta t = new S t r in g B u i1d e r ( ) . c lass IzuzetakD inam ickihPolja extends Exception {} p ublic c la s s Dinam ickaPolja { p riv a te O b ject[] [] p o lja . i++) p o l j a [ i] = new O b je c t[] { n u ll.

f o r ( i n t i = 0. return r e z u lta t. } p riv a te in t m akeField (Strin g id ) { f o r ( i n t i = 0. // Uzmi staru vrednost } catch(NoSuchFieldException e) { // Upotrebi konstruktor k o ji prima "cau se": throw new Runtim eException(e). // Rekurzivan poziv s proširenim poljim a: return m a k e F ie ld (id ). // U tim slučajevim a morate u p o tre b iti in itC a u s e (). IzuzetakD inam ickihPolja idp = new Iz u z e ta k D in a m ic k ih P o lja (). Object vrednost) throws IzuzetakD inam ickihPolja { if(v re d n o s t = = n u ll) { // Većina izuzetaka nema konstruktor k o ji bi primio argument "cau se". Object re z u lta t = n u l1.Poglavlje 12: Obrada grešaka pomoću izuzetaka 363 throw new N o Su ch Field Ex cep tio n ().in itC au se(new Nul 1Po in te rE x c e p tio n ( ) ) . if ( b r o jP o lj a = = -1) b ro jP o lja = m a k e F ie ld (id ). try { re z u lta t = g e t F ie l d ( i d ) . i < p o lja . nu ll } . p o lja = tmp. i < tm p. return i . return b ro jP o lja .length. Dodaćemo jedno: O b je c t [][] tmp = new 0 b je ct[p o l ja . } p u b lic Object s e t F ie ld (S tr in g id .le n g th + 1] [2 ]. i++) if (p o l j a [ i ] [0] = = n u ll) { pol j a [ i ] [0] = id . } pol ja [b ro jP o l ja ] [1] = vrednost. // dostupnu u svim potklasama od Throwable. i++) tm p [i] = new 0 b je c t[] { n u ll. p ri n t(d p ). } pu b lic Object g e t F ie ld (S tr in g id ) throws NoSuchFieldException { return p o lja[g e tFie ld N u m b e r(id )] [1 ]. . throw idp.le n g th . i++) tm p [i] = p o l j a f i ] . } in t b ro jP o lja = h a s F ie ld (id ) . f o r ( i n t i = p o lja .le n g th . } // Nema praznih p o lja . id p. } p ub lic s t a t ic void m a in (S trin g [] args) { Dinam ickaPolja dp = new D inam ickaPolja(3 ). i < p o lja .le n g th .

Ako .p rin tS ta c k T ra c e (S y s te m . p r in t ( d p ) . Kada p rav ite taj objekat. m e to d a setField( ) pribavlja i sta ru v red n o st na m estu tog polja m e to d o m getField( ) koja m o že generisati izuzetak NoSuchFieIdException. 48).s e t F ie ld (" d " . Prvi o b jek at je id e n tifik a to r p o lja (tip a String). i staviti u njega vašu v red n o st. .s e tF ie ld ("b r o j2 “ . 1ang.o u t). 47).s e tF ie ld ("d " . "Neka vrednost za d " ) .se tFie ld (D in a m ick a P o lja . // Izuzetak ( catch(NoSuchFieldException e) { e . d p . tako nazv an o p olje ili će n a p ra v iti novo.ja v a :66) . d p .364 Misliti na Javi try { d p . o n a če p ro n ači p ostojeće.g e tF ie ld ("d ") : Nova vrednost za d IzuzetakDi nam ickihPolja a t D in a m ick a Po lja .g e tF ie ld (\ ''d \ ") : 1 1 + d p .s e tF ie ld (D in a m ic k a P o lja .Nul1PointerException at D in a m ic k a P o lja . "Nova vrednost za d " ) .o u t). p rin tC 'd p . d p . U koliko joj p o n e sta n e p ro sto ra . } catch(Izuzetak D in am ick ihPolja e) { e . generisaće IzuzetakDinamickihPolja tako što će ga n ap rav iti i m e to d o m in itC au se( ) u m e tn u ti NullPointerException kao uzrok. d p . Object p o lje = d p . n u l l ) . Ako p o k u šate d a u n u tr a stavite v re d n o st null.j a v a :94) Caused by: j a v a . p rin t("d p : " + d p ).p rin tS ta c k T ra c e (S y s te m . p ravite zasn o v an u p retp o stav k u o to m e koliko v am p o lja treba.s e t F ie ld (" b r o j" . g e t F ie ld ( " d " )) .m ain(Dinam ickaPolj a .s e tF ie ld ("b r o j3 ". a d ru g i v re d n o st polja koja m ože b iti bilo kojeg tip a sem p ro sto g (bez o m o ta ča ). d o d aće ga p rav ljen jem niza d u žeg za je d a n i k o p iran jem starih elem en ata u njega. Kao p o v ra tn u v re d n o st. 1 more * ///:Svaki o b jek at tip a DinamickaPolja sađrži niz p arova Object-Object. Č im pozovete setFie!d( ). .s e tF ie ld ("d " .ja v a :6 4 ) at D inam ickaPolja. } } } /* Is p is : n u l l : n ull n u ll: n u ll n u l l : n ull d: Neka vrednost za d b ro j: 47 broj2 : 48 dp: d: Nova vrednost za d b ro j: 47 broj2: 48 broj3: 11 d p . 11).

V ažno je razu m eti šta su izuzeci i šta se s n jim a m ože u rad iti. Specijalan slučaj klase RuntimeException Prvi p rim e r u ovo m poglavlju bio je: i f(t = = n u l1) throvv new Nul 1P o in te rE x c e p tio n (). O klasi StringBuilder saznaćete više u poglavlju Z n a k o vn i nizovi . T estirajte k o d u m e to d i m a in ( ). ali zasad je d o voljno z n ati d a je treb a u p o treb ljav ati k ad g o d p išete u toS tring( ) koja o b u h v a ta k ru že n je u petlji. to je p ro g ra m sk a greška. Standardni izuzeci u Javi Javina klasa Throwable opisu je sve što se m o ž e g en erisati kao izuzetak. Vežba 10: (2) N aprav ite klasu s dve m eto d e. N ajbolji n ačin za pregled izuzetaka jeste čitan je H T M L d o k u m e n ta c ije Javinog razvojn o g o k ru ž e n ja (JD K ). ali u n u ta r o d re d b e catch o m o ta jte izu zetak m e to d e g ( ) u RuntimeException.Poglavlje 12: Obrada grešaka pomoću izuzetaka 365 p ro g ra m e r klijen t pozove getField( ). p ro st tip koji zan im a p ro g ra m e ra u Javi jeste Exception. Exception je p ro st tip izuzetka koji m o že n astati u b ilo kojoj m e to d i klase sta n d a rd n e Javine biblioteke. d a im e b u d e relativ n o očigled n o. to ne m o ra te da radite. P rem a to m e. ali ukoliko taj izuzetak b u d e g en erisan u n u ta r m e to d e setF ield( ). kao ovde. Error p red stav lja sistem ske greške i greške to k o m p rev o đ en ja koje nije n e o p h o d n o h v atati (o sim u sp ecijaln im slu čajev im a). je r je ovaj p o stu p a k deo s ta n d a rd n e provere .io. ali b rzo ćete shvatiti da se izuzeci ne razlik u ju n i p o čem u b itn o m . To vredi u ra d iti sam o je d n o m da bi se stekla p red stav a o različitim izuzecim a. Svaka n ov a bib lio tek a koju n abavite o d n ezav isn o g au to ra v ero v atn o će sad rža ti i sopstvene izuzetke. net i io. u h v atite n je n izu zetak i u o d re d b i catch g enerišite d ru g aćiji izu zetak (d ru g o g tip a koji ćete ta k o đ e sam i defin isati). kako bi se u tv rd ilo da li im a v red n o st n u ll (p o što ne zn a te da li je m e to d i p ro sle đ e n a isp rav n a referenca). U m e to d i g ( ) g en erišite izu ze tak n o vog tip a koji ćete definisati. o n je o d g o v o ra n za o b ra d u izuzetka NoSuchFieldException. osim po im en u . Srećom . pa se NoSuchFieldException p o m o ć u k o n stru k to ra koji p rim a a rg u m e n t cause p retv a ra u RuntimeException. neki su n ap rav ljen i rad i p o d ršk e d ru g im b ib lio tek am a kao što su util. M o žd a ste p rim e tili d a to S trin g ( ) u p o treb ljav a StringBuilder za p rav ljen je svog rezu ltata. svi u lazn o /izlazn i izuzeci izvedeni su iz klase java. O sn o v n a zam isao je da im e izuzetka p red stav lja p ro b lem koji se desio. broj izuzetaka u Javi staln o raste i b esm islen o je da se šta m p a ju u knjizi. N isu svi izuzeci d efinisani u b iblioteci java. Bilo bi stra šn o da m o ra te p roveravati svaku referencu koja se p ro sleđ u je m eto d i. što se m ože zaklju čiti iz p u n o g im e n a n jih o v ih klasa ili im ena klase iz koje su izvedeni. U m eto d i f ( ) p o zo v ite m e to d u g ( ). P ostoje dve opšte vrste o b jek ata tip a Throwable (vrsta o b jek ta = n asleđivanje iz). kao i u m e to d a m a koje sam i p rav ite i a k c id e n tim a p rilik o m izvršavanja.IOException. tj. f ( ) i g ( ). Takođe. Vežba 11: ( 1) P o n ovite p re th o d n u vežbu. Na p rim er.lang.

Z bog toga su g ornji red ovi k oda uvek suvišni. je r se o n o b ra đ u je a u to m atsk i. Ako je m e to d a po zv an a preko reference null.java:10) at NeHvataSe. P ostoji čitava g ru p a tip o v a izuzetaka koji p rip a d a ju ovoj k ategoriji i n jih Java uvek gen eriše au to m a tsk i. p a n e m o ra te d a ih n av o d ite u sp eđ fik aciji svojih izuzetaka. p o što su to neprovereni izuzeci (engl. p ošto prevodilac ne zahteva specifikaciju ovakvih vrsta izuzetaka.java:7) at NeHvataSe.java:13) . Izlaz u sistem skom to k u grešaka (System. Da b ism o videli šta će se desiti u to m slučaju.RuntimeException: Iz metode f() at NeHvataSe. Takođe. } public static void main(String[] args) { g().366 Misliti na Javi to k o m izvršavanja k o ju Java sp ro v o d i u m esto vas. } } ///:Već v id ite da je izuzetak tip a RuntimeException (i sve što je iz njega izvedeno) specijalan slučaj. a da n e b u d e uhvaćen.1ang.java // Zanemarivanje izuzetaka tipa RuntimeExceptions. ovakav izuzetak u o p šte n e m o ra te hvatati. n ik ad a n ije p o tre b n o d a pišete specifikaciju izuzetka koja će sao p štav ati d a bi m e to d a m ogla gen erisati izu zetak tip a RuntimeException (ili b ilo kojeg tip a n asleđeno g o d RuntimeException). Č ak i ako o b ič n o ne h v atate izuzetke tip a RuntimeException. } static void g() { f(). Pošto RuntimeException u k azu je n a greške u p ro g ra m ira n ju . unchecked exceptions). zvuči ra z u m n o d a bi izuzetak RuntimeException m o g ao d a se p ro širi sve d o m eto d e m a in ( ). p o g led ajm o sledeći p rim e r: //: izuzeci/NeHvataSe. Java će a u to m a tsk i g en erisati izuzetak tip a NullPointerException. k o d b i p o stao p rilič n o n ep reg led an . Z g o d n o je i to što su svi o n i g ru p isan i u n u ta r iste o sn o v n e klase RuntimeException koja p redstavlja savršen p rim e r nasleđivanja: uspo stav lja p o ro d ic u tip o v a d elim ičn o zajedničkih o so b in a i p o n a šan ja. K ada biste m o ra li d a tražite izuzetke tip a RuntimeException.err) izgleda ovako: Exception in thread "main" java.g(NeHvataSe. Šta se dešava ako ne u h v atite ovakav izuzetak? Pošto prev o d ilac ne zahteva specifikaciju takvog tip a izuzetaka.f(NeHvataSe. iako bi treb alo o b av iti d ru g e p rovere d a se n e bi p ojavio izuzetak NullPointerException.main(NeHvataSe. // {ThrowsException} public class NeHvataSe { static void f() { throw new RuntimeException("Iz metode f()"). m o žd a ćete o d lu č iti da u svojim p ak etim a generišete n e k u v rs tu ovakvog izuzetka.

2. izuzetak tip a ArrayIndexOutOfBoundsException znači d a je treb alo o b ra titi p a ž n ju n a d u ž in u n iza). Sada v am je ja sn o koliko je k o risn o p o sto jan je izuzetaka u o vo m slučaju . Vežba 12: (3) Izm en ite p ro g ra m unutrasnjeklase/Sekvenca.Poglavlje 12: Obrada grešaka pomoću izuzetaka 367 D akle. ko m p letan o d eljak za o b ra d u izuzetaka izgleda ovako: Try { // Čuvana o b la s t: Opasne ak tivn o s ti // koje mogu da generišu A. Da bi se p ostigao ovaj efekat. Izuzetak tip a RuntimeException z an e m a ru je te zato što p redstavlja grešku u p ro g ra m ira n ju : 1 . treb alo da p ro v erite u svom k o d u (np r. G reška k oju bi. ali je o d presu d n e važn o sti i za o d re đ e n e vrste p ro g ram ersk ih grešaka koje prevodilac n e m ože da otkrije.java tako d a generiše od g o v araju ći izu ze tak ako p o k u ša te d a u m e tn e te previše elem enata.olakšavaju p o s tu p a k p ro n a la žen ja i o tk la n jan ja grešaka. kao p ro g ra m er. G reška k o ju n e m o žete da o b ra d ite (p rim e ra rad i. p o š to se o s la n ja n a to d a će o v a k v u v rs tu čiš- . Z anim ljivo je p rim e titi d a se Javina teh nik a o b rad e izuzetaka ne m ože klasifikovati kao alatka specifične n am en e . često p o staje p ro b le m n a m e stu 2. odg o vor glasi: ako izuzetak tipa RuntimeException stigne sve d o m eto de m a in () a da ne b u d e uhvaćen. finally. p o što za o stale izuzetke prevo dilac zahteva o b ra d u . koristi se o d re d b a fin a lly 1 posle svih blokova za o b ra d u izuzetaka. Im ajte n a u m u da u svom k o d u sm ete d a zan e m a ru jete sam o izuzetke tip a RuntimeException. P rem a to m e . Čišćenje odredbom fin ally C esto p ostoie delovi k o d a koje želite da izvršite bez o bzira na to da li je u n u ta r isp itn o g b lo ka n asta o izuzetak. B i l i C } catch(A a l ) { // Procedura za obradu s it u a c ije A } catch (B b l) // Procedura za obradu s it u a c ije B } catch (C c l) // Procedura za obradu s it u a c ije C } fin a lly { // A k tiv n o sti koje se uvek dešavaju } 4 O b r a d a iz u z eta k a u je z ik u C + + n e m a o đ re đ b u ć c n ja o b a v lja ti d e s tr u k to ri. To je o b ičn o slučaj u n ek im o p eracijam a koje ne predstavljaju o p o ravak m e m o rije (p o što se o to m e b rin e sakupljač sm eća). p rilik o m izlaska iz p ro g ram a poziva se m eto d a printStackTrace( ) za taj izuzetak. O n a je projek to vana za rad s n ezgo dn im greškam a to k o m izvršavanja koje se dešavaju usled delovanja činilaca van d om ašaja vašeg koda. Izu zetak koji n astaje na m estu 1. p rim a n je reference null k o ju m eto d i p ro sleđ u je p ro g ra m e r k lijent).

kao što je ran ije p o m en u to . Na osno v u ovog p ro g ra m a m o žete zaključiti kako da se iz b o rite s čin jen ico m d a izuzeci u Javi n e dozvoljavaju vraćan je n a m esto n astan k a izuzetka. S y ste m . } catch (Izu zetak T ri e) { S y s te m . if ( b r o j = = 2) break. A ko b lok t r y sm cstite u n u ta r p etlje. . Uvek se zna tačno gde i kada d estru k to r biva pozvan.5 o d re d b a finally je važna zato što p ro g ra m e ru o m o g u ću je da g aran tu je o slo bađan je m em o rije.p rin tln ("B e z iz u z e ta k a "). p ub lic s t a t ic void m a in (S trin g [] args) { w h ile (tru e ) { try { // Sufiksno uvećavanje p rvi put daje vrednost nula: if(broj+ + = = 0) throw new Iz u z e ta k T ri( ) . // za vrsi p e tlju w hile } } } } /* Is p is : IzuzetakTri U bloku f i n a l l y Bez izuzetka U bloku f i n a l l y * ///:Iz rezultata vidite d a se o d re d b a fin ally uvek izvršava. bez o bzira na to šta se dešava u blok u try . U jeziku C + + d e stru k to r se poziva autom atski. } fin a lly { Sy s te m . Čemu služi odredba finally? U jeziku koji n em a sakupljač sm eća ni au to m atsk e pozive d e stru k to ra . M eđ u tim . p o k re n ite sledeći p rog ram : //: iz u z e c i/ P rim e rZ a F in a lly .p rin tln ("U bloku f i n a l l y " ) .o u t. bez o b z ira n a to da li se izuzetak generiše ili ne.368 Misliti na Javi D a biste se uverili d a se o d re d b a fin a lly uvek izvršava. c lass IzuzetakTri extends Exception { } p ub lic c la s s Prim e rZ a Fin a lly { s t a t ic in t broj = 0. M ožete da d o d a te i statički b ro jač ili neki drugi m eh an izam koji će o m o g u ćiti petlji da isp ro b a nekoliko p ristu p a pre nego što o d u stan e. Java im a sakupljač sm eća. pa o slo bađan je m em orije 5 D estru k to r je funkcija koja se poziva kad god neki objekat prestan e da se koristi. a i C# (koji je m no g o sličniji Javi) u m e da au to m atsk i un išti n ep o treb n e objekte.ja v a // Odredba f i n a l l y se uvek iz v rš a v a . Na taj n ačin vaši p ro g ra m i m o gu da p o sta n u rob usniji.p rin tln ("Iz u z e ta k T ri" ) .o u t.o u t. m ožete da uvedete uslov koji m o ra da b ud e zadovoljen pre nego što se n astavi izvršavanje p ro g ra m a .

n e m a d e stru k to re koji b i bili pozivani. } c a tc h (Iz u z e ta k P a liG a s il e) { S y s te m .ja v a import s t a t i c n e t.o u t. p u b lic c la s s Prekidac { p riv a te boolean s ta n je = f a ls e . b risan je nečega što ste n acrta li n a e k ra n u . pr. D akle.Poglavlje 12: Obrada grešaka pomoću izuzetaka 369 gotovo n ik ad nije pro b lem .u k lju c e n (). } } } /* Is p is : ukljucen is k l jucen * ///:- . p r i n t ( t h i s ) . k ad a u Javi treb a k o ristiti o d re d b u finally? O d re d b a lin a lly je n e o p h o d n a k ad a u p rv o b itn o stan je m o ra te d a v ra tite n ešto što nije m e m o rija .} p u b lic void is k lju c e n () { s ta n je = f a ls e . is k l j u c e n ( ) .. ili čak p ritisk a n je n ek o g prek id ača iz sp o ljn o g sveta.m in d v ie w . Uz to. To m ože b iti zatv aran je o tv o ren e d ato tek e ili rask id veze s m režo m .o u t. kao što je m o d e lo v an o u sledečem p rim e ru : //: iz u z e c i/ P a liG a s i. } p u b lic S trin g to S trin g O { retu rn s ta n je ? "u k lju ce n " : " is k lju c e n " . p u b lic boolean re a d () { retu rn s ta n je . f0. i skl jucen ( ) . pr.u til.ja va p u b lic c la s s Iz u z e ta k P a liG a s i1 extends Exception { } / / / :— //: i z u z e c i/Iz u z e ta k P a liG a s i2 . * . } p u b lic void u k lju c e n () { s ta n je = tru e . } c a tc h (Iz u z e ta k P a liG asi 2 e) { S y s te m .p rin tln ("Iz u z e ta k P a liG a s i1 ").p rin tln ("Iz u z e ta k P a liG a s i2 ").ja v a p u b lic c la s s Iz u z e ta k P a liG a s i2 extends Exception { } ///://: iz u z e c i/ P re k id a c P a liG a s i. p ub lic s t a t ic void f ( ) throws Iz u z etak P aliG asi 1. P r i n t .. p r . // Kod k o ji moze da generiše iz u z e tk e . } } III-/ / : iz u z e c i/ Iz u z e ta k P a liG a s i1. p r i n t ( t h i s ) . ja va // Čemu slu ž i odredba f i n a l l y ? p u b lic c la s s Prekid a c P a liG a s i { p riv a te s t a t ic Prekidac pr = new P re k id a c O . is k lj u c e n ( ) . Iz u z e ta k P a liG a s i2 {} p u b lic s t a t ic void m a in (S trin g [] args) { try { p r .

m in d v ie w . p ub lic s t a t ic void m a in (S trin g [] args) { try { pr. p a se pr. c la s s Iz u z e ta k C e tiri extends Exception { } p u b lic c lass U ve k Fin ally { p ub lic s t a t ic void m a in (S trin g [] args) Sy ste m .370 Misliti na Javi Cilj je o sig u rati d a p rek id ač b u d e isključen k ad a se završi izvršavanje m eto d e m a in ( ).o u t.. M eđ u tim .o u t.ja v a // F in a lly garantuje č iš ć e n je .u kl ju c e n ( ) .iskljucen( ) p rem ešten a n a m esto gde će se sig u rn o izvršavati bez o b zira na to šta se desi. // Kod k o ji može da generiše iz u z e tk e .p rin tln ( "Ulazak u p rvi is p it n i b lo k "). import s t a t ic n e t. finally će se izvršiti p re nego što m eh an izam za o b ra d u izuzetaka n astavi da traži b lo k za o b rad u na sledećem nivou: //: iz u z e c i/ U v e k F in a lly . try { { . P o m o ć u o d re d b e fmally. } c a tc h (Iz u z e ta k P a liG a s i1 e) { S y s te m .iskljucen( ) stavlja n a kraj isp itn o g b loka i n a kraj svakog b lo ka za o b ra d u izuzetaka. P r i n t . } ‘ } /* Is p is : ukl jucen is k lju c e n * ///:O v de je m e to d a pr. Ć ak i u slučajevim a kada se izuzetak ne u hvati u tek u ćem sk u p u blokova c a tc h .u til.p rin tln ( "Ulazak u drugi is p it n i b lo k ").isk lju cen ( ) bila preskočena. m og u će je d a n astan e izu zetak koji ovde nije uhv aćen. tr y { S y s te m . p a bi m e to d a pr. P r e k id a c P a liG a s i.p rin tln ("Iz u z e ta k P a liG a s i1 ").o u t.o u t. pu b lic c la s s U z F in a lly { s t a t ic Prekidac pr = new P r e k id a c (). is k l ju c e n ( ) . } catc h (Iz u z e ta k P a liG a si2 e) { S y s te m . ..f () . * . k o d za čišćenje m ožete d a sm estite u n u ta r isp itn o g b lok a n a sam o je d n o m m estu : // : iz u z e c i/ U z F in a lly .p rin tln ("Iz u z e ta k P a liG a s i2 ").ja v a // F in a lly se uvek iz vrš a v a . } fin a lly { p r .

} fin a lly { S y s te m .java m o že d a se p o k v ari tako što ćete generisati izuzetak RuntimeException u n u ta r b loka try.java ne zakazuje tak o što ćete g en erisati izuzetak RuntimeException u n u ta r b lo k a try.p r in tln ("F in a lly u prvom ispitnom b lo k u "). . m o g u ć je p o v ra ta k s više tačaka m eto d e . Vežba 14: (2) Pokažite da p rek id ač PrekidacPaliGasi. } f in a lly { S y s te m .o u t. pu b lic c la s s VisePovratakalzM etode { pu b lic s t a t ic void f ( i n t i ) { p r i n t ( " I n i c i j a l i z a c i j a koja zahteva č iš ć e n je " ).o u t.o u t . čak i ako je g enerisan izuzetak NullPointerException. Vežba 15: (2) Pokažite da UzFinally. Upotreba bloka finally tokom povratka iz metode pomoću rezervisane reči return Pošto se blok fin ally uvek izvršava.p rin tln ( "Uhvaćen Iz u z e ta k C e tiri u prvom ispitnom b lo k u ").m in d vie w .Poglavlje 12: Obrada grešaka pomoću izuzetaka 371 throw new Iz u z e ta k C e tiri( ) .u ti1. p rintC 'T ačka 2 " ). O b ra tite p a žn ju na sledeće: u z o zn ačen break i ozn ačen continue.java import s t a t ic n e t. } } c a tc h (Iz u z e ta k C e tiri e) { S y s te m . P r i n t . try { p rin t("T a čk a 1 "). *. } } } /* Is p is : Ulazak u prvi is p it n i bolk Ulazak u drugi is p it n i bolk F in a lly u drugom ispitnom bloku Uhvaćen Iz u z e tak C e tiri u prvom ispitnom bloku F in a lly u prvom ispitnom bloku } ///:N aredba finally će se izvršavati i u situ acijam a u k o jim a u čestv u ju n a re d b e break i continue. if(i = = 1) retu rn . if (i = = 2) retu rn . a d a se i dalje m ože jem čiti da će v ažno čišćenje b iti obavljeno: //: i zuzeci/Vi sePovratakalzM etode. fmally u kida p o tre b u za n are d b o m goto u Javi. Vežba 13: (2) P ro m en ite vežbu 9 d o d a v an je m o d re d b e finally. U verite se d a se b lo k finally izvršava.p rin tln ( " F in a lly u drugom ispitnom b lo k u ").

java tako da pokažete da se p ra v iln o čišćenje jem či čak i kada se p o v ra ta k rezerv isan o m rečju return obavi iz sred in e b lo k a try-finally. Mana: izgubljeni izuzetak R ealizacija izu ze tak a u Javi je izv an red n a. if (i = = 3) retu rn . m o g u će je da se izuzetak zagubi. To m o ž e d a se desi kada se k o risti o d re d b a finally: . i++) f(i). Iako izuzeci ukazuju na slabu tačk u u p ro g ra m u i ne b i n ik ad a sm eli da se ig n o rišu . Vežba 16: (2) P rep rav ite p ro g ra m ponovnaupotreba/CADSystem. i < = 4. } } /* Is p is : I n i c i j a l i z a c i j a koja Tačka 1 O b avljan je č išć e n ja I n i c i j a l i z a c i j a koja Tačka 1 Tačka 2 O b avljan je č iš ć e n ja I n i c i j a l i z a c i j a koja Tačka 1 Tačka 2 Tačka 3 O b avljan je č išć e n ja I n i c i j a l i z a c i j a koja Tačka 1 Tačka 2 Tačka 3 Kraj O b avljan je čišć e n ja zahteva č iš ć e n je zahteva č iš ć e n je zahteva č iš ć e n je zahteva č iš ć e n je * ///:Iz re z u ltata v idite da nije v ažn o gde se v raćate iz klase koja sadrži o d re d b u finally.372 Misliti na Javi p rin t("T a č k a 3 " ) . } fin a lly { p rin t("O b a v lja n je č iš ć e n ja '1 ). p r in t C 'K r a j " ). im a p ro p u sta . ali. i p o k ažite d a to rad i čak i kada se rezerv isan o m rečju return v ratite iz sre d in e b lok a try-finally. Vežba 17: (3) P reprav ite p ro g ra m polimorfizam/Zaba. re tu rn . } } p u b lic s t a t i c void m a in (S trin g [] args) { f o r ( i n t i = 1.java tako d a p rav iln o čišćenje jem či b lo k o m try-finally. n ažalost.

} } } /* Is p is : T r iv ij a l a n izuzetak * III-V idite d a n e m a n azn ak a o p risu stv u izuzetka tip a VeomaVazanlzuzetak koji je zam enjen izuze tkom tip a Trivijalanlzuzetak u o d red b i finally. je r znači da izuzetak m ože p o tp u n o da se izgubi i to na n ačin koji je m n o g o teže o tk riti nego u g o rn je m p rim e ru . } } catch (Exception e) { System . } } c la s s T riv ija la n lz u z e ta k extends Exception { p u b lic S trin g to S trin g O { return " T r iv ija la n iz u zeta k". } } p u b lic c la s s ZagubljenaPoruka { void f ( ) throws VeomaVazanlzuzetak { throw new VeomaVazanlzuzetakO. kao što je p o cisti( ) u g o rn jem p rim e ru .pri n t l n ( e ) . } fin a lly { lm . c la s s VeomaVazanlzuzetak extends Exception { p u b lic S trin g to S tr in g () { return "Veoma važan iz u z e ta k !". . try { lm .java // Kako se izuzetak može z a g u b iti. u jeziku C + + se situacija. M o žd a će u b u d u ć im verzijam a Jave ovaj p ro b lem b iti ispravljen (s d ru g e stra n e . To je p rilićn o o zb iljan n e d o sta tak.p o c is ti ( ) . m e to d u koja generiše izuzetak. o b ič n o ćete sm estiti u n u ta r o d re d b e try-catch). sm a tra velikom greškom u p ro g ra m ira n ju .Poglavlje 12: Obrada grešaka pomoću izuzetaka 373 // : izu zeci/Zag ub ljen aPoruka. } p u b lic s t a t ic void m a in (S trin g [] args) { try { ZagubljenaPoruka lm = new Z agu bljenaPoru ka().f ( ) . } void p o c is t iO throws T riv ija la n lz u z e ta k { throw new T r iv ija la n lz u z e t a k ( ) . N a su p ro t to m e.out . kad a se d ru g i izuzetak generiše pre nego što je prvi o b ra đ e n .

v idećete d a ništa n e ispisuje n a izlazu. naravno.ja va // R edefinisane metode mogu da generišu samo izuzetke navedene u njihovim // osnovnim klasama. ) fin a lly { // Upotreba rez ervisan e re č i 'r e t u r n ' u bloku f i n a l l y // svaki bačeni izuzetak č in i nemim. F o u l.ja v a public c la s s P ri