Uvod

Računar je složen sistem koji se sastoji iz puno komponenata. Najvažnija komponenta je centralna procesorska jedinica. U pitanju je jedan čip čiji je posao da izvršava programe. Program je lista nedvosmislenih instrukcija koje računar mehanički izvršava. Računar može da izvršava instrukcije koje su napisane u tzv. mašinskom jeziku. Svaki tip računara ima svoj mašinski jezik i može da direktno izvršava samo programe koji su pisani u tom jeziku. (Programe koji su pisani u drugim jezicima može da izvršava samo ako se prevedu u mašinski jezik tog računara.) Mašinski jezik se sastoji od vrlo jednostavnih isntrukcija koje CPU tog računara može direktno da izvršava. Sa druge strane, skoro svi programi se pišu u programskim jezicima višeg nivoa, kao što su Java, Pascal ili C++. Program koji se napiše u nekom od ovih jezika ne može da se direktno izvršava na nekom računaru. On mora da se prvo prevede u mašinski jezik. Ovo radi poseban program, kompajler. Kompajler uzima program napisan u jeziku višeg nivoa i prevodi ga u izvršni program u mašinskom jeziku. Ako program treba da se izvrši na nekom drugom računaru, mora da se prevede u taj drugi mašinski jezik uz upotrebu drugog kompajlera, koji odgovara tom drugom tipu računara. Postoji i alternativa za kompajliranje programa pisanog u jeziku višeg nivoa. Umesto da se koristi kompajler koji odjednom prevodi program, možete da koristite interpreter, koji prevodi instrukciju po instrukciju. Interpreter je program koji se ponaša slično kao CPU, odnosno postoje ciklusi važenja instrukcija i njihovog izvršavanja. Interpreter radi u petlji koja stalno čita instrukcije iz programa, odlučuje da li je potrebno da se ona izvrši i ako je potrebno obavlja odgovarajuđu komandu iz mašinskog jezika. Postoje interpreteri koji izvršavaju jezike višeg nivoa. Na primer, programski jezik LISP radi preko interpretera, a ne preko kompajlera. Dizajneri Jave su odlučili da koriste kombinaciju kompilacije i interpretacije. Programi koji su pisani u Javi se kompajliraju u mašinski jezik, ali je u pitanju mašinski jezik za računar koji ne postoji u stvarnosti. U pitanju je virtuelni računar, poznat kao Java virtuelna mašina. Mašinski kod za JVM se naziva bajtkod. Nema nijednog razloga zašto Java bajtkod ne bi mogao da se koristi kao mašinski jezik za pravi računar. Sun Microsystems su i napravili takav računar, odnosno procesor. Sa druge strane, jedna od najvažnijih stvari u Javi je da se Java program može da izvršava na bilo kom računaru. Sve što na tom računaru treba da postoji je interpreter za Java bajtkod. Za svaki računar treba da postoji drugi Java bajtkod interpreter, ali kad računar jednom ima taj interpreter, on može da izvršava bilo koji program pisan u Javi. Isti Java program se može da izvrši na bilo kom računaru koji ima takav interrpreter. Ovo je i jedna od najvažnijih karakteristika Jave, Isti program može da se izvršava na različitim računarima.

1

Zašto biste koristili Java bajtkod? Zašto se ne bi distribuisao originalni Java program, koji bi se kasnije kompajlirao u odgovarajući mašinski jezik. Postoji više razloga. Prvo, kompajler mora da razume Javu, koja je složeni jezik visokog nivoa. Sam kompajler je složeni program. Interpreter za bajtkod je sa druge strane prilično jednostavan program. Lako je napisati interpterer bajtkoda za svaki tip računara, nakon čega taj interpreter može da izvrši bilo koji Java program. Bilo bi mnogo teže napisati Java kompajler za svaki tip računara. Još jedan razlog je sigurnost. Puno Java programa se preuzimaju preko mreže. Ne biste želeli da preuzmete program koji će oštetiti Vaš računar. Interpreter bajtkoda se ponaša kao bafer između Vas i programa koji ste preuzeli. Vi u suštini pokrećete interpreter, koji indirektno izvršava preuzeti program. Interpreter može da Vas zaštiti od potencijalno opasnih akcija, koje su deo tog programa. Java i Java bajtkod ne moraju obavezno da budu povezani. Program napisan u Javi bi mogao da se kompajlira i u neki drugi mašinski jezik, realnog računara. Programi pisani u drugim programskim jezicima bi mogli da se kompajliraju u Java bajtkod. Ipak, kombinacija Jave i Java bajtkoda je ono što daje nezavisnost platforme, sigurnost i kompatibilnost.

Objektno orijentisano programiranje
Objektno orijentisano programiranje je odgovor na softversku krizu iz devedesetih godina pro{log veka. Tada dolazi do nagle ekspanzije primene ra~unara u svim oblastima. Programi postaju sve ve}i i slo`eniji. U njihovom razvoju u~estvuje sve ve}i broj programera. Tradicionalni algoritamski na~in programiranja ne mo`e da odgovori izazovima koji se tada javljaju. Ovde se pre svega misli na mogu}nost kasnijeg odr`avanja softvera. Programi imaju vi{e hiljada linija koda u kojima se treba sna}i. Odgovor je bio u objektno orijentisanom programiranju. [ta su objekti? Sve mo`e biti objekat. Objekti su svuda oko nas. Objektni mogu predstavljati realne ili apstraktne stvari. Objekat je va{ pas, sto, knjiga, bicikla sve {to nas okru`uje. Objekti iz realnog sveta imaju dve karakteristike, a to su stanje i pona{anje. Stanje Va{eg psa predstavlja njegova boja, ime, rasa i sl. Pona{anje nam govori da li on laje, da li je gladan i sl. Softverski objekti su sli~ni ovim objektima iz realnog sveta po tome {to imaju stanje i pona{anje. Stanje softverskog objekta se izra`ava njegovim atributima, koji se opisuju preko promenljivih. Pona{anje softverskog objekta se implementira preko metoda. Metodi su funkcije (potprogrami) koji su pridru`eni jednom objektu. Objekti iz realnog sveta mogu da se predstave softverskim objektima. Na primer u programu za kontrolu rada elektronske bicikle, se bicikla mo`e predstaviti softverskim objektom, bicikl. Pored realnih objekata softverski objekti se mogu koristiti i za predstavljanje apstraktnih stvari. Tako na primer, u programiranju GUI-ja (grafi~ki korisni~ki interfejs) se za predstavljanje doga|aja mo`e koristiti objekat. Doga|aj mo`e biti klik mi{em, ili pritisak nekog tastera na tastaturi.

Sve {to jedan softverski objekat zna (stanje) i mo`e da uradi (pona{anje) se predstavlja atributima i metodima koji se u njemu nalaze. Na primer, bicikla iz realnog sveta ima svoje atribute, koji se odnose na trenutnu brzinu (10 km/h), broj zup~anika (5) i sl. 2

Objektni dijagrami pokazuju da atributi objekta ~ine njegovo jezgro. Metodi okru`uju to jezgro i sakrivaju ga od ostatka programa. Pakovanje atributa objekta i njihova za[tita putem metoda se naziva u~aurenjem. Objekat se prema tome, sastoji od jezgra, koje ~ine njegovi atributi i membrane, koju ~ine njegovi metodi, preko koje se tom jezgru pristupa. U~aurenje promenljivih i metoda je ideja koja programerima pru`a dve osnovne prednosti: Modularnost: Izvorni kod objekta se mo`e napisati i kasnije se mo`e odr`avati nezavisno od drugih objekata i njihovog koda. Objekat se tako|e mo`e lako proslediti izvan granica sistema. mo`ete nekom dati svoju biciklu i ona }e i dalje da radi. Skrivanje informacija: Objekat ima javni interfejs koji drugi objekti koriste za komunikaciju sa njim. Objekat mo`e da odr`ava svoje privatne informacije i metode koji se mogu u bilo kom trenutku promeniti, a da to ne uti~e na objekte oko njega. Ne morate da poznajete detalje u vezi mehanizma sa zup~anicima bicikle, da biste mogli da je koristite. ^emu ova pri~a o objektima? Java je ~ist objektno orijentisani jezik. To zna~i da u Javi nijedno par~e koda ne mo`e da postoji ako nije deo objekta. U C++-u koji je tako|e objektno orijentisani jezik, mogu da postoje i delovi koda koji nisu objektno orijentisani. Ne samo da mogu, nego uvek postoji takav kod, jer uvek mora da postoji funkcija main, koja ozna~ava glavni program, a koja nije deo nijedne klase.

Java aplikacije
Svaka aplikacija pisana u Javi mora da sadr`i klasu, koja defini{e metod po imenu main(). Klasa mo`e da ima proizvoljno ime, ali metod koji se u aplikaciji prvi pokre}e je metod po imenu main(). Obi~no se iz ovog metoda pozivaju druge metode te ili drugih klasa. Prva Java aplikacija Prva aplikacija je ona koju }ete videti na po~etku rada s abilo kojim programskim jezikom, aplikacija koja }e ispisati tekst “Zdravo”. Evo kako izgleda kod:
/** * Klasa ZdravoApp implementira aplikaciju koja na * standardnom izlazu prikazuje tekst zdravo */ public class ZdravoApp { public static void main(String[] args) { System.out.println("Zdravo!"); //Prikazuje string } }

Program sadr`i definiciju klase ZdravoApp. U ovoj klasi postoji samo jedan metod, metod main(). Prva linija definicije ovog metoda je uvek: public static void main(String[] args) U metodu postoji samo jedan izvr{ni iskaz: System.out.println("Zdravo!"); 3

println je metod koji pripada objektu out i on {tampa tekst koji se nalazi u zagradama na ekran. javadoc. je napravljena na ovaj na~in.ozna~ava verziju programa @author . System. realan broj. Program se kompajlira komandom: javac ZdravoApp. Ovaj objekat je ~lan klase System. Kada se jednom defini{e tip promenljive u tom delu memorije mogu da se sme{taju samo podaci tog tipa (ceo broj. Na primer: @version . a kraj komentara sa */. System je standardna klasa koja podr`ava unos preko tastature i prikazivanje izlaza na ekranu. U okviru ove dokumentacije mogu se koristiti razli~ite HTML oznake. objekat i sl. smatra se komentarom i to kompajler zanemaruje prilikom prevo|enja. Objekat out predstavlja standardni izlazni tok.Klju~na re~ public u definiciji metoda main ozna~ava da tom metodu mo`e da se globalno pristupi. Ova klasa se nalazi u paketu java. Svaka promenljiva ima svoje ime i tip. u ovom slu~aju ekran monitora.ozna~ava autora itd. koji od nje pravi dokumentaciju sa hiperlinkovima.) Na osnovu zadatog tipa kompajler kasnije mo`e da proverava da ste toj promenljivoj 4 . Klju~na re~ static osigurava pristup ~ak i kada ne postoji objekat (instanca) klase ZdravoApp. Tekst komentara se na ovaj na~in mo`e da pro{iri na vi{e redova.lang i mo`e joj se pristupiti samo preko imena klase. Ovakve komentare zatim ~ita poseban program. Sve {to se nalazi izme|u po~etka i kraja komentara kompajler zanemaruje prilikom prevo|enja. Osnove jezika Java Podaci i promenljive Promenljiva je imenovani deo memorije koji se koristi za sme{tanje informacija u programu. {to zna~i da mu se mo`e pristupati i kada ne postoji instanca klase System. Sve {to sledi iza ovih znakova. a zavr{avaju se kao i obi~an komentar sa */. Klju~na re~ void ozna~ava da ovaj metod ne vra}a nikakvu vrednost. a nalazi se u istom redu. niz karaktera. Ovaj metod je deklarisan kao static. // ovo je komentar u jednom redu Alternativa je da se po~etak komentara ozna~i sa /*. Sva dokumentacija koju nalazite na sajtovima vezanim za Java kod. Preko imena pristupate podatku na koji ta promenljiva ukazuje. Svaki deo memorije kome ste dali ime mo`e da primi sa odre|eni tip podatka.java a izvr{ava komandom java ZdravoApp Kada se program izvr{i na ekranu treba da se prika`e tekst Zdravo Komentari u kodu Postoji nekoliko mogu}ih vrsta definisanja komentara. tip odre|uje {ta u toj promenljivoj mo`e da se na|e i koje su peracije dozvoljene. /* ovo je komentar u u vi{e redova */ Komentari koji slu`e za generisanje dokumentacije po~inju znacima /**. Jedan od na~ina je da se se upotrebe dve kose crte //.

kao {to je A.4x1038 do 3. Op{ti oblik deklaracije je: tip ime Pored imena i tipa svaka promenljiva ima i svoj domen. int a = 1.poku{ali da zadate neki drugi tip podatka. Domen promenljive je deo koda u kome se ta promenljiva mo`e da koristi. {to zna~i da mogu da sadr`e pozitivne i negativne brojeve. double b = 1. float .vrednosti mogu biti od -128 do +128 i u memoriji zauzimaju 1 bajt (8 bitova) short . Tipovi sa pokretnim zarezom Slu`e za sme{tanje realnih brojeva. Primer: float a = 1.7x10308 do 1. Znakovne promenljive Promenljiva tipa char zauzima u memoriji dva bajta. double .vrednosti mogu biti od-3. Vrednosti se predstavljaju sa ta~no{}u od 7 cifara. ili neki od Unicode karaktera koji dolaze iz razli~itih jezika. Vrednosti se predstavljaju sa ta~no{}u od 17 cifara. U jednom iskazu se mo`e deklarisati i vi{e promenljivih: int a. kao {to je tabulator. Prilikom deklaracije se mo`e izvr{iti i inicijalizacija promenljive. Vrednost ovakve promenljive je jedan karakter.vrednosti mogu biti od -32768 do 32767 i u memoriji zauzimaju 2 bajta (16 bitova) int .5.vrednosti mogu biti od -1. Svaki od njih mo`e da ima predznak. Vrednost mo`e biti i neki specijalni karakter.67. short brojac. Ovi tipovi se razlikuju po opsegu vrednosti koje mogu da se sme{taju. Evo koji su to tipovi: byte .7x10303 i u memoriji zauzimaju 8 bajtova. Kada se 5 . Domen se implicitno defini{e na osnovu mesta gde se nalazi deklaracije promenljive. b.vrednosti mogu biti o -2147483648 do +2147483647 i u memoriji zauzimaju 4 bajta (32 bita) long .vrednosti mogu biti od -9223372036854775808 do +9223372036854775807 i u memoriji zauzimaju 8 bajtova (64 bita) Evo kako izgledaju deklaracije ovih tipova: byte najmanjaVrednost. long najvecaVrednost. Postoje dva tipa. * . int br. Osnovni tipovi promenljivih Celobrojne vrednosti Postoje ~etiri tipa promenljivih koji se mogu koristiti za celobrojne vrednosti.4x1038 i u memoriji zauzimaju 4 bajta. x ili belina (blanko karakter). Ime i tip se promenljivoj zadaju preko deklaracije. float i double.

MAX_VALUE. System. = Integer.out.out. Primer: public class MaxVariablesDemo { public static void main(String args[]) { // celi brojevi byte najveciByte = short najveciShort int najveciInteger long najveciLong = Byte.karakter unosi u program on se mora uokviriti jednostrukim navodnicima ‘A’.op2 Opis Sabira op1 i op2 Oduzima op2 od op1 6 . = Short. char c = ‘a’.println("Najveca vrednost tipa double je " + najveciDouble).println("Najveca vrednost tipa float je " + najveciFloat).println("Vrednost za promenljivu b je " + b).MAX_VALUE.println("Karakter " + c + " je veliko slovo. Long. if (Character. boolean b = true.println("Najveca System.MAX_VALUE. // ostali pritimitivni tipovi char c = 'S'. Promenljive tipa boolean Promenljive ovog tipa mogu da imaju samo dve vrednosti: true (ta~no) i false (neta~no)."). // prikazivanje System. Navodnici nisu deo vrednosti i ne sme{taju se u promenljivu. } System. System.out.MAX_VALUE.isUpperCase(c)) { System. long je " + najveciLong).out. // realni brojevi float najveciFloat = Float. ‘*’. boolean t = false. short je " + najveciShort).println("Najveca vrednost vrednost vrednost vrednost tipa tipa tipa tipa byte je " + najveciByte).println("Najveca System.println("Najveca System.out.out. U pitanju je samo konvencija.out. double najveciDouble = Double. int je " + najveciInteger).out. } } Operatori i zrazi Aritmeti~ki operatori U tabeli koja sledi su prikazani tipovi i opis aritmeti~kih operatora: Operator + - Upotreba op1 + op2 op1 ."). boolean p = true.MAX_VALUE.println("Karakter " + c + " je malo slovo. } else { System.MAX_VALUE.out.

.").println("Oduzimanje..out. i = 37 j = 42 x = 27. System.println(" y = " promenljivih su. System.out.println(" x * y = " + (x * y)).out.out. System.println(" x / y = " + (x / y)).out.println(" i * j = " + (i * j)).").. + i).out.. + x).println("Mesanje tipova.out.out.println(" i * x = " + (i * x)).. System. //Deljenje po modulu System.println(" x = " System..out.out. System.out.out.out.println(" x % y = " + (x % y))."). double x = 27.println(" i % j = " + (i % j)). //mesanje tipova System. System. + y).* / % op1 * op2 op1 / op2 op1 % op2 Mno`i op1 sa op2 Deli op1 sa op2 Ra~una ostatak deljenja op1 sa op2 Sledi primer AritmetikaDemo u kome se defini{u dve celobrojne promenljive i dva realna broja sa dvostrukom precizno{}u i sa njima se obavljaju razli~ite aritmeti~ke operacije. System.y)).println(" x .j)).println(" j + y = " + (j + y))..out. double y = 7.println(" i / j = " + (i / j)).out. System.println("Deljenje po modulu. //oduzimanje brojeva System. } } Izlaz iz ovog programa je: Vrednosti promenljivih su.out.out.out.22.475 7 .j = " + (i ..out.. System.. System..out.println("Deljenje. //Mno`enje brojeva System.println(" x + y = " + (x + y)). int j = 42.out.. System..println("Sabiranje..println(" i .println(" j = " System. //deljenje brojeva System.475.").out. System.y = " + (x ..println("Mnozenje. public class ArithmeticDemo { public static void main(String[] args) { //nekoliko brojeva int i = 37.println("Vrednosti System..println(" i = " System.println(" i + j = " + (i + j))."). System.").out."). //sabiranje brojeva System. + j).

. System. i + j = 79 x + y = 34.255 Mnozenje.815 Mesanje tipova.println(“Ukupan broj vocaka u programu”). na osnovu tipova operanada. ++op/--op se prvo operand pove}ava za 1.println(“Broj narandzi je “ + brojNarandzi). Kod verzije prefiks. Potrebne konverzije se vr{e pre {to se obavi operacija. i * j = 1554 x * y = 198. Ceo broj se implicitno konvertuje u realan broj pre samog izra~unavanja.out..out.8054 Deljenje po modulu..println(“Ukupan broj vocaka je “ + brojVocaka). int brojJabuka = 10. a najmanje jedan od operatora je tipa long.. 8 . U tabeli koja sledi su prikazani tipovi podataka koji se vra}aju iz aritmeti~kih operacija. i . j + y = 49.. int brojVocaka = 0. i % j = 37 x % y = 5. System..y = 7. a tek posle se ta vrednost promeni.j = -5 x . Nijedan od operanada nije float ili double (aritmetika celih brojeva).. public class Voce { public static void main(String[] args) { //deklaracija i inicijalizacija tri promenljive int brojNarandzi = 5..58 Kada se kao operandi u jednoj aritmeti~koj operaciji koriste zajedno ceo broj i realan broj. To su operator ++ koji operand pove}ava za 1 i operator -.. rezultat je realan broj. System.22 Sabiranje.22 i * x = 1016. Oba operatora mogu da se pojave ispred operanda (prefiks) i iza operanda (postfiks). i / j = 0 x / y = 3.out.695 Oduzimanje.37 Deljenje. Nijedan operand nije long..y = 20. pa se taj rezultat koristi dalje u izrazima. Najmanje jedan operand je tipa double.koji operand smanjuje za 1. // povecava se broj narandzi i racuna zbir vocaka brojVocaka = ++brojNarandzi + brojJabuka. Nijedan nije tipa double. Kod verzije postfix se prvo operand primeni u izrazu (stara vrednost). int double float Postoje i dva operanda koji omogu}avaju skra}eno izra~unavanje.. Tip podatka za rezultat long Tipovi podataka za operande Nijedan od operanada nije float ili double (artiemtika celih brojeva).. Najmanje jedan operand je tipa float.

").out.println("Vece ili System. Na primer.. //true //false //false 9 .out.println(" k >= //manje od System.println("Manje System..println(" k = " promenljivih. != vra}a ta~no ako dva operanda nisu jednaki..").println(" j System.out. + j).").println("Vrednosti System.println(" i > j = " + (i > j)). + i)..out.println(" j >= System. j = " + (k >= j)). i = " + (j >= i)). < j = " + (k < j)).println(" i >= System..println("Vece od.. System.println(" i System.out. System. + k). Ako se iskaz sabiranja promeni na: brojVocaka = brojNarandzi++ + brojJabuka..out.out.println(" j > i = " + (j > i)). < i = " + (j < i)). j = " + (i >= j)).out. //false //true //true od.println(" k //false //true //false. System. oni su jednaki jednako.out. < j = " + (i < j)).. //vece od System. //vece ili jednako System. System. Relacioni i uslovni operatori Relacioni operator poredi dve vrednosti i odre|uje vrednost izme|u njih.out. U tabeli koja sledi su dati relacioni operatori: Operator > >= < <= == != Upotreba op1 > op2 op1 >= op2 op1 < op2 op1 <= op2 op1 == op2 op1 != op2 Vra}a true(ta~no) ako je op1 ve}e op2 op1 ve}e ili jednako od op2 op1 manje op2 op1 manje ili jednako op2 op1 i op2 su jednaki op1 i op2 su razli~iti U primeru koji sledi smo definisali tri cela broja i poredili ih pomo}u relacionih operatora. ukupni broj vo}aka je 15.println(" i = " System. Razlog je {to se broj narand`i prvo pove}ao za 1.} } Ukupan broj vo}aka je sada 16. int j = 42.out."). pa je taj broj u{ao u sabiranje.println(" j = " System. public class RelacioniDemo { public static void main(String[] args) { //Nekoliko brojeva int i = 37.out.out. int k = 42.println(" k > j = " + (k > j)).out. koja je tek naknadno pove}ana.out. po{to je u sabiranje u{la stara vrednost za broj narand`i.out.

.println(" k != j = " + (k != j)). i != j = true k != j = false Relacioni operatori se ~esto koriste zajedno sa logi~kim operatorima. } } //false //true //true //false Evo kako izgleda izlaz iz ovog programa: Vrednosti promenljivih...out.. System.. op ima vrednost false (neta~no) || ! op1 || op2 ! op 10 . //razlicito System.").. i = 37 j = 42 k = 42 Vece od. i < j = true j < i = false k < j = false Manje ili jednako.out. op2 se izra~unava samo ako je potrebno.out.//manje ili jednako System. //true //false //true //jednako System..println(" k ili jednako. <= j = " + (k <= j)).out. ili op1 ili op2 ima vrednost true (ta~no)..println(" i System. op2 se izra~unava samo ako je potrebno..out.out. ~ime se dobijaju slo`eni izrazi. U Javi postoje slede}i logi~ki operatori: Operator && Upotreba op1 && op2 Vra}a true(ta~no)ako je i op1 i op2 imaju vrednost true. <= j = " + (i <= j))..println("Manje System..println(" i == j = " + (i == j))..out..println("Razlicito.println(" j System.println("Jednako. System.out. i == j = false k == j = true Razlicito.out.").out. i <= j = true j <= i = false k <= j = true Jednako. System."). <= i = " + (j <= i)).println(" i != j = " + (i != j))....println(" k == j = " + (k == j)). i >= j = false j >= i = true k >= j = true Manje od. i > j = false j > i = true k > j = false Vece ili jednako... System...

Ili je op1 ili je op2 true (ta~no). kojim se jedna vrednost dodeljuje drugoj. Prethodna dva izraza su ekvivalentna. U tabeli koja sledi su dati neki od operatora ovog tipa: Operator += -= *= /= %= &= |= ^= Upotreba op1 += op2 op1 -= op2 op1 *= op2 op1 /= op2 op1 %= op2 op1 &= op2 op1 |= op2 op1 ^= op2 Ekvivalentno sa op1 = op1 + op2 op1 = op1 . Sa operatorom & se vrednost drugog operatora uvek izra~unava. 11 .& | ^ op1 & op2 op1 | op2 op1 ^ op2 i op1 i op2 imaju vrednost ta~no. a ako je to dovoljno da se izra~una vrednost celog izraza. Koja je razlika izme|u operatora && i &? Razlika je u brzini izvr{avanja programa. za kreiranje nizova. Uvek se izra~Unava i op1 i op2. Uvek se izra~unava i op1 i op2. U Javi postoje i operatori dodele kojim se odjednom izvr{ava vi{e operacija. dok se sa operatorom && izra~unava vrednost prvog operanda.op2 op1 = op1 * op2 op1 = op1 / op2 op1 = op1 % op2 op1 = op1 & op2 op1 = op1 | op2 op1 = op1 ^ op2 Ostali operatori U tabeli koja sledi su dati ostali operatori koji postoje u Javi. Napisali biste: i = i + 2. Pretpostavimo da `elite da saberete vrednost promenljive sa nekim brojem i da rezultat dodelite istoj promenlivoj. ali ne oba. ako su op1 i op2 razli~iti. Operatori dodele Osnovni operator dodele je operator =. i za pristup elementima niza. Operator ?: [] Opis Skra}eni iskaz if-else Koristi se za deklarisanje nizova. odnosno ako jedan ima vrednost true. Skra}eno se ovo mo`e napisati pomo}u operatora += na slede}i na~in: i += 2. drugi operand se ne izra~unava.

U ovom primeru se kreira novi objekat klase Integer. Integer a = new Integer(10). ako op1 ima vrednost true (ta~no) ili vrednost op3 ako op1 ima vredcnost false (neta~no). ( params ) ( tip ) new Koristi se za formiranje kvalifikovanih imena. Operator [] Ovaj operator se koristi za deklarisanje nizova i za pristupanje elementima niza. Operator instanceof Ovaj operator testira da li prvi operator predstavlja priemrak klase koja je data drugim operatorom. (double) a a se pretvara u tip double. Ovaj operator se koristi za pristup ~lanovima klase. op1 ? op2 : op3 Pretpostavimo da imamo dve celobrojne promenljive tipa int. @elimo da tre}oj promenljivoj. Operator new Koristi se za kreiranje novog objekta ili niza. 12 . Vi{e o njemu kada se bude govorilo o klasama. Sedmom ~lanu niza mo`ete da pristupite na slede}i na~in: realniNiz[6] Operator . Operator () Koristi se prilikom deklarisanja i poziva metoda klase. dodelimo ve}u od ove dve vrednosti. Konvertuje se jedan tip u neki drugi. promenljiva stariji dobija vrednost tvojeGodine. mojeGodine i tvojeGodine. Evo kako izgleda iskaz: stariji = tvojeGodine > mojeGodine ? tvojeGodine : mojeGodine Prvi argument ovog operatora je logi~ki izraz tvojeGodine > mojeGodine. Operator (tip) Vrednost se konvertuje u odre|eni tip. Kreira se novi objekat ili niz. Ako taj izraz ima vrednost true (ta~no). a ako je prvi izraz ocenjen kao false (neta~no) promenljiva stariji dobija vrednost mojeGodine. Vi{e o njemu kada se bude govorilo o klasama. Defini{e se lista parametara. Vrednosti se odvajaju zarezima. instanceof Odre|uje se da li je prvi operator instanca (primerak) drugog Operator ?: Ovaj operator vra}a op2. float [] realniNiz = new float[10].. stariji. Ovaj izraz deklari{e niz realnih brojeva sa deset elemenata.

postfiks operatori unarni operatori [] . na primer. Operatori sa najvi{im prioritetom su navedeni prvi. Prioritet operatora Ako se u izrazu na|e vi{e operatora oni se izvr{avaju odre|enim redosledom. Primer: 13 * / % + << >> >>> < > <= >= instanceof == != & ^ | && || ? : = += -= *= /= %= &= ^= |= <<= >>= >>>= . Iskaz if Iskaz if je elementarni logi~ki izraz.op1 instanceof op2 op1 mora biti objekat. a ako nemam kupi}u mese~nu kartu za autobus. “Ako imam para na ra~unu kupi}u nov auto. Morate biti u stanju da izaberete izme|u razli~itih mogu}nosti. a zatim slede oni sa ni`im prioritetom. (params) expr++ expr-++expr --expr +expr -expr ~ ! operatori kreiranja i kovenrzije new (type)expr mno`enje sabiranje pomeranje relacioni jednakost bitovsko I bitovsko isklju~ivo ILI bitovsko uklju~ivo ILI Logi~ko I logi~ko ILI uslovni dodela Logi~ki izrazi Osnovni element svih programa je dono{enje odluka. Njegov najjednostavniji oblik je: if (izraz) iskaz. U tabeli koja sledi je dat prioritet operatora. a op2 mora biti ime klase.”. treba da koristite zagrade. Programski se dono{enje odluka realizuje pomo}u relacionih operatora i odgovaraju}ih logi~kih izraza. Izraz mo`e biti bilo koji izraz koji daje vrednost true (ta~no) ili false (neta~no). Ako je vrednost izraza true. onda se izvr{ava iskaz koji sledi. u suprotnom ne. Ako `elite da promenite prioritet operatora. Objekat je instanca klase ako je primrak ba{ te klase ili neke klase koja je iz nje izvedena.

if(broj % 2 != 0) ++broj. izvr{avaju se svi iskazi izme|u viti~astih zagrada. else iskaz4. else iskaz2. if(izraz1) iskaz1. neka postane paran Ovaj iskaz se mo`e napisati i na neki drugi na~in. if(izraz){ iskaz1.println(“Broj je pretvoren u paran i njegova vrednost je sada “ + broj). else if(izraz2) iskaz2. … } Primer: if(broj % 2 != 0){ //proverava se da li je broj neparan ++broj. a ako nije. Klauzula else Osnovni iskaz if mo`e da se pro{iri klauzulom else. … }else{ iskaz2. mo`e se upotrebiti klauzula else if. if(broj %2 != 0) ++broj. neka postane paran System. ali se preporu~uje ovakva forma. else if(izraz3) iskaz3. Iskaz ili iskazi koji slede iza klauzule elese se izvr{avaju samo u slu~aju da izraz u klauzuli if nije ta~an. a ne samo jedan kao u prethodnom primeru. //ovako ne bi trebalo. iskaz2. if(izraz) iskaz1. Ako je potrebno da se u klauzuli else izvr{i vi{e iskaza tako|e se mogu uporebiti viti~aste zagrade. ne izvr{ava se nijedan. … } Klauzula else if Ukoliko prilikom dono{enja oluke postoji vi{e mogu}nosti. mogu se uporebiti viti~aste zagrade. mada je mogu}e Ako je potrebno da se kao rezultat iskaza if izvr{i vi{e iskaza. } Ako je izraz ocenjen kao ta~an. 14 .out. //ako je neparan. if(izraz){ iskaz1. //proverava se da li je broj neparan //ako je neparan.

Kao {to vidite vrednost promenljive rezultatTesta mo`e da zadovolji vi{e od jednog uslova. u okviru tog drugog. Iskazi if mogu biti ugne`deni. if (rezultatTesta >= 90) { ocena = 'A'. na koji promenljiva ukazuje. izvr{ava se iskaz (iskazi) iza klauzule else. } else if (rezultatTesta >= 70) { ocena = 'C'. ako ona postoji. } Iskaz switch Ovaj iskaz se koristi za uslovno izvr{avanje iskaza na bazi vrednosti celobrojnog izraza. tre}i itd.out… Izrazi koji slede iza izraza koji je bio zadovoljen se ne proveravaju. } else { ocena = 'F'. Ako vrednost izraza izraz2 nije true.println("Ocena = " + ocena).out. } System. Ako je njegova vrednost ta~na.out.println("Februar"). 15 . break.println("Januar"). } else if (rezultatTesta >= 60) { ocena = 'D'. Ocena je ipak C. U primeru koji sledi je upotrebljen iskaz switch koji na osnovu celobrojne vrednosti mesec {tampa ime meseca. Primer: public class IfElseDemo { public static void main(String[] args) { int rezultatTesta = 76.out. U okviru jednog if iskaza mo`e da se na|e drugi. Ako izraz nema vrednost true. Evo kako to izgleda: if(izraz1){ if(izraz1-1){ if(izraz1-1-1) iskaz1-1-1. }else iskaz1-1. jer je 76 >= 70. proverava se vrednost izraza izraz2. public class SwitchDemo { public static void main(String[] args) { int mesec = 8. kontrola programa prelazi na kod iza iskaza if. a tako|e je i rezultatTesta >= 60. case 2: System. zato {to se izvr{ava samo prvi blok koda koji pripada izrazu rezultatTesta >= 70. u ovom slu~aju na iskaz System. char ocena. Ako nijedan od izraza u klauzulama else if nije ocenjen kao ta~an (true). izvr{ava se iskaz iskaz2. switch (mesec) { case 1: System. Kada se izvr{i taj blok. Posle izvr{enja iskaza iskaz2 program se nastavlja kodom koji sledi iza celog iskaza if. a samim tim se i ne izvr{ava pripadaju}i kod. izvr{ava se iskaz1.Ako je vrednost izraza izraz1 ocenjena kao ta~na. } else if (rezultatTesta >= 80) { ocena = 'B'. } } Izlaz iz programa je: Ocena = C. proverava se vrednost izraza izraz3 itd. break.

out. break.println("Mart"). 16 .println("Maj"). else brojDana = 28. } …… itd. onda se kontrola toka.println("Jun").println("Jul"). prenosi na slede}i iskaz u switch bloku.println("Januar"). break.println("Oktobar").out. case 2: if ( ((godina % 4 == 0) && !(godina % 100 == 0)) || (godina % 400 == 0) ) brojDana = 29.out. Evo primera u kome smo to iskoristili: public class SwitchDemo2 { public static void main(String[] args) { int mesec = 2. System. if (mesec == 1) { System. break. break.out. Stvar je li~nog izbora koji }ete od ovih metoda koristiti. nakon {to se izvr{i pravi iskaz. break.out. Na~in kontrole toka programa u iskazu switch (bez iskaza break) mo`e ponekad i da bude od koristi.println("Februar"). Ako se doda iskaz break. jer se bez njega kontrola toka programa.out. System.out. case 4: case 6: case 9: case 11: brojDana = 30. Rezultat ovog programa je Avgust. dok se u iskazu if mogu da koriste razli~iti uslovi. System. break.println("April").case case case case case case case case case case } } } 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: System.println("Septembar"). break.out. Prilikom dono{enja odluke treba imati u vidu iskaz switch odluku mo`e da donese samo na osnovu celobrojne vrednosti.println("Novembar"). Isti efekat se mogao posti}i i pomo}u iskaza if: int mesec = 8. } else if (month == 2) { System. break. break. break. System. System. int godina = 2000.out. System.out. break. System. Verovatno ste u prethodnom kodu primetili prisustvo iskaza break.out. break. System. nakon izvr{enja pravog iskaza.println("Decembar"). break. switch (mesec) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: brojDana = 31. Ovaj iskaz se naj~e{}e koristi zajedno sa iskazom switch.println("Avgust"). int brojDana = 0.out. System. prenosi na kod koji sledi iza iskaza switch.

case 11: System. switch (mesec) { case 1: System. break.println("Septembar").out. ponovo se izvr{avaju iskazi. } } Izlaz iz programa je: Broj dana je 29 Ovaj program izra~unava broj dana u mesecu za zadatu godinu i mesec. case 12: System. } Prvo se izra~unava vrednost izraza. break. break.println("Novembar"). koji postoji samo kod poslednjeg u nizu. public class WhileDemo { 17 . mo`ete da upotrebite klauzulu default.out. break. case 10: System. izvr{avaju se iskazi koji pripadaju petlji. Ta vrednost mora biti tipa boolean.out.out. break. case 3: System. Ovo se ponavlja sve dok je vrednost izraza ocenjena kao ta~na (true). Ako `elite da se neki iskazi izvr{e u slu~aju da nijedan od case iskaza nije zadovoljen. break.out. U Javi postoje tri vrste petlji: while. sada sa dodatom klauzulom default: public class SwitchDemo { public static void main(String[] args) { int mesec = 8. Ovo se ponavlja sve dok se ne nai|e na karakter g.out.out.println("Broj dana je " + brojDana).println("Avgust"). Svaki karakter koji nije g se dodaje u objekat StringBuffer.out. break.println("Mart").println("Januar"). case 8: System.out. Iskazi koji slede iza ove klauzule se izvr{avaju ako nijedan slu~aj (case) nije zadovoljen.} System.out.out. case 6: System. case 7: System.out.out. Evo kako izgleda prepravljen program iz prvog primera.. break. do while i for. U primeru koji sledi se pomo}u petlje while ide kroz string. break. Kao {to vidite svi meseci koji imaju 31 dan su bez iskaza break.println("Oktobar").println("April").break. case 4: System. i ako je ta vrednost true. Na kraju se rezultuju}i string {tampa. Posle izvr{avanja iskaza.println("Maj").println("Decembar"). Evo kako izgleda ta petlja: while(izraz){ iskazi. Isto va`i i za mesec koji imaju 30 dana (i oni su grupisani i postoji samo jedan iskaz break). break. default: System. break.println("Jun").println("Februar"). break. case 5: System.println("Jul"). Petlja while Ova petlja se koristi za ponovljeno izvr{avanje bloka iskaza sve dok je uslov ta~an.out. } } } Petlje Petlje se koriste za izvr{avanje dela koda koji se ponavlja. case 9: System. case 2: System. Ako je vrednost izraza true (ta~no).println("Niste uneli ispravan broj za mesec"). ponovo se proverava vrednost izraza.

Izvr{avanje petlje se nastavlja sve dok se uslov_petlje izra~unava kao ta~an. do { kopirajUMene.println(kopirajUMene). char c = kopirajOdMene. pa se tek u zavisnosti od rezultata izvr{ava telo petlje. Kada njegova vrednost bude false (neta~no). int i = 0.charAt(++i).out.append(c). while (c != 'g') { kopirajUMene.charAt(i).public static void main(String[] args) { String kopirajOdMene = "Kopiraj ovaj string sve dok se ne " + " dodje do slova 'g'. Razlika u odnosu na petlju while je u tome da se kod petlje while uvek prvo proveri vrednost izraza. a tek posle prvog izvr{enja se proverava vrednost izraza. Tu se obi~no inicijalizuje broja~ petlje.out.charAt(++i).println(kopirajUMene). } } Petlja for Op{ti oblik ove petlje je: for(inicijalizacija. Evo kako izgleda prethodni primer. }while(izraz).". ali sa petljom do-while: public class DoWhileDemo { public static void main(String[] args) { String kopirajOdMene = "Kopiraj ovaj string sve dok se ne " + " dodje do slova 'g'. } while (c != 'g').. Ovaj izraz se proverava na po~etku svakog izvr{enja petlje. StringBuffer kopirajUMene = new StringBuffer().append(c). char c = kopirajOdMene. Kod petlje do-while se telo petlje uvek izvr{ava makar jednom. } } Izlaz iz ovog programa je: Kopiraj ovaj strin Petlja do-while Ova petlja je sli~na sa petljom while. c = kopirajOdMene. StringBuffer kopirajUMene = new StringBuffer(). } System.". c = kopirajOdMene. izraz petlje){ iskazi… } Deo ozna~en sa inicijalizacija se izvr{ava jednom pre pokretanja petlje. int i = 0. 18 . uslov_petlje.charAt(i). Sintaksa za petlju do-while je: do{ iskazi. System.

sto znaci da nije prost broj break. i++){ prostBroj = true. i <= limit’ i++) sum += i. // Trazi se suma od 1 do ove vrednosti int sum = 0. // maksimalna vrednost koja se proverava boolean prostBroj = true. Spolja{nja petlja ide kroz sve brojeve koje treba proveriti. Izraz ozna~en sa izraz_petlje se izvr{ava na kraju petlje.println(i). // u pitanju je prost broj pa se ispisuje } } } Ispisuju se prosti brojevi od 1 do nVrednost (u ovom slu~aju 50).program se nastavlja kodom koji sledi iza petlje. // ako smo dospeli do ovde. Primer: Public class ForPetlja{ public static void main (String[] args){ int limit = 20. pa tek onda spolja{nja. // vrednost sume for(int i = 1. j < i. Program se iskazom break nastavlja kodom koji sledi iza petlje. unutra{nja petlja proverava da li postoji neki broj sa kojim se to i mo`e da podeli bez ostatka. mo`ete upotrebiti iskaz continue. i <= limit’ i++){ if(i % 3 == 0) continue. // pretpostavka da je trenutna vrednost prost broj for(int j = 2. Na kraju se svi prona|eni prosti brojevi {tampaju. Ako mo`e. Za svako i.println(“suma = “ + sum). Broja~ te petlje je i. j++){ if(i % j == 0){ //tacno ako j deli bez ostatka prostBroj = false. Obi~no se tu pove}ava ili smanjuje broja~ petlje za neku zadatu vrednost. postojalo je deljenje bez ostatka. System. Sledi primer u kome se pronalaze prosti brojevi. 19 . } } // ispisivanje prostih brojeva if(prostBroj) // da li je to prost broj System. to zna~i da nije u pitanju prost broj i da treba napustiti unutra{nju petlju (za to slu`i iskaz break). Prvo se izvr{ava unutra{nja petlja. Petlje mogu da se ugne`davaju. // preskace se ostatak iteracije sum += i. // tacno ako je prost broj // provera svih vrednosti od 2 do nVrednost for(int i = 2. i <= nVrednost. Prost broj je onaj koji nije deljiv bez ostatka ni sa jednim drugim brojem (osim sa 1). Primer: for(int i = 1. Iskazi continue i break kao delovi petlje Ako `elite da se u nekom prolazu kroz petlju presko~i neki njen deo i da se izvr{enje nastavi od po~etka petlje.out. } Iskaz break se mo`e upotrebiti za trenutni prekid petlje. public class ProstiBrojevi{ public static void main (String[] args){ int nVrednost = 50. } } Broja~ petlje mo`e biti i realan broj.out.

true.5. Veli~ina niza je u ovom slu~aju odre|ena brojem elemenata.println("Maksimum je " + max). i++) { niz[i] = i.5}. false. Ovo je deklaracija niza. morate da ih zadate za sve elemente. U ovom trenutku niz jo{ uvek nema dodeljenu memoriju. na primer.out. 17. Java proverava da li element niza kome pristupate postoji. ^lanovi niza se u Javi uvek numeri{u po~ev od 0. 5. public class MaxNiz{ public static void main (String[] args){ double[] A = {2.print(niz[i] + " ").3. } System. 5. System.Nizovi i stringovi Niz je struktura podataka koja se sastoji od zadatog broja stavki. iskaz niz[4] pristupa petom elementu niza. Jedan niz...length. Niz se deklari{e na slede}i na~in: int[] niz. U trenutku kreiranja niza se defini{e njegova du`ina i dodeljuje se potrebna memorija. niz = new int[10]. } Inicijalizacija nizova Elementima niza se mogu odmah u toku definisanja dodeliti vrednosti. double max = A[0]. Evo kako se to radi: boolean[] answers = { true. true.. kome se pristupa. koje su numerisane od 0 do 99. } } 20 . 12.length Sledi primer koji pokazuje kako se pristupa elementima niza i kako se odre|uje njegova veli~ina. 3. Veli~ina (du`ina) niza Veli~inu niza }ete dobiti na slede}i na~in: imeNiza. i++) { if (A[i] > max) max = A[i]. Ako poku{ate da pristupite nepostoje}em elementu niza javi}e se izuzetak tipa IndexOutOfBoundsException. Na primer. U primeru koji sledi je pokazano kako se odre|uje element niza sa najve}om vredno{}u. Pristup elementima niza Elementima niza se pristupa preko imena niza.length. Nizovi u Javi su objekti pa se u skladu sa time kreiraju pomo}u operatora new. false }. for (int i = 1.out. mo`e da sadr`i 100 celobrojnih vrednosti. i < A. Ako zadajete inicijalne vrednosti niza. for (int i = 0. iza kojeg u uglastim zagradama sledi indeks elementa. pri ~emu su sve stavke (elementi) istog tipa. Iskaz koji sledi zauzima dovoljno memorije za niz od deset celobrojnih vrednosti i zatim taj niz dodeljuje promenljivoj niz. koju smo ranije deklarisali. i < niz.

j < temperatura[i]. //Pravi se novi niz. ne dovode do kopiranja niza A u niz B.6. i < temperatura. Ako se `eli kopiranje treba napisati: double[] B = new double[A.length. j++) prosek += temperatura[i][j]. // generisanje temperature for(int i = 0.println("Prosecna temperatura na lokaciji " + (i+1) + " je " + prosek/(float) temperatura[i]. od kojih je svaki niz 21 . Ovo mo`ete da ostvarite pomo}u niza od 10 elemenata.0). j < temperatura[i]. // prosecna vrednost for(int j = 0.4. } } } Nizovi nizova promenljive du`ine Kada su elementi jednog niza drugi nizovi. i++){ float prosek = 0.Kopiranje niza Kopiranje niza se vr{i tako {to se u novi niz kopira svaki novi element niza zasebno. a druga se kre}e od 0 do 364 i odnosi se na temperature. Iskazi: double [] A = {1. Niz se mo`e deklarisati na slede}i na~in: float primer [] []. j++) temperatura [i][j] = (float) (45. U ovom slu~aju je samo napravljena nova promenljiva B. Vi{edimenzionalni nizovi Niz kao elemente mo`e da ima druge nizove. oni ne moraju biti iste du`ine. Ako `elite da uka`ete na temperaturu u toku stotog dana na {estoj lokaciji mo`ete da napi{ete: temperatura [5] [99] U primeru koji sledi }emo vrednosti za temperaturu generisati po slu~ajnom principu. Broj elemenata u prvoj dimenziji se mo`e zadti izrazom: primer = new float [6] []. //izracunavanje prosecne vrednosti za temperaturu for(int i = 0. Ovim se deklari{e niz primer tipa float. //prikaz prosecne temperature za trenutnu lokaciju System.length).out.}.length.length. iste velicine kao A for (int i = 0.length. i < temperatura. Ho}ete da merite temperaturu na svakoj od ovih lokacija u toku svakog dana u godini.random() .. // Kopira se svaki element iz A u B.0 * Math. i++) B[i] = A[i]. Uzima}emo nasumi~ne vrednosti izme|u -10 i +35 stepeni Celzijusa. public class Vreme { public static void main(String[] args) { float[][] temperatura = new float[10][365]. double [] B = A. Ovaj niz ima dve dimenzije.length.0f. tokom jedne godine. i < A. koja ukazuje na isti niz kao i promenljiva A. Ovakav niz bi se deklarisao na slede}i na~in: float [] [] temperatura = new float [10] [365]. Prva dimenzija se kre}e od 0 do 9 i odnosi se na geografsku lokaciju. // definicija sest elemenata. ~iji je svaki element drugi niz od 365 ~lanova.. pa je zna~i u pitanju dvodimenzionalan niz. Pretpostavimo da `elite da pratite vremenske prilike na 10 razli~Itih geografskih lokacija. i++) for(int j = 0.length].10.

Ukoliko bismo hteli da niz primer ima trougaoni oblik. tako da mo`ete da napi{ete: triDim[0] = new int[4] []. Mnogo ~e{}e od numeri~kih nizova }ete koristiti nizove znakova (karaktera). triDim[1] = new int[2] [].out. Dalje bismo mogli da napi{emo: triDim[0][1] = new int[3].. i < primer. U pitanju je standardna klasa koja dolazi zajedno sa Javom. Sa nizovima karaktera se obi~no ne radi preko ovakvih nizova. Niz mo`e da ima i vi{e dimenzija. // tri dvodimenzionalna niza Svaki od ova tri elementa u prvoj dimenziji niza mo`e da sadr`i razli~it dvodimenzionalni niz. sa 50 ~lanova: char[] poruka = new char[50]. Ovaj kod daje slede}i izlaz: Ovo je String konstanta 22 . primer[5] = new float[10]. odnosno da prvi element bude niz sa jednim elementom. Skoro svaki put kada smo koristili iskaz println. Mo`ete na primer. U Javi postoji posebna klasa koja se koristi specijalno za rad sa karakterima. mogli biste da napi{ete: for(int i = 0. Iskaz System. Ti nizovi se dalje mogu definisati pojedina~no: primer[2] = new float [6]. To je klasa String.println(“Ovo je \n String konstanta”). drugi niz sa dva elementa. da deklari{ete promenljivu niza tipa char. triDim[2] = new int[5] [].length.Sada imamo dodeljenih {est elemenata od kojih svaki mo`e da sadr`i jednodimenzionalni niz. Na primer niz sa tri dimenzije se mo`e deklarisati na slede}i na~in: int [] [] [] triDim= new int[3] [] []. kao {to je znak za novi red. ili tabulator morate da koristite escape sekvencu. Ako u okviru Stringa `elite da ubacite i neki specijalni karakter. String literal je bilo koja vrednost napisana izme|u dvostrukih navodnika: “Ovo je string literal” Ovo je konstantan objekat klase String. tre}i niz sa tri elementa itd. koji kompajler pravi za upotrebu u programu. i++) primer[i] = new float[i+1]. Znak \n je oznaka za novi red. Niste ograni~eni na dve dimenzije. Dodaje novi red kod {tampanja. kao argument smo koristili i string literal. //itd Nizovi karaktera Nizovi koje smo dosada pominjali su bili numeri~ki nizovi. String literali Do sada smo ve} vi{e puta koristili String literale.

String mojString. Za spajanje stringova mo`ete da upotrebite i operator +=: String fraza = “Spajanje je “ . fraza += “moguce izvrsiti i ovako”. String na koji promenljiva fraza ukazuje posle nakon izvr{enja drugog iskaza je potpuno novi objekat.out. Ako `elite da promenite sadr`aj stringa morate da odbacite staru referencu i da napravite novu. Promenljiva tipa string mo`e da se inicijalizuje i na null vrednost.println(mojString).println(mojString).println(mojString). deklari{e promenljivu mojString koja ne ukazuje ni na jedan string. Promenljiva mojString sadr`i referencu na deo memorije u kome se ~uva sam string. 23 . Iskaz String mojString = null. Ovim se ne menja string “Spajanje je “. Primer: public class StringProba { public static void main(String[] args) { String prviString = "Puno ". Ova promenljiva se deklari{e sli~no kao i ostale promenljive osnovnih tipova. To je mehanizam koji objekte i promenljive koji vi{e nisu potrebni. Objekti klase String su nepromenljivi. sa drugim stringom. Operacijom spajanja stringova preko operatora + se pravi potpuno novi objekat tipa String koji je nezavisan od operanada. Ako je potrebno ova promenjiva se mo`e inicijalizovati odmah prilikom deklaracije: String mojString = “Moj prvi string”. System.out. String drugiString = "ruku ". String treciString = "olaksavaju posao". Na taj novi objekat ukazuje promenljiva mojString. Dobra programerska praksa je da stringove kojima `elite da vrednost dodelite kasnije. Promenljiva mojString sada ukazuje na drugi deo memorije.out. Mo`ete da napi{ete: mojString = “Ovo je drugi string”. uvek inicijalizujete na ovaj na~in. System. //kombinacija stringa i celih brojeva mojString = "pedeset pet je " + 5 + 5. System. posle izvesnog vremena izbacuje iz memorije. mojString = brojRuku + " " + drugiString + treciString. O izbacivanju starog stringa brine sama Java preko skuplja~a otpada. // promenljiva za smestaj rezultata mojString = prviString + drugiString + treciString. // konverzija celih brojeva u string i spajanje sa dva stringa int brojRuku = 99.Objekti tipa string Promenljiva tipa String je u stvari objekat klase String. Operacije nad stringovima Spajanje stringova Spajanje dva stringa se mo`e ostvariti putem operatora +. mojString = “Prvi string se spaja “ + “ sa drugim”. a prvi se odbacuje.

U drugom iskazu je prva operacija matemati~ko sabiranje. tako da se uvek radi o spajanju stringova. Razlog je u tome {to je operator + levo asocijativan. System.out. bez obzira na to da li je sadr`aj tih stringova identi~an. ovaj iskaz ne poredi same stringove.out. ali u jednom slu~aju 5 + 5 daje 55. System.out.println("string1 je sada: " + string1). Iskazi izgledaju sli~no.out. Ovde pre samog spajanja dolazi do konverzije numeri~ke vrednosti brojRuku u String.out. a u drugom 10. String string3 = "Suvise kolacica".println("string1 == string3 je tacno " + "string1 i string3 referenciraju na isti string"). a rezultat se konvertuje u String da bi se omogu}ilo spajanje sa literalom “je 10”. drugiString i treciString se spajaju i sme{taju u ~etvrtoj promenljivoj mojString. System. } } Prvo spajanje je jednostavno i spaja tri stringa.out. System. Iskaz string1 == string2 }e proveriti da li ove dve promenljive ukazuju na isti string.println("string3 je sada: " + string3). System.println("string1 == string3 je tacno " + "string1 i string3 referenciraju na isti string"). String string2 = "kolacica".// kombinacija celih brojeva i stringa mojString = 5 + 5 + " je deset". if(string1 == string3){ System.out. nakon ~ega se to spaja sa stringom “ “. Drugim re~ima. System. if(string1 == string3){ System. } // sada string1 i string3 referenciraju na iste stringove string3 = string1.println("string1 == string3 je netacno " + "string1 i string3 ne referenciraju isti string"). Tri promenljive prviString. ovaj iskaz vra}a false (neta~no).out. }else{ 24 . Razlika je u tome da kod prvog iskaza prilikom sabiranja uvek postoji makar jedan operand tipa string.println("string1 je sada: " + string1).out.println(mojString). Ovo je bitno kod slede}a dva spajanja.out.println("Test 1"). string1 += string2. pa se parovi kod spajanja uskla|uju sa leve strane. Za objekte tipa String (ili bilo koje druge objekte) ovo ne va`i. Ako referenciraju (ukazuju) na razli~Ite stringove. Primer: public class PoredjenjeStringova { public static void main(String[] args) { String string1 = "Suvise " . }else{ System. ve} reference na stringove.println("Test 2"). Drugo spajanje stringova se odnosi na spajanje celog broja 99 i stringa “ “. Pore|enje stringova Osnovni tipovi se porede pomo}u operatora ==. System.println("string3 je sada: " + string3).

if(string1.out.equals(string3)){ System.equals(string3)){ System. Ovaj metod poredi stringove sa pravljenjem razlike izme|u malih i velikih slova.out.equals(string3) je netacno " + "string1 string3 nisu jednaki"). Primer: public class PoredjenjeStringova1 { public static void main(String[] args) { String string1 = "Suvise " . } } } Na po~etku su definisane i inicijalizovane tri promenljive tipa String. if(string1. 25 . }else{ System.println("string1equalsIgnoreCase(string3) je netacno " + "string1 i string3 nisu jednaki").println("string1. po{to promenljive ukazuju na dva razli~ita stringa.out.println("string3 je sada: " + string3). Dva stringa su jednaka ako su iste du`ine. System.equals(string3) string3 su jednaki"). Ako ne `elite da se pravi razlika izme|u malih i velikih slova.equalsIgnoreCase(string3) je tacno " + "string1 i string3 su jednaki. Nakon iskaza dodele sadr`aj promenljivih string1 i string3 }e biti identi~an.println("string1.out. Ako `elite da uporedite dve promenljive tipa String i da utvrdite da li je njihov sadr`aj identi~an.out. String string2 = "kolacica". }else{ System. mo`ete da koristite metod equalIgnoreCase().out. } // razlikuje se velicina slova string3 = "SUVISE kolacica". }else{ System. System.println("string1 je sada: " + string1).equals(string3) je tacno " + "string1 string3 su jednaki"). System. } je tacno " + "string1 i je netacno " + "string1 i i i if(string1.System. System. ali ako se ne pravi razlika izmedju malih i velikih slova"). String string3 = "Suvise kolacica".out. po{to string1 i string3 ukazuju na isti objekat.println("string1 je sada: " + string1). System. Nakon toga smo promenili promenljivu string3.println("string1 == string3 je netacno " + "string1 i string3 ne referenciraju isti string").println("string1.out.println("string1.out. klase String. koristi}ete metod equal.equals(string3) string3 nisu jednaki").out. System.equalsIgnoreCase(string3)){// poredjenje uz zanemarivanje malih i velikih slova System.out.println("string1.println("Test 2"). U tom slu~aju iskaz if se ocenjuje kao ta~an.println("Test 1"). tako da ukazuje na isti objekat kao i string1.out.println("string3 je sada: " + string3).out. ali pore|enje po jednakosti ipak vra}a false. string1 += string2. ako imaju isti broj znakova i ako je svaki znak u jednom stringu identi~an odgovaraju}em znaku u drugom.

U pitanju je metod charAt().startsWith(“Suv”) vra}a true. Sintaksa za pozivanje metoda nekog objekta je: imeObjekta. drugi na poziciji 1 itd. Ako je string1 = “Suvise kolacica”. Po{to je String objekat.} } } Pre nego {to se pozabavimo primerom objasni}emo sintaksu koja je vezana za objekte. koristi}ete metod endsWith(). U tu svrhu se koristi metod length() objekta tipa String. tipa String.imeMetoda(lista argumenata odvojenih zarezima) Metod equals() zahteva jedan argument. Prvi znak u stringu je na poziciji 0. U pitanju je string koji se poredi sa originalnim objektom. odnosno indeks.endsWith(“ica”) vra}a true. ali se pri tome zanemaruje razlika izme|u malih i velikih slova. klase String. objekta string1. U iskazu if smo pozvali metod equals(). tako da iskaz string1. I ovde se pravi razlika izme|u malih i velikih slova. U skladu sa tim rezultat poslednjeg pore|enja je true (ta~no) jer se stringovi razlikuju samo po velikim i malim slovima. Metod equalsIgnoreCase() poredi stringove. razmaka i slova koji ga ~ine. to se i karakterima koji ga ~ine pristupa preko odre|enog metoda.equals(string1) pri ~emu se dobija isti rezultat. Iskaz string1. Va`i i obrnuto: string3. Po~etak i kraj stringa Metod startsWith() klase String omogu}ava proveru da li neki string po~inje odre|enom kombinacijom znakova. objekta out. desi}e se gre{ka u programu.startsWith(“sUV”) vra}a false. Pristup pojedinim znakovima u stringu Vrlo ~esto se javlja potreba za pristupom odre|enom znaku ili znacima koji su deo stringa. Metod vra}a true (ta~no) ako je vrednost koja mu je prosle|ena (u ovom primeru string3) identi~na sa stringom ~iji je metod equals() pozvan. koji ozna~ava poziciju znaka u stringu. Da bi se izbegle gre{ke ovakvog tipa potrebno je poznavati du`inu stringa. Ako `elite da proverite da li se string zavr{ava nekom kombinacijom karaktera. Odre|enom karakteru u stringu se pristupa preko celobrojnog indeksa. Ovaj metod prihvata argument koji predstavlja poziciju karaktera u stringu. Prilikom pore|enja se vodi ra~una o malim i velikim slovima. ra~unaju}i od po~etka. U primeru koji sledi je dat program koji analizira odre|eni tekst i odre|uje broj samoglasnika. To je ista sintaksa koju smo koristili i za poziv metode println. Ako poku{ate da upotrebite indeks koji je manji od 0 ili ve}i od du`ine niza. onda iskaz string1. Primer: public class KarakteriStringa { public static void main(String[] args) { // string koji se analizira 26 .

// provera da li je samoglasnik if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') samoglasnici++.isWhitespace(ch)) razmaci++. Pored karaktera koji se tra`i.println("Tekst sadrzi: samoglasnika .out. U ovom slu~aju se metodima {alju dva argumenta. // provera da li je razmak if(Character.indexOf(‘a’). koji pripadaju klasu String. Karakter se u pretvara u malo slovo pomo}u metoda toLowerCase() klase Character. // ovo su samo mala slova String testVelika = tekst.// broj razmaka. Zato je va`no da se uvek proverava da li je vrednost koju vra}aju -1 i da se u zavisnosti od toga izvr{avaju dalje akcije. } } Metod charAt(i) se koristi za odre|ivanje znaka na i-oj poziciji u stringu. int razmaci = 0. Ako `elite da prona|ete poslednje pojavljivanje karaktera ‘a’ u nizu tekst napisa}ete: indeks = tekst. 27 . klase String. U tom slu~aju se ceo string pretvara u tekst sa samo malim. samoglasnika i slova u tekstu int duzinaTeksta = tekst. proverava da li je u pitanju slovo i pomo}u metoda isWhiteSpace() iste klase. i++){ char ch = Character. } System. startIndeks). U prethodnom iskazu se pretra`uje sadr`aj stringa tekst i to po~ev{i od po~etka.String tekst = "Ovo je tekst koji sluzi za vezbu prilikom pristupanja elementima stringa. radi lak{eg ispitivanja da li je u pitanju samoglasnik. ako karakter nije prona|en. odnosno samo velikim slovima. String tekst = “Ovo su me{ovita slova?”. Ako slovo ‘a’ ne postoji u stringu. Kasnije se u kodu pomo}u metoda isLetter().index(‘a’. slova = 0. indeks = tekst.lastIndexOf(‘a’). i < duzinaTeksta." + samoglasnici + "\n" + " suglasnika ." +(slova-samoglasnici) + "\n" + " razmaka . mo`ete da koristite varijaciju ovih metoda.length(). indeks = tekst.toLowerCase(). String tekstMala = tekst. Karakter koji se dobija se pretvara u malo slovo. Ako `elite da prona|ete poziciju znaka koji nije ni na po~etku ni na kraju.isLetter(ch)) slova++.toUpperCase(). // provera da li je slovo if(Character. Ovo je klasa koja je u Javi unapred definisana i slu`i za rad sa karakterima. Vra}a se pozicija indeksa prvog karaktera ‘a’ na koji se nai|e. da li je u pitanju razmak (blanko karakter).charAt(i))." + razmaci).toLowerCase(tekst. // ovo su samo velika slova Pretra`ivanje stringova u potrazi za odre|enim karakterima Ako `elite da u okviru stringa prona|ete odre|eni karakter koristi}ete metode indexOf() i lastIndexOf(). vrati}e se -1. zadaje se i pozicija od koje treba da se tra`i. klase Character.". Oba pomenuta metoda vra}aju ili indeks pojavljivanja karaktera koji se tra`i ili -1. samoglasnici = 0. Ako `elite da ceo string pretvorite u mala ili velika slova mo`ete uporebiti metode toLowerCase() i toUpperCase(). for (int i = 0. int indeks = 0.

U ovom slu~aju se vra}a pozicija prvog pojavljivanja podstringa “ovo je” u okviru stringa tekst. while(indeks >= 0){ brojac++. String poslednjaRec = mesto. a u novom podstringu se nalazi i karakter sa te po~etne pozicije. Ako napi{ete indeks = tekst. // trenutna pozicija indeksa String pod = "je". int bIndeks = -1. ali po~ev od indeksa aIndeks. U primeru koji sledi se pronalazi prvo pojavljivanje karaktera ‘b’. indeks).substring(5). ++aIndeks). Izdvajanje podstringova iz zadatog stringa U klasi String postoji metod substring() koji iz niza izdvaja zadati podstring.// broj pojavljivanja int indeks = -1.println("Kombinacija je se u nizu pojavljuje " + brojac + " puta"). ali po~ev od pozicije koja je zadata kao drugi argument.indexOf(‘b’. } } // Preraditi program. pomo}u metoda lastIndexOf(). String grad = “Novi Sad”. " + "U njemu treba proveriti koliko puta se pojavljuje kombinacija 'je'". // prelaz na poziciju iza poslednjeg slova prvog pojavljivanja podstringa indeks = tekst. ali iza prvog pojavljivanja karaktera ‘a’.indexOf(pod). pretraga unapred po je indeks = tekst.out. Postoje dve verzije ovog metoda. Jedna iz zadatog stringa vadi podstring. Vra}a se broj pojavljivanja podstringa u okviru glavnog stringa. onda tra`ite poslednje pojavljivanje karaktera ‘b’ u stringu tekst.indexOf(pod. a kod druge treba zadati po~etnu i krajnju poziciju. indeks = tekst.length(). Primer: public class PodstringoviStringa { public static void main(String[] args) { // string koji se analizira String tekst = "Ovo je string koji sluzi za probu. 28 . tako da se pretra`ivanje vr{i unazad. int aIndeks = -1. if(aIndeks >= 0) bIndeks = tekst. a ne samo jedan karakter.Ovde se tra`i karakter koji je zadat kao prvi argument. int brojac = 0. } System. aIndeks = tekstIndexOf(‘a’). Brojanje indeksa po~inje od 0. U primeru koji sledi se pretra`uje zadati string u potrazi za svim pojavljivanjima zadatog podstringa.lastIndexOf(‘b’. po~ev od zadate pozicije. aIndeks). indeks += pod.indexOf(“ovo je”). String poslednjaRec nakon izvr{enja ovog iskaza sadr`i tekst “Sad”. U svemu ostalom ovi metodi rade potpuno isto kao verzije koje smo pomenuli u prethodnom odeljku. Pretra`ivanje stringova u potrazi za odre|enim potstringovima Postoje i verzije metoda indexOf() i lastIndexOf() koje kao argumente prihvataju znakovni podniz. U tom slu~aju se tra`i ceo zadati podniz.

odnosno reci for(int i = 0. int count = 0. }while(indeks != -1). } } } U prvom delu programa smo izbrojili broj reci u zadatom stringu i taj broj kasnije upotrebili za definisanje niza.substring(indeks).6). da se postoje}i string pro{iri ili skrati i sl.. zadavanje indeksa koji je van granica samog stringa. dovodi do pojave gre{ke. Za razliku od metoda indexOf() kod koje zadavanje indeksa koji je izvan dozvoljenog opsega vra}a -1. i < subStr.Druga verzija ovog metoda tra`i dva argumenta. " + "U njemu treba izdvojiti pojedine reci".substring(3. char separator = ' '. indeks). indeks = endIndeks + 1. // izdvaja se do kraja else // ako postoji separator subStr[i] = tekst. pomo}u metoda substring. i++){ endIndeks = tekst. Podstring se zavr{ava na jednoj poziciji ispred indeksa koji je zadat kao kraj (6-1=5).substring(indeks. ali je zbog nepromenljivosti ovih objekata cena ve}a. do{ ++count. ++indeks. int endIndeks = 0. String segment = mesto.out. //odredjivanje broja podnizova int indeks = 0. Ve}a cena se ogleda u sporijem radu i ve}em zauzimanju memorije. vadili iz stringa jednu po jednu re~.println(subStr[i]). Objekti klase StringBuffer Objekti klase String se ne mogu menjati. // pomera se na mesto iza poslednje pozicije indeks = tekst. String segment posle izvr{enja ovog iskaza sadr`i tekst “i S”.indexOf(separator. kod metoda substring. for(int i = 0. Primer: public class SubstringPrimer { public static void main(String[] args) { String tekst = "Ovo je string koji sluzi za probu. 29 . niza je prethodno if(endIndeks == -1) //ako ne postoji znak separator subStr[i] = tekst. endIndeks). Ako se `eli da izvede spajanje stringova. treba koristiti klasu StringBuffer.// dimenzija odre\ena indeks = 0. U primeru koji sledi se pomo}u metoda indexOf() i substring() zadati tekst razdvaja na pojedine re~i. U drugom delu smo. i++){ System. //izdvajanje podnizova u niz String[] subStr = new String[count]. Ove operacije se mogu izvesti i pomo}u klase String.indexOf(separator. // pocetak za sledeci ciklus } // prikaz podnizova. indeks). i < count.length.

Ovaj objekat mo`e da uskladi{ti 50 znakova.append(“ i ovo je dodatak”). Umetanje stringova u objekat klase StringBuffer Metod append koji smo pomenuli se koristi za dodavanje sadr`aja na kraj bafera. u objekat buf dodaju tekst 2. mojString = new StringBuffer(“Novi string”). Memorija dodeljena ovom objektu se vi{e ne mo`e menjati. Efikasnije je. njegov kapacitet je za 16 ve}i du`ine stringa. Kapacitet se ovde izra`ava u karakterima koji mogu da stanu u taj objekat.3). U objektu se nakon ovog nalazi tekst “Novi buffer ovo je dodatak”. Na primer. Postoji mogu}nost da se novi sadr`aj ubaci i negde u sredinu postoje}eg objekta klase StringBuffer. to je mogu}e koristiti i slede}i iskaz: buf. boolean). Ako se prilikom deklaracije izostavi kapacitet. U tu svrhu se 30 . {to se odra`ava na produ`eno vreme procesa. iskazi StringBuffer buf = new StringBuffer(“Proba “). memorija koju zauzima objekat klase StringBuffer se mo`e menjati. Argument koji se prosle|uje metodu je tipa double. tako da kasnije nisu potrebne promene. Dodavanje u objekat klase StringBuffer Ako `elite da ne{to dodate na kraj postoje}eg objekta klase StringBuffer koristi}ete metod append. onda mora da se zauzme dodatna memorija (da se pove}a kapacite objekta StringBuffer). Kada se objekat StringBuffer pravi na osnovu postoje}eg stringa. Metod append vra}a pro{ireni objekat StringBuffer.append(“dodatak “). Prilikom kreiranja ovog objekta mo`ete da eksplicitno zadate njegov kapacitet: StringBuffer buf = new StringBuffer(50). Kapacitet objekata StringBuffer Objekti klase String imaju dodeljeno onoliko memorije koliko je potrebno za sme{tanje karaktera koji se nalaze u tom stringu. jer se njegov kapacitet automatski prilago|ava veli~ini stringa koji u njega treba da se smesti. Ne treba brinuti o tome da li objekat StringBuffer ima dovoljan kapacitet da primi va{ string. Prethodni iskaz kreira objekat klase StringBuffer i inicijalizuje ga stringom “String za inicijalizaciju”. StringBuffer buf = new StringBuffer(“Novi bufer”).13). Objekat StringBuffer se mora kreirati uz pomo} klju~ne re~i new. Sa druge strane kapacitet objekta StringBuffer je bitan jer uti~e na upotrebu resursa koji se koriste za skladi{tenje i modifikaciju stringova.append(2.Objekat klase StringBuffer se mo`e napraviti na slede}i na~in: StringBuffer primer = new StringBuffer(“String za inicijalizaciju”). buf. Kapacitet objekta StringBuffer nije fiksan. char.append(2. Ako je po~etni kapacitet suvi{e mali i ako `elite da tu ubacite neki ve}i string. koje omogu}avaju da se u objekat dodaju i drugi osnovni tipovi. onda se koristi podrazumevani kapacitet od 16 znakova.3. da se kapacitet objekta unapred podesi na dovoljnu vrednost. Postoje razli~ite varijacije metoda append. Mogu}e je napisati i slede}e: StringBuffer mojString = null.append(“ ovo je dodatak”). Sli~ni metodi postoje i za ostale osnovne tipove (int. Po{to metod append vra}a isti objekat StringBuffer. ako je mogu}e. ali se on pre dodavanja pretvara u string i kao takav se dodaje. buf. Za razliku od ovog.

StringBuffer buf = new StringBuffer(“proba”).koristi metod insert. I ovde se prilikom upotrebe nekog od osnovnih tipova prvo vr{i konverzija tog podatka u string. ali sada kao objekat klase String. koji vra}a sadr`aj tog bafera. “dodati “). Metod prima dva argumenta.setCharAt(3. StringBuffer buf = new StringBuffer(“provera”). Drugi argument metoda insert mo`e biti i neki od osnovnih tipova. Iskaz buf. onda se u baferu nalazi tekst “Ovo je dodati bafer”. U klasi StringBuffer postoji i metod setCharAt(). buf. Objekat StringBuffer (kao i svi drugi objekti u Javi) sadr`i metod toString.insert(7. Prvi je indeks karaktera koji treba zameniti. koji preokre}e string. buf.reverse(). po~ev od poslednjeg prema prvom karakteru. ‘z’). kojim se menja znak na zadatoj poziciji u baferu. odnosno stringa koji se u njemu nalazi. klase StringBuffer. a drugi je novi karakter. Na primer ako se u baferu buf. U pitanju je metod reverse. Postoji i metod za okretanje bafera. 31 .toString(). Vrlo ~esto }e se za same operacije sa nekim stringom koristiti objekat StringBuffer. Ostali metodi klase StringBuffer Klasa StringBuffer ima metod charAt() koji radi na isti na~in kao i kod klase String. isto kao kod metoda append.reverse() vra}a bafer sa sadr`ajem “arevorp”. koji smo ve} upoznali. a tek onda se taj podatak ubacuje u bafer. nalazi tekst “Ovo je bafer” i ako izvr{ite iskaz buf. Prethodni iskaz menja ~etvrti karakter u baferu i na njegovo mesto stavlja slovo z. String izlazIzBafera = buf. Mo`e biti u pitanju {tampanje ili neka druga operacija koja tra`i objekat tipa string. ali }e na kraju biti potrebno da od sadr`aja tog bafera napravimo string.

metodi . Ove promenljive razlikuju jedan objekat od drugog. Takva referenca. 32 . sa druge strane ne mo`e da se koristi. a da i dalje kontroli{ete objekat. Promenljive u definiciji klasa U okviru klase mogu da postoje dve vrste promenljivih. Svaka instanca ima svoje vrednosti ovih promenljivih. Da biste u programu mogli da koristite neki objekat morate da pre toga imate njegovu definiciju. s = “ovo je sada objekat”. Dokle god dr`ite referencu imate vezu sa objektom (televizorom). Kada se jednom defini{e klasa. a da se na osnovu te definicije prave razli~ite instance (primerci) te klase. mogu se praviti konkretni primerci te klase. Zamislite situaciju kada sedite pred svojim televizorom (objekat) i u ruci dr`ite daljinski upravlja~ (referenca). ili da smanjite ton. Iako se sve tretira kao objekat. te`ina i sl. a koji nisu u skladu sa objektnim pristupom. C++ sadr`i mnoge elemente koji su tu samo zbog kompatibilnosti sa jezikom C. Referenca mo`e da postoji i nezavisno od samog objekta. To su promenljive instance i promenljive klase. Svaki programski jezik ima svoje zna~enje pojma manipulacija podacima. vi ste napravili samo referencu na neki objekat klase String. Ako radite u Javi pretpostavlja se da `elite da koristite samo objektno orijentisano programiranje. Java je sa druge strane potpuno objektno orijentisana. Kada neko zatra`i da promenite kanal. Ipak Java je jezik koji je vi{e objektno orijentisan. koja dalje menja sam objekat. Definicija objekta se naziva klasom. Da li se radi direktno sa objektom ili se radi sa nekom vrstom indirektne predstave (kao pokaziva~i u C++-u) koja ima specijalnu sintaksu. sa osobinama visina. vi manipuli{ete referencom. Napomenuli smo da klasa predstavlja definiciju objekta. Sve se tretira kao objekat. U Javi je ovo mnogo jednostavnije. morate da joj pridru`ite neki objekat. a ne sam objekat (televizor). Ako napi{ete String s.. Ako `elite da se {etate sobom. sa sobom nosite referencu (daljinski). Da biste mogli da ovu referencu koristite dalje u programu. U skladu sa ~injenicom da je pravljena kao ~isto objektno orijentisani jezik.operacije koje se mogu izvoditi sa tom klasom. Ponekad program mora da stalno vodi ra~una o tome kakva je manipulacija u pitanju.promenljive koje skladi{te podatke i koje omogu}avaju da s enapravi razlika izme|u dva primerka iste klase. Ako biste na primer. Ovi primerci se ~esto nazivaju instancama. U definiciji klase mogu da se na|u samo dve stvari: polja . imali klasu osoba. koja opisuje osobine i pona{anje nekog objekta. odnosno promenljivima klase. Koristi se jedinstvena sintaksa. ali jo{ uvek niste toj referenci pridru`ili sam objekat. Metodi obi~no rade sa poljima. to je koncepte vezane za objektno programiranje u Javi lak{e nau~iti i prihvatiti.Klase i objekti Java je programski jezik koji ima puno sli~nosti sa jezikom C++. identifikator kojim manipuli{ete u stvari predstavlja “referencu” na objekat. Promenljive instance su one promenljive koje su vezane za instance klase.

Pomo}u metoda mo`ete da slo`ene stvari razlo`ite na zbir manjih. Mora postojati neki na~in da se sa tom klasom ne{to i uradi. Promenljive klase je pridru`ena klasi. argn){ } Za metodu se mo`e definisati povratni tip koji se vra}a posle njenog izvr{enja. ne bi bio ispravan. Ako ne `elite da se vrednost neke promenljive kasnije u programu menja. double radijus. odnosno metodi i atributi. Kod koji se odnosi na konkretnu klasu treba da bude u datoteci sa istim imenom i ekstenzijom . Sama definicija klase. Promenljive klase se deklari{u preko klju~ne re~i static. Metoda je blok koda koji ima svoje ime i koja se mo`e izvr{avati vi{e puta sa razli~itih mesta u programu.svaka instanca te klase.. ali nisu dovoljne za funkcionisanje same klase. Ako ne `elite da metoda vra}a vrednost. static int brojac = 0. Metoda mo`e. Metodi se mogu proslediti odre|eni argumenti. Ovo je promenljiva koju }emo koristiti za brojanje koliko je instanci te klase napravljeno u programu. kojima je lak{e rukovati. te`inu i ostale sli~ne osobine. double yCentar. {to je i ura|eno u prethodnom primeru. Klju~na re~ public na po~etku prethodnog primera ka`e da se ovoj klasi mo`e da pristupi bilo sa kog mesta u programu. moraju biti u okviru zagrada koje slede iza imena klase. . Ovo bi trebalo koristiti za sve konstante koje imate u programu. Metoda se poziva preko njenog imena i mo`e. Osnovna struktura metode je: povratni_tip imeMetode(arg1. Povratna vrednost iz metode Povratna vrednost se iz metoda vra}a preko iskaza return. … } Klasa se u Javi defini{e preko klju~ne re~i class iza koje sledi ime klase. Svaka instanca te klase }e imati svoje primerke promenljivih xCentar … Metodi klase Promenljive klase opisuju stanje objekta. koja opisuje sferu. Konstanta PI je u prethodnom primeru promenljiva klase. odnosno ako `elite da to kompajler proverava i zabranjuje. public class Sfera { //promenljive klase static final double PI=3.14. To zna~i da svaki naredni iskaz koji bi poku{ao da promeni vrednost za promenljivu PI. // promenljiva klase za brojanje objekata //promenljive instance double xCentar. U primeru koji sledi se deklari{e klasa Sfera. double zCentar. Svi objekti klase Sfera }e imati samo jednu kopiju promenljivih PI i brojac. Slede}a promenljiva je tako|e definisana kao promenljiva klase (static). Na primer. mo`ete tu promenljivu deklarisati sa final. odnosno svaka konkretna osoba bi imali svoje vrednosti za visinu. koji se u telu metode koriste za neka izra~unavanja. Ovakve promenljive pripadaju svim instancama te klase. Broj argumenata je proizvoljan. arg2. ali ne mora da ima argumente. onda njen povratni tip treba zadati kao void.java. a to se ~ini preko metoda. iskaz 33 . Naredne ~etiri promenljive su promenljive instance. ali ne mora da vrati vrednost.

double d = 5. } } Argumenti koji se prosle|uju metodi mogu imati neki od osnovnih tipova (int. ako negde u kodu ka`ete int c = 3. … return c. Kao {to postoje dve vrste promenljivih u klasi. tako da metoda mo`e da promeni objekat.. To dalje zna~i da metoda ne mo`e da promeni vrednost promenljive u programu koji je tu metodu pozvao. naravno ako to zahteva logika samog programa. to ne mo`e da promeni vrednost promenljive c u programu koji je tu metodu pozvao. sa kojom dalje ta metoda manipuli{e. mojaMetoda(c. Pro{iri}emo malo klasu Sfera. Za sve instance te klase. {to i jeste cilj. d). Klju~na re~ return mo`e da se upotrebi i sama. Ako se radi o osnovnim tipovima. tako da ne mora da postoji nijedna promenljiva instance. Na primer. double b){ int c. } } Ovo je metoda klase. Metode koje vra}aju vrednost moraju da u telu metode imaju iskaz return. Ovo su vrednosti koje se metodi prosle|uju u trenutku njenog poziva i koje ona dalje interno koristi. Ovo ne va`i za objekte koji se prosle|uju meetodama. postoji samo jedan primerak ove metode. public class Sfera { //promenljive klase 34 . a to se vidi u u programu iz kojeg je metoda pozvana. program nastavlja sa radom tamo odakle je metoda pozvana. bez ikakve promenljive. Pristupanje ~lanu (atributu) klase u metodi U metodu instance mo`ete da pristupite bilo kom podatku koji je ~lan te klase.return povratnaVrednost. Lista argumenata Izme|u zagrada koje slede iza imena metode se nalazi lista argumenata. Nakon izvr{enja iskaza return. onda {ta god radili sa argumentom a u samoj metodi. To su metode klase (deklarisane preko klju~ne re~i static) i metode instance. jer ta metoda vra}a broj instanci klase koji je napravljen. vra}a vrednost promenljive povratnaVrednost. Objekti se prosle|uju po referenci. tako postoje i dve vrste metoda. double…). jer ta metoda postoji dok jo{ nije napravljen nijedan objekat. To zna~i da se za promenljivu koja se prosle|uje metodi u trenutku poziva. onda se argumenti prosle|uju po vrednosti. public class mojaKlasa(){ public int mojaMetoda(int a. Svaki argument mora da ima svoj tip. U metodi mo`e da postoji vi{e iskaza return. pravi nova kopija. Ovo se koristi u metodama koje ne vra}aju vrednost. float. Ako se vratimo na klasu Sfera koju smo ranije po~eli da defini{emo: public class Sfera{ // definicija kao i ranije public static int getBrojac(){ return brojac. U okviru metoda static ne mo`ete da pristupate nijednoj od promenljivih instanci. tako {to }emo dodati metodu za izra~unavanje zapremine. ali mogu biti i drugi objekti.

static int brojac = 0.0. // promenljiva klase za brojanje objekata //promenljive instance double xCentar = 10.static final double PI=3. definisali funkciju za promenu radijusa sfere. U metodu se za izra~unavanje zapremine koristi promenljiva instance radijus. u ovom slu~aju zapreminu sfere. Promenljiva this Svaka metoda instance ima promenljivu this. koja se odnosi na trenutni objekat za koji je metoda pozvana. // promenljiva klase za brojanje objekata //promenljive instance double xCentar. @ivotni vek tih promenljivih je `ivotni vek metode. te promenljive su lokalne za tu metodu. double radijus. Dobra programerska praksa je da se sve promenljive prilikom deklaracije inicijalizuju. Na primer. iskaz za vra}anje zapremine u definiciji klase Sfera bi mogao da izgleda ovako: return 4. double zCentar = 10.radijus* this.14. double yCentar= 10.0 * PI * radijus* radijus* radijus. } // metoda instance koja racuna zapreminu double zapremina(){ return 4.0. double radijus = 5. static int brojac = 0. } } Metoda zapremina je metoda instance.radijus ukazuje na promenljivu radijus u instanci. public class Sfera { //promenljive klase static final double PI=3.radijus. } Promenljiva this. Stvar je va{eg izbora da li }ete koristiti promenljivu this ili ne u svojim metodima.0.0/3. Lokalne promenljive Ako u samoj metodi zadate neke promenljive koje se koriste samo u njoj. a promenljiva radijus na ulazni parametar. Ako biste na primer.0 * PI * this.radijus* this. Kompajler implicitno koristi ovu promenljivu kada se pristupa promenljivim instance te klase. Skuplja~ otpada u Javi brine o tome da se oslobodi memorija koju su te promenljive zauzimale.14. Inicijalizacija ~lanova klase Prilikom definisanja ~lanova klase mo`e se izvr{iti i njihova inicijalizacija. Ona nema ulazne argumente. ali vra}a vrednost tipa double. ona bi mogla da izgelda ovako: void promenaRadijusa (double radijus){ this.0/3. double zCentar. … } 35 . Kada se napusti metoda te promenljive prestaju da postoje. double yCentar. // staticka metoda klase koja vraca broj napravljenih objekata public static int getBrojac(){ return brojac.radijus = radijus.0 .

double yCentar. konstruktora. static int brojac = 0. Ovakav blok se izvr{ava jednom. Konstruktor se izvr{ava prilikom kreiranja instance klase. // konstruktor Sfera(double rad. Osnovna namena konstruktora je da obezbedi sredstva za inicijalizaciju promenljivih instanci. double zCentar. double x. Stati~ki blok za incijalizaciju se deklari{e klju~nom re~i static ispred viti~astih zagrada. // promenljiva klase za brojanje objekata //promenljive instance double xCentar. Ako prilikom definisanja klase ne zadate nijedan konstruktor. Primer: public class ProbaInicijalizacije{ static int[] values = new int[10]. prazan.14. // blok za incijalizaciju static{ for(int i = 0. xCentar = x. Konstruktor ima dve osobine koje ga razlikuju od ostalih metoda klase: Konstruktor nikada ne vra}a vrednost. tako da se za njega ne zadaje povratni tip (pa ni void) Konstruktor uvek ima isto ime kao klasa. double fl. double y. Ako u klasi postoje blokovi za incijalizaciju. double z){ radijus = rad. podrazumevani konstruktor. i < values. i++) values[i] = i. brojac++. oni se izvr{avaju pre konstruktora. izme|u kojih se stavljaju iskazi koji treba da se izvr{e. } // staticka metoda klase koja vraca broj napravljenih objekata public static int getBrojac(){ return brojac. Nestati~ki blok za inicijalizaciju se izvr{ava jednom prilikom kreiranja svake instance klase i u njemu mogu da se inicijalizuju promenljive instance. prilikom u~itavanja klase i u njemu se obi~no inicijalizaciju stati~ki ~lanovi klase. zCentar = z. } // nestaticki blok za inicijalizaciju { fl = 28. tzv. kompajler }e sam napraviti jedan.length. } 36 .0. double radijus. } } Konstruktori U svakoj klasi postoji jedna ili vi{e specijalnih metoda. Postoje stati~ki i obi~an blok za incijalizaciju. yCentar = y.Ako je prilikom inicijalizacije potrebno izvr{iti odre|ena izra~unavanja mo`ete da koristite blok za incijalizaciju. Primer: public class Sfera { //promenljive klase static final double PI=3. Blokovi za incijalizaciju se ozna~avaju viti~astim zagradama.

// metoda instance koja racuna zapreminu double zapremina(){ return 4.0/3.0 * PI *radijus * radijus * radijus; } }

U gornjem primeru je konstuktor uokviren. Kao {to vidite konstruktor ima isto ime kao klasa i nema odre|en povratni tip. Konstruktor mo`e da ima vi{e agumenata, ali ne mora da ima ni jedan. U ovom slu~aju postoje ~etiri argumenta i svaki od njih se koristi za inicijalizaciju odre|ene promenljive instance. Poslednja akcija u konstruktoru je da se uve}a brojac, koji broji instance klase Sfera. Kreiranje objekata klase Kada se negde u kodu deklari{e promenljiva tipa Sfera, iskazom: Sfera lp; ne poziva se nikakav konstruktor. Ovde se ne prave nikakvi objekti. Sve {to se uradili je da ste napravili promenljivu lp, koja mo`e da sadr`i jedan objekat tipa Sfera, ako ga budemo nekada pravili. Da biste napravili instancu klase, morate da upotrebite klju~nu re~ new, iza koje sledi poziv konstruktora. Za na{u klasu Sfera to mo`e da izgleda ovako:
lp = new Sfera(10.0, 1.0, 1.0, 1.0);

Nakon izvr{enja ovog iskaza postoji objekat Sfera sa polupre~nikom 10.0, ~iji je centar ta~ka sa koordinatama 1.0. Promenljiva lp se nakon ovog iskaza pona{a kao referenca na objekat. Ako biste sada napisali
Sfera josLp = lp;

nova promenljiva josLp ukazuje na isti objekat kao i promenljiva lp. Jo{ uvek postoji samo jedan objekat (instanca), ali postoje dve promenljive koje na njega ukazuju. ^injenica da su promenljiva i objekat razdvojeni ima uticaj na na~in na koji se metodi prosle|uju objekti kao argumenti. Prosle|ivanje objekata metodi Objekti se metodama prosle|uju po referenci. To zna~i da se u metodu ne radi sa kopijom objekta, kao kada se prosle|uju promenljive osnovnih tipova, ve} se radi sa istim objektom. To dalje zna~i da }e ako u metodu do|e do neke promene objekta, ta promena imati uticaja i na osnovni objekat koji je metodu prosle|en. Primer: Datoteka SferaMain.java
public class SferaMain { public static void main(String[] args) { Sfera sf = new Sfera(10., 1.0, 1.0, 1.0); System.out.println("Radijus sfere je " + sf.getRadijus()); promenaObjekta(sf); System.out.println("Radijus sfere je " + sf.getRadijus()); } static void promenaObjekta(Sfera sf){ sf.setRadijus(12.0); } } Datoteka Sfera.java public class Sfera { //promenljive klase static final double PI=3.14;

37

static int brojac = 0; // promenljiva klase za brojanje objekata //promenljive instance double xCentar; double yCentar; double zCentar; double radijus; // konstruktor Sfera(double rad, double x, double y, double z){ radijus = rad; xCentar = x; yCentar = y; zCentar = z; brojac++; } // staticka metoda klase koja vraca broj napravljenih objekata public static int getBrojac(){ return brojac; } // metoda instance koja racuna zapreminu double zapremina(){ return 4.0/3.0 * PI *radijus * radijus * radijus; } public void setRadijus(double rad){ this.radijus = rad; } public double getRadijus(){ return this.radijus; } }

U ovom primeru smo prikazali dve klase. Jedna je klasa Sfera koju smo ve} koristili, ali sada dopunjena metodama setRadijus() i getRadijus(). Ove metode slu`e za promenu atributa radijus i za njegovo va|enje iz klase. Druga klasa je SferaMain, koja nam slu`i za izvr{enje ovog programa. Obratite pa`nju na njenu metodu promenaObjekta(). U ovoj metodi se menja radijus objekta koji se metodi prosle|uje kao argument. Po kasnijoj {tampi se vidi da promena radijusa u metodi, menja radijus i u objektu koji je metodi prosle|en. @ivotni vek objekta (instance) @ivotni vek objekta je odre|en promenljivom koja na taj objekat referencira. Ako imate deklaraciju
Sfera sf = new Sfera(10.0, 1.0, 1.0, 1.0)

onda objekat sf postoji sve dok postoji promenljiva sf. To }e biti na kraju oblasti u kojoj se ova deklaracija nalazi. Na isti objekat mo`e da referencira vi{e promenljivih. U tom slu~aju objekat postoji sve dok postoji i poslednji objekat koji na njega ukazuje. Ako se napi{e iskaz sf = null; onda promenljiva sf vi{e ne ukazuje na objekat, tako da taj objekat mo`e biti uni{ten (pod pretpostavkom da nema drugih promenljivih koje na njega ukazuju. Proces izbacivanja objekata koji se u programu vi{e ne koriste se naziva skupljanjem otpada (garbage collection). Ovo skupljanje otpada se u Javi odvija automatski. To ipak ne zna~i da objekti istog trenutka kada se vi{e ne koriste i nestaju iz memorije, pa samim tim ta memorija ne mora da bude odmah na raspolaganju. U pitanju je proces koji nije pod va{om kontrolom, tako da o njemu ne treba mnogo brinuti. 38

U primeru koji sledi smo pokazali kako se koristi klasa Sfera koju smo napravili. Primer: Datoteka SferaMain.java
public class SferaMain { public static void main(String[] args) { System.out.println("Broj objekata je " + Sfera.getBrojac()); Sfera lp = new Sfera(4.0, 0.0, 0.0, 0.0); System.out.println("Broj objekata je " + lp.getBrojac()); Sfera lp1 = new Sfera(12.0, 1.0, 1.0, 1.0); System.out.println("Broj objekata je " + Sfera.getBrojac()); System.out.println("Zapremina sfere lp je " + lp.zapremina()); System.out.println("Zapremina sfere lp1 je " + lp1.zapremina()); } }

Klasa Sfera je ista kao u prethodnom primeru, a u datoteci SferaMain.java smo dali klasu koja kreira instancu klase Sfera i poziva neke njene metode. Preklapanje metoda U klasi mo`ete da defini{ete vi{e metoda sa istim imenom, ali sa razli~itim argumentima. Takvi metodi se nazivaju preklopljenim metodima. Preklopljene metode se me|usobno moraju da razlikuju po broju ili tipu argumenata. Ne mogu se razlikovati samo po povratnom tipu. Primer za preklopljene metode mogu biti metodi append, klase StringBuffer, koje smo ve} koristili. Vi{estruki konstruktori Kao i obi~ne metode, tako se i konstruktori mogu da preklapaju. Preklopljeni konstruktori se koriste kada je potrebno da instancu klase napravite na osnovu razli~itih ulaznih parametara. Ako pogledamo klasu Sfera, u njoj mo`emo da imamo jedan podrazumevani konstruktor (bez argumenata) i konstruktor koji smo ve} napravili (sa argumentima za radijus i koordinate ta~ke). Primer: Konstruktori iz klase Sfera // podrazumevani konstruktor
Sfera(){ radijus = xCentar = yCentar = zCentar = brojac++; } 1.0; 0.0; 0.0; 0.0;

Sfera(double rad, double x, double y, double z){ radijus = rad; xCentar = x; yCentar = y; zCentar = z; brojac++; }

Prilikom kreiranja instanci klase Sfera kompajler odre|uje koji }e konstruktor pozvati na osnovu tipa argumenata koje ste zadali.
Sfera lp = new Sfera(); // podrazumevani konstruktor Sfera lp1 = new Sfera(2.0, 1.0, 1.0, 1.0);

39

end = new Tacka(xEnd. a druga liniju. double xEnd. // pocetna tacka linije Tacka end. double yStart.aTacka. } // Kreiranje tacke na osnovu druge tacke Tacka(final Tacka oldTacka) { x = oldTacka. y = oldTacka. } // KOnvertuje tacku u string public String toString() { return Double. double y. Klasa Tacka: public class Tacka { // Koordinate tacke double x. } // Rastojanje do druge tacke double distance(final Tacka aTacka) { return Math.end = } linije na osnovu dve tacke Tacka start. // Krajnja tacka linije // Kreiranje Linija(final { this. " + y. } // Pomeranje tacke void move(double xDelta.x) + (y .y)*(y . double yDelta) { // parametarske vrednosti koje se dodaju trenutnim koordinatama x += xDelta.x)*(x . Jedna klasa defini{e objekat tacka. y = yVal.y.aTacka. U njemu }emo koristiti dve klase. double yEnd) { start = new Tacka(xStart. yEnd).aTacka. // Kreiranje linije na osnovu koordinata dveju tacaka Linija(double xStart.x.aTacka.java): public class Linija { Tacka start. } } Klasa Linija (Linija. yStart).toString(x) + ".start this. 40 . final Tacka end) = new Tacka(start). // Kreiranje tacke na osnovu koordinata Tacka(double xVal.Primer koji sledi se odnosi na jednostavnu geometriju u ravni. Ove objekte }emo koristiti za pronala`enje preseka dveju linija. new Tacka(end). y += yDelta.y) ).sqrt( (x . double yVal) { x = xVal.

end).0).out.out.end. // Pomera se krajnja tacka linije 1 i prikazuje se novi presek end.y)*(this.Linija1.0).x)*num/denom. System.0.this.distance(end). 1.start.move(1. // koristi se metod klase Tacka } // Linija se konvertuje u string public String toString() { return "(" + start + "):(" + end + ")". } // presek dve linije Tacka intersects(final Linija Linija1) { Tacka lokalnaTacka = new Tacka(0.out.println("Presek je " + Linija2.this.0). lokalnaTacka.intersects(Linija2)).y - Klasa Geometrija (Geometrija.println("Napravljene su dve linije " Linija2).end. 0). Linija Linija2 = new Linija(0.x) (this. + Linija1 + " i " + // Presek System.0. } } Linija1.println("Napravljene su dve tacke " + start + " i " + end).y + + (Linija1.y)*num/denom. 3. Tacka end = new Tacka(5.y).start. System.java): public class Geometrija { public static void main(String[] args) { // Kreiraju se dve tacke i prikazuju se Tacka start = new Tacka(0.println("Novi presek je " + Linija1.y)*(Linija1. 3.x)*(Linija1.this. 0.x .start.y).end.0). 6.start.start.y .0.start.start.x)*(this. double denom = (this.end.0.out.end.start.intersects(Linija1)).x = Linija1. lokalnaTacka.Linija1.x Linija1.start. return lokalnaTacka.this. // Kreiraju se dve linije i prikazuju se Linija Linija1 = new Linija(start.} // izracunavanje duzine linije double length() { return start.0.start.x .Linija1.start.y .0. -5.y .x (Linija1.Linija1.end. System.start.end. } } 41 .end.y = Linija1.start.x . double num = (this.x .start.x) (this.y .

// Ako je n 0 vraca se 1. Zbog toga treba da se pozivaju samo kada je to neophodno.0. Rekurzije najvi{e primene imaju kod struktura podataka kao {to je stablo ili liste.out.5)). metoda power poziva samu sebe.lang. Sve standardne klase koje postoje u Javi su tako|e organizovane u pakete. I klase koje smo do sada koristili se nalaze u paketima. System.out. To zna~i da se ra~una xn. ve}i od 1. n-1). onda se u prilikom {tampanja pomo}u operatora + (spajanje stringova) mo`e koristiti objekat ove klase. // rekurzivni poziv else if(n < 0) return 1. System.5. U rekurzivnom metodu mora da postoji i neka logika koja }e prekinuti poziv metode. U klasi smo definisali i metodu toString(). Paketi Sve klase u Javi su organizovane u pakete. Ovo se ponavlja sve dok stepen ne dobije vrednost 0. Paketi u Javi su sli~ni direktorijumima (fasciklama) koji se koriste za organizaciju podataka na disku. jedan koji tacku pravi na osnovu para koordinata i drugi koji pravi novi objekat Tacka. na osnovu postoje}eg. Na taj na~in bi se izvr{avao mnogo efikasnije. U ovom trenutku postoje dva konstruktora. -n).println("7. // Negative power of x else return n == 0 ? 1. Klase koje smo do sada koristili (String. ali do sada na to nismo obra}ali pa`nju. Rekurzivni metodi su veoma zahtevni po pitanju resursa i vremena.println("10 na -2 je " + power(10. System. U primeru koji sledi je data rekurzivna metoda koja ra~una stepen zadate ceoblrojne vrednosti. public class Stepen { public static void main(String[] args) { double x = 5. int n) { if(n > 1) return x*power(x.0)).println("7.out. Ovaj paket nije potrebno nazna~avati u 42 . u suprotnom se vraca x } } Ako je n pozitivan broj. StringBuffer) se nalaze u paketu java. U metodu za izra~unavanje preseka.5 na 5 je " + power(7. Navedeni primer bi se mnogo lak{e realizovao putem petlje.println(x + " na 4 je " + power(x. Proces u kome metoda poziva samu sebe se naziva rekurzijom. Ako klasa ima ovu metodu.5. } // Dize se x na n-ti stepen static double power(double x.5 na 0 je " + power(7. u kom slu~aju se prekida rekurzija. U klasi Linija smo liniju definisali preko dva objekta klase Tacka.0 : x. smo koristili parametarske jedna~ine du`i (x=x1 + (x2-x1)t i y=y1+(y2-y1)s). koja preklapa metodu toString() nasle|enu iz klase Object. {to je i prirodno.4)).-2)). Rekurzija Metode koji smo do sada koristili se pozivaju iz drugih metoda. jer bi u suprotnom dobili beskona~ane pozive. System.U klasi Tacka postoje dva ~lana (x i y koordinata tacke). ali sa ulaznim parametrom smanjenim za 1.0/power(x.out.

Postoje i drugi standardni paketi. sadr`i i ime paketa u kome se ta klasa nalazi. Na primer. Sadr`i osnovne klase kao {to su String. O ovome brine kompajler. Ako se prilikom definicije klase ne navede klju~na re~ public.kodu. Dodavanje klasa iz nekog drugog paketa u program Ako su klase u drugom paketu definisane sa klju~nom re~i public. jer se prilikom preno{enja tih klasa ta struktura mora da ispo{tuje.sadr`i klase koje s ekoriste za ulazno izlazne operacije 43 . ali i vi to morate znati.lang .3dOblici. koji se nalazi u direktorijumu Geometrija. Na primer. java. StringBuffer. Lista ovih paketa stalno raste. a da u njemu razdvojite klase koje se koriste za 2D i 3D geometriju. mo`ete da napravite jo{ dva paketa po imenu 2dObilici i 3dOblici. Paketi su povezani sa strukturom direktorijuma na kome se nalaze datoteke sa Java klasama. pripadnik tog paketa. To zna~i da u programu mo`ete da imate dve klase sa istim osnovnim imenom. package Proba. Ova struktura mo`e imati dubinu koja odgovara Va{im potrebama. mo`ete da napi{ete: import Geometrija. ali iza iskaza za definisanje paketa.2dOblici. onda novi program te klase mo`ete dodati preko iskaza import. nastaju datoteke sa bajt kodom. Ve} znamo da se definicija klase nalazi u datoteci ~ije je ime isto kao ime klase. Struktura direktorijuma sa ovim datotekama. Zvezdica na kraju prethodno iskaza zna~e da se uklju~uju sve klase iz paketa. Ovaj iskaz mora biti prvi u toj datoteci. koje mogu da imaju isto ime.3dOblici. // uklju~uje klasu Sfera Ime klase. Sve datoteke u paketu ImePaketa moraju se nalaziti u direktorijumu ImePaketa. onda se mo`e pristupati samo toj klasi. public class Linija … Klasa Linija iz ovog primera mora da se nalazi u direktorijumu 2dOblici. ali evo nekih od njih: java.*.io . U jednom paketu mo`e biti vi{e klasa. Ovo je isto kao sa datotekama na disku. koji se nalaze u paketu Geometrija. ako se nalaze u razli~itim direktorijumima. ~ija je ekstenzija .ovaj paket ne mora da se eksplicitno ubacuje u program. onda se toj klasi mo`e pristupati samo iz metoda klasa koje se nalaze u istom paketu. Paketi mogu da imaju strukturu.class. jer je on automatski dostupan u svim programima. import Geometrija. Math i sl. ako se one nalaze u razli~itim paketima. Prilikom kompajliranja datoteka sa izvornim kodom. tako|e mora da po{tuje pakete koji se primenjuju. Standardne klase i paketi Sve standardne klase koje se isporu~uju sa Javom se nalaze u standardnim paketima. Ovaj iskaz treba da se nalazi na po~etku datoteke sa definicijom klase.Sfera.3dOblici. Ako se napi{e konkretna klasa. Klju~na re~ public u definiciji klase ukazuje na to da se klasi Sfera mo`e pristupiti i iz drugih paketa i klasa u programu. ali se oni uglavnom moraju eksplicitno uklju~iti u kod. public class Sfera … Prethodni iskaz ka`e da je klasa Sfera pripadnik paketa Proba. Pakovanje klase se izvodi tako {to se u datoteku u kojoj se nalazi klasa na po~etku doda iskaz za pakovanje. Ti paketi se defini{u na slede}i na~in: package Geometrija. ako `elite da napravite jedan vrhovni paket za rad sa geomtrijom i nazovete ga Geometrija. ako u datoteci u~inite dostupnim klase iz paketa Geometrija. pored imena same klase.

za manipulisanje kolekcijama i sl java. Prilikom definisanja dostupnosti postoje ~etiri mogu}nosti. Ove klase }ete koristiti ako `elite da od stringa napravite osnovni tip (meetode tipa parseInt. bilo otkuda nema pristupa izvan klase iz bilo koje klase u okviru paketa i iz bilo koje potklase.util . Dobra programerska praksa je da se ~lanovi deklari{u kao privatni. ali pobolj{an java. tako da je njih najbolje deklarisati kao public. Sa druge strane. ili kada je potrebno da na neki drugi na~in manipuli{ete osnovnim tipom.klase za datum i vreme.awt . metode predstavljaju interfejs klase.java. public double getRadijus(){ return this. double radijus.sql . koji se odnosi na u~aurenje.swing . Promenljive i metodi te druge klase ne moraju obavezno da budu dostupni.osnovne klase za grafi~ki korisni~ki interfejs (GUI). koje sadr`e osnovni tip ali i dodatne metode za manipulaciju tim osnovnim tipom. Atribut Bez atributa dostupnosti public private protected Dozvoljen pristup Iz bilo koje klase u okviru paketa Iz bilo koje klase.grafi~ki interfejs.lang. Njihova dostupnost zavisi od atributa dostupnosti za svaki konkretan metod i atribut. To zna~i da se ~lanovi klase ne mogu menjati direktno na bilo kom mestu odakle se pozivaju. a da se za one koje je potrebno menjati spolja i ~ije se vrednosti ~itaju spolja deklari{u odgovaraju}i set i get metodi. Ovo je u skladu sa jednim od principa objektno orijentisanog programiranja.radijus. } 44 . Promena ovih ~lanova i pristup do njih je tada mogu} samo preko ovih metoda. parseDouble i sl).klase za pristup bazama podataka putem jezika SQL … Standardne klase za osnovne tipove objekata Za sve osnovne tipove podataka u Javi postoje klase omota~i. bilo koja klasa ima direktan pristup do bilo koje klase iz tog paketa. koja se nalazi u bilo kom paketu ^lanovi klase bi generalno trebalo da budu deklarisani sa atributom private. java. To su slede}e klase: Boolean Character Byte Short Integer Long Float Double Sve ove klase se nalaze u paketu java. Dostupnost ~lanova klase U istom paketu.

Bilo koji ~lan koji se defini{e u izvedenoj klasi je dodatak ~lanovima koji postoje u osnovnoj klasi.public void setRadijus(double rad){ this. [panijel je vrsta psa i ima mnoge osobine koje su zajedni~ke za sve pse. To ipak ne zna~i da }e u klasi Spaniel biti dostupni svi ~lanovi i metodi klase Pas. Da biste mogli da izvodite novu klasu iz neke klase. Ova definicija konkretno zna~i da se klasa Spaniel izvodi iz klase Pas. To mogu biti grafi~ki resirsi. Spaniel je specijalizovani primerak psa. Osnovnu i izvedenu klase razlikuju dodatni ~lanovi koje pravite u izvedenoj klasi. U primeru koji sledi smo definisali osnovnu klasu Pas. Objekat Spaniel }e u sebi uvek imati kompletan objekat Pas. iz koje smo zatim izveli potklasu Spaniel. onda on nije nasle|eni ~lan. Ako 45 . ili datoteke na disku i sl. Klasa iz koje se izvodi nova klasa se naziva osnovnom ili originalnom ili superklasom izvedene klase. To odra`ava i realni svet. ali ima i jedinstvene osobine koje ga razlikuju od ostalih vrsta pasa. To ne mora biti istog trenutka kada se objekat prestane da koristi. tako da }e objekat tipa Spaniel imati sve ~lanove koje ima klasa Pas. osnovna klasa ili mora biti u istom paketu. Kada objekat vi{e nije u oblasti va`enja. Ovo va`i ako su osnovna i izvedena klasa u istom paketu. Ako ~lan osnovne klase nije dostupan u izvedenoj klasi. Kada do|e do izbacivanja ona poziva metodu finalize(0. plus ~lanove koji su specifi~ni samo za njega. Evo kako izgleda ta metoda: protected void finalize(){ // kod za ~i{}enje } Ova metoda je korisna kada se u klasi koriste neki resursi koji zahtevaju posebnu akciju prilikom uni{tavanja objekta. Nasle|ivanje Jedna od osnovnih osobina objektno orijentisanog programiranja jeste nasle|ivanje.radijus = rad. Nasle|ivanje omogu}ava da novu klasu izvedete iz neke postoje}e i da je kasnije pro{irite. sa svim njegovim podacima i metodama. Mehanizam nasle|ivanja je u ovom slu~aju dobar model za opisivanje stvarnog sveta. Dostupni su samo oni ~lanovi koji se nasle|uju. } Metoda finalize() U klasi mo`e da postoji i metoda finalize(). ili mora biti deklarisana kao public. Potklasa ili izvedena klasa nasle|uje sve ~lanove osnovne klase osim onih koji su deklarisani kao privatni (klju~na re~ private). U novoj klasi mo`ete da koristite sve mogu}nosti osnovne klase. ali Java virtuelna ma{ina mo`da ne}e odmah da ga izbaci iz memorije. ali jeste deo objekta izvedene klase. Prilikom nasle|ivanja se odvija aditivan proces u smislu definicije klase. class Pas{ // clanovi klase Pas } class Spaniel extends Pas{ // clanovi klase Spaniel } Prilikom definisanja izvedene klase se koristi klju~na re~ extends (pro{iruje). ali i da dodate nove. Ovo je metoda koja se automatski poziva pre nego {to se objekat uni{ti i oslobodi prostor u memoriji koji je on zauzimao. Obi~no ti objekti nisu u okviru Java okru`enja i nema garancije da }e biti automatski oslobo|eni. {to se ti~e programa on ne postoji.

// nasledjuje se } Ako se u izvedenoj klasi defini{e ~lan sa istim imenom kao u osnovnoj klasi. public class Pas extends Zivotinja{ // konstrktori za objekat Pas private String ime. } public String toString(){ return “Ovo je “ + tip. Primer: Pretpostavimo da smo definisali klasu Zivotinja: public class Zivotinja{ private String tip. Pravila nasle|ivanja se odnose i na promenljive instance i na promenljive klase. Konstruktori izvedene klase public class Pas extends Zivotinja{ public Pas(String aIme){ super(“Pas”). Nasle|ivanje metoda Metode koje nisu konstruktori se nasle|uju isto kao i atributi. One metode koje su osnovnoj klasi deklarisane kao private se ne nasle|uju. koji inicijalizuju podatke koji su definisani u toj klasi. po{to se ~lanovi deklarisani kao private i kontruktori ne nasle|uju. a one koje su deklarisane bez atributa dostpunosti se nasle|uju samo u istom paketu. public Zivotinja(String aTip){ tip = new String(aTip). Ova klasa }e definisati pse. private String rasa. } private String ime. onda taj iz izvedene klase sakriva onaj iz osnovne. Sada mo`emo definisati drugu klasu koja se zasniva na klasi Zivotinja. To se radi iskazom: 46 . ali se tom ~lanu ne mo`e pristupiti iz klase Pas. private String rasa. ime = aIme. Konstruktori se nikad ne nasle|uju. } Kao {to vidite u konstruktorima izvedene klase treba pozivati konstruktore osnovne klase. } } U ovoj klasi postoji ~lan tip koji slu`i za to da odredi o kojoj se `ivotinji radi. Objekat Pas }e imati i podatak ~lan koji se odnosi na tip.osnovna i izvedena klasa nisu u istom paketu. onda se nasle|uju samo oni ~lanovi osnovne klase koji su definisani kao za{ti}eni (klju~na re~ protected). rasa = aRasa. } Klasa Pas nasle|uje samo metodu toString(). class OsnovnaKlasa{ private static int a. String aRasa){ super(“Pas”). rasa = “Nepoznato”. ime = aIme. } public Pas(String aIme.// ne nasledjuje se protected static int b.

koji {tampa vrstu `ivotinje. Ako on ne postoji. Ovaj metod nije svestan ~lanova izvedene klase. Atribut dostupnosti mora biti isti kao u osnovnoj klasi. } } Metod toString koji se ovde poziva je metod koji dolazi iz osnovne klase. koje imaju isto zaglavlje (ime. prilikom kompajliranja }e se javiti gre{ka. poziva odgovaraju}a metoda te klase. u izvedenoj klasi mora biti tako|e deklarisana kao public. moramo prikazati atribut tip iz osnovne klase.super(“Pas”). public String toString(){ return "Ime psa je " + ime + " a rasa je " + rasa. Preklapanje metoda osnovne klase U izvedenoj klasi mo`ete definisati metodu koja ima isto zaglavlje kao i metoda u osnovnoj klasi. Konstruktor osnovne klase se uvek poziva preko klju~ne re~i super.out. System. povratni tip i argumente). Ovo je podrazumevani konstruktor za osnovnu klasu. Ako u konstruktori izvedene klase niste u prvom redu pozvali konstuktor osnovne klase. Kada se iz instance izvedene klase kasnije poziva metoda sa ovim imenom. tako da mu s ene mo`e pristupiti iz izvedene klase.println(ps). Zbog toga }emo jo{ jednom promeniti metod toString() u izvedenoj klasi: public String toString(){ return super.toString() poziva metod toString() osnovne klase. Ovaj atribut je deklarisan kao privatan. to se prilikom poziva metode iz instance klase Pas. public class TestIzvodjenje { public static void main(String[] args) { Pas ps = new Pas("Fido". "Chiuahua"). Probajte da iz konstruktora u klasi Pas izbacite poziv konstruktora osnovne klase i analizirajte rezultate. System. a ne metoda iz osnovne klase. 47 . To zna~i da ako je metoda u osnovno klasi deklarisana kao public. Ako bismo `eleli da prika`emo i vrstu `ivotinje. } Po{to u klasama Zivotinja i Pas postoje metode toString(). Primer: U primeru koji sledi smo prikazali kako bi mogla da se upotrebi klasa Pas. Pokaza}emo ovo na primeru metode toString() koju smo definisali u klasi Zivotinja. ili manje restriktivan. kompajler }e to poku{ati da uradi umesto vas. U tom slu~aju }e se dodati iskaz: super(). poziva se metoda iz izvedene klase. Pas ps1 = new Pas("Lesi"). koju smo pre toga napravili.println(ps1). Sada }emo je definisati i u klasi Pas.out.toString() + "\nIme psa je " + ime + " a rasa je " + rasa. To zna~i da metoda u izvedenoj klasi ima prioritet u odnosu na metodu iz osnovne klase. } Sada se direktno preko iskaza super.

. Metode u osnovnoj i izvedenim klasama moraju da imaju istu deklaraciju i isti povratni tip. Ne mo`ete da pozovete metodu iz objekta izvedene klase. u zavisnosti od tipa metoda na koji se poziv odnosi. Ako se prisetimo klasa Zivotinja i Pas iz prethodnog primera.out. Mo`ete je na primer koristiti za ukazivanje na objekat klase Pas: ziv = new Pas(“Vucjak”). koje se odnose na ~injenicu da se objekat izvedene klase mo`e uskladi{titi u promenljivoj koja je tipa direktne ili indirektne osnovne klase. ostatak isti kao ranije } Iz klase Zivotinja mo`emo da izvedemo i klasu Macka: public class Macka extends Zivotinja { public Macka(String aIme) { super("Macka"). zadatog tipa. Da pogledamo malo detaljnije kako ovo izgleda na primeru. String aRasa) { super("Macka"). koristi za referenciranje objekata razli~itih tipova.println("Av Av"). Izvedene klase uvode nove mogu}nosti. ime = aIme. koja mo`e bti uskladi{tena u promenljivima tipa Zivotinja i Pas. ime = aIme. } 48 . } //. metoda mora biti ~lan i osnovne i izvedene klase. } // Vra]a se string sa detaljima o toj macki public String toString() { return super. rasa = aRasa. koriste}i metodu osnovne klase. } public Macka(String aIme. // deklaracija promenljive tipa Zivotinja Ovu promenljivu mo`ete upotrebiti za ukazivanje na objekat bilo koje klase koja je izvedena iz klase Zivotinja. ako metoda ne postoji u osnovnoj klasi. To omogu}ava da se jedna ista metoda pona{a na razli~ite na~ine. smesti u promenljivoj tipa Zivotinja. Promenljiva zadatog tipa obi~no ukazuje na objekat istog tipa. Klasu Pas }emo pro{iriti novom metodom koja prikazuje zvuk koji pas proizvodi. a dostupnost ne sme biti vi{e restriktivna. Ova osobina omogu}ava da se jedna ista promenljiva. Polimorfizam radi sa izvedenim klasama. Da bi se dobilo polimorfno pona{anje prilikom poziva metode.Polimorfizam Pomorfizam je jedna od va`nih osobina objektno orijentisanog programiranja. Pretpostavimo da ste deklarisali promenljivu Zivotinja ziv. Isto va`i i za instancu klase Spaniel. pri ~emu se automatski pozivaju metode specifi~ne za tip objekta kojem se pristupa. kod njih je mogu}e da se instanca klase Pas. public class Pas extends Zivotinja{ // metoda za lavez public void zvuk(){ System. rasa = "Nepoznato".toString() + "\nIme macke je " + ime + " a rasa je " + rasa.

i < 5.toString() + "\nIme patke je " + ime + " a rasa je " + breed. i++){ // generator slucajnih brojeva 49 .util. Zivotinja izborZivotinje. "Sijamska"). public class Patka extends Zivotinja { public Patka(String aIme) { super("Patka"). Random select = new Random().// metod za mjaukanje public void zvuk() { System. "Pudlica"). } public Patka(String aIme. new Patka("Daca") }. } // Detalji o patkio public String toString() { return super. rasa = "Nepoznato". } private String ime. ime = aName. new Macka("Cica". ime = aIme. } // metod za zvuk public void zvuk() { System. } Da bi mogao da se primeni polimorfizam.Random. } private String ime. U tu klasu dodajte slede}i kod: public void zvuk(){ } Potreban nam je i program koji }e koristiti ove klase.println("Kva kva").println("Mijauuu").out. import java. private String rasa. private String rasa. metoda zvuk() mora da se implementira i u osnovnoj klasi Zivotinja. } // ime macke // rasa Izve{}emo i klasu za patke. // Pet slucajnih izbora for(int i = 0. public class Polimorfizam { public static void main(String[] args) { // NIz sa razlicitim zivotinjama Zivotinja[] zivotinje = { new Pas("Dzoni". rasa = aRasa. String aRasa) { super("Patka").out.

Kasnije koristimo klasu Random i njen objekat select. public class Vucjak extends Pas{ public Vucjak(String aIme){ super(aIme. // reakcija } } } Ovde su napravljene tri instance klasa Pas. ali se mo`e napraviti promenljiva tog tipa. } Od klase koje je deklarisana kao apstraktna se ne mogu praviti instance. } public String toString() { return "Ovo je " + tip. Jedini dodatni ~lan klase Vucjak je konstruktor u kome se poziva konstruktor klase Pas. a klasa Zivotinja je indirektna super klasa. new Patka("Daca"). i rasa “Vucjak”. Klasa Pas je direktna super klasa. Apstraktne klase U klasi Zivotinja smo imali metodu zvuk() koja je bila prazna i koja se tu nalazila samo da bi kasnije mogla da se koristi u izvedenim klasama. Klasa Vucjak }e naslediti sve ~lanove klase Pas. "Pudlica"). ali ne i definisane. preko kojih generi{emo slu~ajne brojeve koje koristimo za pristup elementima niza. Vi{estruki nivoi nasle|ivanja Izvedena klasa mo`e biti osnovna za neku drugu klasu. Iz dobijenih rezultata (koji su svaki put kada se program izvr{i razli~Iti) se vidi da se metode toString() i zvuk() pozivaju u zavisnosti od objekta koji je uskladi{ten u promenljivoj izborZivotinje. } private String tip. kome se prosle|uje ime. “Vucjak”). Evo kako to izgleda na primeru: public abstract class Zivotinja{ public abstract void zvuk(). System. new Macka("Cica". } } U prethodni primer mo`emo dodati i ovu klasu. //apstraktna metoda public Zivotinja (String aTip) { tip = new String(aTip).nextInt(zivotinje. }.zvuk().println("\nIzabrali ste :\n" + izborZivotinje).izborZivotinje = zivotinje[select. Iz klase Pas bismo mogli da bez problema izvedemo klasu Vucjak. Apstraktna je ona klasa u kojoj su neke metode deklarisane. uklju~uju}i i one ~lanove koji su nasle|eni iz klase Zivotinja. One su sme{tene u nizu ~iji je osnovni tip Zivotinja. Po{to ove metode nemaju definiciju.length)]. Ovo se mo`e re{iti i preko apstraktnih klasa. Promenite samo slede}i kod: Zivotinja[] zivotinje = { new Pas("Dzoni". izborZivotinje. 50 . Macka i Patka. "Sijamska").out. new Vucjak(“Reks”). Ovaj metod u klasi Zivotinja nema nikakvo zna~enje. u pitanju su apstraktne metode.

getName()). Pas@b75778b2 Odre|ivanje tipa objekta Metoda getClass() koju sve klase nasle|uju iz klase Object vra}a objekat tipa Class. equals() getClass() HashCode() notify(0 notifyAll() wait() Metode getClass(). U njoj se prikazuje ime klase. koja mo`e ukazivati na objekat tipa Pas. To su metode clone() koja se koristi za kopiranje objekta i metoda finalize() koja se poziva kada se objekat bri{e iz memorije. Dovodi do toga da nit ~eka na promenu u trenutnom objektu. Klasa Object ima odre|en broj metoda i atributa (~lanova). Postoje i dve metode tipa protected. Ovo se nigde eksplicitno ne zadaje. Metoda toString() Ovu metodu smo koristili u na{im klasama. Vra}a se objekat tipa Class koji identifikuje klasu trenutnog objekta. Macka. Ova metoda poredi prosle|eni objekat i trenutni objekat i vra}a true ako su objekti isti (ne samo jednaki ve} to mora biti isti objekat u memoriji). Nju kompajler koristi kada je potrebna String prezentacija objekta. notify(). Evo koje su to metode: Metoda toString() Namena Vra}a se String koji opisuje trenutni objekat. U nasle|enoj verziji metode to }e biti ime klase iza kojeg sledi @. System. znak @ i hash kod tog objekta. Ove metode se mogu menjati u izvedenim klasama. Ako se ova metoda ne preklopi. Pretpostavimo da imate promenljivu ziv tipa Zivotinja. koji identifikuje klasu objekta o kome je re~. onda se koristi verzija iz klase Object. i heksadecimalna reprezentacija objekta. Class tipObjekta = ziv. U tom slu~aju dodajete promenljivu tipa Object.println(tipObjekta. U skladu sa ovim promenljiva tipa Object mo`e da primi instancu bilo koje druge klase. Vra}a false ako su razli~iti objekti. a u samoj metodi ispitujete koja je vrsta objekta u pitanju. koje Va{e klase nasle|uju. notifyAll i wait() se ne mogu preklapati u izvedenim klasama. pa ~ak i ako su vrednosti njihovih atributa identi~ne. Koristi se za obave{tavanje niti koja je u vezi sa trenutnim objektom.Univerzalna superklasa Sve klase koje pravite u Javi su izvedene iz jedne zajedni~ke klase.getClass(). To je korisno kada treba da napi{ete metodu koja rukuje objektom nepoznatog tipa. Patka ili ~ak Vucjak. Object. To se podrazumeva.out. koristi se za obave{tavanje svih niti koje su u vezi sa trenutnim objektom. // prikaz imena klase 51 . Vra}a hash kod objekta koji se koristi kod sme{tanja objekta u hash tabelama.

ali tek ako je re~ o povratku na prvobitan tip. Vucjak vuc = new Vucjak(“Reks”). Identifikacija objekata Ako ne znate o kom se objektu radi (na primer. ili Object. a ne i ostalo {to se posti`e nasle|ivanjem. Da bi neka klasa mogla da koristi interfejs. Java zadr`ava informaciju o tome koja je aktuelna klasa kojoj objekat pripada. Konstante su uvek public. Interfejsi U klasama koje smo izvodili iz klase Zivotinja imali smo metodu zvuk() koja je bila razli~ito implementirana u svakoj od potklasa. kada je objekat izvedene klase prosle|en metodi osnovne klase. Na ovaj na~in se pojava tog izuzetka izbegava. U primeru koji sledi dat je interfejs koji sad`i samo konstante: public interface FaktoriKonverzije { double INCH_U_MM = 2. // konvertovanje Vucjaka u Zivotinju. Operator instanceof vra}a true ako je objekat instanca te klase ili neke od njenih potklasa. Metode u interfejsu su uvek public i abstract. Interfejs predstavlja skup konstanti i apstraktnih metoda. onda }e drugi iskaz iz prethodnog primera dati izlaz Patka Ako se klasa nalazi u nekim paketu ovde }e biti i celo ime paketa u kome se klasa nalazi.Ako promenljiva ukazuje na objekat klase Patka. mo`ete upotrebiti interfejse. Konverzija tipa objekta Objekat izvedene klase se mo`e konvertovati u objekat neke od superklasa za tu klasu. if(ziv instanceof Patka){ pat = (Patka) ziv. Primer: Patka pat. Mo`ete na primer. … } Ako promenljiva ziv ukazuje na promenljivu tipa Zivotinja i Vi `elite da je konvertujete u tip Patka. Ako Vam je potrebno samo polimorfno pona{anje. apstraktne metode ili oboje. pa se ni za njih ne zadaju atributi. isto kao da su nasle|ene iz neke osnovne klase. a ako je re~ o konverziji u izvedenu klasu. Ako to nije bio slu~aj. Ako se radi o konverziji u natklasu.// konvertovanje Vucjaka u Zivotinju Kada konvertujete objekat u tip natklase. konvertovati objekat tipa Vucjak u klasu Pas ili Zivotinja. poku{aj konverzije dovodi do izuzetka. Zivotinja ziv = (Zivotinja) vuc. Mogu}a je i obrnuta konverzija. kao argument. to se mo`e uraditi samo ako je taj objekat inicijalno ukazivao na tip Patka. on mora da se u toj klasi implementira. mo`ete da preko operatora instanceof proverite tip objekta. onda je mogu}a implicitna konverzija. Nakon implementacije interfejsa u svakoj klasi morate da napi{ete i kod za metode koje ste u interfejsu deklarisali. pa se uz njih ne vezuju atributi. Time smo `eleli da dobijemo polimorfno pona{anje. Ovo i ne mora da se eksplicitno navodi (kod konverzije navi{e) Zivotinja ziv = vuc. 52 .54. a deklarisani tip je izvedena klasa). onda konverzija mora da se eksplicitno izvr{i. Kada klasa implementira interfejs sve konstante koje su zadate u definiciji interfejsa su direktno dostupne u klasi. Interfejs mo`e da sadr`i konstante. pre same konverzije. static i final.

59. public doublegetTezinaUKg(){ return tezinaUFuntama * FUNTA_U_GRAM. to su ove promenljive dostupne i izvan paketa u kome se interfejs nalazi. } 53 . odnosno njeno telo. U primeru koji sledi smo implementirali interfejs Konverzija: public class MojaKlasa implements Konverzija{ public double inchiUMM(double inchi){ return inchi * INCH_U_MM. double funtaUGram(double funte). Evo interfejsa koji sadr`i metrode za konverziju: public interface Konverzija { double inchUMM(double inchi).34. Po{to su static i final. Interfejs mo`e da pro{iruje neki drugi interfejs. U interfejsu Konverzija.double UNCA_U_GRAM = 28. Sve one su podrazumevano public. public interface MojInterfejs extends Interfejs1. kao i klasa pripada nekom paketu. double uncaUGram(double unce). } public double funtaUGram(double funte){ return funte * FUNTA_U_GRAM. static i final. double funtaUGram(double funte). ove promenljive se moraju inicijalizovati i kasnije se ne mogu menjati. ondnosno da se izvede iz drugog interfejsa. Ako bismo `eleli da interfejs Konverzija izvedemo iz interfejsa FaktoriKonverzije. Promenljive koje smo zadali u prvom interfejsu su dostupne izvan interfejsa. Interfejs. Kod za svaku od ovih metoda morate da obezbedite u klasi koja implementira ovaj interfejs. koji smo zadali smo dali samo deklaraciju svake metode. double uncaUGram(double unce). mogli bismo da napi{emo: public interface Konverzija extends FaktoriKonverzije{ double inchUMM(double inchi). } Interfejs mo`e da sadr`i vi{e drugih interfejsa. } Ovde je zadato nekoliko konstanti koje se mogu koristiti za konverziju jedinica. Ako `elite da implementirate interfejs koji sadr`i metode morate da za svaku metodu obezbedite kod. Ako u definiciji interfejsa izostavite klju~nu re~ public. mo`e im se pristupati i kao ~lanovima klase MojaKlasa. Interfejs2 { // kod } Implementacija interfejsa public class MojaKlasa implements FaktoriKonverzije{ double tezinaUFuntama. } } Sve konstante koje su definisane u interfejsu FaktoriKonverzije su dostupne u klasi MojaKlasa. } public double UncaUGram(double unce){ return unce * UNCA_U_GRAM. onda je interfejs dostupan samo u paketu u kome se nalazi. Po{to su tipa public. } Interfejs se defini{e klju~nom re~i interface. Po{to je interfejs deklarisan kao public. double FUNTA_U_GRAM = 453.

a u zavisnosti od toga kojoj od potklasa pripada objekat. } } } public class Pas1 implements ZivotinjaIzlaz{ public Pas1(String aIme){ ime = aIme. i++) { ziv = zivotinje[select. rasa = aRasa. to i metode u klasi moraju biti deklarisane kao public. Kada se koriste interfejsi Interfejs je pogodan na~in za pakovanje konstanti.zvuk(). onda morate da tu klasu deklari{ete kao apstraktnu. Random select = new Random(). } private String ime. private String rasa. ziv. Po{to su metode interfejsa public. "Sijamska"). String aRasa){ ime = aIme. Interfejs sa konstantama mo`ete da kasnije iskoristite u razli~Itim klasama koje }e ga implementirati. new Macka1("Cica". 54 . System. koja je u razli~itim potklasama razli~ito implementirana se kasnije pristupa preko promenljive koja ukazuje na osnovnu klasu. } public String toString(){ return "\nIme psa je " + ime + " a rasa je " + rasa. to su u ovoj klasi dostupne i sve promenljive koje su definisane u tom interfejsu. Primer: import java.length)]. Sve klase za koje `elite da se pona{aju polimorfno treba da implementiraju interfejs sa zajedni~kim metodima. Konstante su stativ i objekti klase ih me|usobno dele. Ako u nekoj klasi ne `elite da implementirate sve metode interfejsa. dolazi do poziva metoda iz potklasa. rasa = "Nepoznato". Po{to interfejs Konverzija pro{iruje interfejs FaktoriKonverzije. a polimorfno pona{anje se posti`e pozivom promenljiva koja je tipa tog interfejsa. // Random number generator for(int i = 0. "Pudlica"). ZivotinjaIzlaz ziv.util.Random. Interfejs je tako|e na~in da se implementira polimorfizam. new Patka1("Daca") }. Kod polimorfizma je potrebno da se u osnovnoj i svim izvedenim klasama defini{e metoda sa istim zaglavljem. Ovoj metodi.} Svaka metoda iz interfejsa mora imati definiciju u klasi koja taj interfejs implementira. Sli~na funkcija se mo`e posti}i i interfejsom.nextInt(zivotinje.out.println("\nIzarbali ste :\n" + ziv). i < 5. public class TestInterfejs { public static void main(String[] args) { ZivotinjaIzlaz[] zivotinje = { new Pas1("Dzoni". } public Pas1(String aIme. U primeru koji sledi smo pokazali kako preko interfejsa mo`e posti}i isto {to smo radili nasle|ivanjem klase Zivotinja i sl.

U glavnoj klasi za implementaciju se pravi promenljiva tipa ZivotinjaIzlaz. } // metod za zvuk public void zvuk() { System. Nema vi{e promenljive tip iz osnovne klase. To se odnosi i na potklase koje nasle|uju interfejs iz direktne ili indirektne klase.println("Av Av"). rasa = "Nepoznato". } Definicije klasa su sli~ne sa onima iz prethodnog primera. rasa = "Nepoznato". koja se nasle|ivala u izvedenim klasama. private String rasa. String aRasa) ime = aIme.out. jer toga sada nema. // ime macke // rasa } public class Patka1 implements ZivotinjaIzlaz{ public Patka1(String aIme) { ime = aIme. } } public class Macka1 implements ZivotinjaIzlaz{ public Macka1(String aIme) { ime = aIme. String aRasa) { ime = aIme.println("Kva kva"). } { // Vra]a se string sa detaljima o toj macki public String toString() { return "\nIme macke je " + ime + " a rasa je " + rasa. } // metod za mjaukanje public void zvuk() { System. rasa = aRasa.println("Mijauuu"). Ta promenljiva se koristi za skladi{tenje objekata klase koja implementira taj interfejs. private String rasa. } // Detalji o patkio public String toString() { return "\nIme patke je " + ime + " a rasa je " + rasa. Promenjena je i metoda toString(). } public Macka1(String aIme. tako da nema ni poziva konstruktora za super klasu u njihovim konstruktorima. Razlika je u tome da se klase ne izvode iz klase Zivotinja.// metoda za lavez public void zvuk(){ System. } private String ime. koja ukazuje na interfejs.out. } private String ime. } public Patka1(String aIme.out.toString(). 55 . tako {to je izba~en poziv metode super. rasa = aRasa.

kod neispravnog konvertovanja objekta. ili kod deljenja nulom. ili ga mo`e proslediti dalje u hijerarhiji poziva. Izuzeci treba da budu rezervisani za katastrofalne situacije.Nastaju na primer. Izuzeci Izuzeci obi~no signaliziraju na pojavu gre{ke u programu. ali se obi~no javlja kao gre{ka u Va{em kodu Tipovi izuzetaka Izuzetak je uvek instanca neke klase koja je potklasa standardne klase Throwable.Gre{ke u Java Virtuelnoj Ma{ini koja interpretira Va{ program. Izuzetak ukazuje na neuobi~ajen doga|aj u programu koji zaslu`uje pa`nju. Izuzeci pokriveni klasom Exception . iza definicije metode treba zadate klju~nu re~ throws i da navedete vrstu izuzetka. i odvojiti ih zarezima. Sopstveni izuzeci . Ako `elite da se gre{ka i objekat klase Exception ne obra|uju na licu mesta. Prilikom pisanja tog koda imate mogu}nost da izaberete da li }e se izuzetak obraditi u istoj metodi. mo`e dovesti do pojave izuzetka StringIndexOutOfBoundsException. Izuzetak ~ine izuzeci pokriveni klasom RunTimeException.Izuzeci koje sami pravite Gre{ke Jave . kada mo`e do}i do prekida rada programa. Potrebno je ih samo navesti iza imena klase (u njenoj definiciji). Izuzeci pokriveni klasom Error . Rad sa izuzecima Ako kod mo`e da proizvede neki od izuzetaka koje treba hvatati (presretati) onda morate i da napi{ete takav kod. Ne morate sve gre{ke u programu da obra|ujete kao izuzetke. klase String. Osnovna prednost signaliziranja gre{ke pomo}u izuzetka je u tome da se time kod koji rukuje gre{kom razdvaja od koda koji se izvr{ava kada se stvari odigravaju na uobi~ajeni na~in. Izuzeci stanadardnih metoda . Izuzeci se mogu podeliti na ~etiri osnovne kategorije: Gre{ke u kodu ili podacima . Ovo va`i i za stadnardne i za sopstvene izuzetke. metod substring().Skoro svi izuzeci pokriveni ovom klasom treba da se presere}u. kori{}enja indeksa niza koji je izvan granica. Izuzetak je u Javi objekat koji se pravi kada se u programu pojavi neka nenormalna situacija. double mojMetod() throws FileNotFoundException{ … } Ovo zna~i da metoda koja poziva ovu metodu mora da ima kod koji obra|uje izuzetak tipa FileNotFoundException. Izuzetak se pojavljuje kada se objekat koji identifikuje neobi~ne situacije prosledi delu programa koji je posebno napisan da bi upravljao takvim problemom. Svi standardni izuzeci su pokriveni sa dve direktne potklase klase Throwable.Ovi izuzeci se odnose na stanja kada se ne o~ekuje da vi ne{to uradite i stoga i ne treba da ih presre}ete. 56 . Ovaj objekat ima ~lanove (atribute) koji bli`e opisuju prirodu problema. a to su klase Error i Exception.Na primer. ili }e se proslediti metodi koja je pozvala metodu u kojoj je izuzetak nastao.Klasa mo`e da implementira vi{e interfejsa. odnosno `elite da ih prosledite metodi koja je pozvala tu metodu. Za kod koji prima objekat izuzetka se ka`e da presre}e izuzetak.

} // Catch the exception catch(ArithmeticException e) { System. try { System. Blok finally se uvek izvr{ava pre nego {to se zavr{i metoda.println("Ulaz u blok try " + "i = "+ i + " j = "+j). sa kodom koji dovodi do pojave izuzetka. // deljenje sa nulom. Kod za koji pretpostavljate da }e proizvesti izuzetak mora biti u ovom bloku. bez obzira na to da li je do{lo do pojave izuzetka. u kom slu~aju }e se hvatati svi izuzeci. public class TryCatchProba { public static void main(String[] args) { int i = 1. To su blokovi try. Ako klasa koju nazna~ite ima potklase. int j = 0. Nakon {to se izvr{i kod u 57 . Blok try okru`uje kod koji mo`e dovesti do pojave izuzetka. nastaje izuzetak System.Obrada izuzetka Izuzetak se obra|uje preko tri razli~ita bloka koda. kod se mora nalaziti u okviru bloka try.out. onda taj catch blok mo`e da uhvati izuzetke tog tipa klase. catch i finally.out.println(i/j). } System.println("Doslo je do pojave izuzetka tipa ArithmeticException"). U primeru koji sledi smo prikazali pojavu i obradu izuzetka. ali i svih potklasa. Blok try Ako `elite da presretnete (uhvatite) izuzetak.println("Posle bloka try"). Blok try izgleda ovako: try{ // kod koji moze dovesti do pojave izuzetaka } Blok catch Kod koji obra|uje izuzetak se mora nalaziti u bloku catch. try{ // kod koji moze dovesti do pojave izuzetaka }catch(ErithmeticException e){ // kod koji obra|uje izuzetak } Jedina vrsta izuzetka koju ovaj blok catch mo`e da uhvati je izuzetak tipa ArithmeticException.out. To zna~i da mo`ete da kao arugment navedete i klasu Exception.out. tako da postoji operacija deljenja nulom. Parametar bloka catch mora biti tipa Throwable ili neke od potklasa koje su izvedene iz ove klase. Kada se pojavi izuzetak kontrola programa se odmah prebacuje na blok catch.println("Kraj bloka try"). System. Blok catch se odnosi na kod koji obra|uje izuzetak odre|enog tipa.out. Ovaj blok mora slediti odmah iza bloka try. } } Promenljiva j u primeru je inicijalizovana na 0. return.

U primeru koji sledi smo pokazali redosled izvr{avanja razli~itih blokova try i catch. onda se se izuzetak potklasa nikad ne}e izvr{iti. iza kojeg slede svi blokovi catch i na kraju mo`da blok finally. Blokovi koji slede iza njega se ne izvr{avaju. Ako `elite da u ovom bloku radite sa objektima koji su postavljeni u bloku try. Vi{estruki blokovi catch Ako blok try mo`e da proizvede vi{e razli~itih vrsta izuzetaka. Blok finally Pojava izuzetka zna~i da se izvr{avanje bloka try prekida. To zna~i da treba paziti na redosled iskaza catch.IOException. U ve}ini slu~ajeva }ete u metodi napraviti jedan blok try. Mogli ste. Ovaj blok se izvr{ava bez obzira na to da li se desio izuzetak ili ne. 5. onda te promenljive morate definisati ispred bloka try. Na taj na~in mo`e da se desi da neki poslovi ostanu nedovr{eni.io. koja zatim ostaje nezatvorena. try{ // kod koji moze dovesti do izuzetka }catch(ArithmeticException e){ // kod za obradu ovog izuzetka }catch(IndexOutOfBoundsException e){ // kod za obradu ovog izuzetka } Izvr{ava se prvi blok catch koji odgovara tipu nastalog izuzetka. vidljive samo u okviru bloka. onda to zatvaranje treba da stavite u blok finally.bloku catch. 0}. izvr{avanje programa se nastavlja iskazom koji sledi iza njega. mo`ete staviti vi{e blokva catch. Blok finally omogu}ava da zavr{ite va`ne stvari koje su prekinute u bloku try. public class TryBlockTest{ public static void main(String[] args) { int[] x = {10. Ako treba da bude zatvorena datoteka. Iskazi u bloku try. ~ime obezbe|ujete da }e se taj posao uvek obaviti. Promenljive koje defini{ete u ovom bloku. Ako su dva tipa izuzetka tipa osnovne i potklase i ako je osnovna klasa u catch blokovima ispred potklase. da otvorite datoteku. // Niz od tri integera //Ovaj blok javlja izuzetak ako postoji u metodu podeli() try { 58 . bez obzira na kod koji se nalazi iza mesta nastanka izuzetka. Promenite vrednost za j na 1 i probajte ponovo. Blok catch je odvojen od bloka try. na primer. Primer: import java. koji slede iza mesta na kome je do{lo do izuzetka se ne izvr{avaju. ne}e se izvr{iti nijedan blok catch iza ovog prvog bloka (to ne mo`e ni da se kompajlira). su kao i kod svih blokova. Iza njega mora da ide najmanje jedan blok catch ili finally. Ako ima vi{e catch blokova i ako na po~etak stavite klasu Exception. try{ // kod }catch(Exception e){ // obrada izuzetka }finally{ // zavrsni kod } Blok try ne mo`e da postoji samostalno. Sa blokom try treba pa`ljivo raditi.

println("I/O izuzetak uhvacen u metodi main()").println("rezultat = " + podeli(x.println("U metodi main() je uhvacen aritmeticki izuzetak"). to se ona ne mo`e pozvati bez blokova try i catch. } // metod za deljenje public static int podeli(int[] array.out. } catch(ArrayIndexOutOfBoundsException e){ System. // Aritmeticka greska x[1] = 1. } finally{ System.println("Poceo je prvi try blok u metodi main()").out. return array[index + 2].println("\nUlaz u prvi blok try u metodi podeli()"). //Nema gresaka x[1] = 0. // Ceka se na unos return.println("Izvan prvog bloka try u metodi main()").println("Kod na kraju prvog bloka try u podeli()"). } catch(IOException e){ // Metod read() moze da dovede do izuzetka System.println("Drugi blok try u metodi main()").out. {to se i vidi iz {tampanja koja se prikazuju. } System. } System. System.println("Izvrsavanje koda nakon bloka try u podeli()"). U metodi podeli postoji i blok finally koji se uvek izvr{ava. } } U metodi main() postoje dva bloka try.out.System. int index){ try{ System.read().println("\nPritisnite enter za kraj"). Ovaj deo koda mo`e da dovede do izuzetka IndexOutOfBoundsException.println("Uhvacen izuzetak Index-out-of-bounds u podeli()"). // Greska u indeksu } catch(ArithmeticException e){ System.println("U metodi main je uhvacen izuzetak IndexOutOfBoundsException").0)).out.println("Kod u metodi main posle drugog bloka try").out. // sprecava deljenje sa nulom System.out.0)). koji je ~lan klase System.out. System.1)). array[index + 2] = array[index]/array[index + 1].out. System. } catch(ArithmeticException e) { System.out.println("finally blok u podeli()"). U pitanju je standardni ulaz (in).println("rezultat = " + podeli(x. Ako poku{ate da tako uradite kompajler }e javiti gre{ku. } catch(ArrayIndexOutOfBoundsException e){ System.println("rezultat = " + podeli(x.println("Aritemticki izuzetak uhvacen u podeli()"). // Dovodi do deljenja sa nulom System.out.out.out. Drugi blok try u metodi main() je potreban zato {to se u njemu poziva metoda read() objekata in. System. U ovoj metodi postoji i kod koji se izvr{ava izvan svih ostalih blokova. U metodi podeli() postoje dva bloka catch.out.out. koji se izvr{avaju ako do|e do deljenja sa nulom. ili ako se pristupi elementu sa nepostoje}im indeksom.out. Prvi poziv metode podeli() u prvom bloku try ne dovodi do nikakve gre{ke.out.out. return array[index + 2].println("blok finallyza drugi blok try u metodi main"). } finally{ // Ovo se uvek izvrsava System.in. } System. Po{to ova metoda mo`e da dovede do izuzetka tipa IOException. // Ovaj blok sluzi samo za pauziranje programa pre kraja try{ System. 59 .

0)). Tre}i poziv metode podeli() spre~ava deljenje sa nulom.out.out.Drugi poziv metode podeli izaziva deljenje sa nulom. // Aritmeticka greska x[1] = 1.out. // Niz od tri integera //Ovaj blok javlja izuzetak ako postoji u metodu podeli() try { System. } System. 60 .0)). 5.println("U metodi main() je uhvacen aritmeticki izuzetak"). koji se hvata u toj metodi. // Dovodi do deljenja sa nulom System. //Nema gresaka x[1] = 0.1)).println("\nPritisnite enter za kraj"). ~esto se javlja potreba da se izuzetak prosledi dalje programu. Pregled izvr{avanja metode sadr`i broj reda u izvornom kodu u kome se izuzetak pojavio.println("rezultat = " + podeli(x. U tom slu~aju se javlja izuzetak ArithmeticException. koji nastaje usled koda na kraju metoda podeli (return array[index+2]). // sprecava deljenje sa nulom System. Po{to ovaj kod nije u bloku try to se taj izuzetak ne hvata u metodi podeli().println("U metodi main je uhvacen izuzetak IndexOutOfBoundsException").IOException.out. System. jer se na ovaj na~in mo`e da odredi lokacija gre{ke i naravno mesto gde treba ne{to ispraviti. U tom trenutku metoda se prekida i izvr{avanje se nastavlja u metodi main(). ali dovodi do pojave izuzetka IndexOutOfBoundsException. Prosle|ivanje izuzetaka Iako pomo}u bloka catch mo`ete da obradite izuzetak.out.out.println("Poceo je prvi try blok u metodi main()").println("rezultat = " + podeli(x. koja hvata taj izuzetak. 0}. Izuzetak se iz klauzule catch mo`e da prosledi preko iskaza throw. Ovo je vrlo va`na informacija. try{ // kod koji dovodi pojave izuzetka }catch(ArithmeticException e){ // obrada izuzetka throw e. To je obi~no puno ime klase izuzetka i kratak opis izuzetka. } catch(ArrayIndexOutOfBoundsException e){ System. koji na osnovu toga treba da preduzme neku akciju. public class TrTest1 { public static void main(String[] args) throws IOException { int[] x = {10. TO se prikazuje na standardnom izlazu.println("rezultat = " + podeli(x. Ovo je mogu}e preko metoda klase Throwable iz koje se izvode svi izuzeci.out.out.println("Izvan prvog bloka try u metodi main()"). } Objekti izuzetaka Objekat izuzetka koji se prosle|uje bloku catch mo`e da pru`i dosta informacija o prirordi problema i njegovom uzroku.io. Metoda printStackTrace() ima i oblik sa prosle|enim objektom PrintStream u kom slu~aju vi zadajete gde }e se to {tampati. System. a iza toga sledi spisak metoda koji su prethodili izvr{enju tog koda. Objekat klase Throwable ima nekoliko metoda koje pru`aju informacije o izuzetku. To su metoda getMessage() i metode printStackTrace() i printStackTrace(PrintStream s). // Greska u indeksu } catch(ArithmeticException e){ System. Metoda getMessage() vra}a poruku koja opisuje trenutni izuzetak. Promenili smo prethodni primer. tako da se prika`u i informacije o mestu na kome je gre{ka nastala: import java. Metoda printStackTrace() prikazuje poruku i pregled izvr{avanja metode.

println("\nIzlaz iz metode StackTrace:\n"). e.out.println("Aritemticki izuzetak uhvacen u podeli()\n" + "\nPoruka iz objekta exception:\n\t" + e.io.out.read(). System. } System. } } Sopstveni izuzeci Ve}ina standardnih izuzetaka u Javi ne pru`a dodatne informacije o stanju koje dovodi do pojave izuzetka. onda mo`ete kreirati sopstvene izuzetke. e.out). } catch(ArrayIndexOutOfBoundsException e) { System. 61 .out.out. } catch(IOException e){ // Metod read() moze da dovede do izuzetka System. klasu Throwable.println("Izvrsavanje koda nakon bloka try u podeli()"). } catch(ArithmeticException e) { System.println("I/O izuzetak uhvacen u metodi main()"). Ako vam je potrebno vi{e informacija o okolnostima pod kojim je do{lo do pojave izuzetka. return array[index + 2].// Ovaj blok try sluzi za pauziranje programa pre izlaza try{ System.out.getMessage()).printStackTrace(System. Sopstvene izuzetke dodajete kada `elite da imate dodatne informacije kada se pojavi standardni izuzetak ili kada u kodu imate gre{ku koja opravdava posebnu klasu izuzetka.println("blok finallyza drugi blok try u metodi main").println("\nUlaz u prvi blok try u metodi podeli()").out). } finally { System. } System. Ta klasa }e bli`e obja{njavati izuzetak op{teg tipa ArithmeticException. System.out. // Ceka se na unos return.println("\nKraj izlaza iz StackTrace\n").println("Kod na kraju prvog bloka try u podeli()").println("Kod u metodi main posle drugog bloka try"). } // podeli method public static int podeli(int[] array.out. System.out.out.println("Uhvacen izuzetak Index-out-of-bounds u podeli()\n" + "\nMessage in exception object:\n\t" + e. a ne u izuzetke. System.println("\nIzlaz iz metode StackTrace:\n"). int index) { try { System.println("\nKraj izlaza iz StackTrace\n"). Napravi}emo sopstvenu klasu za izuzetak deljenja sa nulom. Va{e klase izuzetaka moraju da imaju kao superklasu. onda ga treba ubaciti u petlju if-then-else.println("Drugi blok try u metodi main()"). } finally{ // Ovo se uvek izvrsava System.in. Sopstveni izuzeci nisu zamena za normalan kod za oporavak za koji o~ekujete da }e se ~esto izvr{avati. Primer: import java.getMessage()). System.IOException.out.out. System. array[index + 2] = array[index]/array[index + 1]. Najbolje je da svoje klase izvodite iz klase Exception.out. Promeni}emo primer koji smo ranije priakzali.out.out. return array[index + 2].printStackTrace(System. Ako imate kod koji se ~esto izvr{ava u ovakvim situacijama.println("klauzula finally u podeli()").

} finally{ // Ovo se uvek izvrsava System.println("Deljenje sa nulom je ispravljeno za element " + x[index]).println("U metodi main() je uhvacen aritmeticki izuzetak"). // Niz od tri integera //Ovaj blok javlja izuzetak ako postoji u metodu podeli() try { System. } catch(ArrayIndexOutOfBoundsException e){ System.println("Kod na kraju prvog bloka try u podeli()").println("Izvrsavanje koda nakon bloka try u podeli()").println("\nUlaz u prvi blok try u metodi podeli()").public class Izuzetak { public static void main(String[] args) { int[] x = {10.read(). System.1)). //Nema gresaka x[1] = 0. int index) throws DeljenjeSaNulomIzuzetak{ try{ System.out. array[index + 2] = array[index]/array[index + 1]. return array[index + 2]. // Aritmeticka greska x[1] = 1. // Ceka se na unos return.println("blok finallyza drugi blok try u metodi main"). } finally{ System. return array[index + 2]. } catch(ArithmeticException e) { System.println("rezultat = " + podeli(x.out. throw new DeljenjeSaNulomIzuzetak(index + 1).in.out.println("rezultat = " + podeli(x. // Greska u indeksu }catch(DeljenjeSaNulomIzuzetak e){ int index = e. System.println("U metodi main je uhvacen izuzetak IndexOutOfBoundsException"). System. } System.out.out. } System. 5.println("rezultat = " + podeli(x.out.println("Poceo je prvi try blok u metodi main()").println("Aritemticki izuzetak uhvacen u podeli()").println("Uhvacen izuzetak Index-out-of-bounds u podeli()"). // Ovaj blok try sluzi za pauziranje programa pre izlaza try{ System.out.out. } // metod za deljenje public static int podeli(int[] array. } catch(IOException e){ // Metod read() moze da dovede do izuzetka System. System.0)).out.println("Drugi blok try u metodi main()").println("finally blok u podeli()"). // Dovodi do deljenja sa nulom System.out.1].out.println("I/O izuzetak uhvacen u metodi main()"). // indeks elementa koji je doveo do greske if(index > 0){ x[index] = 1.println("Kod u metodi main posle drugog bloka try").println("\nPritisnite enter za kraj").0)).out. // sprecava deljenje sa nulom System.out.out. } catch(ArrayIndexOutOfBoundsException e){ System.getIndex(). } System.out.out.println("Izvan prvog bloka try u metodi main()").out.out. 0}. } 62 .out. x[index + 1] = x[index . } }catch(ArithmeticException e){ System. System.

Osnovni razlog za upotrebu tokova u Javi je da se obezbedi nezavisnost programskog koda u odnosu na ure|aj koji se koristi. // indeks elementa niza koji dovodi do greske // podrazumevani konstrktor public DeljenjeSaNulomIzuzetak(){ } // Standardni konstruktor public DeljenjeSaNulomIzuzetak(String s) { super(s). {tampa~ i sl. Prednost je u tome da ne morate brinuti o detaljima svakog od ure|aja. Samo Java aplikacije mogu da koriste tokove na ma{ini na kojoj se program izvr{ava. Oni obi~no nisu dostupni apletima.index = index. ili drugom ra~unaru ili tastatura. Promenili smo i kod za hvatanje gre{ke u ovom metodu. Tok se mo`e shvatiti kao niz bajtova koji teku u i iz programa. U tok mo`ete da upisujete podatke i iz njega mo`ete da podatke ~itate. koji sadr`e tokove znakova. Vrste tokova Ve}ina klasa koje su potrebne za manipulaciju tokovima se nalaze u paketu java. tok se naziva izlaznim tokom. Tok je apstraktna prezentacija ulaznog ili izlaznog ure|aja. koji predstavlja izvor ili odredi{te podataka. Kada podatke upisujete u tok. kao i da }e program raditi sa razli~Itim ulazno/izlaznim ure|ajima bez promene koda. // Return the index value } } Promenili smo metod podeli() iz prethodnog primera. datoteka na drugom ra~unaru.io. Ulaz i izlaz u Javi Ulazne i izlazne operacije se u Javi realizuju pomo}u tokova. Obi~no je u pitanju datoteka na disku. Koriste se i za ~itanje tekstualnih datoteka koje nisu nastale iz Jave. Podaci se ~itaju iz ulaznog toka. koji sadr`e binarne podatke i znakovne tokove.} public class DeljenjeSaNulomIzuzetak extends Exception{ private int index = -1. Ako u tok pi{ete podatke kao niz bajtoba. tako {to smo definisali da on mo`e da prosledi izuzetak tipa DeljenjeSaNulomIzuzetak (throws u zaglavlju metoda). Znakovni tokovi se koriste za skladi{tenje i ponovno dobijanje teksta. podaci se upisuju isto onako kako se nalaze i u memoriji. Izlazni tok mo`e biti datoteka na disku. i to tako {to smo dodali iskaz throw new DeljenjeSaNulomIzuzetak(index+1) Ovaj iskaz generi{e novi izuzetak sa vi{e detalja i prosle|uje ga metodi odakle je metoda podeli pozvana. Ovaj paket podr`ava binarne tokove. U metodi main smo dodali blok catch za obradu novog tipa izuzetka (ispred ArithmeticException) i u tom kodu smo promenili element koji je doveo do problema. Izlazni tok mo`e biti i monitor. // Poziv konstruktora osnovne klase } public DeljenjeSaNulomIzuzetak(int index){ super("/ sa nulom"). // Poziv osnovnog konstruktora this. Nema nikakve transformacije podataka. 63 . // Podesavanje indeksa } // Uzimanje indeksa za koji se desila greska public int getIndex() { return index.

Definisanje datoteke Objekat File predstavlja putanju do fizi~ke datoteke ili direktorijuma na disku.io se nalaze slede}e osnovne klase za podr{ku ulazno izlaznih tokova. koji odre|uje putanju do datoteke ili direktorijuma. Tokovi datoteka koji se defini{u pomo}u klasa koje se izvode iz ove ~etiri navedene klase su po svojoj prirodi sekvencijalni. Pored toga {to omogu}ava da napravite objekat koji predstavlja putanju do datoteke."). File mojDir = new File(“F:/jdk1. Ovaj pristup je zgodan kada `elite da radite sa vi{e datoteka koje se nalaze u istom direktorijumu.java”). koji kao arugment prihvata objekat tipa String.Klase za ulaz i izlaz U paketu java. Kod Windows operativnih sistema. Ako `elite da datoteci i zapisima u njoj pristupate po slu~ajnom principu. File mojaDatoteka = new File(“F:/jdk1. “File. morate da koriste klasu RadnomAccessFile.3/src/java/io”)’ File mojaDatoteka = new File(mojDir.io. Klasa File OutputStream InputStream Writer Reader Opis Objekat ove klase predstavlja putanju do datoteke kojoj pristupate za ulaz ili izlaz.*. U toj verziji se {alju dva argumenta.println(myDir + (myDir. OutputStream. a drugi argument je ime datoteke na tom direktorijumu. Ako `elite putanju do datoteke mo`ete da napravite i preko druge verzije konstruktora za klasu File. u ovoj klasi se nalaze i nekoliko metoda koji omogu}avaju testiranje objekata koje pravite. Reader i Writer su apstraktne klase.3/src/java/io/File. Primer: import java. System. U primeru koji sledi smo pokazali kako se preko objekta File mogu dobiti informacije o odre|enom direktorijumu i datotekama u njemu. Ove klase se korsite samo kao osnova za izvo|enje drugih klasa sa konrkretnim mogu}nostima. a ne sam tok.java”). File mojDir = new File(“F:/jdk1. Ovaj objekat sada ukazuje na datoteku sa izvornim kodom koja sadr`i definiciju klase File. umesto znaka “/” mo`ete koristiti i ‘\\’. U ove ~etiri klase su me|utim. Mo`e da se odnosi i na direktorijum Osnovna klasa za izlazne operacije toka bajtova Osnovna klasa za ulazne operacije toka bajtova Osnovna klasa za izlazne operacije toka znakova Osnovna klasa za ulazne operacije toka znakova Klase InputStream. 64 . definisani osnovni metodi koji se koriste za ulazno/izlazne operacije.out. Prvi argument je drugi objekat File koji ukazuje na direktorijum. Iz apstraktnih klasa se ne mogu praviti instance klase. Najjednostavniji na~in kreiranja objekta je preko konstruktora. public class TryFile{ public static void main(String[] args){ // Kriera se direktorijum (objekat koji sadrzi ptanju do njega) File myDir = new File("d:/temp").3/src/java/io”).isDirectory()?" is":" is not") + " a directory. Ako `elite da dobijete putanju do datoteke morate da obezbedite da prosle|eni string ukazuje na datoteku.

Ovi metodi se nasle|uju u njenim potklasama. ByteArrayOutputStream. Sve klase koje se izvode iz ove klase }e naslediti metode koje postoje u ovoj klasi.pi{e se u niz tipa char PipeWriter .println(myFile + (myFile. System.canWrite()?" ":"not ") + "write " + myFile).println("You can" + (myFile.out.doc"). int length) . Klasa FileOutputStream defini{e izlazni tok kao datoteku. write (String str) . Potklase ove klase su FileOutputStream.// Kreira se datoteka (objekat koji ukazuje na nju) File myFile = new File(myDir. return. 65 .apstraktna osnova za Filter. int offset. po~ev od elementa sa indeksom offset.u tok se iz niza cArray pi{e length znakova.pi{e se u spremi{te FilterWriter . write (int c) . Sve klase koje omogu}avaju rad sa znakovima se izvode iz apstraktne klase Writer.pi{e se u String CharArrayWriter . Ako do|e do gre{ke ove metode proizvode izuzetak tipa IOException.out.out. Klasa PipedOutputStream dodaje podatke u izlazni tok koji je namenjen za kori{}enje sa objektom PipedInputStream. } } Izlazni tokovi Izlazni tokovi bajtova se opisuju preko klase OutputStream i onih koje se iz nje izvode.println("You can" + (myFile. "prikaz. Izlazni tokovi znakova omogu}avaju pisanje znakovnih podataka.pi{e se u File PrintWriter . int offset. po~ev od pozicije offset.iz stringa str u tok pi{e length znakova.exists()?" does":" does not") + " exist"). Klasa FilterOutputStream je osnovna klasa za izvo|enje klasa koje pro{iruju mogu}nosti ostalih klasa. Povratni tip je void.pi{e se u PipeReader OutputStreamWriter .pi{e se u Writer BufferedWriter . write (char[] cArray) .canRead()?" ":"not ") + "read " + myFile). Potklase ove klase su: StringWriter . Klasa ByteArrayOutputStream je izlazni tok koji podatke upisuje u niz bajtova.pi{e se u OutputStream FileWriter .u tok se pi{e znakovni niz write char[] cArray. FilterOutputStream.u tok se pi{e string write (String str.Pi{e znak c u izlazni tok. Klasa Writer defini{e slede}e metode. System. Unicode znakovi se automatski prebacuju u kod koji koristi ra~unar na kome se program izvr{ava. System. int length) . PipedOutputStream.

Nakon toga smo na osnovu objekta FileWriter napravili objekat BufferedWriter. String[] sayings = { "Prvi red u datoteci\n". Ako bi vrednost ovog atributa bila false.koristi se za preskakanje dela datoteke koji ne `elite da obradite mark(int readlimit) .createNewFile().io. // Ako je potrebno pravi se nova datoteka if(!output. Metodu close() pozivate kada `elite da zavr{ite sve operacije i da prekinete vezu sa tokom.length. return. Ulazni tokovi Sve klase izvedene iz klase InputStream nasle|uju metode: read() .").getPath() + " nije uspelo. }catch(IOException e){ System. } } } Na po~etku programa se kreira objekat File koji predstavlja putanju do datoteke koju `elimo da napravimo (direktorijum d:\\kurs i datoteka Proba.length() + sayings[i]).getPath().*.out.close().obele`ava trenutnu poziciju. U primeru koji sledi }emo u datoteku dodati tekst. "Drugi red u datoteci. i < sayings. "Cetvrti red u datoteci\n"}. } out. true)). Pisanje u datoteku Za zapisivanje u tekstualnu datoteku mo`ete da koristite klasu FileWriter.println("Greska u pisanju u datoteku " + e). i++){ out. // Ime izlazne datoteke File output = new File(dirName. onda se bi se datoteka uvek pravila iznova.\n".write(sayings[i]. "Treci red u datoteci\n". Ispred se pi[e du`ina stringa for(int i = 0.~ita se dovoljno bajtova da se popuni niz buffer ili dok se ne do|e do kraja niza. Primer: import java. read(byte[] buffer) .out. 66 . tako da se kasnije pomo}u metode reset() mo`ete vratiti na nju. Obratite pa`nju na drugi argument (true) u konstruktoru klase FileWriter. skip(long n) .U ovoj klasi postoje i metode flush() i close(). Ova klasa ima konstruktor koji kao argument prihvata objekat tipa File. fileName).txt). Metoda flush() se koristi kada `elite da zavr{ite niz izlaznih operacija nad tokom (tako {to se prebacuju podaci koji su jo{ uvek unjemu).slu`i za ~itanje jednog bajta podataka iz toka i da vrati tip int. // Direktorijum za izlaznu datoteku String fileName = "Proba.println("Kreiranje datoteke " + output.isFile()){ // PRoverava se da li postoji datoteka System. // Zapisuje se u datoteku. koji }e podatke dodavati u izlaznu datoteku. output. koji govori da se u tu datoteku dodaju zapisi.txt". } BufferedWriter out = new BufferedWriter( new FileWriter(output. public class WriteCharacters{ public static void main(String[] args) { try { String dirName = "d:\\kurs\\".

U primeru koji sledi smo pro~itali datoteku koju smo napravili u prethodnom primeru.toString()).doc". StringBuffer buf = new StringBuffer().. Primer: import java. } System.println(e). ^itanje objekta iz datoteke se naziva deserijalizacijom.out.~itanje iz toka koji dolazi iz objekta PipedOutputStream ByteArrayInputStream . Za serijalizaciju i deserijalizaciju objekata se koriste klase ObjectOutputStream i ObjectInputStream.read()) != -1){ buf. } } } Datoteku ~itamo jedan po jedan karakter. Ovaj objekat se koristi za ~itanje toka napisanog preko klase Writer.pozicionira tok na mesto definisano prethodnim pozivom metode mark(). Potklase klase InputStream FileInputStream . return. while((c = in. } catch(FileNotFoundException e){ System.~itanje iz datoteke SequenceInputStream .io.Osnovna klasa za filtriranje ObjectInputStream .err.~ita podatke iz niza bajtova FilterInputStream . Skladi{tenje objekta u datoteku Proces sme{tanja objekta u datoteku se naziva serijalizacijom. Taj karakter koji se vra}a pretvaramo u tip char i zatim dodajemo u objekat StringBuffer. fileName).*.~itanje iz toka sa objektima Ulazni tok znakova Ulazne operacije obezbe|uju klase koje se izvode iz klase reader. return. Postoje i druge metode. Upisivanje objekta u datoteku 67 .append((char)c). Kada se petlja zavr{i {tampa se string koji se nalazi u StringBuffer objektu.omogu}ava spajanje vi{e ulaznih tokova u jedinstveni tok PipedInputStream . Izlaz smo od{tampali na ekranu.err. Ako je dostignut kraj datoteke vra}a -1. Metod read() objekta BufferedReader ~ita jedan po jedan karakter i vra}a njegovu int prezentaciju. Ove klase su izvedene iz klasa DataOutputStream i DataInputStream.println("Error reading input file" + e ). tako da ove klase poseduju sposobnost obrade osnovnih tipova. public class CitanjeIzDatoteke { public static void main(String[] args) try { String dirName = "d:\\kurs\\". a sve to preko nasle|enih metoda. BufferedReader in = new BufferedReader(new FileReader(input)). String fileName = "Proba.reset() .println(buf. int c. } catch(IOException e){ System. { File input = new File(dirName.

FileOutputStream izlaz = new FileOutputStream(“Proba”). 68 . Njih treba eksplicitno rekonstruisati kada se objekat u~itava iz toka. kao {to je na primer trenutno vreme ili teku}i datum. ObjectOutputStream objectOut = new ObjectOutputStream(izlaz). ili koje ne `elite da upi{ete u tok. Ovoj metodi mo`ete da prosledite objekat bilo koje klase. Svaki nezavisan objekat koji zapisujete zahteva poseban poziv metode. Ova metoda vra}a tip Object.writeObject(mojObjekat). Ovaj objekat defini{e tok za datoteku u koju nameravate da smestite svoj objekat. Metod writeObject() koji smo mi pozvali }e dalje pozvati istoimene metode za sve objekte koji su ~lanovi podaci.// tranzientan ~lan } Ako ste neki ~lan deklarisali sa transient.Konstruktor klase ObjectOutputStream kao argument zahteva objekat klase FileOutputStream. ali se objekti koji su ~lanovi drugog objekta zapisuju automatski. koji uvek treba da budu postavljeni na trenutnu vrednost. onda treba da ih ozna~ite sa transient. ^itanje objekta iz datoteke Najpre treba napraviti objekat ObjectInputStream. public MojaKlasa implements Serializable{ transient protected Graphics g. kao i sadr`aj i tipovi ~lanova klase. to radi automatski. klase ObjectOutputStream. kasnije u operaciji ~itanja mogao da rekonstrui{e. koji dalje treba pretvoriti u odgovaraju}i tip. onda ta osnovna klasa mora imati podrazumevani kosntruktor (koji ne zahteva nijedan argument). po{to se u datoteku nisu ni zapisivale. Nakon toga se mo`e pozvati metoda readObject() za taj objekat. Tu su i informacije o klasi i svim njenim supreklasama. Ako su prethodni uslovi zadovoljeni. uklju~uju}i i ~lanove koji su deklarisani kao transient. {to zna~i da moraju biti osnovnog tipa ili tipa klase koja se mo`e serijalizovati. pri ~emu se objekat o kome se radi prosle|uje kao argument. Da bi se objekat mogao da zapisuje u tok na ovaj na~in klasa mora da zadovoljava tri osnovna uslova: Klasa mora biti deklarisana kao public Klasa mora da implementira interfejs Serializable Ako klasa ili potklasa ima direktnu ili indirektnu potklasu koja se ne mo`e serijalizovati. Ovo se mo`e koristiti za vrednosti koje nisu bitne. Prilikom upisivanja se vodi ra~una o tome da se upi{e sve {to je potrebno da bi se objekat. Implementacija interfejsa Serializable U klasu za koju `elite da implementira interfejs Serializable treba dodati slede}i kod: public MojaKlasa implements Serializable{ // definicija klase } Sva polja u klasi moraju biti takva da se mogu serijalizovati. Kada se objekat klase ponovo u~ita. onda metoda writeObject() ne}e poku{ati da taj ~lan upisuje u tok. on }e biti ispravno konstruisan. Vrednosti tih ~lanova ne}e biti iste kao pre slanja u datoteku. Pisanje u datoteku proba mo`ete da izvr{ite preko metode writeObject(). ali se sa objektima koji su ~lanovi klase. Ovo radi ~ak i kada su ~lanovi klase drugi objekti. sve dok se ti drugi objekti mogu serijalizovati. onda se upisivanje objekta u tok koji je ranije definisan mo`e uraditi na slede}i na~in: objectOut. ^lanovi klase deklarisani kao transient Ako klasa ima ~lanove podatke koji se ne mogu serijalizovati. Nezavisni objekti se u tok zapisuju posebnim pozivom metode writeObject().

Ovo je ekvivalentno re~i koju tra`ite u obi~nom re~niku. zatim objekat na zadatoj poziciji (preko indeksa. to se moraju napisati najmanje ova dva catch bloka. Klju~ mo`e biti bilo koja vrsta objekta.out. Svaki objekat koji se sme{ta u mapu ima pridru`en drugi objekat. Skupovi su najjednostavnije kolekcije. Klase kolekcija Kolekcija je op{ti termin za objekat u kome se nalazi skup objekata koji su na neki na~in grupisani. kome se kasnije pristupa preko klju~a. U ovom poslednjem slu~aju se proveravaju svi objekti koji se nalaze u listi. 69 . koje se koriste za razli~ite stvari. Sekvence su kolekcije u koje se objekti sme{taju na linearan na~in. ali je ograni~ene veli~ine.) u jednom objektu. zbog na~ina na koji radi. ime osobe. sekvence i mape. Obi~an niz je primer za kolekciju. Mo`e se dobiti prvi. U paketu java. }catch(ClassNotFoundException e){ System. }catch(IOException e){ System. onda taj klju~ mo`e da bude na primer. Objekat iz liste se mo`e izvaditi na nekoliko na~in.println(e). Ovo je kao kada ne{to stavljate u d`ep.util postoji devet klasa koje se mogu koristiti za rukovanje kolekcijama objekata. a ne sa kolekciju samih objekata. Objekti su u odnosu na kolekciju spolja{nji objekti. u nju mo`ete da objekat dodajete na po~etak. Pomo}ne klase U paketu java. U pitanju su liste. Ova dva objekta se u mapu sme{taju kao par. He{iranje obra|uje objekat klju~a i pravi celobrojnu vrednost koja se zove he{ kod. ObjectInputStream objectIn = new ObjectInputStream(ulaz). zatim klase za rad sa datumima.readObject(). To su skupovi. Ako na primer. Po{to je lista (sekvenca) linearna. Svaki klju~ treba da proizvede razli~it he{ kod.. Objektu u map{i pristupate preko tog klju~a. Va`na osobina kolekcija je da one mogu da se {ire i da prihvate onoliko elemenata koliko je potrebno. kao i neke klase za obradu stringova.println(e). ili jo{ bolje mati~ni broj. Mesto sme{tanja objekta u map{i se odre|uje procesom he{iranja. na kraj ili da ga ubacujete ispred odre|enog objekta. Svi klju~evi u mapi moraju biti razli~iti. Mape se razlikuju od skupova i sekvenci po tome {to sadr`e parove objekata. Postoje tri osnovna tipa kolekcija. Klju~ odre|uje gde je objekat sme{ten u mapi. Objekti u njima nisu pore|ani na odre|eni na~in i jednostavno se u sme{taju u skup bez ikakve kontrole sme{tanja. skupovi i mape. // deserijalizacija objekta obj = (MojaKlasa) objectIn. za koji smo sigurni da je jedinstven. Tu se nalaze razli~ite klase kontejneri.out. ili poslednji objekat. Idealno je kada he{iranje proizvodi vrednosti koje su uniformno raspore|ene u odre|enom opsegu. Jednostavno stavite unutra i stvari se izme|aju bez ikakvog reda. ime. // ovde se skladisti objekat try{ // konstruise se objekat ulaznog toka za datoteku po imenu MojaDatoteka FileInputStream ulaz = new FileInputStream(“MojaDatoteka”).Primer: Objekat tipa MojaKlasa se iz datoteke mo`e u~itati na slede}i na~in: MojaKlasa obj. sa po~etkom i krajem. Kada se u Javi pomene kolekcija misli se na kolekciju referenci na objekte.util se nalazi skup klasa op{te namene. broj telefona . Mapa se ponekad naziva i re~nikom. ili se mo`e tra`iti objekat koji je identi~an zadatom objektu. pravite program za imenik i `elite da imate sve detalje o nekoj osobi (adresa. } Po{to metoda readObject() mo`e izazvati i izuzetke koji su potklasa klase IOException i izuzetak ClassNotFoundException. Pomenu}emo samo neke od njih. kao u nizu). klju~.

*. Primer: import java. i++) imena. ArrayList implentira niz objekata kome se mo`e menjati veli~ina i kome se mo`e pristupati i kao povezanoj listi. mo`e biti prili~no neefikasan. kao i u obi~nom nizu. Ako je Vector pun. Elementima vektora se mo`e pristupati i preko interfejsa iterator. 10). ali }e se kapacitet svaki put uve}avati za samo 10 elemenata. ali nije sinhronizovana. "Milan". LinkedList implementira povezanu. Klasa HashMap implementira mapu koja dozvoljava sme{tanje null objekata i dozvoljava da klju~ bude null (samo jedan. Vector transakcija = new Vector(). onda se prilikom dodavanja novog elementa pove}ava kapacitet. Radi isto kao klasa Vector. Objekti se sme{taju i vade iz kolekcije putem indeksa. Po{to sadr`i element tipa Object. "Nikola"}. odnosno ako je dostignut njegov kapacitet.size() .length . jer klju~evi moraju biti jedinstveni). Proces dupliranja kapaciteta. "Petar". kapacitet se duplira. Rad sa kolekcijom Vector Klasa Vector predstavlja kolekciju elemenata tipa Object. i<ime. Ovo zna~i da je nepotrebno zauzeto dosta memorije. "Lazar". ali mo`e da automatski raste i time se prilago|ava potrebnom kapacitetu. for(int i = 0 . String[] ime = { "Dragan". {to mo`e da uti~e na efikasnost programa. on }e realno imati prostor za 12800 objekata. ako se kapacitet {iri radi primanja novih ~lanova je 10. Ako na primer. To je i potencijalna opasnost da se unutra na|u klase razli~Itih tipova. Ovaj objekat ima inicijalni kapacitet od 100. U pitanju je slede}i konstruktor: Vector transakcija = new Vector(100. Svaki put kada se popuni. Vector je jedina klasa koja je sinhronizovana. ArrayList i LinkedList. i<imena. ulana~anu listu. Funkcioni{e sli~no kao niz. Ovo ne zna~i treba i}i u drugu krajnost i pove}avati kapacitet svaki put samo za 1. public class TryVector { public static void main(String[] args) { Vector imena = new Vector(). {to mo`e da dovede do problema prilikom rada sa takvim vektorima. "Novica". u Vector koji smo malopre definisali smestimo 7000 objekata. Podrazumevani konstruktor pravi prazan objekat klase Vector sa kapacitetom da se primi 10 objekata. for(int i = 0 . Objekti se sme{taju na linearan na~in Klasa Hashtable implementira mapu u kojoj klju~evi ne smeju biti null vrednosti. jer je proces pove}anja zahteva vreme. odnosno dobro radi kada joj se istovremeno pristupa iz vi{e niti.util. Ovo je tip kolekcije nazvan lista ili sekvenca. Kapacitet objekta Vector se mo`e eksplicitno da podesi prilikom kreiranja objekta. Podrazumevani rast objekta. i++) 70 . Klasa Vector implementira listu koja automatski pove}ava svoj kapacitet da bi se prihvatili novi elementi. u nju se mo`e sme{tati objekat bilo kojeg tipa.Klase koje se koriste za implementaciju povezanih listi i koje se najvi{e koriste su Vector. Ovaj vektor inicijalno ima kapacitet da primi 100 objekata. Klasa Vector ima ~etiri konstruktora. Vector transakcija = new Vector(100). ako se `eli dodavanje novog elementa. Ovo se mo`e izbe}i navo|enjem iznosa za koji Vector treba da se pove}a.add(ime[i]).

Referenca na iterator se dobija pozivom metode iterator. Ako navedete vrednost indeksa koja je negativna ili ve}a od veli~ini. Pomo}u ovog metoda mo`ete i}i unapred i unazad kroz vektor. Brisanje elemenata iz vektora 71 . Promenu elementa u vektoru je mogu}e uraditi preko metoda set(). klase Vector }ete promeniti na slede}i na~in: transakcije. Ovaj metod prihvata dva argumenta. transakcije. koja kao argument prihvata indeks pozizcije prvog elementa vektora. Postoji i verzija metode add() koja prima dva argumenta. ListIterator lt = imena. Argument ne sme biti negativan. Ovaj metod obi~no ima prednost u odnosu na metodu get() klase Vector. Tre}i element u objektu transakcija. Transakcija trans = (Transakcija) transakcije. Ovim se izvla~i peti element vektora. elementNovi). Ovde je neophodna eksplicitna konverzija. Metod vra}a referencu na objekat koji je prethodno bio na toj poziciji. Mogu}e je dobiti i ListIterator koji obuhvata samo deo vektora. Prvi argument je indeks koji ozna~ava poziciju. koji treba da se na|e u iteratoru. Tom prilikom se poziva druga verzija metode listIterator.get(4). Ovo se dodaje na kraj. Pristupanje elementima preko iteratora Elementima vektora se mo`e pristupati preko iteratora koji se mo`e dobiti iz klase Vector. koji se mo`e koristiti za prolaz kroz sve elemente vektora. Ovim se u vektor transakcija dodaje referenca na objekat element.System.listIterator(2). Ova metoda vra}a objekat Iterator. Vrednost indeksa mora biti manja ili jednaka veli~ini objekta klase Vector.add(2. ListIterator lt = imena. po~ev od 0. Mo`e se koristiti i objekat ListIterator. Izvla~enje objekata iz vektora Ako znate indeks elementa u vektoru.out. transakcije.set(2. Veli~ina objekta klase Vector se pri tome pove}ava za jedan. Prvi argument je indeks pozicije na koju se sme{ta objekat koji se zadaje kao drugi argument.iterator(). noviElement). Ovim se dobija ListIterator koji obuhvata elemente po~ev od elementa na poziciji 2. Prethodni iskaz u vektor transakcija ubacuje element elementNovi i to na tre}u poziciju. ~etvrti na petu itd. klase Vector. javlja se izuzetak ArrayIndexOutOfBoundsException. Objekat koji je pre toga bio na tre}oj poziciji se sada pomera na ~etvrtu. a drugi je objekat koji treba uvrstiti. mo`ete ga izvaditi preko metode get().get(i)). Svi objekti koji su pre toga bili u vektoru ostaju na svojim mestima. Iterator it = imena.add(element).listIterator(). Indeks se broji isto kao od niza. } } Sme{tanje objekata u vektor Objekti se u vektor sme{taju metodom add.println((String)imena.

72 . "Novica". Klasa Date Ova klasa ima dva konstruktora. } } Klase za datum i vreme U paketu java. "Milan". sa tastature. ali ga mo`ete i promeniti. To su: after (Date prethodni) . transakcije.util. Primer: import java. i<ime.Referencu na element koji se nalazi na odre|enoj poziciji u vektoru mo`ete da izbacite pomo}u metode remove().indexOf("Nikola").out.vra}a true ako je teku}i objekat datum koji je kasniji od onog koji je prosle|en argumentom prethodni). To su podrazumevani konstruktor. } int l = imena. i++) imena. klasa Calendar i klasa GregorianCalendar. Po{to se ovo meri u odnosu na odre|eni datum. "Nikola"}. Date() . Metoda vra}a referencu na objekat koji se uklanja. Pretra`ivanje vektora Indeks pozicije objekta koji se nalazi u vektoru se mo`e dobiti pomo}u metode indexOf(). "Petar". while(lt. Klasa GregorianCalendat ima metode za dobijanje dana. bez argumenata. public class TryVector { public static void main(String[] args) { Vector imena = new Vector().length . ListIterator lt = imena. Klasa Date ima i neke korisne metode za pore|enje datuma.indexOf(element).ovaj konstruktor pravi objekat na osnovu teku}eg vremena sa sata Va{eg ra~unara (sa ta~no{}u do milisekunde).next()).remove(3). "Lazar". String[] ime = { "Dragan". to je i to {to se dobija tako|e datum. To su klasa Date.util se nalaze klase koje omogu}avaju da radite sa datumom i vremenom. int pozicija = transakcije. Uklanja se element koji se nalazi na poziciji 3.pravi se objekat na osnovu vremena (u milisekundama) po~ev od 1 januara 1970 godine. sa ta~no{}u do milisekunde. ~iji se indeks tra`i. Ona kao argument prima indeks koji ozna~ava poziciju objekta. a tu jo{ neke korisne metode. U primeru koji sledi smo napisali program koji modelira skup ljudi u koji se mogu. Date (long time) . meseca i godine iz datuma. for(int i = 0 . u suprotnom vra}a false.listIterator().*. ali mereno od 1 januara 1970-e godine. dodavati nove osobe. Ovom metodu se kao argument prosle|uje referenca objekta. tako da Va{a klasa treba da ima odgovaraju}u implementaciju ove metode. i konstruktor sa jednim argumentom tipa long. Prilikom pretra`ivanja se koristi metoda equals().add(ime[i]). Objekat kalendara je uvek postavljen na odre|eni datum. Objekat klase Date defini{e odre|eni vremenski trenutak. System.hasNext()){ System.println(l).println((String)lt.out.

YEAR.out.MONTH)+1)). kao argument prihvata `eljeni format datuma.get(cl.println("Godina je " + cl. java. sa HTML strane) dobije datum u obliku stringa.add(cl. Ako se `eli format datuma u skladu sa odre|enom lokacijom. 14).get(cl. u suprotnom vra}a false. Iz ovog objekta mo`ete da dobijete teku}i datum pozivom metoda getTime(). ako `elite da datumu dodate 14 godina.YEAR)). 73 .SimpleDateFormat sdf = new java. treba da navedete negativan argument. od koje je mogu}e praviti instance. System. java. Za prethodno pode{en format datum.text. godini i sl.// godina Kalendar poseduje i korisne funkcije koje omogu}avaju sabiranje i oduzimanje datuma. postoji metoda setTime().out. GregorianCalendar cal = new GregorianCalendar(). cl.SimpleDateFormat("dd-MM-yyyy"). Podrazumevani konstruktor (bez argumenata) kreira novi kalendar i njegov datum postavlja na teku}i trenutak. od kojeg kasnije treba napraviti datum.SimpleDateFormat("dd-MM-yyyy"). Kako funkcija parse mo`e da proizvede izuzetak tipa ParseException.out.DAY_OF_MONTH)). mo`ete da upotrebite funkciju parse. Na primer.text.//mesec u godini System.get(cl. Ovim se datum {tampa u formatu dan-mesec-godina. U klasi GregorianCalendar postoje polja koja odgovaraju danima u nedelji.// dan u mesecu System.format(dt)).parse("03-05-2002"). GregorianCalendar cl = new GregorianCalendar(). dt2 = sdf. mo`ete da napi{ete: cl.text. ina~e }e kompajler da prijavi gre{ku. Ako `elite da iz stringa dobijete datum. Date sada = cal. ali i klasa GregorianCalendar. mo`emo da napi{emo: dt2 = sdf.SimpleDateFormat sdf = new java.out. Mo`e da se koristi apstraktna klasa Calendar.println("Dan u mesecu je " + cl.getTime(). to se ovaj izuzetak mora da uhvati. mesecima u godini. Ovo zna~i da }e oba objekta da vrate istu vrednost preko metoda getTime().setTime(dt2). Ako `elite da kalendar postavite na neki odre|eni datum. iz klase SimpleDateFormat. U klasi GregorianCalendar postoji vi{e konstruktora.text. koja kao argument prihvata objekat klase Date. Ovo je korisno kada se sa odnekud (na primer. Klase za kalendare Kalendar je klasa koja sadr`i razli~ite pomo}ne funkcije za manipulaciju datumima.vra}a true ako teku}i objekat i argument predstavljaju isti datum i vreme.before(Date kasniji) . ako teku}i objekat predstavlja datum koje je raniji od onog koji je prosle|en kao argument. equals(Object datum) . mo`e se koristiti klasa SimpleDateFormat koja se nalazi u paketu java. Dobi}e se novi datum.vra}a true. Jedan od konstrktora ove klase.println(sdf. Ako `elite da se vratite u pro{lost. danima u godini.println("MEsec u godini je " + (cl.text.parse("03-05-2002"). Formatiranje datuma Podrazumevana vrednost za ispisivanje datuma je u skladu sa vremenskom zonom koja je pode{ena na ra~unaru na kojem se radi. Svaki datum koji se kasnije prosledi metodi format iz ove klase se formatira prema tim pravilima. System.

GregorianCalendar cl = new GregorianCalendar().out.println(" novo vreme je = " + cl.*.get(cl.currentTimeMillis(). System. System.toString()). Klasa ima nekoliko konstruktora.toString()).println(" dt1 = " + dt1. na osnovu unapred zadatog delimitera.out.out.println("Dan u mesecu je " + cl. Klasa StringTokenizer Ova klasa omogu}ava da se zadati string podeli na tokene. -5).getTime()). 14).println(" dt2 = " + dt2.YEAR)). System. Delimiteri se ne vra}aju.DAY_OF_MONTH)).getTime()).out. }catch(Exception e){ System.text.MONTH.println(" izuzetak"). Date dt1 = new Date(vreme).println(sdf. } cl.out. Date dt2 = null.println(" novo vreme je = " + cl.// godina cl.toString()).println("Godina je " + cl.YEAR. ali se posebno zadaje delimiter.add(cl.MONTH.out. dt2 = cl. try{ dt2 = sdf.text. java.println(" novo vreme je = " + cl. String delim) 74 .out.getTime()). System. cl.cl. kao {to su blanko karakter.// mesec u godini System.parse("03-05-2002").util.println(" dt2 = " + dt2.toString()).out. System.get(cl.format(dt)). StringTokenizer(String s.out. Za kreiranje datuma se koristi klasa Date. System. Ovim ste se vratili u pro{lost za pet meseci.out. klasa GregorianCalendar. Primer: package proba.SimpleDateFormat("dd-MM-yyyy").SimpleDateFormat sdf = new java. StringTokenizer(String s) Ovaj konstruktor kreira StringTokenizer koji iz stringa s mo`e da vadi pojedine tokene.MONTH) + 1)).// dan u mesecu System.println("MEsec u godini je " + (cl. tabulator ili novi red. za formatiranje datuma klasa SimpleDateFormatter i za rad sa vi{e datuma. Date dt = new Date().add(cl.println(" dt = " + dt. Drugi konstruktor tako|e kreira tokenizer koji mo`e da razla`e string. public class Datumi { public static void main(String[] args) { long vreme = System. System.out.out. import java. System. System.setTime(dt2). Koriste se podrazumevani delimiteri.add(cl.getTime(). } } U primeru je pokazano kako se koriste klase koje smo u prethodnom tekstu pomenuli.get(cl. -5).

hasMoreTokens ()) System. while (stok2. Promenljiva stok2 predstavlja StringTokenizer koji tako|e vadi tokene iz stringa s.". System.out. Metoda countTokens() broji tokene u stringu. Na nju se ne treba previ{e oslanjati. "|"). Promenljiva stok3 predstavlja StringTokenizer koji vadi tokene iz stringa s.out. StringTokenizer stok1 = new StringTokenizer (s). onda se i delimiter vra}a kao deo tokena.nextToken ()).println ("\r\ncount3 = " + stok3. Tokom va|enja tokena se koristi i metod hasMoreTokens() koji vra}a true ako u stringu koji se ispituje postoji jo{ tokena.hasMoreTokens ()) System. ali se ovog puta kao delimiter koristi karakter |. System.println ("\r\ncount2 = " + stok2.|Druga recenica.out.out. Druga varijanta prima argument tipa String i ona se koristi ako u toku rada `elite da promenite karakter koji se koristi kao delimiter. StringTokenizer stok2 = new StringTokenizer (s.countTokens ()).println ("token = " + stok1.out. StringTokenizer stok3 = new StringTokenizer (s.println ("count1 = " + stok1.println ("token = " + stok2.countTokens ()). " |". kao u prethodnom primeru. Kao delimiteri se koriste blanko.countTokens ()). boolean returnDelimiter) Ako je vrednost argumenta returnDelimiter pode{ena na true. while (stok1.out. Tre}i konstruktor kreira tokenizer koji mo`e da razla`e zadati string. true). Tada se kao delimiter koristi onaj karakter koji je upotrebljen kod konstruktora. String delim. StringTokenizer stok2 = new StringTokenizer (s. Primer: public class Tokenizer { public static void main(String[] args) { String s = "Ovo je recenica koja treba da se tokenizuje. Va|enje tokena Va|enje tokena iz stringa se vr{i preko metoda nextToken(). ako ih vi{e nema. Jedna verzija nema argumente.nextToken ()). System.out. Ovaj metod ima dve verzije.countTokens ()).println ("count1 = " + stok1.Delimiter se ne vra}a kao deo tokena. StringTokenizer stok3 = new StringTokenizer (s.hasMoreTokens ()) System. Promenljiva stok1 ukazuje na StringTokenizer koji iz stringa s vadi tokene. String s = "Recenica koja se tokenizuje. ".nextToken ()). System. ali se zadaje jo{ jedan argument koji ukazuje na to da li se delimiter vra}a kao deo tokena koji se dobijaju iz stringa. true). StringTokenizer stok1 = new StringTokenizer (s). zadaje se delimiter. ali se vra}a i sam karakter koji je delimiter. novi red i sl. while (stok1.hasMoreTokens ()) 75 .nextToken ()). "|"). while (stok2. System. kao delimiter koristi karakter |.println ("\r\ncount2 = " + stok2. Tom prilikom se ne vra}a sam karakter.println ("token = " + stok1. " |".out. StringTokenizer (Strings.hasMoreTokens ()) System. | Ovo je jos jedna takva recenica.countTokens ()). Za rad je najbolje koristiti kombinaciju metoda hasMoreTokens() i nextToken(). ili false.out.println ("token = " + stok3. while (stok3.

println ("\r\ncount3 = " + stok3.System.out. } } 76 .nextToken ()).countTokens ()).out. System.println ("token = " + stok2. while (stok3.out.hasMoreTokens ()) System.nextToken ()).println ("token = " + stok3.

Sign up to vote on this title
UsefulNot useful