You are on page 1of 53

Laslo Kraus

PROGRAMSKI JEZIK

Java
sa reenim zadacima

AKADEMSKA MISAO
Beograd, 2013

Kraus: Knjiga Java.doc i 04.03.13 00:48


Laslo Kraus

PROGRAMSKI JEZIK JAVA


SA REENIM ZADACIMA

Recenzenti
Dr Igor Tartalja
Mr ore urevi

Lektor
Anelka Kovaevi

Korice
Zorica Markovi, akademski slikar

Izdava
AKADEMSKA MISAO
Bul. kralja Aleksandra 73, Beograd

tampa
Planeta print, Beograd

Tira
300

ISBN 86-7466-???-?

NAPOMENA: Fotokopiranje ili umnoavanje na bilo koji nain ili ponovno objavljivanje ove knjige - u
celini ili u delovima - nije dozvoljeno bez prethodne izriite saglasnosti i pismenog odobrenja izdavaa.

Kraus: Knjiga Java.doc ii 04.03.13 00:48


Duanki i Katarini

Kraus: Knjiga Java.doc iii 04.03.13 00:48


Predgovor

Ova knjiga predstavlja udbenik za programski jezik Java za iroki krug italaca. Knjigu
mogu da koriste i poetnici u programiranju, ali poznavanje osnovnih pojmova iz objektno
orijentisanog programiranja i programskih jezika C/C++ ili C# znatno olakava da se savla-
da materija iz ove knjige.
Programski jezik Java izloen je u obimu koji moe da zadovoljava i naprednije nepro-
fesionalne programere. Od ogromne standardne biblioteke klasa, koja prati jezik Java,
objanjeni su samo delovi koji su potrebni za efikasno programiranje pri reavanju veine
problema relativno visoke sloenosti.
Jedini nain da se naui neki programski jezik jeste da se piu programi na njemu. Ova
knjiga je u potpunosti podreena tom osnovnom naelu.
Uvodno poglavlje 1 sadri i informacije korisne pre svega za poetnike: osnovne poj-
move objektno orijentisanog programiranja, glavne osobine programskog jezika Java i
naina obrade programa u tekstualnom i grafikom okruenju.
U poglavlju 2 obraeni su podaci koji su predmet obrade u programima. Objanjen je
pojam tipa podataka, naini definisanja i korienja skalarnih brojanih, znakovnih i
logikih podataka. Da bi to pre mogli da se piu potpuni programi u ovom poglavlju je
obraena i ulazna i izlazna konverzija brojanih podataka. Naime, programi koji ne vre
itanje poetnih podataka i ispisivanje rezultata nemaju nikakvu upotrebnu vrednost.
Poglavlje 3 je posveeno operatorima i nainima sastavljanja izraza pomou njih. Tu su
obraeni operatori jezika Java koji itaocu s prosenim matematikim obrazovanjem ne bi
trebalo da budu strani. Prikazivanje nekih specifinijih operatora je odloeno za kasnije.
Kao proirenje skupa operatora dat je i pregled vanijih standardnih bibliotekih funkcija
koje postoje u jeziku Java. Odabrane su funkcije koje se odnose na optepoznate pojmove
iz matematike i na obradu ve objanjenih tipova podataka.
U poglavlju 4 prikazane su naredbe koje predstavljaju jedinine obrade u programima.
Pored prostih naredbi obraene su sloene naredbe jezika Java koje omoguavaju sa-
stavljanje sloenih programa na efikasan i pregledan nain: uslovno izvravanje (selekcije),
viestruko izvravanje (ciklusi) delova programa i upravljake naredbe (skokovi).
Iz matematike dobro poznati nizovni tipovi: vektori, matrice i viedimenzionalni nizovi
obraeni su u poglavlju 5.
Izuavanje objekto orijentisanog programiranja poinje u poglavlju 6 o klasama. Klase
su sloeni tipovi podataka koji programerima omoguuju modeliranje objekata iz realnog
ivota. Sastoje se od polja ije vrednosti ine stanja primeraka klasa i metoda koje definiu

Kraus: Knjiga Java.doc v 04.03.13 00:48


vi Predgovor

mogue naine korienja tih polja. Primerci klasa su podaci klasnih tipova i nazivaju se
objektima. Jedan od vanih elemenata ispravnog rada programa je pravilna inicijalizacija
objekata.
Programski jezik Java omoguava grupisanje srodnih klasa u pakete. U poglavlju 7
obraeni su paketi: njihovo formiranje i korienje.
Poglavlje 8 posveeno je sledeem fundamentalnom konceptu objektno orijentisanog
programiranja, nasleivanju. U grupama podataka koje su predstavljene klasama mogu da
se uoe podgrupe sa nekim specifinijim osobinama. Te podgrupe, predstavljene
potklasama, nasleuju osobine irih grupa, natklasa. lan podgrupe uvek moe da se koristi
i kao lan optije nadgrupe. U ovom poglavlju obraeni su specijalni apstraktni tipovi,
interfejsi, koji samo definiu odreene osobine koje klase koje ih ostvaruju treba da posedu-
ju, a ne i nain kako se te osobine ostvaruju.
U poglavlju 9 obraeni su ugneeni tipovi, klase i interfejsi koji su definisani unutar
drugih klasa i interfejsa.
Jezik Java omoguava da rukovanje izuzecima (grekama) vremenski ne optereuje
program sve dok se izuzetak ne pojavi. Kada se izuzetak pojavi, kontrola se automatski
predaje jednom od rukovalaca izuzecima koje je definisao programer. Nain rukovanja
izuzecima prikazan je u poglavlju 10.
U poglavlju 11 objanjeni su generiki tipovi i metode. Generike klase i metode omo-
guavaju pisanje klasa i metoda za obradu podataka, iji tipovi nisu poznati u vreme
njihovog pisanja, na bezbedan nain sa stanovita provera ispravnog korienja tipova po-
dataka. Generiki interfejsi, na slian nain, opisuju oekivane osobine buduih klasa u
uslovima kada tipovi pojedinih korienih podataka nisu poznati.
U poglavlu 12 izloeni su osnovni koncepti konkurentne obrade, obrade koja se sastoji
od istovremenog odvijanja vie tokova kontrole, vie istovremenih obrada. Ti tokovi kon-
trola nazivaju se niti, ija je korektna sinhronizacija osnova dobrog programa s
konkurentnom obradom.
Rukovodei se ve istaknutim naelom o uenju jezika, ova knjiga, pored manjih pri-
mera u toku izlaganja, na kraju svakog poglavlja sadri nekoliko reenih zadataka. Vie
zadataka moe da se nae u autorovoj zbirci Reeni zadaci iz programskog jezika Java
(videti [7]). Kroz zadatke u ovoj knjizi i u zbirci skree se panja na neke specifinosti
jezika Java i daju ideje za elegantno i efikasno reavanje nekih problema.
Ova knjiga je vie nego udbenik za programski jezik Java. Kroz reene zadatke prika-
zane su i primene osnovnih elemenata objektno orijentisanog programiranja, a na prime-
rima koji se uopteno sreu u raunarskoj tehnici: obradi redova, stekova, listi, tekstova,
datoteka itd. Posebna panja posveena je i inenjerskim aspektima programiranja. Nije
dovoljno da program reava zadati problem, ve treba da bude i lep, razumljiv, da se lako
odrava, da troi to manje memorije i da bude to efikasniji.
Svi programi koji se nalaze u ovoj knjizi potpuni su u smislu da mogu da se izvravaju
na raunaru. Provereni su na nekoliko raunara korienjem nekoliko razliitih prevodilaca
za jezik Java.
Izvorni tekstovi svih programa iz ove knjige mogu da se preuzmu sa Interneta, sa adrese
home.etf.rs/~kraus/knjige/. Na istoj adresi objavie se ispravke eventualnih, nak-
nadno otkrivenih greaka u knjizi. Svoja zapaanja itaoci mogu da upute autoru elektron-
skom potom na adresu kraus@etf.rs.
Laslo Kraus
Beograd, februara 2013.

Kraus: Knjiga Java.doc vi 04.03.13 00:48


Sadraj

Predgovor..............................................................................................................................v

Sadraj ................................................................................................................................vii

1 Uvod ............................................................................................................................1
1.1 O programskom jeziku Java ..............................................................................1
1.2 Uvod u objektno orijentisano programiranje .....................................................2
1.2.1 Apstrakcija..............................................................................................4
1.2.2 Uaurivanje.............................................................................................4
1.2.3 Nasleivanje...........................................................................................5
1.2.4 Polimorfizam ..........................................................................................6
1.2.5 Ponovno korienje koda........................................................................6
1.3 Osobine jezika Java ...........................................................................................6
1.4 Obrada programa na jeziku Java .......................................................................8
1.4.1 Obrada programa u tekstualnom reimu.................................................8
1.4.2 Obrada programa u grafikom reimu..................................................10

2 Podaci........................................................................................................................13
2.1 Elementi jezika Java ........................................................................................13
2.2 Identifikatori ....................................................................................................14
2.3 Tipovi podataka ...............................................................................................15
2.4 Brojani tipovi .................................................................................................16
2.4.1 Celobrojni tipovi podataka ...................................................................17
2.4.2 Realni tipovi podataka ..........................................................................17
2.5 Znakovni podaci...............................................................................................18
2.6 Logiki podaci .................................................................................................20
2.7 Niske ................................................................................................................20
2.8 Definisanje podataka........................................................................................20
2.9 itanje i pisanje podataka ................................................................................21
2.9.1 itanje podataka ...................................................................................22
2.9.2 Pisanje podataka ...................................................................................23
2.10 Primeri potpunih programa ..............................................................................26

Kraus: Knjiga Java.doc vii 04.03.13 00:48


viii Sadraj

3 Operatori ..................................................................................................................33
3.1 Aritmetiki operatori........................................................................................34
3.2 Operatori za dodelu vrednosti ..........................................................................36
3.2.1 Inicijalizacija i dodela vrednosti ...........................................................37
3.3 Pisanje sloenih izraza .....................................................................................37
3.4 Matematike funkcije.......................................................................................38
3.5 Konverzija tipa.................................................................................................39
3.6 Relacijski operatori ..........................................................................................41
3.7 Logiki operatori..............................................................................................41
3.8 Uslovni operator ..............................................................................................42
3.9 Operatori po bitovima ......................................................................................43
3.10 Operatori za niske ............................................................................................44
3.11 Pregled operatora .............................................................................................45
3.12 Zadaci ..............................................................................................................46
3.12.1 Povrina trougla u ravni........................................................................46
3.12.2 Pakovanje i raspakivanje vremena........................................................48

4 Naredbe.....................................................................................................................51
4.1 Prosta naredba..................................................................................................51
4.2 Sekvenca ili blok: {}.......................................................................................52
4.3 Doseg identifikatora.........................................................................................53
4.4 Selekcije...........................................................................................................55
4.4.1 Osnovna selekcija: if-else ...............................................................55
4.4.2 Generalizovana selekcija: if-else-if-else....................................57
4.4.3 Selekcija pomou skretnice: switch ..................................................58
4.5 Ciklusi..............................................................................................................59
4.5.1 Osnovni ciklus s izlazom na vrhu: while ...........................................59
4.5.2 Generalizovani ciklus s izlazom na vrhu: for .....................................60
4.5.3 Ciklus s izlazom na dnu: do .................................................................62
4.6 Skokovi ............................................................................................................63
4.6.1 Oznaene naredbe.................................................................................63
4.6.2 Iskakanje iz upravljake strukture: break ..........................................63
4.6.2.1 Selekcija alternativnih grana ...................................................64
4.6.2.2 Ciklus s izlazom u sredini .......................................................66
4.6.3 Skok na kraj ciklusa: continue.........................................................66
4.7 Zadaci ..............................................................................................................67
4.7.1 Reavanje kvadratne jednaine.............................................................67
4.7.2 Raunanje statistikih pokazatelja ........................................................70
4.7.3 Ispisivanje brojeva u binarnom sistemu................................................72

5 Nizovi.........................................................................................................................75
5.1 Definisanje nizova ...........................................................................................75
5.2 Inicijalizacija nizova ........................................................................................77
5.3 Pristupanje elementima niza: [] .....................................................................78
5.4 Dohvatanje duine niza: length ...................................................................78
5.5 Dodela vrednosti nizovnih promenljivih: = .....................................................79

Kraus: Knjiga Java.doc viii 04.03.13 00:48


Sadraj ix

5.6 Uporeivanje nizovnih promenljivih: ==, !=..................................................80


5.7 Nepravilni viedimenzionalni nizovi ...............................................................81
5.8 Obilazak elemenata niza: for .........................................................................82
5.9 Sakuplja otpadaka ..........................................................................................83
5.10 Zadaci ..............................................................................................................84
5.10.1 Skalarni proizvod dva vektora ..............................................................84
5.10.2 Ureivanje nizova brojeva ...................................................................86
5.10.3 Unija skupova .......................................................................................90
5.10.4 Transponovanje matrice........................................................................93
5.10.5 Stepenovanje simetrine matrice ..........................................................95

6 Klase..........................................................................................................................99
6.1 Definisanje klasa............................................................................................100
6.2 Pristupanje lanovima klasa...........................................................................100
6.3 Polja klasa ......................................................................................................101
6.4 Metode klasa ..................................................................................................102
6.4.1 Definisanje metoda .............................................................................103
6.4.1.1 Povratna vrednost metode .....................................................103
6.4.1.2 Parametri metode ..................................................................103
6.4.1.3 Telo metode...........................................................................103
6.4.1.4 Skriveni parametar metode....................................................104
6.4.1.5 Boni efekti metoda ..............................................................105
6.4.2 Pozivanje metode................................................................................106
6.4.3 Rekurzivne metode .............................................................................107
6.4.4 Metode s promenljivim brojem argumenata .......................................109
6.4.5 Preoptereivanje imena metoda ..........................................................109
6.5 Konstruktori ...................................................................................................111
6.6 Objekti ...........................................................................................................113
6.6.1 Definisanje objekata ...........................................................................113
6.6.2 Unitavanje objekata ..........................................................................114
6.6.3 Tekstualni prikaz objekata..................................................................115
6.7 Statiki lanovi klasa .....................................................................................116
6.8 Inicijalizacioni blokovi ..................................................................................118
6.8.1 Statiki inicijalizacioni blokovi ..........................................................118
6.8.2 Inicijalizacija klasa .............................................................................119
6.8.3 Nestatiki inicijalizacioni blokovi ......................................................120
6.8.4 Tok stvaranja objekata........................................................................120
6.9 Glavna metoda ...............................................................................................121
6.10 Dinamike strukture podataka .......................................................................122
6.11 Dijagrami klasa ..............................................................................................124
6.12 Zadaci ............................................................................................................127
6.12.1 Obrada taaka u ravni .........................................................................127
6.12.2 Obrada nizova taaka u ravni..............................................................130
6.12.3 Obrada jedinstvenih matinih brojeva graana ..................................134

Kraus: Knjiga Java.doc ix 04.03.13 00:48


x Sadraj

7 Paketi.......................................................................................................................139
7.1 Definisanje paketa..........................................................................................139
7.2 Korienje lanova paketa .............................................................................141
7.3 Potpaketi ........................................................................................................143
7.4 Uskladitavanje hijerarhije paketa .................................................................145
7.5 Uvoenje statikih lanova klasa ...................................................................146
7.6 Dijagrami klasa ..............................................................................................147
7.7 Paket java.lang ........................................................................................148
7.7.1 Usluna klasa za matematike funkcije..............................................148
7.7.2 Omotake klase za proste tipove ........................................................148
7.7.2.1 Brojani tipovi.......................................................................148
7.7.2.2 Znakovni tip ..........................................................................149
7.7.2.3 Logiki tip .............................................................................150
7.7.2.4 Automatsko pakovanje i raspakivanje...................................151
7.7.3 Klase za niske .....................................................................................152
7.7.3.1 Klasa za nepromenljive niske................................................152
7.7.3.2 Klase za promenljive niske ...................................................154
7.7.4 Klasa za sistemske radnje ...................................................................156
7.8 Paket java.util ........................................................................................156
7.8.1 Klasa Random....................................................................................157
7.8.2 Klasa Scanner .................................................................................158
7.9 Zadaci ............................................................................................................160
7.9.1 Obrada ravni s obojenim krugovima ..................................................160

8 Nasleivanje............................................................................................................169
8.1 Potklase..........................................................................................................170
8.1.1 Definisanje potklasa............................................................................170
8.1.2 Korienje lanova potklasa ...............................................................172
8.1.3 Sakrivanje lanova natklase................................................................174
8.1.4 Korienje lanova izvan potklase......................................................177
8.1.5 Konane metode .................................................................................178
8.1.6 Stvaranje objekata potklasa ................................................................179
8.2 Kompatibilnost tipova....................................................................................180
8.3 Nizovi ............................................................................................................183
8.4 Polimorfizam .................................................................................................184
8.5 Klasa Object ...............................................................................................186
8.6 Apstraktne klase.............................................................................................187
8.7 Interfejsi .........................................................................................................188
8.7.1 Definisanje interfejsa ..........................................................................189
8.7.2 Ostvarivanje interfejsa ........................................................................189
8.7.3 Viestruko nasleivanje interfejsa......................................................190
8.7.4 Podinterfejsi........................................................................................192
8.7.5 Prazni interfejsi...................................................................................193
8.7.6 Apstraktna klasa protiv interfejsa .......................................................193
8.8 Dijagrami klasa ..............................................................................................193

Kraus: Knjiga Java.doc x 04.03.13 00:48


Sadraj xi

8.9 Zadaci ............................................................................................................195


8.9.1 Obrada geometrijskih figura u ravni...................................................195
8.9.2 Ureivanje uporedivih objekata .........................................................202

9 Ugneeni tipovi.....................................................................................................209
9.1 Klase lanovi..................................................................................................210
9.1.1 Statike ugneene klase ...................................................................211
9.1.2 Unutranje klase .................................................................................213
9.2 Lokalne klase .................................................................................................215
9.3 Bezimene klase ..............................................................................................217
9.4 Interfejsi .........................................................................................................218
9.5 Zadaci ............................................................................................................220
9.5.1 Obrada redova objekata ......................................................................220

10 Izuzeci .....................................................................................................................225
10.1 Klase za izuzetke............................................................................................226
10.2 Prijavljivanje izuzetaka..................................................................................228
10.3 Rukovanje izuzecima .....................................................................................229
10.3.1 Naredba try ......................................................................................229
10.3.2 Izvravanja naredbe try....................................................................230
10.4 Kloniranje objekata........................................................................................232
10.5 Zadaci ............................................................................................................235
10.5.1 Obrada vektora zadatih opsega indeksa..............................................235
10.5.2 Izraunavanje odreenog integrala.....................................................240
10.5.3 Obrada predmeta koji mogu da se kloniraju .......................................248

11 Generiki tipovi i metode.......................................................................................257


11.1 Tipovne promenljive......................................................................................257
11.2 Generike klase i interfejsi.............................................................................258
11.2.1 Definisanje generikih klasa i interfejsa .............................................258
11.2.2 Konkretizacija generikih tipova ........................................................259
11.2.3 Uskladitavanje podataka u generike objekte ...................................260
11.2.4 Generiki nizovi .................................................................................261
11.2.5 Generike potklase i ugneene kalse................................................262
11.3 Generike metode ..........................................................................................263
11.3.1 Definisanje generikih metoda ...........................................................263
11.3.2 Pozivanje generikih metoda ..............................................................264
11.3.3 Automatsko odreivanje tipovnih argumenata...................................265
11.3.4 Generike metode u generikim klasama ...........................................266
11.3.5 Generiki konstruktori ........................................................................267
11.4 Ograniavanje tipovnih parametara ...............................................................268
11.5 Doker tip ......................................................................................................269
11.5.1 Upotreba doker tipa ..........................................................................269
11.5.2 Ograniavanje doker tipa ..................................................................271
11.6 Brisanje tipova ...............................................................................................273
11.7 Sirovi tipovi ...................................................................................................275

Kraus: Knjiga Java.doc xi 04.03.13 00:48


xii Sadraj

11.8 Zadaci ............................................................................................................277


11.8.1 Obrada generikih redova...................................................................277
11.8.2 Obrada napredne klase redova objekata .............................................280

12 Niti ...........................................................................................................................283
12.1 Niti u jeziku Java ...........................................................................................284
12.2 Stvaranje i izvravanje niti.............................................................................285
12.2.1 Stvaranje objekta niti ..........................................................................285
12.2.2 Vrsta niti .............................................................................................287
12.2.3 Ime i identifikator niti.........................................................................287
12.2.4 Prioritet niti.........................................................................................288
12.2.5 Tekstualni prikaz niti ..........................................................................288
12.2.6 Pokretanje niti.....................................................................................288
12.2.7 Dohvatanje trenutne niti .....................................................................289
12.2.8 Zahtev za prekidanje niti ....................................................................289
12.2.9 Zaustavljanje niti na odreeno vreme.................................................290
12.2.10 Ustupanje procesora .........................................................................291
12.3 Sinhronizacija niti ..........................................................................................291
12.3.1 ekanje da se nit zavri ......................................................................291
12.3.2 Sinhronizovani blokovi i metode........................................................292
12.3.3 Modifikator volatile.....................................................................294
12.3.4 ekanje na signal................................................................................295
12.3.5 Slanje signala......................................................................................296
12.4 Grupe niti .......................................................................................................298
12.5 Zadaci ............................................................................................................299
12.5.1 Zbirka s konkurentnim izraunavanjem ukupne veliine ...................299
12.5.2 Problem proizvoai/potroai...........................................................304

Literatura..........................................................................................................................313

Indeks ................................................................................................................................315

Kraus: Knjiga Java.doc xii 04.03.13 00:48


1 Uvod

1.1 O programskom jeziku Java


Programski jezik Java je vii programski jezik opte namene koji u potpunosti podrava pa-
radigmu objektno orijentisanog programiranja.
Java je vie od programskog jezika koji ima odreenu sintaksu i semantiku. Ona je pra-
vo programsko okruenje koje pomou ogromne biblioteke standardnih programskih mo-
dula podrava obrade bez kojih danas ne moe da se zamisli nijedan ozbiljan program. Tu
spadaju komunikacija sa korisnikom preko prozora, vienitna obrada, rad preko Interneta,
troslojna arhitektura rada s bazama podataka itd. Standardi programskih jezika do pojave
jezika Java te elemente nisu obuhvatali. Svaki proizvoa je uvodio nestandardna reenja
za njih, ograniavajui time prenosivost programa s jedne na drugu platformu.
Programski jezik Java je srodnik jezika C++ koji je direktni potomak jezika C.
Pogramski jezik C pojavio se poetkom 1970-tih godina i u osnovama je promenio
dotadanji, nesistematizovani, stil programiranja. Kroz podrku za strukturirano programi-
ranje obezbedio je da mogu da se napiu, razumeju i odravaju znatno vei programski
sistemi nego pre. Poto se u centru panje nalaze postupci koji se primenjuju na podatke, ta
tehnika programiranja naziva se i proceduralno programiranje.
Poto su jezik C projektovali programeri koji su i sami pisali programe, drugi programe-
ri su ga rado prihvatili i uskoro je postao jedan od najrasprostranjenijih programskih jezika,
koji se koristi i danas. Za autora jezika C smatra se Denis Rii (Dennis Ritchie) iz Belovih
laboratorija (Bell Laboratories).
Poetkom 1980-tih godina raunarski programi narasli su do takvih veliina da su se
tehnike proceduralnog programiranja pokazale neefikasnim. Reenje se nalo u paradigmi
objektno orijentisanog programiranja, kod koje se u centru panje nalaze podaci (objekti)
na koje se primenjuju neki postupci. Od programskih jezika koji su projektovani da podra-
vaju nove tehnike programiranja najvei uspeh je imala nadogradnja jezika C, koja je danas
poznata pod imenom C++ (++ je u jeziku C operator poveavanja!). Preko 95% jezika C
usvojeno je bez izmena i u jeziku C++.
C++ je hibridni jezik u smislu to, pored novijeg objektno orijentisanog programiranja,
podava i starije proceduralno programiranje.
Za autora jezika C++ smatra se Bjarn Strostrup (Bjarne Stroustrup).

Kraus: Knjiga Java.doc 1 04.03.13 00:48


2 1 Uvod

Poetkom 1990-tih godina pojavila se potreba za programima koji su u prevedenom


obliku nezavisni od platforme, tj. mogu da se izvravaju na bilo kom raunaru bilo kog
proizvoaa. Radilo se prvenstveno o programima za potrebe industrijske elektronike za
upravljanje kunim aparatima.
Postojei vii programski jezici bili su, bar teorijski, prenosivi na nivou izvornog teksta
programa. Taj tekst morao zasebno je da se prevede u izvodljivi oblik za svaku vrstu ra-
unara. To bi u uslovima naraslog broja razliitih platformi trailo izradu velikog broja
prevodilaca sa vieg programskog jezika na mainski jezik raunara. Trebalo je projektovati
programski jezik koji omoguava da prevedeni oblik programa bude nezavisan od platfor-
me na kojoj se izvrava.
Zbog toga je grupa programera u firmi Sun Microsystems, Inc. s Demsom Gazlingom
(James Gosling) na elu zapoela projektovanje novog programskog jezika koji je trebalo
da bude lak za korienje, pouzdan i nezavisan od platforme na nivou prevedenog oblika.
Taj jezik se u poetku zvao Oak (hrast), a ime Java dobio je 1995. godine.
Nekako ba u vreme razvijanja jezika Java poelo je intenzivno irenje Interneta i
posebno njegove usluge World Wide Web za pruanje najraznovrsnijih informacija, organi-
zovanih u takozvane "veb stranice", sa specijalnih servera do proizvoljnih klijenata irom
sveta. Veb stranice su u poetku bile statine: sadravale su samo tekstove i slike (u poet-
ku nepokretne, kasnije i pokretne). Za dinamini sadraj, koji podrazumeva i interakciju s
klijentima, trebalo je u veb stranice ugraditi male programe. Ti programi, poto bi se izvr-
avali na raunaru klijenta, morali su biti nezavisni od platforme i bezbedni da ne naprave
tetu na klijentskom raunaru.
Programski jezik Java imao je upravo te osobine, pa je dananju popularnost stekao
kroz takozvane aplete (applets), male programe koji se ugrauju u veb stranice. U meuvre-
menu apleti kao dinamini sadraj veb stranica prevazieni su, ali i nove tehnologije pro-
gramiranja za Internet u velikoj meri se oslanjaju na jezik Java.
Kao programski jezik opte namene, Java se koristi i za izradu samostalnih programa
koji se nazivaju aplikacije.
Programski jezik Java nema zvanian standard. Kao de facto standard uzima se specifi-
kacija koju je u poetku publikovala firma Sun Microsystems, Inc., a u novije vreme firma
Oracle, koja je kupila firmu Sun.
Jezik je jo u intenzivnom razvoju i publikovan je vei broj izdanja. Prvo izdanje je bila
verzija 1.0, ali je ubrzo zamenjena verzijom 1.1 koja nije donela bitne izmene. Verzija 1.2
donela je znaajne izmene i od tada se jezik skraeno zove Java 2, a punim imenom Java
J2SE (Java 2 Platform Standard Edition). Sledile su verzije 1.3 i 1.4 koje su donele manje
izmene. Verzija 1.5 donela je ogromne promene, pa da bi se to naglasilo, ta verzija je
proglaena verzijom 5 (Java J2SE 5). Aktuelna verzija u vreme pisanja ove knjige je 7.

1.2 Uvod u objektno orijentisano programiranje


U svakom raunarskom programu mogu da se uoe dve grupe elemenata: naredbe i podaci.
Naredbe odreuju ta se radi, a podaci ime se radi. Organizacija programa moe da bude
orijentisana ka jednoj od ove dve grupe elemenata.
Klasian stil programiranja okrenut je prema postupcima i naziva se proceduralno
programiranje (procedural programming). Po tom modelu program se sastoji od niza
uzastopnih koraka. Logike celine koraka mogu da se ostvaruju u obliku modula koji se

Kraus: Knjiga Java.doc 2 04.03.13 00:48


1.2 Uvod u objektno orijentisano programiranje 3

nazivaju potprogrami, procedure ili funkcije. Sloena obrada ostvaruje se kombinovanjem


takvih modula.
Mana ovakvog pristupa programiranju je veliki stepen povezanosti delova sloenog
sistema. To oteava odravanje i unapreivanje sistema. Da bi se unele nove mogunosti
esto je potrebno preraditi vrlo veliki deo ve gotovih delova programa.
Dva programska jezika koji podravaju proceduralno programiranje i koji su u dananje
vreme vrlo raireni jesu Pascal i C.
Savremen stil programiranja okrenut je prema podacima i naziva se objektno orijenti-
sano programiranje (OOP object-oriented programming). Po tom modelu program se
sastoji od objekata (objects) koji imaju neka mogua stanja i ponaanja. Stanja predstavlja-
ju vrednosti objekata, koje vremenom mogu da se menjaju. Ponaanja predstavljaju pravila
menjanja stanja, reakcije na uticaje okoline i naine uticanja na okolinu. Celokupna obrada
ostvaruje se u obliku meusobnih delovanja objekata u programu.
Svi objekti u programu grupiu se po svojim osobinama. Grupe objekata sa slinim oso-
binama ine klase (classes). Objekti iste klase imaju ista mogua stanja i ista ponaanja.
Objekti date klase predstavljaju pojedinane primerke svojih klasa.
Pojam klase i objekta najlake se shvata kroz primere iz svakodnevnog ivota. Pas
(klasa) je ivotinja sa svima poznatim optim osobinama i ponaanjem. Lesi (objekat) je
jedan tano odreeni pas s konkretnim osobinama (boja, teina, starost) i ponaanjem koje
se uklapa u ponaanje svih pasa. Drugi primer: automobil je opte ime (klasa) za sva prevo-
zna sredstva te vrste, dok je automobil BG0720AX jedan tano odreeni automobil (obje-
kat).
Klase su tipovi podataka prema definiciji tipova podataka u programiranju, jer odreuju
mogue vrednosti svojih primeraka i mogue radnje nad tim primercima. Po tome, objekti
su podaci klasnih tipova. Za razliku od prostih tipova podataka, kao to su celi brojevi ili
realni brojevi, klase su sloeni tipovi podataka.
Stanja objekata predstavljaju se podacima unutar objekata i koji se nazivaju polja
(fields). Polja mogu da budu podaci prostih i sloenih tipova. U proste tipove podataka
spadaju celi brojevi, realni brojevi itd., a u sloene tipove nizovi i klase.
Ponaanje objekata ostvaruje se postupcima unutar klasa koji se nazivaju metode
(methods). Metode odgovaraju funkcijama i procedurama u klasinim programskim jezi-
cima.
Polja i metode klasa zajednikim imenom nazivaju se lanovi (members) klasa.
Prednosti objektno orijentisanog programiranja ogledaju se u tome to je pri menjanju
mogunosti programskog sistema potrebno preraivati samo mali deo ve gotovog
programa. Ako se proire mogunosti neke klase nije potrebno promeniti i deo programa
koji koristi tu klasu. Naravno, pod uslovom da se nita ne promeni u nainu korienja
mogunosti klase koje su postojale i pre promene. Takoe, ako se u programski sistem
uvode nove klase, deo programa koji koristi samo stare klase ne treba promeniti.
Najvie zastupljeni jezici za objektno orijentisano programiranje su C++, Java i, u no-
vije vreme, C#.
Objektno orijentisano programiranje zasniva se na pet osnovnih principa: apstrakciji,
uaurivanju, nasleivanju, polimorfizmu i ponovnom korienju koda.

Kraus: Knjiga Java.doc 3 04.03.13 00:48


2 Podaci

Podaci su predmet obrade u programima. U vom poglavlju su uvedeni osnovni pojmovi o


podacima u programiranju i prikazani su prosti tipovi podataka koji se koriste u jeziku
Java.

2.1 Elementi jezika Java


Skup znakova (character set) koji se koristi u jeziku Java ine mala i velika slova engle-
skog alfabeta, mala i velika slova veine alfabeta sveta, deset decimalnih cifara i vei broj
znakova interpunkcije. Pravi se razlika izmeu malih i velikih slova kako u slubenim delo-
vima programa tako i unutar obinih tekstova.
U nastavku teksta pod pojmom slova podrazumevaju se mala i velika slova bilo kog al-
fabeta, a pod pojmom cifre decimalne cifre.
Mada jezik Java predvia upotrebu slova svih alfabeta, u slubenom delu jezika koriste
se samo slova engleskog alfabeta. Takoe, postoje radna okruenja koja ne podravaju upo-
trebu slova bilo kog alfabeta. Ona obino podravaju upotrebu slova engleskog alfabeta i,
eventualno, jo jedne grupe alfabeta. Na primer: latinina slovazapadno evropskih jezika,
latinina slova istonoevropskih jezika ili irilina slova.
Leksiki simboli (tokens) su nedeljivi nizovi znakova. U jeziku Java dele se na identifi-
katore, konstante, kljune rei, operatore i separatore. Leksiki simboli mogu da se piu, uz
nekoliko izuzetaka, spojeno ili meusobno razdvojeno proizvoljnim brojem belih znako-
va. Beo znak izmeu leksikih simbola je neophodan, ako bi se njegovim izostavljanjem
dobio drugi postojei leksiki simbol.
U bele znakove (white spaces) spadaju znak za razmak, tabulacija, vertikalna tabulaci-
ja, prelazak u novi red i prelazak na novi list.
U irem smislu, u bele znakove se ubrajaju i komentari. Komentari (comments) su proi-
zvoljni tekstovi koji su namenjeni itaocu teksta programa radi lakeg razumevanja namene
i funkcionisanja programa. Te tekstove prevodilac zanemaruje.

Kraus: Knjiga Java.doc 13 04.03.13 00:48


14 2 Podaci

U jeziku Java postoje tri vrste komentara:


Komentari zapoeti sa // obavezno traju do kraja reda i tu se zavravaju. Zgodni
su za kratke komentare iza slubenih elemenata s poetka reda.
Komentari stavljeni izmeu /* i */ mogu da se stave izmeu bilo koja dva
leksika simbola (kao i beli znakovi) i mogu da se proteu i kroz vie redova.
Mogu da poslue kao kratki umeci unutar redova ili da sadre dua objanjenja.
Komentari stavljeni izmeu /** i */ su takozvani dokumentacioni komentari.
Sadraj takvih komentara program javadoc iz kompleta JDK koristi za sasta-
vljanje dokumentacije programa. Mada i dokumentacioni komentari mogu da se
umeu unutar redova, oni se obino proteu na vie redova.
Naredbe (statements) su nizovi leksikih simbola. Dele se na deklarativne i izvrne
naredbe. Deklarativnim naredbama (declarative statements) definiu se neki elementi pro-
grama (podaci, funkcije, klase itd.), izvrnim naredbama (executive statements) izvode se
elementarne obrade.
Programi su nizovi naredbi pomou kojih se ostvaruju sloene obrade podataka. Jezik
Java ne postavlja nikakve uslove za rasporeivanje naredbi po redovima teksta programa.
Jedna naredba moe da se protee u vie redova i u jednom redu moe da bude vie
naredbi. Osnovno naelo treba da bude to vea preglednost teksta celokupnog programa.

2.2 Identifikatori
Identifikatori (identifiers) slue za oznaavanje svih vrsta elemenata programa: podataka,
simbolikih konstanti, tipova podataka koje definie programer, potprograma i oznaka koje
slue kao odredita za naredbe skokova.
Identifikatori mogu da se sastoje od slova, cifara, znaka podvueno (_) i znaka dolar
($). Prvi znak u identifikatoru ne sme da bude cifra. Upotrebu znaka $ treba izbegavati. On
je rezervisan za identifikatore koje razni alati za generisanje programskih tekstova generiu
automatski.
Pravi se razlika izmeu malih i velikih slova. To znai da su q i Q dva razliita identifi-
katora.
Identifikatori mogu da budu proizvoljno dugaki.
Kljune rei (keywords) jezika Java su rezervisane rei (reserved words) i ne mogu da
se koriste kao identifikatori. Te kljune rei su:
abstract assert boolean break byte
case catch char class continue
const default do double else
enum extends false final finally
float for goto if implements
import instanceof int interface long
native new null package private
protected public return short static
strictfp super switch synchronized this
throw throws transient true try
void volatile while
Rei const i goto su uvrtene u kljune rei, mada se ne koriste u jeziku Java, jer
njihova pojava u programu u bilo koje neslubene svrhe mogla bi da zbuni programere koji
su ranije koristili jezike C i C++.

Kraus: Knjiga Java.doc 14 04.03.13 00:48


2.2 Identifikatori 15

Primer 2.1 Ispravni identifikatori


alfa AnaVoliMilovana
ALFA vrloDugakoImeAMoeDaBudeJoIDue
Alfa $nePreporuujeSe$
x55_123 ime_i_prezime
datumRoenja

Uobiajeno je da se u identifikatorima koji su sastavljeni od vie rei poetna slova po-
jedinih rei piu velikim slovima, a ostala malim slovima.
Primer 2.2 Neispravni identifikatori
13a55 // Prvi znak ne sme da bude cifra.
alfa,beta // Znakovi interpunkcije nisu dozvoljeni.
xy // Operatori nisu dozvoljeni.
int // Rezervisane rei nisu dozvoljene.

2.3 Tipovi podataka


Podaci (data) su predmet obrade u programima. Svaki podatak ima odreene osobine koje
ine tip podatka. Tip podatka (data type) odreen je skupom moguih vrednosti koje moe
da uzme podatak i skupom moguih operacija koje mogu da se izvode nad podatkom.
Podaci u programu mogu da se predstavljaju pomou vrednosti ili pomou identifikatora.
Podaci predstavljeni pomou vrednosti ne mogu da promene svoje vrednosti u toku iz-
vravanja programa i nazivaju se konstante (constants). Na primer, 55 je celobrojna
konstanta, a 128.76 realna konstanta (u programiranju se koristi decimalna taka umesto
decimalnog zareza).
Konstantne vrednosti mogu da se predstave i pomou identifikatora i tada se nazivaju
imenovane konstante (named constants). Na primer, PI moe da bude imenovana kon-
stanta koja predstavlja iz matematike dobro poznatu vrednost 3,14159. Uobiajeno je da se
identifikatori imenovanih konstanti piu samo velikim slovima. Ako se sastoje od vie rei
koristi se znak podvueno (_) za razdvajanje rei (na primer: SVETLO_SIVA).
Smatra se da konstante ne zauzimaju prostor u memoriji raunara ve da se ugrauju
neposredno u naredbe programa.
Podaci predstavljeni pomou identifikatora (osim imenovanih konstanti) smetaju se u
memoriju raunara gde zauzimaju odreeni prostor. Vrednost podatka se smeta u taj pro-
stor. U nastavku pod pojmom podatak podrazumeva se samo ova vrsta podataka. Kon-
stante su izuzete iz ovog pojma jer one ne mogu da se obrauju, ve samo da se njihove
vrednosti koriste u izraunavanjima. Na primer, x, y, obim, alfa i poetnaBrzina mogu
biti identifikatori podataka.
Podacima koji su smeteni u memoriji raunara, obino, mogu da se promene vrednosti
u toku izvravanja programa. Takvi podaci nazivaju se promenljivi podaci ili krae pro-
menljive (variables).
Postoje, dodue ree, i podaci ije vrednosti ne mogu da se promene u toku izvravanja
programa. Oni se nazivaju nepromenljivi podaci. Ne nazivaju se konstante jer se smetaju
u memoriju kao i promenljivi podaci i ne mogu u programu da se koriste na isti nain kao i
gore definisane prave konstante.

Kraus: Knjiga Java.doc 15 04.03.13 00:48


16 2 Podaci

Podaci mogu da budu prosti ili sloeni.


Podaci prostih tipova (primitive types) ili prosti podaci (primitive data) ne mogu da se
rastave na manje elemente koji bi mogli nezavisno da se obrauju. Zato se kae da oni
nemaju strukturu. Nazivaju se i nestrukturirani podaci ili skalarni podaci. U jeziku Java,
prosti podaci su brojani, znakovni i logiki podaci.
Podaci sloenih tipova (compound types) ili sloeni podaci (compund data) sastoje se
od nekoliko elemenata koji mogu da se nezavisno obrauju. Elementi sloenih podataka
mogu da budu prosti, ali i sami mogu da budu sloeni. Na taj nain je broj razliitih sloe-
nih tipova podataka, koji mogu da se izvode, polazei od prostih tipova podataka, neograni-
en. Poto sloeni podaci imaju odreenu strukturu nazivaju se i strukturirani podaci. U
jeziku Java, sloeni podaci su nizovi i klase.
Prema nainu uskladitavanja i pristupanja, podaci se dele na vrednosne i pokazane.
Promenljiva vrednosnog tipa (value type) sadri vrednost podatka koga predstavlja (sli-
ka 2.1.a). Pod vrednou promenljive podrazumeva se vrednost sadranog podatka. Opera-
cije nad promenljivom obrauju taj, neposredno, sadrani podatak. Promena vrednosti jed-
ne promenljive nikad ne utie na vrednost druge.

x: 8 a: 5 0 2 7 9 3 4

y: 2 b: 7 9 2 6 8

z: 5 c:

a) vrednosni b) pokazani
Slika 2.1 Vrednosni i pokazani podaci

Promenljiva pokazanog tipa (reference type) sadri samo adresu mesta (pokaziva
pointer, reference) u memoriji gde se nalazi vrednost predstavljenog podatka (slika 2.1.b).
Pod vrednou promenljive podrazumeva se vrednost pokazanog podatka, a ne vrednost ne-
posredno sadranog pokazivaa. Operacije nad promenljivom obrauju pokazani podatak, a
ne neposredno sadrani pokaziva. Vie promenljivih mogu da pokazuju na fiziki isti
podatak. U tom sluaju promena vrednosti jedne promenljive promenie i vrednost ostalih
promenljivih koje predstavljaju (pokazuju na) isti podatak. Na primer, na slici 2.1.b
promenljive b i c predstavljaju isti niz brojeva. Ako se promeni vrednost broja b2, promeni-
e se i vrednost broja c2.
U jeziku Java prosti tipovi su vrednosni, a sloeni tipovi pokazani tipovi podataka.
U nastavku ovog poglavlja obraeni su prosti tipovi podataka u jeziku Java.

2.4 Brojani tipovi


Brojani tipovi (numeric types) podataka jesu prosti tipovi za koje su definisane aritmetike
operacije. Meu njima posebno se razlikuju celobrojni i realni tipovi.

Kraus: Knjiga Java.doc 16 04.03.13 00:48


3 Operatori

Operatori predstavljaju radnje koje se izvravaju nad operandima dajui pri tome odreeni
rezultat. Izrazi (expressions) su proizvoljno sloeni sastavi operanada i operatora. Opti
oblik izraza u jeziku Java je:
konstanta ili
promenljiva ili
operator izraz ili
izraz operator ili
izraz operator izraz ili
izraz ? izraz : izraz ili
( izraz )

Najjednostavniji izraz se sastoji od jedne konstante ili od jedne promenljive.


Sloeniji izrazi se dobijaju primenom operatora na operande. Poto operandi mogu
da budu rezultati ranijih izraunavanja u gornjem optem obliku su obeleeni sa izraz.
Operatori mogu da se primenjuju na jedan operand (unarni operatori) ili na dva operan-
da (binarni operatori). U jeziku Java postoji i jedan operator s tri operanda (ternaran opera-
tor).
Unarni operatori mogu da stoje ispred operanda (prefiksni operatori) ili iza operanda
(postfiksni operatori).
Binarni operatori uvek stoje izmeu svoja dva operanda (infiksni operatori).
Upotreba ternarnog operatora ?: oznaava se stavljanjem znaka pitanja izmeu prvog
i drugog operanda i dve take izmeu drugog i treeg operanda.
Na kraju, izraz po potrebi i po elji moe da se stavlja unutar para oblih zagrada ().
Njihova uloga je da izdvoje deo sloenog izraza kao neku manju celinu i da time utiu na
redosled izraunavanja operatora.
Rezultat izraunavanja moe biti:
promenljiva neto to je u memoriji (lvrednost u jezicima C/C++),
vrednost,
nita oznaava se sa void (moe biti samo rezultat metoda koje su tako obe-
leene 6.4.1.1, 103).
Postoje operatori za koje neki od operanada mora da bude promenljiva. Ako pri objanja-
vanju pojedinih operatora nije posebno naglaeno, operandi ne moraju da budu promenljive.

Kraus: Knjiga Java.doc 33 04.03.13 00:48


34 3 Operatori

Boni efekat (side effect) predstavlja promenu vrednosti nekog od operanada operatora
u toku izvravanja operatora. Rezultat izraunavanja je vrednost izraza i moe da se koristi
kao operand u daljim izraunavanjima. Ako se to ne radi, vrednost izraza se odbacuje.
Trajni rezultati mogu da se dobiju samo kao boni efekti operatora. Za operatore koji
proizvode bone efekte posebno je to naglaeno prilikom objanjavanja tih operatora.
Redosled izvravanja operatora prvenstveno se odreuje oblim zagradama ( i ). Unu-
tar para oblih zagrada mogu da budu ugneeni drugi parovi zagrada do proizvoljne dubine.
Operatori unutar para zagrada izvravaju se pre operatora izvan tih zagrada.
Operatori unutar zagrada izvravaju se po redosledu prioriteta (priority) ili prvenstva
(precedence) operatora. Od dva susedna operatora, operator s viim prioritetom izvrava se
pre operatora s niim prioritetom. U jeziku Java postoje ukupno 16 nivoa prioriteta. Najvii
prioritet ima nivo 16, a najnii nivo 1.
U sluaju niza operatora meusobno jednakih prioriteta, operatori e biti izvravani sle-
va nadesno ili zdesna nalevo, u zavisnosti od njihovog smera grupisanja. Na datom nivou
prioriteta svi operatori se grupiu u istom smeru.
Kod binarnih operatora uvek se prvo izraunava levi i tek posle toga desni operand, bez
obzira na smer grupisanja. Ovo pravilo je vano u sluajevima kada je jedan od operanada
izraz koji pravi i bone efekte.
U jeziku Java postoje sledee vrste operatora (po opadajuem redosledu prioriteta):
aritmetiki operatori,
operatori sa niskama,
relacijski operatori,
operatori za rad s bitovima,
logiki operatori,
operatori za dodelu vrednosti.

3.1 Aritmetiki operatori


Aritmetiki operatori imaju brojane operande i daju brojane rezultate. Slue za obavljanje
uobiajenih aritmetikih operacija.
Binarni operatori +, , *, / i % izraunavaju zbir, razliku, proizvod, kolinik i ostatak
posle deljenja dva broja, respektivno.
U sluaju deljenja dva cela broja razlomljeni deo se prosto odbacuje, tj. ne vri se zao-
kruivanje. Ovakva operacija naziva se i celobrojno deljenje.
Tipovi operanada operatora % moraju da budu jedan od celobrojnih tipova, a predznak
rezultata je jednak predznaku prvog operanda.
Operatori + i imaju prioritet 11, a operatori *, / i % prioritet 12. Svi ovi operatori se
grupiu sleva nadesno.
Primer 3.1 Izrazi s binarnim aritmetikim operatorima
a + b c // (a + b) c
a + b * c // a + (b * c)
a / b * c // (a / b) * c
7 / 4 * 3 // 3 ali
7 * 3 / 4 // 5 za razliku od
7. / 4. * 3. // 5.25 i od
7. * 3. / 4. // 5.25
7 % 3 // 1
9 % 3 // 0

Kraus: Knjiga Java.doc 34 04.03.13 00:48


3.1 Aritmetiki operatori 35

Prvi izraz prikazuje izraz s dva operatora istog prioriteta. Poto se ovi operatori gru-
piu sleva nadesno, prvo se izvrava operator +. Rezultat tog izraunavanja predstavlja
prvi operand operatora . U drugom izrazu operator * ima vii prioritet, pa se prvo izvra-
va taj operator. U treem izrazu, opet, oba operatora su istog prioriteta, pa se oni izvrava-
ju sleva nadesno.
etvrti i peti izraz pokazuju da u sluaju celobrojnih operanada nije sve jedno po kom
se redosledu piu operatori i operandi ako meu njima ima i operatora za deljenje. Dva
izraza, koja bi matematiki gledano trebalo da daju isti rezultat, daju razliite vrednosti. To
nije sluaj kod raunanja s realnim podacima, kao to to pokazuju esti i sedmi izraz.
Osmi i deveti izraz prikazuju nalaenje ostatka deljenja prvog celobrojnog operanda s
drugim celobrojnim operandom. Prvi operand je deljiv s drugim ako je ostatak nula.
Unarni operatori su +, -, ++ i --.
Prefiksan unaran operator + daje kao rezultat vrednost svog operanda bez izmene, a
prefiksan unaran operator vrednost svog operanda s izmenjenim predznakom. Ovi opera-
tori imaju prioritet 13 i grupiu se zdesna nalevo.
Operator ++ poveava, a smanjuje vrednost svog operanda za 1. Oni su jedini unarni
operatori koji mogu da budu prefiksni (++k, k) ili postfiksni (k++, k).
Vrednost izraza ++k i k je nova vrednost promenljive k. To znai da u sluaju kada
se koristi kao operand u nekom izrazu, prvo se izmeni vrednost promenljive k, i dalje se
rauna s tom novom vrednou.
Vrednost izraza k++ i k je stara vrednost promenljive k. To znai da u sluaju kada
se koristi kao operand u nekom izrazu, prvo se uzima vrednost promenljive k za dalje rau-
nanje a tek posle se menja vrednost promenljive k.
Operandi ovih operatora mogu da budu samo promenljive, a ne i rezultati drugih opera-
tora. Osim u retkim sluajevima kada je rezultat tog drugog operatora promenljiva.
Prefiksne varijante ovih operatora su prioriteta 13 i grupiu se sleva nadesno. Postfiksne
varijante su prioriteta 14 i grupiu se zdesna nalevo. Smerovi grupisanja nemaju upotrebnu
vrednost, jer ne mogu dva ovakva operatora da se napiu jedan za drugim. Naime, rezultat
prvog operatora nije promenljiva, pa ne moe biti operand drugog operatora.
Primer 3.2 Izrazi s operatorima ++ i
++k // k = k + 1
k++ // k = k + 1
j = k // k = k 1, j = k
j = k // j = k, k = k 1
j = ++k * k // k = k + 1, j = k * k ali
j = k++ * k // u = k, k = k + 1, j = u * k
k++ ++ // (k++)++ GREKA!
Prva dva izraza pokazuju da su u sluaju samostalnog izraza prefiksna i postfiksna va-
rijanta operatora ++ istovetne. Isto vai, naravno, i za operator .
Pod pretpostavkom da je vrednost promenljive k jednaka 8, nova vrednost promenljive
j u treem izrazu je 7, a u etvrtom 8. Nova vrednost promenljive k u oba sluaja je 7. Ovi
izrazi pokazuju i jednu zanimljivu osobinu jezika Java, mogunost dobijanja vie rezultata
pomou jednog izraza.
Zbog pravila da se prvo izrauna levi operand binarnog operatora, pod pretpostavkom
da je vrednost promenljive k jednaka 8, nova vrednost promenljive j u petom izrazu je 81,
a u estom 72. Nova vrednost promenljive k u oba sluaja je 9.
Poslednji izraz je neispravan jer rezultat izraza k++ nije promenljiva, pa ne moe na to
jo jednom primeniti operator ++

Kraus: Knjiga Java.doc 35 04.03.13 00:48


4 Naredbe

Naredba (statement) je osnovna jedinica obrade u programima. Postoje proste, sloene i


upravljake naredbe.
Proste naredbe (simple statements) predstavljaju elementarne obrade koje ne mogu da
se podele na manje delove koji bi i sami bili naredbe.
Sloene naredbe (compound statements) predstavljaju strukture naredbi kojima se
odreuje redosled izvravanja naredbi sadranih u strukturi. Te strukture naredbi nazivaju
se upravljake strukture. One mogu da se podele u sledee tri grupe:
sekvenca,
selekcije, i
ciklusi ili petlje.
Upravljake naredbe (control statements) ne vre nikakvu obradu ve samo prenose
tok upravljanja na neko mesto u programu. Ovoj grupi pripadaju razne naredbe skokova.
Naredbe unutar sloenih naredbi i same mogu da budu proste ili sloene. Na taj nain
mogu da se ostvaruju vrlo sloene obrade. U nastavku knjige, ako se drugaije ne kae, pod
pojmom naredba podrazumevae se bilo koja vrsta naredbi: prosta, sloena ili upravljaka.
Ove naredbe spadaju u grupu izvrnih naredbi. Ponekad, u irem smislu obuhvatae se i
deklarativne naredbe kao to su naredbe za definisanje podataka (2.8, 20), tipova poda-
taka (poglavlje 6 o klasma) itd.

4.1 Prosta naredba


Prosta naredba predstavlja elementarnu obradu u programu. Njen opti oblik je:
izraz ;
Izvravanje proste naredbe sastoji se u izraunavanju izraza. Dobijena vrednost izraza
ne koristi se ni za ta. Trajni rezultati naredbe dobijaju se kao boni efekti pojedinih opera-
tora unutar izraza. Operatori s bonim efektima jesu operatori za dodelu vrednosti (3.2,
36) i operatori ++ i (3.1, 35).
Specijalnu, i ree korienu, naredbu ini takozvana prazna naredba (empty statement).
Ona se sastoji samo od take-zareza (;). Prazna naredba nema nikakvog efekta. Koristi se u
sluajevima kada sintaksa jezika Java zahteva naredbu, a desi se da na tom mestu nema ta
da se radi.

Kraus: Knjiga Java.doc 51 04.03.13 00:48


52 4 Naredbe

4.2 Sekvenca ili blok: {}


Sekvenca ili blok je niz naredbi koje se izvravaju jedna za drugom.
Sekvenca u jeziku Java pie se u obliku niza naredbi unutar vitiastih zagrada ({}).:
{ naredba1 naredba2 naredbaN }

Pojedine naredbe mogu biti bilo deklarativne za definisanje podataka (2.8, 20), bilo
izvrne iz ovog poglavlja. U jeziku Java nema ogranienja u redosledu korienja
deklarativnih i izvrnih naredbi. Zbog toga podatke treba definisati to blie mestu prvog
korienja i tada, obino, nema razloga da se ne navedu i inicijalizatori za postavljanje
poetnih vrednosti.
Kao to postoji prazna naredba, tako postoji i prazna sekvenca, koja ne sadri nijednu
naredbu.
Programski jezik Java ne postavlja nikakve uslove u vezi podele naredbi u redove. U
jednom redu moe da bude vie naredbi i jedna naredba moe da se pie u proizvoljnom
broju redova. Osnovni kriterijum treba da je preglednost teksta programa.
Ukoliko treba da se koristi vie redova, preporuuje se da se vitiaste zagrade ({})
izdvoje u zasebne redove, a sadraj sekvence da se uvlai za nekoliko mesta u odnosu na
vitiaste zagrade. Na taj nain se jasno istie gde su poetak i kraj sekvence:
{
naredba1
naredba2

naredbaN
}

Primer 4.1 Sekvence


{ p = a; a = b; b = p; }
{
System.out.prin("Re,Im= ");
int a = Citaj.Double(); int b = Citaj.Double();
int c = Math.sqrt(a*a + b*b); int d = Math.atan2(b, a);
System.out.println("Abs=" + c + "\tArg=%" + d);
}
Prvi primer je jedna jednostavna sekvenca kojom se meusobno zamene vrednosti pro-
menljivih a i b korienjem pomone promenljive p. Treba posebno obratiti panju na to da
je znak ; ispred zagrade } neophodan. Naime, b=p je samo izraz i tek je b=p; naredba ko-
ja moe da bude deo sekvence.
Drugi primer predstavlja jednu malo sloeniju sekvencu. Ona, posle poruke korisniku,
ita dva realna broja dvostruke tanosti, koji predstavljaju realni i imaginarni deo kom-
pleksnog broja. Zatim izraunava apsolutnu vrednost i argument tog kompleksnog broja i
ispisuje rezultat. Potrebne promenljive se definiu deklarativnim naredbama izmeu dve
izvrne proste naredbe za pisanje na glavnom izlazu.

Kraus: Knjiga Java.doc 52 04.03.13 00:48


4.2 Sekvenca ili blok: {} 53

4.3 Doseg identifikatora


Doseg (oblast vaenja scope) identifikatora u programiranju oznaava deo programa u
kome identifikator moe da se koristi.
Doseg identifikatora u jeziku Java protee se od mesta deklarativne naredbe kojom je
uveden do kraja bloka u kome se nalazi ta naredba. Zbog toga se ovakav doseg naziva
blokovski doseg (block scope). Kasnije e se videti da postoje i druge vrste dosega identifi-
katora.
Treba obratiti panju na to da se doseg identifikatora ne protee na ceo blok, ve poi-
nje tek od mesta definisanja identifikatora.
Primer 4.2 Definisanje identifikatora u bloku
{
int x = 5;
double y = x / 2.;
System.out.println("x=" + x + ", y=" + y);
}
Na poetku bloka definiu se dve promenljive i posle se ispisuju njihove vrednosti.
Vrednosti promenljivih zadate su kao inicijalizatori prilikom definisanja. Treba obratiti
panju na to da se poetna vrednost promenljive y izraunava na osnovu vrednosti pro-
menljive x, koja je definisana u redu neposredno pre naredbe kojom je definisana promen-
ljiva y.
Pojedine naredbe unutar bloka (sekvence) i same mogu biti blokovi. Time se u doseg
koji je odreen spoljanjim blokom ugneuje doseg unutranjeg bloka. Poto se ugneeni
blok (nested block) nalazi unutar dosega spoljanjeg bloka, unutar ugneenog dosega
mogu da se koriste i identifikatori koji su u spoljanjem bloku definisani pre ugneenog
bloka. Kae se da su identifikatori spoljanjeg bloka globalni za unutranji blok.
Obrnuto, identifikatori iz ugneenog bloka ne mogu da se koriste unutar spoljanjeg
bloka, ni ispred ni iza unutranjeg bloka. Ti identifikatori postoje samo unutar ugneenog
bloka. Zato se kae da su identifikatori ugneenog bloka lokalni za taj blok.
U sluaju viestrukog ugneivanja, unutar najdubljeg bloka mogu da se koriste identi-
fikatori iz svih okruujuih blokova. Unutar bloka na srednjem nivou ugneivanja mogu
da se koriste identifikatori iz svih okruujuih blokova ali ne i identifikatori iz u njega
ugneenih blokova. Naravno, mogu da se koriste samo oni identifikatori koji su definisani
pre ulaska u odreeni ugneeni blok.
Poto je doseg uneenog bloka sastavni deo okruujueg dosega, u ugneenom bloku
ne sme da se definie identifikator koji postoji u spoljanjem bloku, tj. koji ve postoji u
dosegu. Po naputanju unutranjeg bloka dozvoljeno je definisanje identifikatora koji po-
stoji u unutranjem bloku, poto taj identifikator vie nije u dosegu.
Skree se panja na to da je telo (sadraj) metode main, u stvari, blok i unutar nje mogu
da postoje ugneeni blokovi.
Primer 4.3 Ugneivanje blokova
Na poetku spoljanjeg bloka na slici 4.1 definiu se dve promenljive (a i b).
U prvom ugneenom bloku mogu da se koriste promenljive koje su definisane u spolja-
njem bloku pre njega (a i b), ali ne sme da se koriste promenljive koje su definisane iza
njega (h, i i j). Ne sme da se definie promenljiva s identifikatorom b, poto je taj identifi-

Kraus: Knjiga Java.doc 53 04.03.13 00:48


54 4 Naredbe

{ // Spoljanji blok.
int a = 1, b = 2;
{ // Prvi ugneeni blok.
int c = a + b;
int d = h + i * j; // GREKA: h jo ne postoji.
int b = c / d; // GREKA: b ve postoji.
int e = f; // GREKA: f jo ne postoji.
{ // Drugi nivo ugeivanja.
int f = a * b / (c d + e);
}
int g = f; // GREKA: f vie ne postoji.
int h = c + d;
}
int h = a / b; // U redu: prethodno h vie ne postoji.
int i = c + f; // GREKA: c i f vie ne postoje.
{ // Drugi uneeni blok.
double c = 1.234;
boolean d = true;
String e = "Dobar dan!";
byte f = 55;
float g = 35.8F;
char h = '?'; //GREKA: h ve postoji.
}
int j = (a + b) * (h - i);
}

Slika 4.1 Ugneivanje blokova

kator uveden doseg u spoljanjem bloku. Korienje promenljive f nije dozvoljeno ni pre ni
posle bloka na drugom nivou ugneivanja. Pre jo, a posle ve ne postoji.
U bloku na drugom nivou ugneivanja mogu da se koriste svi identifikatori (promenlji-
ve) kako iz prvog ugnjeenog bloka (c, d i e), tako i iz spoljanjeg bloka (a i b).
Iza prvog ugneenog bloka, u spoljanjem bloku, moe da se definie promenljiva h,
bez obzira to je taj identifikator korien u ugneenom bloku. Naputanjem ugneenog
bloka naputen je i doseg prve definicije identifikator h. S druge strane, iz istog razloga, ne
mogu se koristiti kao operandi promenljive c i f.
Drugi ugneeni blok je potpuno nezavisan od prvog. Zbog toga identifikatori c, d, e i
f, koji su korieni u prvom bloku, mogu ponovo da se koriste. Tipovi promenljivih kojima
se dodeljuju su nezavisni od tipova istoimenih promenljivih iz prvog bloka. Jedino identifi-
kator h iz prvog bloka ne sme da se ponovo definie u drugom bloku, jer je izmeu ta dva
bloka taj identifikator definisan u spoljanjem bloku. Definicija iz spoljanjeg bloka je u
dosegu i u drugom ugneenom bloku.
Iza drugog ugneenog bloka, u spoljanjem bloku, kao operandi mogu da se koriste
samo promenljive definisane ranije u tom bloku (a, b, h i i), a ne i promenljive definisane
unutar bilo kog ugneenog bloka.

Kraus: Knjiga Java.doc 54 04.03.13 00:48


5 Nizovi

Nizovi podataka predstavljaju najjednostavnije i najee koriene sloene tipove. Oni


slue za predstavljanje iz matematike dobro poznatih vektora, matrica i viedimenzionalnih
nizova.
Podatak nizovnog tipa predstavlja niz podataka meusobno jednakih tipova. Oni se
nazivaju elementi niza i identifikuju se pomou rednog broja unutar niza. Ti redni brojevi
nazivaju se indeksi elemenata niza. Prvi element niza u jeziku Java obavezno ima indeks 0,
drugi 1 itd.
Elementi nizova mogu biti prostog i sloenog tipa, ukljuujui i nizove. U sluaju kada
su elementi nizovi, govori se o ugneavanju nizova ili viedimenzionalnim nizovima.
Niz je jednodimenzionalan (vektor) ako elementi nisu nizovi. Dvodimenzionalan niz
(matrica) je niz iji su elementi jednodimenzionalni nizovi. Niz ima dimenziju k ako su
njegovi elementi nizovi sa k1 dimenzija.
Nizovi kao sloeni tipovi podataka u jeziku Java su pokazani tipovi (2.3, 16). To
znai da je promenljiva nizovnog tipa samo pokaziva na sm niz. Elementi niza nalaze se
negde drugde u memoriji.

5.1 Definisanje nizova


Nizovne promenljive definiu se naredbama za definisanje podataka iz 2.8 (20), s tim da
kao tip treba navesti:
tip [ ] [ ] [ ]

Tip predstavlja tip elemenata niza. Broj praznih parova uglastih zagrada ([]) oznaava ni-
vo ugneavanja, odnosno broj dimenzija niza.
Jednom naredbom za definisanje podataka, kao i kod prostih tipova u 2.8 (20), moe
da se definie i vie nizovnih promenljivih.
Primer 5.1 Definisanje nizovnih promenljivih
int[] vektor;
double[][] matrica;
boolean[][][] p, q, r;

Kraus: Knjiga Java.doc 75 04.03.13 00:48


76 5 Nizovi

Prostor za elemente niza u jeziku Java moe da se dodeljuje iskljuivo dinamiki u


vreme izvravanja programa. Takvi podaci nazivaju se dinamiki podaci, a deo memorije
gde se oni uskladitavaju, dinamika zona memorije.
Opti oblik izraza za dodelu memorije nizu je:
new tip [ duina ] [ duina ] [ duina ]

Operator za dodelu memorije new je prefiksan unaran operator najvieg prioriteta (16) iji
je operand opis niza kome se dodeljuje memorija. Formalno se grupie sleva nadesno,ali
to nema znaaja poto ne mogu da se napiu dva operatora new jedan za drugim.
Tip predstavlja tip elemenata niza.
Duina predstavlja broj elemenata niza po jednoj dimenziji i moe biti proizvoljan
celobrojan izraz (tipa int). U sluaju ugneenih (viedimenzionalnih) nizova, duine za
svaki nivo se pie unutar odvojenog para uglastih zagrada.
Tip rezultata operatora new je (pokaziva na) niz ija je dimenzionalnost jednaka broju
parova uglastih zagrada ([]). Vrednost rezultata moe da se dodeljuje ranije definisanoj
nizovnoj promenljivoj (5.5, 79) ili kao inicijalizator pri definisanju nove promenljive:
tip [ ] [ ] [ ] niz = new tip [ duina ] [ duina ] [ duina ]

Broj parova uglastih zagrada u tipu promenljive i u izrazu za dodelu memorije mora biti
isti. Niz predstavlja identifikator nizovne promenljive. Kao rezultat dodele memorije,
izgradie se sloene stukture podataka, zavisno od nivoa ugneivanja (broja dimenzija)
niza.
Ako dodela memorije ne uspe, greka se prijavljuje izuzetkom tipa OutOfMemoryEr-
ror. Ako se taj izuzetak ne obrauje od strane programa, program se prekida (izuzeci su
objanjeni u poglavlju 10).
Primer 5.2 Definisanje nizova
int[] a = new int[7];
float[][] b = new float[5][4];
char[][][] c = new char[3][4][2];
Slika 5.1 prikazuje nain uskladitavanja prethodnih nizova.

b: 0 1 2
c:
0 1 2 3
0 1 2 3 4 5 6 0 1 0 1 0 1
0
a: 1 0
2 1
a2 3 2
4 3

b3,1 c0,2,1
a) vektora b) matrice c) trodimenzionalnog niza
Slika 5.1 Usklasitavanje nizova

Promenljiva a pokazuje na niz od 7 elemenata tipa int koji se nalaze u dinamikoj zoni
memorije. Prvi element je a0, a poslednji a7.
Poto dvodimenzionalan niz, po definiciji iz 5 (75), jeste niz jednodimenzionalnih
nizova, promenljiva b pokazuje na niz od 5 nizova, tj. na niz od 5 elemenata iji svaki element
pokazuje na niz od 10 elemenata tipa float. Prvi element je b0,0, a poslednji b4,3.

Kraus: Knjiga Java.doc 76 04.03.13 00:48


5.1 Definisanje nizova 77

Na kraju, promenljiva c pokazuje na niz od 3 (pokazivaa na) podmatrice dimenzije


42 elementa. Prvi element je c0,0,0, a poslednji c2,3,1.
U jeziku Java zanemaruje se (s nekoliko izuzetaka) pokazivaka priroda nizovnih pro-
menljivih i govori se o definisanju nizova i da je definisana promenljiva niz odreene
dimenzije sastavljen od elemenata odreenog tipa. Na primer, za nizove u primeru 5.2 kae
se da a je jednodimenzionalan niz celih brojeva, odnosno b je dvodimenzionalan niz
realnih brojeva dvostruke tanosti. Ili drugaije: a je niz celih brojeva, odnosno b je niz
nizova realnih brojeva dvostruke tanosti.
Jedna od situacija kada pokazivaka priroda nizovnih promenljivih dolazi do izraaja
jeste mogunost da nizovna promenljiva ne pokazuje ni na ta. To se predstavlja imenova-
nom konstantom null. Preporuuje se da se nizovna promenljiva nikad ne definie bez
inicijalizatora. Ako se u momentu definicije jo ne zna broj elemenata niza, inicijalizator
neka bude null.
Treba razlikovati null od praznog niza, tj. niza duine nula.
Primer 5.3 Nula niz i prazan niz
int[] c = null;
int[] d = new int[0];
Dok promenljiva c ne pokazuje ni na ta, promenljiva d pokazuje na niz od nula eleme-
nata. Prazan niz moe da se shvati kao granini sluaj, analogno praznom skupu koji ne
sadri nijedan element.

5.2 Inicijalizacija nizova


Svaki bajt memorijskog prostora koji se zauzme operatorom new popunjava se nulama.
Zbog toga je poetna vrednost elemenata nizova nula odgovarajueg tipa (0, 0.0,
'\u0000', false). Za sloene tipove kao to su nizovi, niske (2.7, 20) i klase (6,
99), to je null.
Nenulte poetne vrednosti (inicijalizator) mogu da se navedu u nastavku izraza za
dodelu memorije ili prilikom definisanja nizovne promenljive. Opti oblik inicijalizatora je:
{ vrednost , vrednost , , vrednost }

Pojedinane vrednosti mogu biti proizvoljni izrazi tipa elemenata niza i izraunavaju
se redom sleva nadesno. Po potrebi, na pojedine vrednosti primenjuje se automatska, proi-
rujua, konverzija tipa (3.5, 40). Duina niza bie jednaka broju navedenih vrednosti.
U sluaju ugneavanja nizova pojedinane vrednosti treba da su i same nizovi vred-
nosti odgovarajue dubine ugneavanja.
Ako se u izrazu za dodelu memorije navodi inicijalizator, parovi uglastih zagrada mora-
ju biti prazni (ne smeju da se navedu duine).
Primer 5.4 Inicijalizacija nizova
int[] e = new int[] {1, 2, 3, 4}; // ili
int[] f = {1, 2, 3, 4};
int[][] g = new int[][] {{1,2,3}, {4,5,6}}; // ili
int[][] h = {{1,2,3}, {4,5,6}};

Kraus: Knjiga Java.doc 77 04.03.13 00:48


78 5 Nizovi

5.3 Pristupanje elementima niza: []


Elementi niza se identifikuju pomou rednog broja unutar niza koji se naziva indeks. Indek-
si u jeziku Java su celi brojevi od 0 do n1, gde je n broj elemenata (tj. duina) niza.
Pristup elementima niza naziva se indeksiranje.
Indeksiranje u jeziku Java smatra se binarnim operatorom i obeleava se sa []. Za
razliku od ostalih binarnih operatora, ovaj operator se ne pie izmeu svojih operanada ve
oko drugog operanda. Taj drugi operand je indeks traenog elementa, a prvi operand je
niz unutar kojeg se indeksira:
niz [ indeks ]

Niz ne sme da bude null. Ako jeste, greka se prijavljue izuzetkom tipa NullPoint-
erException. Ako se izuzetak ne obrauje od strane programa, program se prekida (izu-
zeci su objanjeni u poglavlju 10).
Indeks moe da bude proizvoljan celobrojan izraz ija vrednost treba da je >=0 i
<duina. Ako je vrednost indeksa izvan dozvoljenog opsega, greka se prijavljue izu-
zetkom tipa ArrayIndexOutOfBoundsException. Ako se izuzetak ne obrauje od stra-
ne programa, program se prekida (izuzeci su objanjeni u poglavlju 10)
Operator za indeksiranje [] je prioriteta 15 i grupie se sleva nadesno.
Rezultat indeksiranja je vrednost elementa niza sa zadatim indeksom. Tip rezultata je tip
elemenata niza.
U sluaju ugneenih nizova rezultat indeksiranja je (pokaziva na) odgovarajui
komponentni niz. Na tako dobijeni rezultat moe ponovo da se primeni indeksiranje, sve
dok se ne doe do elementa koji nije nizovnog tipa. Odavde sledi da niz u gornjem optem
obliku moe da bude identifikator niza ili rezultat operatora [] koji je niz.
Jednostavnije reeno, nenizovnom elementu viedimenzionalnog niza moe da se pri-
stupa navoenjem po jednog indeksnog izraza za svaku dimenziju (nivo ugneavanja)
unutar odvojenih parova zagrada:
niz [ indeks ] [ indeks ] [ indeks ]
Samo na nenizovne elemente nizova mogu da se primene svi operatori iz poglavlja 3.
Primer 5.5 Pristup elementima nizova iz primera 5.2
a[1] = 155;
a[i+(j1)*n] = x + y * z;
b[i][j] = vektor[i+j];

5.4 Dohvatanje duine niza: length


Broj elemenata (duina) niza moe da se dobija izrazom tipa int oblika:
niz . length
U sluaju ugneenih nizova rezultat je broj neposredno ugneenih komponentnih
nizova. Za svaki od njih pojedinano moe da se trai njihov broj elemenata.

Kraus: Knjiga Java.doc 78 04.03.13 00:48


6 Klase

Klase (classes) u jeziku Java sloeni su tipovi podataka koji se sastoje od elemenata koji
mogu da budu meusobno razliitih tipova. Ti elementi nazivaju se lanovi klasa (class
members).
Podaci klasnih tipova predstavljaju primerke date klase (class instances) i nazivaju se
objekti (objects). Termin klasa esto se koristi, skraeno, za oznaavanje pojma primerak
klase. Iz konteksta treba tada zakljuiti, da li re klasa oznaava tip ili objekat.
Klase kao sloeni tipovi podataka u jeziku Java su pokazani tipovi (2.3, 16). To znai
da je promenljiva klasnog tipa samo pokaziva na objekat. Sm objekat nalazi se negde
drugde u memoriji.
lanovi klasa mogu da budu polja ili metode. Polja (fields) klase, odnosno objekta su
podaci koji ine stanje (state) objekta. Metode (methods) klase su funkcije koje mogu da
izvode razne operacije nad poljima ime menjaju stanje (vrednost) objekta na koji se prime-
njuju.
lanovi klasa mogu da budu privatni ili javni. Privatnim (private) lanovima moe da
se pristupa samo iz unutranjosti posmatrane klase. To znai da privatna polja mogu da
koriste ili menjaju samo metode date klase, a privatne metode mogu da pozivaju samo
druge metode iste klase. Javnim (public) lanovima moe da se pristupa bez ogranienja
kako iz unutranjosti klase, tako i iz delova programa izvan posmatrane klase. Kae se da
ove osobine oznaavaju prava pristupanja (access rights) ili dostupnost lanova.
U veini sluajeva polja su privatna, dok su od metoda neke privatne a neke javne. Jav-
ne metode su tada jedina mogunost da se doe do podataka sadranih u klasnim objekti-
ma. Time se postie uaurivanje podataka koje je pomenuto u 1.2.2 (4).
Klase su pravi tipovi jer:
odreuju mogue vrednosti objekata,
odreuju mogue operacije nad objektima,
mogu da spree izvravanje bilo koje druge operacije nad objektima,
obezbeuju inicijalizaciju (dodelu poetnih vrednosti) stvaranih objekata,

Kraus: Knjiga Java.doc 99 04.03.13 00:48


100 6 Klase

6.1 Definisanje klasa


Definicija klase predstavlja navoenje svih lanova klase. Na osnovu te definicije mora da
se zna veliina potrebnog memorijskog prostora za smetanje pojedinih objekata tipa te kla-
se. Klasa se definie opisom class iji je opti oblik:
class ImeKlase {
modifikatori lan
modifikatori lan

}

Modifikatori odreuju neke specifine osobine lana klase. U sluaju vie modifika-
tora redosled nije bitan.
Modifikator private ili public oznaava da je lan privatan, odnosno javan. Privatni
lanovi mogu da se koriste samo unutar date klase, a javni iz bilo kog dela programa.
ImeKlase je po formi identifikator i ima status identifikatora tipa. Moe da se koristi u
naredbama za definisanje podataka za podatke (objekte) tipa te klase. Uobiajeno je da se
imena klasa piu velikim poetnim slovom.
lan u definiciji klase moe da bude:
definicija polja (6.3, 101),
definicija metode (6.4, 102), i
definicija druge klase (9, 209).
Pored toga u definiciji klase mogu biti:
inicijalizacioni blokovi (6.8, 118), i
definicije konstruktora (6.5, 111).
Oni se ne ubrajaju u lanove klase zbog specifine namene i naina korienja.
Doseg svih identifikatora unutar klase je od mesta definisanja do kraja klase. Kae se da
lanovi klase imaju klasni doseg (class scope).

6.2 Pristupanje lanovima klasa


lanu klase pristupa se izrazom oblika:
objekat . lan

Taka (.) je binaran operator za pristup lanu klase prioriteta 15 koji se grupie sleva
nadesno.
Objekat je najee identifikator objekta ijem lanu se pristupa, ali moe biti i rezul-
tat sloenijeg izraza iji je rezultat (pokaziva na) objekat.
lan moe da predstavlja polje ili metodu. Za polje treba navesti ime polja (6.3,
101). Pristupanje metodi predstavlja pozivanje te metode i treba navesti izraz za pozivanje
(6.4.2, 106).
Unutar klase objekat kojem se pristupa moe da se predstavlja kljunom rei this. Ti-
me se oznaava da se pristupa lanu objekta koji se upravo obrauje (tekueg objekta):
this . lan
Za pristup lanu spostvene klase dovoljno je i navoenje samo lana:

Kraus: Knjiga Java.doc 100 04.03.13 00:48


6.2 Pristupanje lanovima klasa 101

lan
tj. this. se podrazumeva. Ponekad je, ipak, zgodno da se napie to neobavezno this.,
naroito ako se u metodi, pored tekueg, koristi jo i vei broj objekata.

6.3 Polja klasa


Polja klasa su podatkovni lanovi ija definicija ima isti oblik kao i naredba za definisanje
samostalnih podataka u 2.8 (20):
imeTipa imePolja = poetnaVredost , imePolja , ;

Odjednom mogu da se definiu vie polja zajednikog tipa. ImeTipa moe biti bilo koji
prost ili sloen tip, ukljuujui i klasu koja se upravo definie.
Uz imenaPolja mogu da se navedu i poetneVrednosti (inicijalizatori). Za razliku
od samostalnih promenljivih, polja imaju nulte poetne vrednosti u odsustvu inicijalizatora.
U izrazima za poetneVrednosti kao operandi mogu da se koriste i polja koja su ve
definisana po redosledu navoenja, a ne i polja koja e biti definisana tek kasnije u tekstu
klase.
Polja mogu biti konana, ako se na poetku definicije navodi modifikator final.
Vrednosti konanih polja mogu da se postave samo u toku stvaranja objekata (6.8.4,
120), ne obavezno navoenjem poetneVrednosti, ve i u inicijalizacionom bloku
(6.8.3, 120) ili u konstruktoru (6.5, 111).
Polja su skoro bez izuzetka privatna da bi se postiglo uaurivanje podataka (1.2.2, 4),
tj. zatita podataka od neprimerenog korienja.
Primer 6.1 Definisanje polja klasa
class Alfa {
private int a = 1, b; // b == 0
public double c = a + b;
public double d = c * j; // GREKA: k jo ne postoji.
private short[] e = {1, 2, 3, 4};
private byte[] f = new byte[55];
private char[][] g; // g == null
private String h = "Dobar dan.";
private Alfa i; // i == null
public final int j = 55;
public final double k;

}
class AlfaTest {
public static void main(String[] varg) {
Alfa a = new Alfa(); // Stvaranje objekta (6.6.1).
a.c = 35;
a.b = 56; // GREKA: b nije dostupno.
int x = a.j;
a.k = 13; // GREKA: k je konano polje.
}
}
Na poetku klase Alfa definisana su privatna celobrojna polja a i b. Polje a se inicija-
lizatorom postavlja na vrednost 1, dok b poprima podrazumevanu vrednost 0.

Kraus: Knjiga Java.doc 101 04.03.13 00:48


102 6 Klase

Javna realna polja c i d se inicijalizuju vrednostima izraza u kojima se kao operandi


koriste druga polja klase Alfa. Izraz a+b je prihvatljiv, poto su oba operanda ve
definisana polja. Izraz c*j je neispravan jer je polje j definisano je tek kasnije.
Javna polja se retko koriste u praksi, pa su sva preostala polja klase Alfa privatna.
Polja e, f i g su nizovnog tipa. Vektor e se inicijalizuje na osnovu navedenih vrednosti.
Vektor f se inicijalizuje, izrazom za dodelu memorije, nizom od 55 elemenata ije vrednosti
su podrazumevano nule (5.2, 77). Matrica g nema inicijalizator, pa to polje poprima
podrazumevanu vrednost null.
Polja h i i su klasnog tipa. Niska h se inicijalizuje konstantnim tekstom. Polje i je tipa
sopstvene klase Alfa i poprima podrazumevanu vrednost null (klase su pokazani tipovi i
promenljive i polja klasnog tipa su, u stvari, pokazivai).
Na kraju, polja j i k su konana. Polje j ima inicijalizator i time je postavljena njegova
konana vrednost. Polje k nema inicijalizator i zasad ima podrazumevanu vrednost 0. Ovo
se, meutim, ne smatra postavljanjem vrednosti, tako da je dozvoljena jedna kasnija dodela
vrednosti. Poto konana polja ne mogu da se promene izvan klase, ne smeta to su polja j
i k javna. Izvan klase moi e samo da se dohvate, a ne i da se promene, pa nije naruen
princip uaurivanja podataka.
U metodi main klase AlfaTest prikazane su mogunosti korienja lanova klase
Alfa izvan te klase (unutar neke druge klase). Prvom naredbom se stvara objekat a tipa
Alfa, to je detaljno objanjeno u 6.5 (111). Javnom lanu c dozvoljen je pristup sa
a.c, ali a.b nije dozvoljeno, poto je b privatan lan klase Alfa.
U poslednje dve naredbe pristupa se javnim konanim lanovima j i k. Za njih je dozvo-
ljeno samo dohvatanje vrednosti kao operand (x=a.j), a ne i promena vrednosti (a.k=13).

6.4 Metode klasa


Metode klasa su funkcionalni lanovi koji ostvaruju operacije nad poljima klasa menjajui
time vrednosti (stanja) objekata.
Metode se obino definiu kao programski moduli koji na osnovu izvesnog broja ar-
gumenata daju jedan rezultat koji se naziva povratna vrednost (return value), ili skraeno
samo vrednost metode. Tip povratne vrednosti naziva se tip metode. Vrednost metode mo-
e da se koristi ugraivanjem poziva metode u izraze. Poziv metode se, u stvari, smatra
operatorom kao i svi ostali operatori.
Jezik Java dozvoljava da metode, pored vrednosti metode, daju i druge rezultate koji se
nazivaju boni efekti metoda. tavie, vrlo esto vrednost metode uopte se ne koristi, ve
samo njeni boni efekti. Ukoliko nema potrebe da se koristi vrednost metode, poziv metode
predstavlja jedini operand izraza u okviru kojeg se poziva metoda.
Jezik Java dozvoljava i da metoda uopte ne stvara vrednost ve samo bone efekte.
Nema smisla da se pozivi metoda, koje stvaraju samo bone efekte, ugrauju kao operandi
u sloenije izraze.
Metode su najee javne, a ree privatne (1.2.2, 4). Pomou javnih metoda mogue
je obraivati objekte klase iz drugih klasa, dok se privatne metode koriste kao pomone me-
tode unutar sopstvene klase.

Kraus: Knjiga Java.doc 102 04.03.13 00:48


7 Paketi

Paketi (packages) omoguuju grupisanje srodnih klasa u logike celine. Svaki paket ini
zaseban doseg koji se naziva paketski doseg (package scope). To znai da klasa s istim
imenom moe postojati u vie paketa.
Klase u paketu ine lanove paketa.

7.1 Definisanje paketa


Paket se definie stavljanjem naredbe:
package imePaketa ;
kao prvu naredbu u jedinici prevoenja (datoteci). Time sve klase u datoteci pripae tom
paketu. Ne mogu u istoj datoteci da se nalaze klase koje pripiadaju razliitim paketima.
Sme da postoji najvie jedna naredba package u svakoj datoteci.
Sve klase istog paketa mogu da se nalaze u vie datoteka. Ipak, sve te klase pripadaju
zajednikom dosegu. Ne treba (nije ni mogue) posebno naznaiti ako se u jednoj datoteci
koristi klsa koja se nalazi u drugoj datoteci.
Klase koje se ne stavljaju u pakete pripadaju bezimenom paketu (unnamed package),
koji se naziva i podrazumevani paket (default package). Sve dosadanje klase u ovoj knji-
zi pripadaju bezimenom paketu.
Stavljanje klasa u bezimeni paket treba izbegavati. Njega treba koristiti samo za manje
vane klase s ogranienim vekom upotrebe, i ponekad u poetku razvijanja sloenog siste-
ma dok se ne uoe logike celine klasa.
Klase unutar paketa su u izvesnoj meri meusobno prijateljske. Mogu da koriste sve
neprivatne lanove, ukljuujui i ugneene klase lanove, drugih klasa istog paketa. To su,
pored javnih lanova, lanovi koji nisu obeleeni ni kao javni ni kao privatni. Drugim re-
ima, lan je dostupan iz drugih klasa istog, a ne i iz klasa drugih paketa se ako na poetku
definicije ne nalazi ni modifikator private, ni public. Nazivaju se i polujavni lanovi:
javni su unutar paketa, ali ne i izvan paketa. Ne postoji modifikator za oznaavanje ove vr-
ste dostupnosti.
Da bi klase u paketu mogle da se koriste u drugim paketima treba navesti modifikator
public na poetku njihovih definicija. Drugim reima, i za klase najvieg nivoa (koje nisu

Kraus: Knjiga Java.doc 139 04.03.13 00:48


140 7 Paketi

ugneene 9, 209) podrazumevana dostupnost jeste na nivou paketa. Klase najvieg


nivoa ne mogu biti privatne.
U svakoj jedinici prevoenja sme da postoji samo jedna javna klasa. Ime datoteke mora
se poklapa s imenom sadrane javne klase.
Ako u jedinici prevoenja (datoteci) postoji vie klasa najvieg nivoa, klase ija se ime-
na razlikuju od imena datoteke ne bi trebalo da se koriste izvan te jedinice prevoenja. U
suprotnom mogu nastati problemi prilikom prevoenja druge jedinice prevoenja u kojoj se
koristi neka klasa iz prve. Naime, prevodilac (program javac 1.4.1, 9) kad u toku pre-
voenja neke klase T1 nailazi za potrebu za klasom T2, prvo e da trai datoteku T2.java
da bi implicitno prevodio sadraj te datoteke. Ako takve datoteke nema, traie datoteku
T2.class i koristie sadraj te datoteke. Ako ne nae ni tu datoteku, prijavljuje greku da
je tip T2 nepoznat. Zato je u ovakvim sluajevima redosled prevoenja pojedinih jedinica
prevoenja bitan: prvo treba eksplicitno traiti prevoenje jedinice koja sadri klasu T2, pa
tek onda da se prevodi jedinica koja sadri T1.
Kao konaan zakljuak: izbegavati stavljati vie klasa, ak i ako nisu javne, u istu jedi-
nicu prevoenja (datoteku) i datoteke imenovati prema imenima sadranih klasa. Eventual-
ne dodatne klase u datoteci trebale bi da budu pomone klase "glavoj" klasi, klasi ije se
ime poklapa s imenom datotete, i da se ne koriste izvan te datoteke.
Primer 7.1 Definisanje paketa
// Beta.java
package prvi;
class Alfa { // JAVNA KLASA.
private int a;
int b;
public int c;
public void m() {
Beta beta = new Beta();
beta.a = 1; // GREKA: polje a je privatno.
beta.b = 2;
beta.c = 3;
}
}
public class Beta { // PAKETSKA KLASA.
private int a;
int b;
public int c;
public void m() {
Alfa alfa = new Alfa();
alfa.a = 1; // GREKA: polje a je privatno.
alfa.b = 2;
alfa.c = 3;
}
}
Jedinica prevoenja u datoteci Beta.java pripada paketu prvi. Sadri jednu paket-
sku klasu Alfa i javnu klasu Beta. Ime javne klase poklapa se s imenom datoteke.
U obe klase postoje po jedno privatno (a), paketsko (b) i javno (c) polje kao i javna
metoda m. U metodama m pravi se jedan objekat tipa druge klase, posle ega se pristupa

Kraus: Knjiga Java.doc 140 04.03.13 00:48


7.1 Definisanje paketa 141

poljima napravljenih objekata. Iz obe klase moe da se pristupi paketskom i javnom polju
druge klase, a ni iz jedne privatnom polju.
// Gama.java
package prvi;
class Gama { // PAKETSKA KLASA.
private int a;
int b;
public int c;
void m() {
Alfa alfa = new Alfa();
alfa.a = 1; // GREKA: polje a je privatno.
alfa.b = 2;
alfa.c = 3;
Beta beta = new Beta();
beta.a = 1; // GREKA: polje a je privatno.
beta.b = 2;
beta.c = 3;
}
}

Paketska klasa Gama nalazi se u datoteci Gama.java i, takoe, pripada paketu prvi.
U metodi m pravi se po jedan objekat klase Alfa i klase Beta. Poto te klase pripadaju
istom paketu, bez obzira na to to se nalaze u drugoj jedinici prevoenja, uslovi za pristup
lanovima iz klase Gama su isti kao i izmeu klasa Alfa i Beta.
Poto se klasa Alfa ne nalazi u datoteci Alfa.java, klasa datoteka Gama.java ne
moe da se prevodi a da prethodno nije prevedena datoteka Beta.java. Naime, kad pre-
vodilac u toku prevoenja datoteke Gama.java naie na ime klase Alfa, prijavie greku
jer ne moe da nae ni datoteku Alfa.java, ni Alfa.class. Ako bi se prvo prevodila
datoteka Beta.java, kao rezultat dobili bi datoteke Alfa.class i Beta.class, posle
ega bi prevoenje datoteke Gama.java bilo uspeno.
Moe jo da se primeti da kad bi se u klasi Gama prvo pravio objekat klase Beta i tek
posle toga objekat klase Alfa, prevoenje datoteke Gama.java bi svakako uspelo. Naime,
kad bi prevodilac u toku prevoenja datoteke Gama.java naiao na ime klase Beta,
potraio bi datoteku Beta.java, preveo bi je i time napravio datoteke Alfa.class i Be-
ta.class. Posle kad naie na ime klase Alfa ve e imati datoteku Alfa.class.

7.2 Korienje lanova paketa


Javna klasa iz drugog paketa moe da se koristi navoenjem imena paketa ispred imena
klase izrazom oblika:
imePaketa . ImeKlase
Ovo se naziva potpuno ime (fully qualified name) klase.
Ime klase moe da se uveze iz dosega nekog paketa u doseg datoteke u kojoj se koristi
naredbom oblika:
import imePaketa . ImeKlase ;

Kraus: Knjiga Java.doc 141 04.03.13 00:48


8 Nasleivanje

Objekti u svakodnevnom ivotu mogu da se grupiu na osnovu njihovih zajednikih oso-


bina. Unutar grupa mogua su dalja grupisanja na osnovu nekih specifinijih zajednikih
osobina. Svi objekti date podgrupe poseduju sve osobine svoje grupe kao i jo neke speci-
fine osobine. Na primer:
geometrijske figure u ravni mogu da budu okarakterisane poloajem, orijentaci-
jom, povrinom i obimom,
krugovi su geometrijske figure u ravni koje su dodatno okarakterisane polu-
prenikom,
kvadrati su geometrijske figure u ravni koje su dodatno okarakterisane dui-
nom ivice,
trouglovi su geometrijske figure u ravni koje su dodatno okarakterisane dui-
nama stranica,
;
vozila prevoze stvari i ljude,
letelice su vozila koja lete,
avioni su letelice,
helikopteri su letelice,
rakete su letelice,
vasionski brodovi su letelice,
plovila su vozila koja plove po vodi,
amci su plovila,
jedrenjaci su plovila,
brodovi su plovila,
suvozemna vozila su vozila koja se kreu po zemlji,
bicikli su suvozemna vozila s dva toka,
,
;

Kae se da podgrupa nasleuje (inherits) sve osobine svoje optije nadgrupe i da je
nadgrupa predak podgrupe, odnosno podgrupa potomak nadgrupe.
170 8 Nasleivanje

Podgrupe se mogu formirati i u vie koraka. Nadgrupa za neku podgrupu moe i sama
da bude podgrupa druge klase. Na primer, za avione je reeno da su letelice, a same letelice
su podgrupa vozila. S druge stane, i avioni bi mogli da se podele dalje na putnike i teretne.
Drugim reima, osobine neke opte grupe mogu da se nasleuju u vie koraka kroz
vie generacija.

8.1 Potklase
U jeziku Java grupe objekata opisuju se pomou klasa. Klase koje opisuju podgrupu ob-
jekata s nekim dodatnim, specifinim osobinama u odnosu na optije grupe nazivaju se
potklase (subclasses). Polazne klase, koje opisuju optiju grupu objekata, nazivaju se
natklase (superclasses) za date potklase.

8.1.1 Definisanje potklasa


Potklase se definiu opisom class iji je opti oblik:
modifikatori class ImePotklase extends ImeNatklase {
modifikatori lan
modifikatori lan

}

Klasa je potklasa ako u definiciji iza njenog imena postoji kljuna re extends i ime
natklase. Inae, dobija se ve dobro poznata obina klasa (6.1, 100). Kao to se se vidi,
u jeziku Java se kae da potklasa proiruje (extends) natklasu u smislu da potklasa dodaje
neke nove mogunosti mogunostima natklase.
Ako se na poetku definicije klase stavlja modifikator final, klasa je konana (final
class) i ne moe dalje da se proiruje. Drugim reima, ne moe biti natklasa drugim klasama.
lanove potklase, pored sopstvenih lanova (navedenih unutar para vitiastih zagrada
{}) ine i lanovi (polja i metode) njene natklase. Kae se da potklasa nasleuje (inherits)
sve lanove svoje natklase i da je natklasa predak potklase, odnosno potklasa potomak
natklase.
Nenasleeni lanovi potklase nazivaju se i sopstveni ili specifini lanovi.
Kontrola korienja lanova klase ostvaruje se dodavanjem jednog ili nijednog od modi-
fikatora private, protected, public. Time se lanovi dele na privatne, paketske,
zatiene i javne. Privatni lanovi (private). mogu da se koriste samo u matinoj klasi.
Paketski lanovi (bez modifikatora) mogu da se koriste u matinoj klasi i u svim klasama
koje pripadaju istom paketu kao i matina klasa. Zatieni lanovi (protected) mogu da
se koriste u matinoj klasi, u svim klasama koje pripadaju istom paketu kao i matina klasa
i u svim klasama drugih paketa koje su potklase matine klase. Na kraju, javni lanovi
(public) mogu da se koriste unutar svih klasa, bez ogranienja.
Kae se da se lanovi natklase koji ne mogu da se koriste u potklasi ne nasleuju. To su
privatni lanovi uvek, a paketski lanovi samo ako se potklasa ne nalazi u istom paketu s
natklasom. Ovo nenasleivanje treba shvatiti logiki: imena tih lanova se ne nalaze u
dosegu potklase. Zbog toga, pored toga to ne mogu da se koriste, ne mogu ni dalje da se
nasleuju u eventualnim potklasama posmatrane potklase (u potpotklasama prvobitne kla-

Kraus: Knjiga Java.doc 170 04.03.13 00:48


8.1.1 Definisanje potklasa 171

se). Fiziki, sva nenasleena polja su prisutna u objektima potklase i ulaze u veliinu
objekata potklase. Nasleene metode koje mogu da se pozivaju iz potklase, i te kako mogu
da koriste i ta nedostupna polja. Slino je i sa nedostupnim, i time nenasleenim, metoda-
ma: njih ipak mogu da pozivaju metode natklase koje su dostupne potklasi.
Klasa moe biti samo javna ili paketska. To znai da za njih, od modifikatora iz pret-
hodnog pasusa, sme da se koristi samo modifikator public. Moe biti paketska ili javna, a
ne i privatna ili zatiena klasa.
Glavni smisao nasleivanja manifestuje se kod nestatikih lanova. Jedan primerak na-
sleenog nestatikog polja postoji u svakom objektu potklase, pored toga to postoji i u
svakom objektu natklase.
Nasleivanje statikog polja ogleda se samo u tome da u potklasi mogu da se koriste i
samo prostim imenom. Potklasa ne dobija svoj primerak nasleenog statikog polja, ve
potklasa koristi isti primerak koji koristi i natklasa. Moe da se kae da se statiki lanovi
nasleuju samo logiki, a ne i fiziki.
lanovi potklase koji su nasleeni od natklase imaju istu dostupnost kao i u natklasi.
Posebno je vano to to su javni lanovi natklase javni i u potklasi. Zbog toga s objektima
potklase mogu da se izvode sve radnje koje mogu s objektima natklase i, pored njih, jo ne-
ke druge radnje koje postoje samo u potklasi.
Kae se da su potklasa i natklasa u odnosu jeste ili je: potklasa je natklasa s dodatnim
mogunostima. Tamo gde se oekuje objekat natklase, moe ravnopravno da se navede i
objekat potklase.
Konstruktori se ne smatraju lanovima klasa (6.5, 111) i zbog toga se ne nasleuju.
Kao i bilo koja klasa, i potklasa moe da ima proizvoljan broj konstruktora. Naredbom
oblika:
super ( argumenti ) ;

kao prvom naredbom u telu konstruktora potklase, moe da se pozove konstruktor natklase
radi inicijalizacije polja koja su nasleena od natklase. Pozivae se konstruktor natklase
koji odgovara navedenim argumentima. U nedostatku ove naredbe, pre prve naredne u
telu konstruktora potklase, pozivae se podrazumevani konstruktor natklase (super()).
Ako se u potklasi ne definie nijedan konstruktor, generie se podrazumevani konstruk-
tor koji samo poziva podrazumevani konstruktor natklase.
U telu konstruktora eksplicitno moe da se poziva najvie jedan konstruktor: konstruk-
tor svoje klase (this() 6.5, 112) ili konstruktor natklase (super()).
Primer 8.1 Definisanje potklasa s konstruktorima
// A.java
package pak1;
public class A { // Natklasa.

public A( ) { }

}
Klasa A je u paketu pak1. Pored nekoliko lanova ima bar jedan konstruktor.

Kraus: Knjiga Java.doc 171 04.03.13 00:48


172 8 Nasleivanje

// B.java
package pak1;
public class B extends A { // Potklasa u istom paketu.

public B( ) { super( ); }

}
Klasa B, takoe u paketu pak1, je potklasa klase A. Prvom naredbom u telu konstruk-
tora poziva se konstruktor natklase (super()) radi inicijalizacije nestatikih polja nasle-
enih iz klase A. Argumenti ovog poziva odreuju koji e od konstruktora klase A biti pozvan.
// C.java
package pak2;
public final class C extends pak1.A { // Potklasa u drugom paketu.

public C( ) { }

}
Klasa C u paketu pak2 je konana. Nee moi da se definiu klase koje bi bile njene
potklase. Da bi mogla biti potklasa klase A, koja nije u istom paketu, potrebno je navesti
potpuno ime klase A (pak1.A). Druga mogunost je da se ime klase A prethodno uveze
naredbom import u doseg jedinice prevoenja u datoteci C.java. U konstruktoru klase C
nema eksplicitnog poziva konstruktora natklase, pa e se, pre prve naredbe u telu, pozivati
podrazumevani konstruktor klase A (super()).
// D.java
package pak2;
public class D extends C { // GREKA: Klasa C je konana.

public D( ) { }

}
Poto je klasa C konana, ne mogu da se definiu klase koje su njene potklase, bez obzi-
ra na to u kom paketu se one nalaze.

8.1.2 Korienje lanova potklasa


Svi lanovi potklase, kako sopstveni tako i nasleeni, mogu da se koriste na jedinstven nain
koji je opisan za obine klase u 6.2 (100), vodei rauna o njihovoj dostupnosti.
Unutar potklase prosto ime lana je dovoljno (lan) za sve lanove: sopstvene na-
sleene, nestatike statike. Po potrebi, moe da se koristi i skriveni parametar metode
(this.lan).
Za nasleene lanove moe da se koristi i izraz super.lan, gde je super simboliko
ime za podobjekat neposredne natklase. Ovo se preporuuje za nestatike nasleene lano-
ve ako samo lan nije dovoljan. Treba razlikovati ovu upotrebu kljune rei super od
poziva konstruktora natklase (super()) iz prethodnog odeljka. Izraz super.lan moe
da se koristi u bilo kojoj metodi (ne samo u konstruktoru) i u bilo kojoj naredbi metode (ne
samo u prvoj).
Za statike lanove moe da se koristi i izraz Natklasa.lan, pri emu moe da se
navede ime natklase i na viem nivou hijerarhije nasleivanja, a ne samo ime neposredne
natklase. Ovo se preporuuje za nasleene statike lanove ako samo lan nije dovoljan.

Kraus: Knjiga Java.doc 172 04.03.13 00:48


9 Ugneeni tipovi

Ugneen tip (nested type) je tip (klasa ili interfejs) koji je definisan unutar drugog, okru-
ujueg tipa (surrounding type). Tip koji nije unutar drugog tipa naziva se tip najvieg
nivoa (top level type). Jedinice prevoenja (datoteke izvornog teksta) mogu da sadre jedan
ili vie tipova najvieg nivoa, od kojih najvie jedan moe biti javan (7.1, 140).
Ime ugneenog tipa ne sme biti jednako imenu okruujueg tipa, klase ili interfejsa.
Njegovo ime pripada dosegu unutar kojeg je definisano. Unutar tog dosega moe da se ko-
risti prostim imenom. Izvan okruujueg tipa treba da se navede i ime tog tipa:
ImeOkruujuegTipa . ImeUgneenogTipa
Doseg ugneenog tipa obuhvata i sve lanove okruujueg tipa, bez obzira na to da li
se oni nalaze pre ili posle definicije ugneenog tipa.
Ugneeni tip moe da se definie i unutar bloka. Tada je njegovo ime u dosegu tog
bloka i izvan tog bloka ne moe da se koristi.
Ugneeni i okruujui tip su prijateljski jedan drugom. To znai da ugneeni tip moe
da pristupa i privatnim lanovima okruujueg tipa i obrnuto.
lanovi okruujueg tipa iz ugneenog tipa mogu da se koriste prostim imenom, poto
za svaki ugneeni tip postoji samo jedan okruujui tip.
Pristup lanovima ugneenog tipa mogu je samo navoenjem imena ugneenog tipa
(za statike lanove) ili promenljive ugneenog tipa (za nestatike lanove), jer unutar
okruujueg tipa mogu da postoje vie ugneenih tipova, a i za jedan ugneeni tip mogu
postojati vie objekata.
lan ugneenog tipa sakriva polje istog imena, odnosno metodu istog potpisa u okru-
ujuem tipu. Metoda s istim imenom, ali drugaijim potpisom samo preoptereuje ime me-
tode (6.4.5, 109).
Sakrivenim lanovima moe da se pristupa navoenjem imena okruujue klase ispred
imena lana:
ImeOkruujuegTipa . ImePolja odnosno ...
ImeOkruujuegTipa . ImeMetode ( argumenti )
Inae, pristupa se lanu ugneene klase. Eventualni izuzeci od ovog pravila navedeni su u
narednim odeljcima.
Mada ugneeni tipovi donose odreene pogodnosti, ne treba preterivati s njihovom
upotrebom, jer ine definiciju tipa najvieg nivoa kabasatim. Treba izbegavati sloene i

Kraus: Knjiga Java.doc 209 04.03.13 00:48


210 9 Ugneeni tipovi

dugake ugneene tipove, a naroito sisteme ugneenih tipova. Definiciju klase od neko-
liko desetina stranica vrlo je teko sagledati i odravati!
Primer 9.1 Ugneeni tipovi
Ugneena klasa Unutra1 (Slika 9.1) lanove okruujue klase Spolja moe da ko-
risti navoenjem samo njihovih imena (b=a). Polje b te ugneene klase sakriva istoimeno
polje okruujue klase Spolja, zato samo b u izrazu c=b oznaava polje ugneene klase.
Za pristup sakrivenom polju treba pisati Spolja.b.

class Spolja { // Okruujua klasa.


private int a = 1;
private static int b = 2;
public class Unutra1 { // Javna ugneena klasa.
private int b = a; // Sakriva Alfa.b
private int c = b; // Koristi se this.b
private int d = Spolja.b; // Koristi se Spolja.b
}
int e = c; // GREKA: Unutra1.c nije u dosegu.
int f = new Unutra1().c; // Ovako moe.
void m() {
class Unutra2 {} // Klasa unutar bloka (metode).
}
}

Slika 9.1 Ugneene klase

Okruujua klasa Spolja ne moe da koristi lanove ugneenih klasa samo imenom
(e=c), ve mora da se navede i neki objekat (f=).
Dostupnost lanova nije vana bilo da se pristupa lanu okruujue klase iz ugneene
klase ili obrnuto.
Klasa Unutra2 je primer ugneene klase definisane unutar metode m.
Unutra1 p = null; // GREKA: Unutra1 nije u dosegu.
Spolja.Unutra1 q = null; // Ovako moe.
Izvan okruuje klase Spolja ime ugneene klase Unutra1 nije u dosegu, ve mora da
se pie Spolja.Unutra1.

9.1 Klase lanovi


Klasa lan (member type) je ugneena klasa koja je definisana neposredno u klasi, a ne u
bloku neke metode.
Kao i svim lanovima, dostupnost klase lana moe da bude privatna, paketska,
zatiena ili javna to se pri definisanju oznaava odgovarajuim modifikatorom ispred
imena tipa (redom: private, bez modifikatora, protected i public). Dostupan tip lan
izvan okruujue klase moe da se koristi navoenjem imena okruujueg tipa:
ImeOkruujuegTipa . ImeTipalana
Klasa lan moe biti statika ili nestatika.

Kraus: Knjiga Java.doc 210 04.03.13 00:48


9.1 Klase lanovi 211

9.1.1 Statike ugneene klase


Statika ugneena klasa (static nested class) je klasa lan koja se definie navoenjem
modifikatora static ispred imena klase. Ponekad, skraeno, pod ugneena klasa pod-
razumeva se statika ugneena klasa, dok ostale vrste ugneenih klasa imaju svoja zaseb-
na imena.
Statika ugneena klasa moe da ima statike i nestatike lanove.
U statikoj ugneenoj klasi neposredno, navoenjem samo imena, mogu da se koriste
samo statiki lanovi okruujue klase. Nestatikim lanovima moe da se pristupa samo za
konkretne objekte.
lanovi statike ugneene klase mogu da sakriju samo statike lanove okruujue
klase. Pojam sakrivanja nestatikih lanova okruujue klase ne postoji, poto za pristup do
njih uvek mora da se navodi objekat okruujue klase.
Primer 9.2 Statika ugneena klasa
Na poetku okruujue klase Spolja na slici 9.2 nalaze se etiri privatna polja (a, b, c
i d), i dve javne metode met1 i met2. Njih koristi statika ugneena klasa Unutra u
metodi met3. Ta metoda ima parametar s1 tipa Spolja za sluajeve da u telu metode tre-
ba navesti neki objekat tipa Spolja. Naglaava se da su okruujua i ugneena klasa
prijateljske jedna drugoj, i mogu da koriste i privatne lanove druge klase.
Prva dva polja c i d statike ugneene klase Unutra imaju ista imena kao i neka polja
okruujue klase. Tip i statinost ovih polja nisu bitni. Smatra se da samo polje c sakriva
istoimeno statiko polje klase Spolja, jer poklapanje imena polja d ne utie na nain
korienja nestatikog polja klase Spolja. Nesakriveno statiko polje moe da se koristi
samo imenom (f=a u metodi met3), dok za sakriveno polje treba navesti i ime okruujue
klase (j=Spolja.c). Za nestatika polja uvek treba navesti i neki objekat okruujue klase
(h=s1.b i l=s1.d). U sluaju jednakosti imena, samo ime uvek predstavlja polje ugnee-
ne klase (i=c i k =d).
Slino je i sa metodama met1 i met2 s istim potpisima (ne raunajui tipove povratnih
vrednosti) u poslednja etiri reda metode met3.
Metoda met4 pripada okruujuoj klasi Spolja i pokazuje mogunosti korienja la-
nova statike ugneene klase Unutra unutar svoje okruujue klase. Na poetku metode
met4 napravljen je objekat u1 tipa Unutra za sluajeve potrebe u nastavku. Za pristup
lanovima ugneene klase uvek treba navesti neki objekat te klase za nestatike lanove
(u1.c i u1.met1()), odnosno ime te klase za statike lanove (Unutra.e i Unutra.
met2()).
Klasa Test na slici 9.2 je nezavisna klasa od prethodne dve i pokazuje kako moe sta-
tika ugneena klasa da se koristi izvan njene okruujue klase. Uz ime ugneene klase
uvek treba navesti i ime okruujue klase (Spolja.Unutra), bez obzira da li se radi o
definisanju promenljive (Spolja.Unutra u3), stvaranju objekta (new Spolja. Unu-
tra()) ili pristupu statikom lanu (Spolja.Unutra.met2()) ugneene klase. Za
nestatike lanove, kao i uvek, potrebno je samo navesti ime objekta ugneene klase (u3.
met1()). Naravno, sve ovo pod uslovom da su kako sama ugneena klasa, tako i njeni
lanovi dostupni na mestu korienja.

Kraus: Knjiga Java.doc 211 04.03.13 00:48


212 9 Ugneeni tipovi

class Spolja { // Okruujua klasa.


private static int a = 1;
private int b = 2;
private static int c = 3;
private int d = 4;
public static int met1() { return 0; }
public int met2() { return 0; }
public static class Unutra { // Statika ugneena klasa.
private byte c = 5; // Sakriva Spolja.c
private static final int d = 6;
private static int e = 7;
public void met1() {} // Sakriva Spolja.met1()
public static void met2() {}
public void met3(Spolja s1) {
int f = a; // Koristi se Spolja.a
int g = b; // GREKA: b nije statiko polje.
int h = s1.b; // Koristi se Spolja.b
int i = c; // Koristi se Unutra.c
int j = Spolja.c; // Koristi se Spolja.c
int k = d; // Koristi se Unutra.d
int l = s1.d; // Koristi se Spolja.d
met1(); // Poziva se Unutra.met1()
Spolja.met1(); // Poziva se Spolja.met1()
met2(); // Poziva se Unutra.met2()
s1.met2(); // Poziva se Spolja.met2()
}
}
public void met4() {
Unutra u1 = new Unutra();
int m = c; // Koristi se Spolja.c
int n = Unutra.c; // GREKA: Unutra.c nije statiko.
int o = u1.c; // Koristi se Unutra.c
int p = e; // GREKA: Unutra.e nije u dosegu.
int q = Unutra.e; // Koristi se Unutra.e
met1(); // Poziva se Spolja.met1()
Unutra.met1(); // GREKA: Unutra.met1() nije statika.
u1.met1(); // Poziva se Unutra.met1()
met2(); // Poziva se Spolja.met2()
Unutra.met2(); // Poziva se Unutra.met2()
}
}
class Test { // Neka druga klasa.
void test() {
Unutra u2 = new Unutra(); // GREKA: Unutra nije u dosegu.
Spolja.Unutra u3 = new Spolja.Unutra();
u3.met1();
Spolja.Unutra.met2();
}
}

Slika 9.2 Staika ugneena klasa

Kraus: Knjiga Java.doc 212 04.03.13 00:48


10 Izuzeci

Bez posebne podrke od strane programskog jezika konfliktne situacije (greke) u progra-
mima obino se obrauju na sledei nain:
Ako se unutar neke metode otkrije greka, metoda se zavri vraajui neku infor-
maciju o tome pozivajuoj metodi. Ta informacija obino bude neka celobrojna
ifra, ili logiki indikator, koja se esto vraa kao vrednost metode.
Ako ni metoda koja dobija informacju o greci nije u stanju da razrei nastalu si-
tuaciju, prosleuje ifru ili indikator greke metodi koja je nju pozvala. Ako se
na taj nain stie do glavne metode prekida se izvravanje celog programa.
Kada se stigne do metode koja ume da razrei nastali problem, ona preduzme od-
govarajue korektivne akcije i izvravanje programa se nastavi dalje.
Glavni problem je to su sve metode sloenog programskog sistema optereene brigom
Da li je negde otkrivena greka?, a ne samo metoda u kojoj ta greka moe da nastane.
Na slici 10.1 prikazane su tri metode od kojih m1 poziva m2 i m2 poziva m3. Greka koju
moe da obrauje metoda m1 otkrije se u metodi m3. Prenos upravljanja od mesta otkrivanja
greke do mesta obrade greke omoguen je indikatorom g ija vrednost true oznaava
pojavu greke. Vrednost tog indikatora mora svaki as da se proverava. Strelice na slici
10.1 oznaavaju putanju od mesta otkrivanja greke do mesta njene obrade.

void m1(){ void m2(, boolean g){ void m3(, boolean g){
bool g=false;
for(; && !g; ){ for(; && !g; ){
for(; && !g; ){
m3(,g); if(problem)
m2(,g); if(!g){ g=true;
if(!g){ else {
}
} } }
} if(!g){ }
if(!g){ if(!g){
}
} else { } }
// Obrada greke }
}
}

Slika 10.1 Obrada greke pomou indikatora

Kraus: Knjiga Java.doc 225 04.03.13 00:48


226 10 Izuzeci

Jezik Java nudi efikasan mehanizam izuzetaka za obradu greaka koji rastereuje pro-
gramera od veine, ako ne i od svih, navedenih problema. Kad se na nekom mestu u
programu otkrije greka, potrebno je samo da se ona prijavi odgovarajuim izuzetkom
(exception). Bezbedno prekidanje zapoetih aktivnosti i predaja upravljanja nadlenom ru-
kovaocu izuzecima (exception handler) deava se automatski.
Na slici 10.2 prikazane su metode sa slike 10.1 za sluaj upotrebe mehanizma izuzetaka.
Pojedine metode se programiraju za sluaj da je sve u redu i nigde se ne postavlja pitanje,
da li je otkrivena greka. Jedino se metoda m1, koja je u stanju da obradi greke, deli na dva
dela. Prvi deo (blok RADI) odnosi se na obradu kada je sve u redu, a drugi deo (blok
ISPRAVI) sadri korake za obradu otkrivene greke. Kada se u metodi m3 otkrije greka,
njenim prijavljivanjem (naredba PRIJAVI) upravljanje se prenosi neposredno na blok
ISPRAVI u metodi m1, pri emu se metoda m2 u potpunosti zaobilazi. Treba uoiti da su
time prekinute sve do tada zapoete aktivnosti (ciklusi i metode).

void m1(){ void m2(){ void m3(){


RADI {
for(; ; ){ for(; ; ){
for(; ; ){
m3(); if(problem)
m2(); PRIJAVI;
}
} }
}
} ISPRAVI { }
// Obrada greke
}
}

Slika 10.2 Mehanizam izuzetaka

10.1 Klase za izuzetke


Izuzeci u jeziku Java predstavljaju se objektima tipa klase Throwable ili njenih potklasa u
proizvoljnom broju nivoa nasleivanja. Tip objekta koji se alje rukovaocu naziva se tip
izuzetka.
Na slici 10.3 prikazane su klase na vrhu hijerarhije klasa za izuzetke. Klase za izuzetke
u dijagramima klasa oznaavaju se sa <<exception>> iznad imena klasa.

<<exception>>
Trowable

<<exception>> <<exception>>
Exception Error

<<exception>>
RuntimeException

Slika 10.3 Glavne klase za izuzetke

Kraus: Knjiga Java.doc 226 04.03.13 00:48


10.1 Klase za izuzetke 227

Klasa Throwable je neposredna potklasa klase Object, a predstavlja praklasu za sve


klase kojima mogu da se prijavljuju izuzeci.
Klasa Exception predviena je za konfliktne situacije iz kojih u veini programa eli
da se oporavi i da se program nastavi dalje.
Klasa RuntimeException je predviena za standardne izuzetke koji mogu da se ja-
vljaju vrlo esto u toku izvravanja programa. Svi izuzeci koji su spominjani dosada u ovoj
knjizi su potklase ove klase.
Klasa Error predviena je za konfliktne situacije iz kojih u veini programa ne eli da
se oporavi, ve da se program prekine.
Vanije metode ove etiri klase klasa su:
Throwable ()
Throwable (String por)
Exception ()
Exception (String por)
RuntimeException()
RuntimeException(String por)
Error ()
Error (String por)
Konstruktori bez parametara stvaraju prazne objekte, dok konstruktori sa parametrom
objekte koji sadre poruku por.
String getMessage()
Ova metoda u sve etiri klase vraa poruku sadranu u tekuem objektu, odnosno null
ako objekat ne sadri poruku.
String toString()
Ova metoda u sve etiri klase vraa tekstualni prikaz tekueg objekta kao rezultat izraza:
getClass().getName() + ": " + getMessage()
tj. ime klase izuzetka i tekst poruke. Ako u tekuem objektu nema poruke, vraa se sa-
mo ime klase.
Klase za izuzetke koje definiu programeri trebalo bi da su potklase klase Exception,
a mogu da budu i neposredne potklase klase Throwable. Nikako ne bi trebalo da budu pot-
klase klasa RuntimeException i Error.
Klase za izuzetke mogu imati sopstvena polja i metode i da se na taj nain u objektima
prenose proizvoljne koliine informacija sa mesta prijavljivanja izuzetka do rukovaoca izu-
zecima.
Primer 10.1 Definisanje klasa za izuzetke
class G1 extends Exception { }
class G2 extends Exception { }
class G3 extends Exception { }
class G4 extends G1 { }
Klase G1, G2 i G3 su neposredne potklase klase Exception. Klasa G4 je potklasa klase
G1 i time potklasa klase Exception u drugoj generaciji.

Kraus: Knjiga Java.doc 227 04.03.13 00:48


11 Generiki tipovi i metode

esto je potrebno istu obradu primeniti na podatke razliitih tipova. Na primer:


nai vei od dva podatka,
ostvariti rad sa stekom,
urediti niz podataka po nekom kriterijumu,

Sa stanovita algoritma za sve navedene obrade potpuno je svejedno da li se radi o real-
nim brojevima, pravougaonicima ili pak o datumima.
Generiki tipovi (klase i interfejsi) i metode omoguuju razumljivu i bezbednu obradu
podataka razliitih tipova zajednikim klasama, odnosno metodama.

11.1 Tipovne promenljive


Generiki tipovi i metode se parametrizuju nizom tipova koji se nazivaju tipovni parame-
tri (type parameters). Nazivaju se i tipovne promenljive (type variables), jer u definicija-
ma generikih klasa, interfejsa i metoda mogu da se koriste analogno korienju parametara
metoda u telima metoda.
Opti oblik niza tipovnih parametara (promenljivih) je:
< Param , , Param >

Parametar Param, u najjednostavnijem obliku, je ime parametra Ime. Sloeniji oblici su


prikazani u 11.4 (268).
Parametri mogu da predstavljaju samo pokazane tipove (klase, interfejse i nizove), a ne
i proste tipove (na primer, int). Ime moe da se koristi na mestima na kojima se oekuje
ime tipa. Doseg imena tipovnih parametara je od mesta uvoenja do kraja definicije klase,
interfejsa ili metode za koju su parametri.
Obino se koriste jednoslovna imena. Najee se koristi slovo T (type) ili susedna slo-
va S i U kao opta imena tipovnih parametara. Za elemente zbirki (nizova, lista itd.) koristi
se slovo E (element), a za parove klju/vrednost slova K (key) i V (value).

Kraus: Knjiga Java.doc 257 04.03.13 00:48


258 11 Generiki tipovi i metode

Prilikom definisanja promenljivih generikih tipova treba navesti niz konkretnih tipova
koji se nazivaju tipovni argumenti (type arguments). Opti oblik definisanja niza tipovnih
argumenata je:
< Arg , , Arg >

Broj argumenata Arg treba da je jednak broju parametara Param u definiciji generikog
tipa. Svaki argument moe biti proizvoljan konkretan pokazan tip ukljuujui i nizove i
generike tipove. Prosti tipovi nisu dozvoljeni.
Pridruivanje tipovnih argumenata tipovnim parametrima (promenljivim) naziva se
konkretizacija tipovnih parametara. U definiciji generikog tipa ili metode svaki argument
e zameniti odgovarajui parametar. Ovo je analogno dodeljivanju vrednosti argumenta pri
pozivanju metode odgovarajuem parametru. Na mestima parametra u telu metode koristi
se dodeljena vrednost argumenta.
Primer 11.1 Tipovni parametri i argumenti
Za niz tipovnih parametara
<T, S, U>
dve od sledeih konkretizacija su ispravne, a trea nije
<Byte, String, Object>
<Integer[], Float, int[]>
<Exception, byte, Random> // GREKA: byte je vrednosni tip.

11.2 Generike klase i interfejsi


Generiki tipovi su tipovi parametrizovani tipovima. Odreeni su imenom generikog tipa i
nizom tipovnih parametara iz prethodnog odeljka. Opti oblik generikog tipa je:
ImeGenTipa < Param , , Param >

11.2.1 Definisanje generikih klasa i interfejsa


Generike klase i interfejsi definiu se tako da se na mestu imena navede generiki tip. Op-
ti oblik definisanja generike klase, onosno interfejsa je:
modifikatori class GenTip { } odnosno
modifikatori interface GenTip { }

Tipovni parametri unutar generikih tipova mogu da predstavljaju tipove polja, kao i
parametara i povratnih vrednosti metoda. Ne mogu da se stvaraju objekti i nizovi objekata
tipovnog parametra. Mogu da se definiu nizovne promenljive tipovnog parametra kojima
mogu da se dodele nizovi elemenata tipa Object uz eksplicitnu konverziju u niz elemenata
tipa tipovnog parametra. Prilikom te konverzije prevodilac za jezik Java davae opomenu
da nije u stanju da proveri korektnost te konverzije.
Primer 11.2 Definisanje generikih klasa i interfejsa
class GenC1<T> { T t; }
class GenC2<T, S> { S m(T t) { return null; } }
interface GenI1<T> { void m(T t, int i); }

Kraus: Knjiga Java.doc 258 04.03.13 00:48


11.2.1 Definisanje generikih klasa i interfejsa 259

Generika klasa GenC1 ima jedan tipovni parametar ije je ime T i sadri jedno polje
tipa T.
Generika klasa GenC2 ima dva tipovna parametra ija su imena T i S i sadri metodu
m iji je parametar tipa T, a povratna vrednost tipa S.
Generiki interfejs GenI1 ima jedan tipovni parametar ije je ime T i predvia metodu
m iji je prvi parametar tipa T, a drugi int.
class GenC3<T> {
T a = new T(); // GREKA: ne moe objekat tipa parametra.
T[] b = new T [10]; // GREKA: ne moe niz tipa parametra.
T[] c = (T[]) new Object [10]; // Opomena: ne moe da se proveri
// korektnost konverzije.
{ c[0] = a; }
}
T je tipovni parametar generike klase GenC3. Ne moe da se stvara objekat tipa T
(new T()), ni niz objekata tog tipa (new T[10]). Moe da se dodeli memorija nizu (po-
kazivaa na) elemente tipa Object (new Object[10]) i da se rezultat, posle eksplicitne
konverzije tipa ((T[])) dodeli promenljivoj c tipa T[]. Prevodilac za jezik Java e, pri
tom, dati opomenu da ne moe da garantuje korektnost konverzije.
Pomou promenljive c, elementima niza mogu da se dodeljuju objekti tipa T (c[0]=a).

11.2.2 Konkretizacija generikih tipova


Prilikom definisanja promenljivih generikog tipa (klase ili interfejsa) i stvaranja objekata
generike klase kao tip treba navesti konkretizaciju generikog tipa koja se sastoji od
imena generikog tipa i niza tipovnih argumenata (konkretizaciju tipovnih parametara) iz
11.1 (258):
ImeGenTipa < Arg , , Arg >
Svaka konkretizacija generikog tipa (kombinacija tipovnih argumenata) ini po jedan
nezavisan tip. Ti tipovi nisu meusobno kompatibilni, ak i ako su nastali na osnovu kom-
patibilnih tipova. Drugaije reeno, ako je Gen<T> generiki tip i P je podtip nadtipu N, tip
Gen<P> nije podtip tipu Gen<N>.
Opti oblik definisanja promenljive generikog tipa, odnosno stvaranja objekta tipa ge-
nerike klase je:
modifikatori GenTip imePromenljive ; odnosno
new GenTip ( )

Drugim reima, pri definisanju promenljive ili stvaranju objekta potrebno je navesti kon-
kretizovan generiki tip.
Primer 11.3 Definisanje promenljivih i stvaranje objekata generikih tipova iz
primera 11.2
GenC1<Byte> a = new GenC1<Byte>();
GenC1<byte> b = null; // GREKA: ne moe prost tip.
GenC1<byte[]> c = null; // Niz prostog tipa moe.
GenC2<String, Long> d = new GenC2<String, Long>();
GenC2<Object, GenC1<Float>> e = null;
Promenljiva a u prvom redu je tipa GenC1<Byte> i inicijalizovana je objektom tog ti-
pa. Sadrano polje t u objektu je tipa Byte.

Kraus: Knjiga Java.doc 259 04.03.13 00:48


12 Niti

Program je pasivan niz naredbi u obliku izvornog teksta na nekom programskom jeziku ili
u obliku niza bajtova koji je dobijen prevoenjem izvornog teksta na mainski jezik rauna-
ra, uskladiten u jednu ili vie datoteka na disku.
Proces je program koji se izvava u nekom okruenju. Stvara ga operativni sistem rau-
nara tako da mu dodeli odreeni prostor u memoriji raunara i potrebne spoljanje resurse,
napravi odreene upravljake strukture podataka za praenje njegovog stanja i zapoinje
njegovo izvravanje. Proces je aktivna stvar koja se odvija u vremenu izvravanjem njego-
vih naredbi od strane procesora raunara. Dananji operativni sistemi omoguavaju da se
istovremeno izvravaju vie programa, tj. da postoje istovremeno vie procesa. Svaki ima
svoj odvojen adresni prostor i meusobno mogu da izmenjuju podatke samo uz posredova-
nje operativnog sistema.
Neki operativni sistemi omoguavaju da se u okviru procesa vie tokova kontrole (sek-
venci naredbi) izvravaju istovremeno. Ti tokovi kontrole nazivaju se niti (threads). Niti
dele zajedniki adresni prostor matinog procesa i mogu meusobno da izmenjuju podatke
bez posredovanja operativnog sistema. Za pristup zajednikim, deljenim podacima potrebni
su odreeni mehanizmi sinhronizacije da bi komunikacija meu nitima bila ispravna. Na
primer, dok jedna nit menja skup deljenih podataka, druge niti ne smeju da pristupaju tim
istim podacima. Nit koja samo dohvata te podatke, dobie neusaglaeni skup podataka. Nit
koja bi u isto vreme i menjala te podatke, pokvarila bi rezultate druge niti i na kraju taj skup
podataka ne bi bio ispravan.
Deo niti u kojima se pristupa deljenim podacima naziva se kritina sekcija. Svakog
momenta samo jedna nit sme da bude u kritinoj sekciji za pristup istom skupu deljenih po-
dataka. Kae se da sadraj kritine sekcija mora da se izvrava atomino (nedeljivo) u smi-
slu da sve naredbe u kritinoj sekciji moraju da se izvre pre nego to neka druga nit moe
da pristupi podacima koji se obrauju u toj sekciji.
Naredbe izvrava(ju) procesor(i) raunara. Na jednoprocesorskom raunaru taj jedini
procesor treba da izvrava naredbe svih niti svih procesa. Naizgled istovremeno izvravanje
vie niti se ostvaruje tako da procesor na smenu izvrava krae sekvence pojedinih niti. Na
duoj stazi stie se utisak istovremenog napredovanja svih niti. Ovakav nain rada naziva
se konkurentan rad, jer pojedini nite su konkurenti za korienje procesora. Na viepro-
cesorskom raunaru operativni sistem moe pojedine niti da rasporedi na razliite proceso-
re. Tada i stvarno postoji izvestan stepen istovremenosti, ali ne potpuna, jer obino ima vie
niti nego procesora.

Kraus: Knjiga Java.doc 283 04.03.13 00:48


284 12 Niti

Kae se da dok procesor izvrava naredbe jedne niti, radi u kontekstu te niti. Prelazak
procesora s jedne niti na drugu naziva se smena konteksta (context switching).
Iz dosad reenog proizlazi da procesi su najmanje jednice za dodeljivanje memorije,
dok su niti najmanje jedinice za dodeljivanje procesora.
Nit u toku svog ivota moe da se nalazi u tri osnovna stanja (slika 12.1): spremna
kad moe da koristi procesor ali eka da doe do njega, radi kad je dobila proceror na
korienje i izvravaju se njene naredbe i blokirana kada eka na neki dogaaj da bi
mogla da nastavi s radom.

blokirana

spremna radi

Slika 12.1 Stanja niti

Novostvorena nit se stavlja u stanje spremna. U tom stanju moe da se nalazi vie niti
meu kojima operativni sistem po nekom kriterijumu bira kojoj e da dodeli procesor kad
se oslobodi. Jedan mogui kriterijum moe biti po redosledu dolaenja u stanje spremna.
esto se nitima dodeljuju prioriteti i tada prioritetnije niti biraju se pre manje prioritetnih.
Stanje radi nit moe da naputa prinudno ili dobrovoljno. Prinudno, kad joj operativni
sistem iz nekog razloga oduzme procesor i vraa je u stanje spremna. Razlog za oduzimanje
moe biti istek kvanta vremena koliko je niti dodeljeno da moe bez prekida da koristi pro-
cesor. Drugi razlog moe biti, ako se primenjuje dodeljivanje procesora sa preuzimanjem
(pre-emptive scheduling), pojava niti vieg prioriteta u stanju spremna. Nit dobrovoljno na-
puta stanje radi kada prelazi u stanje blokirana da bi ekala na neki dogaaj ili kad zavri s
radom i naputa sistem.
Nit iz stanja blokirana, kad se desi oekivani dogaaj, uvek prelazi u stanje spremna da
saeka svoj red da doe do procesora.
Jedan est problem u vienitnom okruenju je meusobno blokiranje (deadlock) niti.
To je situacija, u najjednostavnijem obliku, kada dve niti zatrae i dobiju ekskluzivno pravo
korienja po jednog deljenog podatka i posle zatrae ekskluzivno pravo korienja delje-
nog podatka koji je zauzela suprotna nit. Tada e se obe niti blokirati i nikad nee moi da
nastave s radom. U meusobnom blokiranju esto moe da uestvuje i vei broj niti. Tehni-
ke spreavanja da doe do meusobnog blokiranja spadaju u domen operativnih sistema
uopte i ne razmatraju se u ovoj knjizi.

12.1 Niti u jeziku Java


Javina virtuelna maina podrava programe s vie niti, bez obzira na korieni operativni
sistem. To je mogue zato to operativni sistem izvrava program java.exe (1.4.1, 9)
koji je, u stvari, Javina virtuelna maina (JVM). JVM korisniki program izvrava inter-
pretirajui bajtkod koji se nalazi u skupu datoteka tipa .class koje sadre prevode klasa
koje ine programski sistem.
Izvravanje programa na jeziku Java poinje pokretanjem JVM koja stvara glavnu nit
korisnikog pograma. U glavnoj niti izvrava se metoda main klase ije je ime navedeno u

Kraus: Knjiga Java.doc 284 04.03.13 00:48

You might also like