Sie sind auf Seite 1von 53

Laslo Kraus

PROGRAMSKI JEZIK

Java
sa reenim zadacima

AKADEMSKA MISAO Beograd, 2013

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.

Duanki i Katarini

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 savlada materija iz ove knjige. Programski jezik Java izloen je u obimu koji moe da zadovoljava i naprednije neprofesionalne 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 pojmove 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 sastavljanje 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

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 poseduju, 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 omoguavaju pisanje klasa i metoda za obradu podataka, iji tipovi nisu poznati u vreme njihovog pisanja, na bezbedan nain sa stanovita provera ispravnog korienja tipova podataka. 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 kontrola 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 primera 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 prikazane su i primene osnovnih elemenata objektno orijentisanog programiranja, a na primerima 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, naknadno otkrivenih greaka u knjizi. Svoja zapaanja itaoci mogu da upute autoru elektronskom potom na adresu kraus@etf.rs. Laslo Kraus Beograd, februara 2013.

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 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

viii 3

Sadraj

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 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 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

Sadraj

ix Uporeivanje nizovnih promenljivih: ==, != ..................................................80 Nepravilni viedimenzionalni nizovi ...............................................................81 Obilazak elemenata niza: for .........................................................................82 Sakuplja otpadaka ..........................................................................................83 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

5.6 5.7 5.8 5.9 5.10

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

x 7

Sadraj

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 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

Sadraj

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

8.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 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 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

10

11

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

1 Uvod

1.1 O programskom jeziku Java


Programski jezik Java je vii programski jezik opte namene koji u potpunosti podrava paradigmu objektno orijentisanog programiranja. Java je vie od programskog jezika koji ima odreenu sintaksu i semantiku. Ona je pravo programsko okruenje koje pomou ogromne biblioteke standardnih programskih modula 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 programiranje 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 programeri 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 podravaju 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).

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 raunara. 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 platforme 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, organizovanih 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 poetku 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 izvravali 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 meuvremenu apleti kao dinamini sadraj veb stranica prevazieni su, ali i nove tehnologije programiranja 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 specifikacija 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

1.2 Uvod u objektno orijentisano programiranje

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 orijentisano programiranje (OOP object-oriented programming). Po tom modelu program se sastoji od objekata (objects) koji imaju neka mogua stanja i ponaanja. Stanja predstavljaju 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 osobinama 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 prevozna sredstva te vrste, dok je automobil BG0720AX jedan tano odreeni automobil (objekat). 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 jezicima. 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 novije vreme, C#. Objektno orijentisano programiranje zasniva se na pet osnovnih principa: apstrakciji, uaurivanju, nasleivanju, polimorfizmu i ponovnom korienju koda.

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 engleskog 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 delovima programa tako i unutar obinih tekstova. U nastavku teksta pod pojmom slova podrazumevaju se mala i velika slova bilo kog alfabeta, 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 upotrebu 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 identifikatore, konstante, kljune rei, operatore i separatore. Leksiki simboli mogu da se piu, uz nekoliko izuzetaka, spojeno ili meusobno razdvojeno proizvoljnim brojem belih znakova. 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 tabulacija, prelazak u novi red i prelazak na novi list. U irem smislu, u bele znakove se ubrajaju i komentari. Komentari (comments) su proizvoljni tekstovi koji su namenjeni itaocu teksta programa radi lakeg razumevanja namene i funkcionisanja programa. Te tekstove prevodilac zanemaruje.

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 sastavljanje 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 programa (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 identifikatora. 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 case const enum float import native protected strictfp throw void assert catch default extends for instanceof new public super throws volatile boolean char do false goto int null return switch transient while break class double final if interface package short synchronized true byte continue else finally implements long private static this try

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++.

2.2 Identifikatori

15

Primer 2.1 Ispravni identifikatori


alfa ALFA Alfa x55_123 AnaVoliMilovana vrloDugakoImeAMoeDaBudeJoIDue $nePreporuujeSe$ ime_i_prezime datumRoenja

Uobiajeno je da se u identifikatorima koji su sastavljeni od vie rei poetna slova pojedinih rei piu velikim slovima, a ostala malim slovima. Primer 2.2 Neispravni identifikatori
13a55 alfa,beta xy int // // // // Prvi znak ne sme da bude cifra. Znakovi interpunkcije nisu dozvoljeni. Operatori nisu dozvoljeni. 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 izvravanja 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 konstanta 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 prostor. U nastavku pod pojmom podatak podrazumeva se samo ova vrsta podataka. Konstante 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 promenljive (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.

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 sloenih tipova podataka, koji mogu da se izvode, polazei od prostih tipova podataka, neogranien. 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 (slika 2.1.a). Pod vrednou promenljive podrazumeva se vrednost sadranog podatka. Operacije nad promenljivom obrauju taj, neposredno, sadrani podatak. Promena vrednosti jedne promenljive nikad ne utie na vrednost druge.
x: 8 y: 2 z: 5 a: b: c:
5 0 2 7 9 3 4 7 9 2 6 8

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 neposredno 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, promenie 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.

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 promenljiva operator izraz izraz operator izraz operator izraz izraz ? izraz : izraz ( izraz ) ili ili ili ili ili ili

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 operanda (binarni operatori). U jeziku Java postoji i jedan operator s tri operanda (ternaran operator). 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 obeleene 6.4.1.1, 103). Postoje operatori za koje neki od operanada mora da bude promenljiva. Ako pri objanjavanju pojedinih operatora nije posebno naglaeno, operandi ne moraju da budu promenljive.

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 ). Unutar 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 sleva 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 zaokruivanje. 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 a + b * a / b * 7 / 4 * 7 * 3 / 7. / 4. 7. * 3. 7 % 3 9 % 3 c c c 3 4 * 3. / 4. // // // // // // // // // (a + b) c a + (b * c) (a / b) * c 3 5 5.25 5.25 1 0

ali za razliku od i od

3.1 Aritmetiki operatori

35

Prvi izraz prikazuje izraz s dva operatora istog prioriteta. Poto se ovi operatori grupiu sleva nadesno, prvo se izvrava operator +. Rezultat tog izraunavanja predstavlja prvi operand operatora . U drugom izrazu operator * ima vii prioritet, pa se prvo izvrava taj operator. U treem izrazu, opet, oba operatora su istog prioriteta, pa se oni izvravaju 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 operatori 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 raunanje a tek posle se menja vrednost promenljive k. Operandi ovih operatora mogu da budu samo promenljive, a ne i rezultati drugih operatora. 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++ j = j = j = j = k++ k k ++k * k k++ * k ++ // // // // // // // k = k + 1 k = k + 1 k = k 1, j = k, k = k = k + 1, u = k, k = (k++)++ j = k k 1 j = k * k k + 1, j = u * k GREKA!

ali

Prva dva izraza pokazuju da su u sluaju samostalnog izraza prefiksna i postfiksna varijanta 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 ++

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 podataka (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 operatora 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.

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 promenljivih 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 koja 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 kompleksnog 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.

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 identifikatora. Treba obratiti panju na to da se doseg identifikatora ne protee na ceo blok, ve poinje 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 promenljive x, koja je definisana u redu neposredno pre naredbe kojom je definisana promenljiva 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 identifikatori 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 postoji 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 spoljanjem 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-

54
{ // Spoljanji blok. int a = 1, b = 2; { // Prvi int c = int d = int b = int e = ugneeni blok. a + b; h + i * j; // GREKA: h jo ne postoji. c / d; // GREKA: b ve postoji. f; // GREKA: f jo ne postoji.

4 Naredbe

{ // 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; int i = c + f; // U redu: prethodno h vie ne postoji. // 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 (promenljive) 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 identifikator 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.

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;

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 OutOfMemoryError. 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 3 0 1 2 3 4 5 6 0 1 2 3 4

c:
0 1 0 1 2 3

0 1 2 0 1 0 1

a:

a2

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.

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 promenljivih 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 imenovanom 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 elemenata. 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, proirujua, konverzija tipa (3.5, 40). Duina niza bie jednaka broju navedenih vrednosti. U sluaju ugneavanja nizova pojedinane vrednosti treba da su i same nizovi vrednosti odgovarajue dubine ugneavanja. Ako se u izrazu za dodelu memorije navodi inicijalizator, parovi uglastih zagrada moraju biti prazni (ne smeju da se navedu duine).
Primer 5.4 Inicijalizacija nizova
int[] e int[] f int[][] int[][] = = g h new int[] {1, 2, 3, 4}; {1, 2, 3, 4}; = new int[][] {{1,2,3}, {4,5,6}}; = {{1,2,3}, {4,5,6}}; // ili // ili

78

5 Nizovi

5.3 Pristupanje elementima niza: []


Elementi niza se identifikuju pomou rednog broja unutar niza koji se naziva indeks. Indeksi 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 ]

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 izuzetkom tipa ArrayIndexOutOfBoundsException. Ako se izuzetak ne obrauje od strane 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 pristupa navoenjem po jednog indeksnog izraza za svaku dimenziju (nivo ugneavanja) unutar odvojenih parova zagrada:
niz [ indeks ] [ indeks ] [ indeks ]

Niz ne sme da bude null. Ako jeste, greka se prijavljue izuzetkom tipa NullPointerException. Ako se izuzetak ne obrauje od strane programa, program se prekida (izu-

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.

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 primenjuju. 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. Javne metode su tada jedina mogunost da se doe do podataka sadranih u klasnim objektima. 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,

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 klase. 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 modifikatora 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 rezultat 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. Time 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:

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 inicijalizatorom postavlja na vrednost 1, dok b poprima podrazumevanu vrednost 0.

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 dozvoljeno 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 argumenata daju jedan rezultat koji se naziva povratna vrednost (return value), ili skraeno samo vrednost metode. Tip povratne vrednosti naziva se tip metode. Vrednost metode moe 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 metode unutar sopstvene klase.

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 knjizi 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 sistema 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 reima, 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 vrste 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

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 imena 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 prevoenja 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 jedinicu prevoenja (datoteku) i datoteke imenovati prema imenima sadranih klasa. Eventualne 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 { private int a; int b; public int c;

// JAVNA KLASA.

} public class Beta { // PAKETSKA 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 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 paketsku 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

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 prevodilac 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 Beta.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 ;

8 Nasleivanje

Objekti u svakodnevnom ivotu mogu da se grupiu na osnovu njihovih zajednikih osobina. 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 specifine osobine. Na primer: geometrijske figure u ravni mogu da budu okarakterisane poloajem, orijentacijom, povrinom i obimom, krugovi su geometrijske figure u ravni koje su dodatno okarakterisane poluprenikom, kvadrati su geometrijske figure u ravni koje su dodatno okarakterisane duinom ivice, trouglovi su geometrijske figure u ravni koje su dodatno okarakterisane duinama 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 objekata 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
modifikatori class ImePotklase extends ImeNatklase { modifikatori lan modifikatori lan

Potklase se definiu opisom class iji je opti oblik:

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 modifikatora 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-

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, metodama: 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 prethodnog 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 nasleenog 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 neke 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 konstruktor koji samo poziva podrazumevani konstruktor natklase. U telu konstruktora eksplicitno moe da se poziva najvie jedan konstruktor: konstruktor svoje klase (this() 6.5, 112) ili konstruktor natklase (super()).
Primer 8.1 Definisanje potklasa s konstruktorima
// A.java package pak1; public class A { public A( ) { } } // Natklasa.

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

172
// B.java package pak1; public class B extends A { public B( ) { super( ); } }

8 Nasleivanje

// Potklasa u istom paketu.

Klasa B, takoe u paketu pak1, je potklasa klase A. Prvom naredbom u telu konstruktora poziva se konstruktor natklase (super()) radi inicijalizacije nestatikih polja nasleenih 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 { public C( ) { } } // Potklasa u drugom paketu.

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 { public D( ) { } }

// GREKA: Klasa C je konana.

Poto je klasa C konana, ne mogu da se definiu klase koje su njene potklase, bez obzira 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 nasleene, 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 lanove 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.

9 Ugneeni tipovi

Ugneen tip (nested type) je tip (klasa ili interfejs) koji je definisan unutar drugog, okruujueg 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 koristi 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 okruujuem tipu. Metoda s istim imenom, ali drugaijim potpisom samo preoptereuje ime metode (6.4.5, 109). Sakrivenim lanovima moe da se pristupa navoenjem imena okruujue klase ispred imena lana:
ImeOkruujuegTipa . ImePolja ImeOkruujuegTipa . ImeMetode ( argumenti ) odnosno ...

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

210

9 Ugneeni tipovi

dugake ugneene tipove, a naroito sisteme ugneenih tipova. Definiciju klase od nekoliko 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 koristi 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 { private int a = 1; private static int b = 2; public class Unutra1 { private int b = a; private int c = b; private int d = Spolja.b; } int e = c; int f = new Unutra1().c; void m() { class Unutra2 {} } } // Okruujua klasa.

// // // //

Javna ugneena klasa. Sakriva Alfa.b Koristi se this.b Koristi se Spolja.b

// GREKA: Unutra1.c nije u dosegu. // Ovako moe. // 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; Spolja.Unutra1 q = null; // GREKA: Unutra1 nije u dosegu. // 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.

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 podrazumeva se statika ugneena klasa, dok ostale vrste ugneenih klasa imaju svoja zasebna 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 treba 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 ugneene 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 lanova 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 statika 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. Unutra()) 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.

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

10 Izuzeci

Bez posebne podrke od strane programskog jezika konfliktne situacije (greke) u programima obino se obrauju na sledei nain: Ako se unutar neke metode otkrije greka, metoda se zavri vraajui neku informaciju 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 situaciju, 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 odgovarajue 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(){ bool g=false; for(; && !g; ){ m2(,g); if(!g){ } } if(!g){ } else { // Obrada greke } } void m2(, boolean g){ for(; && !g; ){ m3(,g); if(!g){ } } if(!g){ } } void m3(, boolean g){ for(; && !g; ){ if(problem) g=true; else { } } if(!g){ } }

Slika 10.1 Obrada greke pomou indikatora

226

10 Izuzeci

Jezik Java nudi efikasan mehanizam izuzetaka za obradu greaka koji rastereuje programera 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 rukovaocu 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(){ RADI { for(; ; ){ m2(); } } ISPRAVI { // Obrada greke } } void m2(){ for(; ; ){ m3(); } } void m3(){ for(; ; ){ if(problem) PRIJAVI; } }

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

RuntimeException

<<exception>>

Slika 10.3 Glavne klase za izuzetke

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 javljaju 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 Exception () Exception (String RuntimeException() RuntimeException(String Error () Error (String por) por) por) 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 samo 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 potklase 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 izuzecima.
Primer 10.1 Definisanje klasa za izuzetke
class class class class G1 G2 G3 G4 extends extends extends extends Exception { } Exception { } Exception { } 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.

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 realnim 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 parametri (type parameters). Nazivaju se i tipovne promenljive (type variables), jer u definicijama 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 slova 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).

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. Opti oblik definisanja generike klase, onosno interfejsa je:
modifikatori class GenTip { } modifikatori interface GenTip { } odnosno

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); }

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 T a T[] T[] } GenC3<T> { = new T(); // GREKA: ne moe objekat tipa parametra. b = new T [10]; // GREKA: ne moe niz tipa parametra. 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 (pokazivaa 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 kompatibilnih 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 generike klase je:
modifikatori GenTip imePromenljive ; new GenTip ( ) odnosno

Drugim reima, pri definisanju promenljive ili stvaranju objekta potrebno je navesti konkretizovan generiki tip.
Primer 11.3 Definisanje promenljivih i stvaranje objekata generikih tipova iz primera 11.2
GenC1<Byte> GenC1<byte> GenC1<byte[]> GenC2<String, GenC2<Object, a = new GenC1<Byte>(); b = null; // GREKA: ne moe prost tip. c = null; // Niz prostog tipa moe. Long> d = new GenC2<String, Long>(); GenC1<Float>> e = null;

Promenljiva a u prvom redu je tipa GenC1<Byte> i inicijalizovana je objektom tog tipa. Sadrano polje t u objektu je tipa Byte.

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 raunara, uskladiten u jednu ili vie datoteka na disku. Proces je program koji se izvava u nekom okruenju. Stvara ga operativni sistem raunara 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 njegovih 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 posredovanje operativnog sistema. Neki operativni sistemi omoguavaju da se u okviru procesa vie tokova kontrole (sekvenci 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 podataka. Kae se da sadraj kritine sekcija mora da se izvrava atomino (nedeljivo) u smislu 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 vieprocesorskom raunaru operativni sistem moe pojedine niti da rasporedi na razliite procesore. Tada i stvarno postoji izvestan stepen istovremenosti, ali ne potpuna, jer obino ima vie niti nego procesora.

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 procesor. Drugi razlog moe biti, ako se primenjuje dodeljivanje procesora sa preuzimanjem (pre-emptive scheduling), pojava niti vieg prioriteta u stanju spremna. Nit dobrovoljno naputa 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 deljenog 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. Tehnike 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 interpretirajui 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

Das könnte Ihnen auch gefallen