Professional Documents
Culture Documents
Java KRAUS PDF
Java KRAUS PDF
PROGRAMSKI JEZIK
Java
sa reenim zadacima
AKADEMSKA MISAO
Beograd, 2013
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.
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
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.
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
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
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
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
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
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
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++.
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.
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 )
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.
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 ++
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
}
{ // 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);
}
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.
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;
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.
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}};
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];
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,
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).
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:
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.
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.
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.
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.
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.
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-
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.
// 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.
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
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.
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.
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 }
}
}
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).
<<exception>>
Trowable
<<exception>> <<exception>>
Exception Error
<<exception>>
RuntimeException
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.
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); }
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).
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.
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.
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
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.