java materijal
TRANSCRIPT
-
8/14/2019 Java Materijal
1/76
1
Uvod
Raunar je sloen sistem koji se sastoji iz puno komponenata. Najvanija komponenta je centralna
procesorska jedinica. U pitanju je jedan ip iji je posao da izvrava programe.
Program je lista nedvosmislenih instrukcija koje raunar mehaniki izvrava. Raunar moe da
izvrava instrukcije koje su napisane u tzv. mainskom jeziku. Svaki tip raunara ima svoj mainski jezik i moe da direktno izvrava samo programe koji su pisani u tom jeziku. (Programe koji su
pisani u drugim jezicima moe da izvrava samo ako se prevedu u mainski jezik tog raunara.)
Mainski jezik se sastoji od vrlo jednostavnih isntrukcija koje CPU tog raunara moe direktno da
izvrava. Sa druge strane, skoro svi programi se piu u programskim jezicima vieg nivoa, kao to
su Java, Pascal ili C++. Program koji se napie u nekom od ovih jezika ne moe da se direktno
izvrava na nekom raunaru. On mora da se prvo prevede u mainski jezik. Ovo radi poseban
program, kompajler. Kompajler uzima program napisan u jeziku vieg nivoa i prevodi ga u izvrni
program u mainskom jeziku. Ako program treba da se izvri na nekom drugom raunaru, mora da
se prevede u taj drugi mainski jezik uz upotrebu drugog kompajlera, koji odgovara tom drugom
tipu raunara.
Postoji i alternativa za kompajliranje programa pisanog u jeziku vieg nivoa. Umesto da se koristi
kompajler koji odjednom prevodi program, moete da koristite interpreter, koji prevodi instrukciju
po instrukciju. Interpreter je program koji se ponaa slino kao CPU, odnosno postoje ciklusi
vaenja instrukcija i njihovog izvravanja. Interpreter radi u petlji koja stalno ita instrukcije iz
programa, odluuje da li je potrebno da se ona izvri i ako je potrebno obavlja odgovarajuu
komandu iz mainskog jezika.
Postoje interpreteri koji izvravaju jezike vieg nivoa. Na primer, programski jezik LISP radi preko
interpretera, a ne preko kompajlera.
Dizajneri Jave su odluili da koriste kombinaciju kompilacije i interpretacije. Programi koji su
pisani u Javi se kompajliraju u mainski jezik, ali je u pitanju mainski jezik za raunar koji nepostoji u stvarnosti. U pitanju je virtuelni raunar, poznat kao Java virtuelna maina. Mainski kod
za JVM se naziva bajtkod. Nema nijednog razloga zato Java bajtkod ne bi mogao da se koristi kao
mainski jezik za pravi raunar. Sun Microsystems su i napravili takav raunar, odnosno procesor.
Sa druge strane, jedna od najvanijih stvari u Javi je da se Java program moe da izvrava na bilo
kom raunaru. Sve to na tom raunaru treba da postoji je interpreter za Java bajtkod.
Za svaki raunar treba da postoji drugi Java bajtkod interpreter, ali kad raunar jednom ima taj
interpreter, on moe da izvrava bilo koji program pisan u Javi. Isti Java program se moe da izvri
na bilo kom raunaru koji ima takav interrpreter. Ovo je i jedna od najvanijih karakteristika Jave,
Isti program moe da se izvrava na razliitim raunarima.
-
8/14/2019 Java Materijal
2/76
2
Zato biste koristili Java bajtkod? Zato se ne bi distribuisao originalni Java program, koji bi se
kasnije kompajlirao u odgovarajui mainski jezik. Postoji vie razloga. Prvo, kompajler mora da
razume Javu, koja je sloeni jezik visokog nivoa. Sam kompajler je sloeni program. Interpreter za
bajtkod je sa druge strane prilino jednostavan program. Lako je napisati interpterer bajtkoda za
svaki tip raunara, nakon ega taj interpreter moe da izvri bilo koji Java program. Bilo bi mnogo
tee napisati Java kompajler za svaki tip raunara.
Jo jedan razlog je sigurnost. Puno Java programa se preuzimaju preko mree. Ne biste eleli dapreuzmete program koji e otetiti Va raunar. Interpreter bajtkoda se ponaa kao bafer izmeu
Vas i programa koji ste preuzeli. Vi u sutini pokreete interpreter, koji indirektno izvrava preuzeti
program. Interpreter moe da Vas zatiti 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 mainski jezik, realnog raunara. 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{logveka. 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 psapredstavlja 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 imetodima 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.
-
8/14/2019 Java Materijal
3/76
3
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!");
-
8/14/2019 Java Materijal
4/76
4
Klju~na re~ public u definiciji metoda main ozna~ava da tom metodu mo`e da se globalno pristupi.
Klju~na re~ static osigurava pristup ~ak i kada ne postoji objekat (instanca) klase ZdravoApp.
Klju~na re~ void ozna~ava da ovaj metod ne vra}a nikakvu vrednost.
System je standardna klasa koja podr`ava unos preko tastature i prikazivanje izlaza na ekranu. Ova
klasa se nalazi u paketu java.lang i mo`e joj se pristupiti samo preko imena klase, System.
Objekat out predstavlja standardni izlazni tok, u ovom slu~aju ekran monitora. Ovaj objekat je ~lanklase System. Ovaj metod je deklarisan kao static, {to zna~i da mu se mo`e pristupati i kada ne
postoji instanca klase System.
println je metod koji pripada objektu out i on {tampa tekst koji se nalazi u zagradama na ekran.
Program se kompajlira komandom:
javac ZdravoApp.java
a izvr{ava komandom
java ZdravoApp
Kada se program izvr{i na ekranu treba da se prika`e tekstZdravo
Komentari u kodu
Postoji nekoliko mogu}ih vrsta definisanja komentara. Jedan od na~ina je da se se upotrebe dve
kose crte //. Sve {to sledi iza ovih znakova, a nalazi se u istom redu, smatra se komentarom i to
kompajler zanemaruje prilikom prevo|enja.
// ovo je komentar u jednom redu
Alternativa je da se po~etak komentara ozna~i sa /*, a kraj komentara sa */. Sve {to se nalazi
izme|u po~etka i kraja komentara kompajler zanemaruje prilikom prevo|enja. Tekst komentara se na
ovaj na~in mo`e da pro{iri na vi{e redova.
/* ovo je komentar u
u vi{e redova
*/
Komentari koji slu`e za generisanje dokumentacije po~inju znacima /**, a zavr{avaju se kao i
obi~an komentar sa */. Ovakve komentare zatim ~ita poseban program, javadoc, koji od nje pravi
dokumentaciju sa hiperlinkovima. Sva dokumentacija koju nalazite na sajtovima vezanim za Java
kod, je napravljena na ovaj na~in. U okviru ove dokumentacije mogu se koristiti razli~ite HTML
oznake. Na primer:
@version - ozna~ava verziju programa
@author - ozna~ava autora itd.
Osnove jezika Java
Podaci i promenljive
Promenljiva je imenovani deo memorije koji se koristi za sme{tanje informacija u programu. Svaki
deo memorije kome ste dali ime mo`e da primi sa odre|eni tip podatka. Svaka promenljiva ima
svoje ime i tip. Preko imena pristupate podatku na koji ta promenljiva ukazuje. tip odre|uje {ta u toj
promenljivoj mo`e da se na|e i koje su peracije dozvoljene. Kada se jednom defini{e tip promenljive
u tom delu memorije mogu da se sme{taju samo podaci tog tipa (ceo broj, realan broj, niz karaktera,
objekat i sl.) Na osnovu zadatog tipa kompajler kasnije mo`e da proverava da ste toj promenljivoj
-
8/14/2019 Java Materijal
5/76
5
poku{ali da zadate neki drugi tip podatka. Ime i tip se promenljivoj zadaju preko deklaracije. Op{ti
oblik deklaracije je:
tip ime
Pored imena i tipa svaka promenljiva ima i svoj domen. Domen promenljive je deo koda u kome se
ta promenljiva mo`e da koristi. Domen se implicitno defini{e na osnovu mesta gde se nalazi
deklaracije promenljive.
Osnovni tipovi promenljivih
Celobrojne vrednosti
Postoje ~etiri tipa promenljivih koji se mogu koristiti za celobrojne vrednosti. Svaki od njih mo`e
da ima predznak, {to zna~i da mogu da sadr`e pozitivne i negativne brojeve. Ovi tipovi se razlikuju
po opsegu vrednosti koje mogu da se sme{taju. Evo koji su to tipovi:
byte - vrednosti mogu biti od -128 do +128 i u memoriji zauzimaju 1 bajt (8 bitova)
short - vrednosti mogu biti od -32768 do 32767 i u memoriji zauzimaju 2 bajta (16 bitova)
int - 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;
short brojac;
int br;
long najvecaVrednost;
U jednom iskazu se mo`e deklarisati i vi{e promenljivih:
int a, b;
Prilikom deklaracije se mo`e izvr{iti i inicijalizacija promenljive.
int a = 1;
Tipovi sa pokretnim zarezom
Slu`e za sme{tanje realnih brojeva. Postoje dva tipa, float i double.
float - vrednosti mogu biti od-3.4x1038 do 3.4x1038 i u memoriji zauzimaju 4 bajta. Vrednosti se
predstavljaju sa ta~no{}u od 7 cifara.
double - vrednosti mogu biti od -1.7x10308 do 1.7x10303 i u memoriji zauzimaju 8 bajtova.
Vrednosti se predstavljaju sa ta~no{}u od 17 cifara.
Primer:
float a = 1.5;
double b = 1.67;
Znakovne promenljive
Promenljiva tipa char zauzima u memoriji dva bajta. Vrednost ovakve promenljive je jedan
karakter, kao {to je A, * , x ili belina (blanko karakter). Vrednost mo`e biti i neki specijalnikarakter, kao {to je tabulator, ili neki od Unicode karaktera koji dolaze iz razli~itih jezika. Kada se
-
8/14/2019 Java Materijal
6/76
6
karakter unosi u program on se mora uokviriti jednostrukim navodnicima A, *. Navodnici nisu
deo vrednosti i ne sme{taju se u promenljivu. U pitanju je samo konvencija.
char c = a;
Promenljive tipa boolean
Promenljive ovog tipa mogu da imaju samo dve vrednosti: true (ta~no) i false (neta~no).boolean t = false;
boolean p = true;
Primer:public class MaxVariablesDemo {
public static void main(String args[]) {
// celi brojevi
byte najveciByte = Byte.MAX_VALUE;
short najveciShort = Short.MAX_VALUE;
int najveciInteger = Integer.MAX_VALUE;
long najveciLong = Long.MAX_VALUE;
// realni brojevi
float najveciFloat = Float.MAX_VALUE;
double najveciDouble = Double.MAX_VALUE;
// ostali pritimitivni tipovi
char c = 'S';
boolean b = true;
// prikazivanje
System.out.println("Najveca vrednost tipa byte je " + najveciByte);
System.out.println("Najveca vrednost tipa short je " + najveciShort);
System.out.println("Najveca vrednost tipa int je " + najveciInteger);System.out.println("Najveca vrednost tipa long je " + najveciLong);
System.out.println("Najveca vrednost tipa float je " + najveciFloat);
System.out.println("Najveca vrednost tipa double je " + najveciDouble);
if (Character.isUpperCase(c)) {
System.out.println("Karakter " + c + " je veliko slovo.");
} else {
System.out.println("Karakter " + c + " je malo slovo.");
}
System.out.println("Vrednost za promenljivu b je " + b);
}
}
Operatori i zrazi
Aritmeti~ki operatori
U tabeli koja sledi su prikazani tipovi i opis aritmeti~kih operatora:
Operator Upotreba Opis
+ op1 + op2 Sabira op1 i op2
- op1 - op2 Oduzima op2 od op1
-
8/14/2019 Java Materijal
7/76
7
* op1 * op2 Mno`i op1 sa op2
/ op1 / op2 Deli op1 sa op2
% op1 % op2 Ra~una ostatak deljenja op1 sa op2
Sledi primer AritmetikaDemo u kome se defini{u dve celobrojne promenljive i dva realna broja sadvostrukom precizno{}u i sa njima se obavljaju razli~ite aritmeti~ke operacije.
public class ArithmeticDemo {
public static void main(String[] args) {
//nekoliko brojeva
int i = 37;
int j = 42;
double x = 27.475;
double y = 7.22;
System.out.println("Vrednosti promenljivih su...");
System.out.println(" i = " + i);System.out.println(" j = " + j);
System.out.println(" x = " + x);
System.out.println(" y = " + y);
//sabiranje brojeva
System.out.println("Sabiranje...");
System.out.println(" i + j = " + (i + j));
System.out.println(" x + y = " + (x + y));
//oduzimanje brojeva
System.out.println("Oduzimanje...");
System.out.println(" i - j = " + (i - j));
System.out.println(" x - y = " + (x - y));
//Mno`enje brojeva
System.out.println("Mnozenje...");
System.out.println(" i * j = " + (i * j));
System.out.println(" x * y = " + (x * y));
//deljenje brojeva
System.out.println("Deljenje...");
System.out.println(" i / j = " + (i / j));
System.out.println(" x / y = " + (x / y));
//Deljenje po modulu
System.out.println("Deljenje po modulu...");
System.out.println(" i % j = " + (i % j));
System.out.println(" x % y = " + (x % y));
//mesanje tipova
System.out.println("Mesanje tipova...");
System.out.println(" j + y = " + (j + y));
System.out.println(" i * x = " + (i * x));
}
}
Izlaz iz ovog programa je:
Vrednosti promenljivih su...i = 37
j = 42
x = 27.475
-
8/14/2019 Java Materijal
8/76
8
y = 7.22
Sabiranje...
i + j = 79
x + y = 34.695
Oduzimanje...
i - j = -5
x - y = 20.255
Mnozenje...
i * j = 1554
x * y = 198.37
Deljenje...
i / j = 0
x / y = 3.8054
Deljenje po modulu...
i % j = 37
x % y = 5.815
Mesanje tipova...
j + y = 49.22
i * x = 1016.58
Kada se kao operandi u jednoj aritmeti~koj operaciji koriste zajedno ceo broj i realan broj, rezultat
je realan broj. Ceo broj se implicitno konvertuje u realan broj pre samog izra~unavanja. U tabelikoja sledi su prikazani tipovi podataka koji se vra}aju iz aritmeti~kih operacija, na osnovu tipova
operanada. Potrebne konverzije se vr{e pre {to se obavi operacija.
Tip podatka za
rezultatTipovi podataka za operande
longNijedan od operanada nije float ili double (artiemtika celih brojeva), a
najmanje jedan od operatora je tipa long.
int Nijedan od operanada nije float ili double (aritmetika celih brojeva).Nijedan operand nije long.
double Najmanje jedan operand je tipa double.
float Najmanje jedan operand je tipa float. Nijedan nije tipa double.
Postoje i dva operanda koji omogu}avaju skra}eno izra~unavanje. To su operator ++ koji operand
pove}ava za 1 i operator -- koji operand smanjuje za 1. Oba operatora mogu da se pojave ispred
operanda (prefiks) i iza operanda (postfiks). Kod verzije prefiks, ++op/--op se prvo operand
pove}ava za 1, pa se taj rezultat koristi dalje u izrazima. Kod verzije postfix se prvo operand
primeni u izrazu (stara vrednost), a tek posle se ta vrednost promeni.
public class Voce
{
public static void main(String[] args)
{
//deklaracija i inicijalizacija tri promenljive
int brojNarandzi = 5;
int brojJabuka = 10;
int brojVocaka = 0;
// povecava se broj narandzi i racuna zbir vocaka
brojVocaka = ++brojNarandzi + brojJabuka;
System.out.println(Ukupan broj vocaka u programu);System.out.println(Broj narandzi je + brojNarandzi);
System.out.println(Ukupan broj vocaka je + brojVocaka);
-
8/14/2019 Java Materijal
9/76
9
}
}
Ukupan broj vo}aka je sada 16. Razlog je {to se broj narand`i prvo pove}ao za 1, pa je taj broj u{ao
u sabiranje.
Ako se iskaz sabiranja promeni na:
brojVocaka = brojNarandzi++ + brojJabuka;
ukupni broj vo}aka je 15, po{to je u sabiranje u{la stara vrednost za broj narand`i, koja je tek
naknadno pove}ana.
Relacioni i uslovni operatori
Relacioni operator poredi dve vrednosti i odre|uje vrednost izme|u njih. Na primer, != vra}a ta~no
ako dva operanda nisu jednaki. U tabeli koja sledi su dati relacioni operatori:
Operator Upotreba Vra}a true(ta~no) ako je
> op1 > op2 op1 ve}e op2
>= op1 >= op2 op1 ve}e ili jednako od op2
i)); //true
System.out.println(" k > j = " + (k > j)); //false, oni su jednaki
//vece ili jednako
System.out.println("Vece ili jednako...");
System.out.println(" i >= j = " + (i >= j)); //false
System.out.println(" j >= i = " + (j >= i)); //true
System.out.println(" k >= j = " + (k >= j)); //true
//manje od
System.out.println("Manje od...");
System.out.println(" i < j = " + (i < j)); //true
System.out.println(" j < i = " + (j < i)); //false
System.out.println(" k < j = " + (k < j)); //false
-
8/14/2019 Java Materijal
10/76
10
//manje ili jednako
System.out.println("Manje ili jednako...");
System.out.println(" i
-
8/14/2019 Java Materijal
11/76
11
& op1 & op2i op1 i op2 imaju vrednost ta~no. Uvek se izra~unava i op1 i
op2.
| op1 | op2 Ili je op1 ili je op2 true (ta~no). Uvek se izra~Unava i op1 i op2.
^ op1 ^ op2ako su op1 i op2 razli~iti, odnosno ako jedan ima vrednost true,
ali ne oba.
Koja je razlika izme|u operatora && i &? Razlika je u brzini izvr{avanja programa. Sa operatorom
& se vrednost drugog operatora uvek izra~unava, dok se sa operatorom && izra~unava vrednost
prvog operanda, a ako je to dovoljno da se izra~una vrednost celog izraza, drugi operand se ne
izra~unava.
Operatori dodele
Osnovni operator dodele je operator =, kojim se jedna vrednost dodeljuje drugoj.
U Javi postoje i operatori dodele kojim se odjednom izvr{ava vi{e operacija. Pretpostavimo da
`elite da saberete vrednost promenljive sa nekim brojem i da rezultat dodelite istoj promenlivoj.Napisali biste:
i = i + 2;
Skra}eno se ovo mo`e napisati pomo}u operatora += na slede}i na~in:
i += 2;
Prethodna dva izraza su ekvivalentna.
U tabeli koja sledi su dati neki od operatora ovog tipa:
Operator Upotreba Ekvivalentno sa
+= op1 += op2 op1 = op1 + op2
-= op1 -= op2 op1 = op1 - op2
*= op1 *= op2 op1 = op1 * op2
/= op1 /= op2 op1 = op1 / op2
%= op1 %= op2 op1 = op1 % op2
&= op1 &= op2 op1 = op1 & op2
|= op1 |= op2 op1 = op1 | op2
^= op1 ^= op2 op1 = op1 ^ op2
Ostali operatori
U tabeli koja sledi su dati ostali operatori koji postoje u Javi.
Operator Opis
?: Skra}eni iskaz if-else
[]Koristi se za deklarisanje nizova, za kreiranje nizova, i za pristup elementima
niza.
-
8/14/2019 Java Materijal
12/76
12
. Koristi se za formiranje kvalifikovanih imena.
(params) Defini{e se lista parametara. Vrednosti se odvajaju zarezima.
(tip) Konvertuje se jedan tip u neki drugi.
new Kreira se novi objekat ili niz.
instanceof Odre|uje se da li je prvi operator instanca (primerak) drugog
Operator ?:
Ovaj operator vra}a op2, ako op1 ima vrednost true (ta~no) ili vrednost op3 ako op1 ima vredcnost
false (neta~no).
op1 ? op2 : op3
Pretpostavimo da imamo dve celobrojne promenljive tipa int, mojeGodine i tvojeGodine. @elimo
da tre}oj promenljivoj, stariji, dodelimo ve}u od ove dve vrednosti. Evo kako izgleda iskaz:
stariji = tvojeGodine > mojeGodine ? tvojeGodine : mojeGodine
Prvi argument ovog operatora je logi~ki izraz tvojeGodine > mojeGodine. Ako taj izraz ima
vrednost true (ta~no), promenljiva stariji dobija vrednost tvojeGodine, a ako je prvi izraz ocenjen
kao false (neta~no) promenljiva stariji dobija vrednost mojeGodine.
Operator []
Ovaj operator se koristi za deklarisanje nizova i za pristupanje elementima niza.
float [] realniNiz = new float[10];
Ovaj izraz deklari{e niz realnih brojeva sa deset elemenata. Sedmom ~lanu niza mo`ete da
pristupite na slede}i na~in:
realniNiz[6]
Operator .
Ovaj operator se koristi za pristup ~lanovima klase. Vi{e o njemu kada se bude govorilo o klasama.
Operator ()
Koristi se prilikom deklarisanja i poziva metoda klase. Vi{e o njemu kada se bude govorilo o
klasama.
Operator (tip)
Vrednost se konvertuje u odre|eni tip.
(double) a a se pretvara u tip double.
Operator new
Koristi se za kreiranje novog objekta ili niza.
Integer a = new Integer(10);
U ovom primeru se kreira novi objekat klase Integer.
Operator instanceof
Ovaj operator testira da li prvi operator predstavlja priemrak klase koja je data drugim operatorom.
-
8/14/2019 Java Materijal
13/76
13
op1 instanceof op2
op1 mora biti objekat, a op2 mora biti ime klase. Objekat je instanca klase ako je primrak ba{ te
klase ili neke klase koja je iz nje izvedena.
Prioritet operatora
Ako se u izrazu na|e vi{e operatora oni se izvr{avaju odre|enim redosledom. U tabeli koja sledi jedat prioritet operatora. Operatori sa najvi{im prioritetom su navedeni prvi, a zatim slede oni sa
ni`im prioritetom. Ako `elite da promenite prioritet operatora, treba da koristite zagrade.
postfiks operatori [] . (params) expr++ expr--
unarni operatori ++expr --expr +expr -expr ~ !
operatori kreiranja i kovenrzije new (type)expr
mno`enje * / %
sabiranje + -
pomeranje > >>>
relacioni < > = instanceof
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. Morate biti u stanju da izaberete izme|u
razli~itih mogu}nosti, na primer, Ako imam para na ra~unu kupi}u nov auto, a ako nemam kupi}u
mese~nu kartu za autobus.. Programski se dono{enje odluka realizuje pomo}u relacionih operatora
i odgovaraju}ih logi~kih izraza.
Iskaz if
Iskaz if je elementarni logi~ki izraz. Njegov najjednostavniji oblik je:
if (izraz)
iskaz;
Izraz mo`e biti bilo koji izraz koji daje vrednost true (ta~no) ili false (neta~no). Ako je vrednostizraza true, onda se izvr{ava iskaz koji sledi, u suprotnom ne.
Primer:
-
8/14/2019 Java Materijal
14/76
14
if(broj % 2 != 0) //proverava se da li je broj neparan
++broj; //ako je neparan, neka postane paran
Ovaj iskaz se mo`e napisati i na neki drugi na~in, ali se preporu~uje ovakva forma.
if(broj %2 != 0) ++broj; //ovako ne bi trebalo, mada je mogu}e
Ako je potrebno da se kao rezultat iskaza if izvr{i vi{e iskaza, a ne samo jedan kao u prethodnom
primeru, mogu se uporebiti viti~aste zagrade.
if(izraz){
iskaz1;
iskaz2;
}
Primer:
if(broj % 2 != 0){ //proverava se da li je broj neparan
++broj; //ako je neparan, neka postane paran
System.out.println(Broj je pretvoren u paran i njegova vrednost je sada + broj);}
Ako je izraz ocenjen kao ta~an, izvr{avaju se svi iskazi izme|u viti~astih zagrada, a ako nije, ne
izvr{ava se nijedan.
Klauzula else
Osnovni iskaz if mo`e da se pro{iri klauzulom else.
if(izraz)
iskaz1;
else
iskaz2;
Iskaz ili iskazi koji slede iza klauzule elese se izvr{avaju samo u slu~aju da izraz u klauzuli if nije
ta~an. Ako je potrebno da se u klauzuli else izvr{i vi{e iskaza tako|e se mogu uporebiti viti~aste
zagrade.
if(izraz){
iskaz1;
}else{
iskaz2;
}
Klauzula else if
Ukoliko prilikom dono{enja oluke postoji vi{e mogu}nosti, mo`e se upotrebiti klauzula else if.
if(izraz1)
iskaz1;
else if(izraz2)
iskaz2;
else if(izraz3)
iskaz3;
else
iskaz4;
-
8/14/2019 Java Materijal
15/76
15
Ako je vrednost izraza izraz1 ocenjena kao ta~na, izvr{ava se iskaz1. Ako izraz nema vrednost true,
proverava se vrednost izraza izraz2. Ako je njegova vrednost ta~na, izvr{ava se iskaz iskaz2. Posle
izvr{enja iskaza iskaz2 program se nastavlja kodom koji sledi iza celog iskaza if. Ako vrednost
izraza izraz2 nije true, proverava se vrednost izraza izraz3 itd. Ako nijedan od izraza u klauzulama
else if nije ocenjen kao ta~an (true), izvr{ava se iskaz (iskazi) iza klauzule else, ako ona postoji.
Primer:public class IfElseDemo {
public static void main(String[] args) {
int rezultatTesta = 76;
char ocena;
if (rezultatTesta >= 90) {
ocena = 'A';
} else if (rezultatTesta >= 80) {
ocena = 'B';
} else if (rezultatTesta >= 70) {
ocena = 'C';
} else if (rezultatTesta >= 60) {
ocena = 'D';} else {
ocena = 'F';
}
System.out.println("Ocena = " + ocena);
}
}
Izlaz iz programa je:
Ocena = C;
Kao {to vidite vrednost promenljive rezultatTesta mo`e da zadovolji vi{e od jednog uslova, jer je
76 >= 70, a tako|e je i rezultatTesta >= 60. Ocena je ipak C, zato {to se izvr{ava samo prvi blok
koda koji pripada izrazu rezultatTesta >= 70. Kada se izvr{i taj blok, kontrola programa prelazi na
kod iza iskaza if, u ovom slu~aju na iskaz System.out Izrazi koji slede iza izraza koji je bio
zadovoljen se ne proveravaju, a samim tim se i ne izvr{ava pripadaju}i kod.
Iskazi if mogu biti ugne`deni. U okviru jednog if iskaza mo`e da se na|e drugi, u okviru tog drugog,
tre}i itd. Evo kako to izgleda:
if(izraz1){
if(izraz1-1){
if(izraz1-1-1)
iskaz1-1-1;
}else iskaz1-1;
}
Iskaz switch
Ovaj iskaz se koristi za uslovno izvr{avanje iskaza na bazi vrednosti celobrojnog izraza. U primeru
koji sledi je upotrebljen iskaz switch koji na osnovu celobrojne vrednosti mesec {tampa ime
meseca, na koji promenljiva ukazuje.public class SwitchDemo {
public static void main(String[] args) {
int mesec = 8;
switch (mesec) {
case 1: System.out.println("Januar"); break;
case 2: System.out.println("Februar"); break;
-
8/14/2019 Java Materijal
16/76
-
8/14/2019 Java Materijal
17/76
17
}
System.out.println("Broj dana je " + brojDana);
}
}
Izlaz iz programa je:
Broj dana je 29
Ovaj program izra~unava broj dana u mesecu za zadatu godinu i mesec. Kao {to vidite svi mesecikoji imaju 31 dan su bez iskaza break, koji postoji samo kod poslednjeg u nizu. Isto va`i i za mesec
koji imaju 30 dana (i oni su grupisani i postoji samo jedan iskaz break).
Ako `elite da se neki iskazi izvr{e u slu~aju da nijedan od case iskaza nije zadovoljen, mo`ete da
upotrebite klauzulu default. Iskazi koji slede iza ove klauzule se izvr{avaju ako nijedan slu~aj
(case) nije zadovoljen. Evo kako izgleda prepravljen program iz prvog primera, sada sa dodatom
klauzulom default:public class SwitchDemo {
public static void main(String[] args) {
int mesec = 8;
switch (mesec) {case 1: System.out.println("Januar"); break;
case 2: System.out.println("Februar"); break;
case 3: System.out.println("Mart"); break;
case 4: System.out.println("April"); break;
case 5: System.out.println("Maj"); break;
case 6: System.out.println("Jun"); break;
case 7: System.out.println("Jul"); break;
case 8: System.out.println("Avgust"); break;
case 9: System.out.println("Septembar"); break;
case 10: System.out.println("Oktobar"); break;
case 11: System.out.println("Novembar"); break;
case 12: System.out.println("Decembar"); break;
default: System.out.println("Niste uneli ispravan broj za mesec");break;
}
}
}
Petlje
Petlje se koriste za izvr{avanje dela koda koji se ponavlja. U Javi postoje tri vrste petlji: while, do
while i for.
Petlja while
Ova petlja se koristi za ponovljeno izvr{avanje bloka iskaza sve dok je uslov ta~an. Evo kakoizgleda ta petlja:
while(izraz){
iskazi..
}
Prvo se izra~unava vrednost izraza. Ta vrednost mora biti tipa boolean. Ako je vrednost izraza true
(ta~no), izvr{avaju se iskazi koji pripadaju petlji. Posle izvr{avanja iskaza, ponovo se proverava
vrednost izraza, i ako je ta vrednost true, ponovo se izvr{avaju iskazi. Ovo se ponavlja sve dok je
vrednost izraza ocenjena kao ta~na (true).
U primeru koji sledi se pomo}u petlje while ide kroz string. Ovo se ponavlja sve dok se ne nai|e nakarakter g. Svaki karakter koji nije g se dodaje u objekat StringBuffer. Na kraju se rezultuju}i string
{tampa.public class WhileDemo {
-
8/14/2019 Java Materijal
18/76
-
8/14/2019 Java Materijal
19/76
19
program se nastavlja kodom koji sledi iza petlje. Izraz ozna~en sa izraz_petlje se izvr{ava na kraju
petlje. Obi~no se tu pove}ava ili smanjuje broja~ petlje za neku zadatu vrednost.
Primer:Public class ForPetlja{
public static void main (String[] args){
int limit = 20; // Trazi se suma od 1 do ove vrednosti
int sum = 0; // vrednost sume
for(int i = 1; i
-
8/14/2019 Java Materijal
20/76
20
Nizovi i stringovi
Niz je struktura podataka koja se sastoji od zadatog broja stavki, pri ~emu su sve stavke (elementi)
istog tipa. ^lanovi niza se u Javi uvek numeri{u po~ev od 0. Jedan niz, na primer, mo`e da sadr`i
100 celobrojnih vrednosti, koje su numerisane od 0 do 99. Niz se deklari{e na slede}i na~in:
int[] niz;
Ovo je deklaracija niza. U ovom trenutku niz jo{ uvek nema dodeljenu memoriju.
U trenutku kreiranja niza se defini{e njegova du`ina i dodeljuje se potrebna memorija. Nizovi u Javi
su objekti pa se u skladu sa time kreiraju pomo}u operatora new. Iskaz koji sledi zauzima dovoljno
memorije za niz od deset celobrojnih vrednosti i zatim taj niz dodeljuje promenljivoj niz, koju smo
ranije deklarisali.
niz = new int[10];
Pristup elementima niza
Elementima niza se pristupa preko imena niza, iza kojeg u uglastim zagradama sledi indeks
elementa, kome se pristupa. Na primer, iskazniz[4]
pristupa petom elementu niza.
Java proverava da li element niza kome pristupate postoji. Ako poku{ate da pristupite nepostoje}em
elementu niza javi}e se izuzetak tipa IndexOutOfBoundsException.
Veli~ina (du`ina) niza
Veli~inu niza }ete dobiti na slede}i na~in:
imeNiza.length
Sledi primer koji pokazuje kako se pristupa elementima niza i kako se odre|uje njegova veli~ina.for (int i = 0; i < niz.length; i++) {
niz[i] = i;
System.out.print(niz[i] + " ");
}
Inicijalizacija nizova
Elementima niza se mogu odmah u toku definisanja dodeliti vrednosti. Evo kako se to radi:
boolean[] answers = { true, false, true, true, false };
Veli~ina niza je u ovom slu~aju odre|ena brojem elemenata. Ako zadajete inicijalne vrednosti niza,
morate da ih zadate za sve elemente.U primeru koji sledi je pokazano kako se odre|uje element niza sa najve}om vredno{}u.
public class MaxNiz{
public static void main (String[] args){
double[] A = {2., 5., 3., 12.5, 5.3, 17.5};
double max = A[0];
for (int i = 1; i < A.length; i++) {
if (A[i] > max)
max = A[i];
}
System.out.println("Maksimum je " + max);}
}
-
8/14/2019 Java Materijal
21/76
21
Kopiranje niza
Kopiranje niza se vr{i tako {to se u novi niz kopira svaki novi element niza zasebno. Iskazi:
double [] A = {1.,4..6.};
double [] B = A;
ne dovode do kopiranja niza A u niz B. U ovom slu~aju je samo napravljena nova promenljiva B,
koja ukazuje na isti niz kao i promenljiva A. Ako se `eli kopiranje treba napisati:double[] B = new double[A.length]; //Pravi se novi niz, iste velicine kao
A
for (int i = 0; i < A.length; i++)
B[i] = A[i]; // Kopira se svaki element iz A u B.
Vi{edimenzionalni nizovi
Niz kao elemente mo`e da ima druge nizove.
Pretpostavimo da `elite da pratite vremenske prilike na 10 razli~Itih geografskih lokacija, tokom
jedne godine. Ho}ete da merite temperaturu na svakoj od ovih lokacija u toku svakog dana u godini.
Ovo mo`ete da ostvarite pomo}u niza od 10 elemenata, ~iji je svaki element drugi niz od 365
~lanova. Ovakav niz bi se deklarisao na slede}i na~in:
float [] [] temperatura = new float [10] [365];
Ovaj niz ima dve dimenzije, pa je zna~i u pitanju dvodimenzionalan niz. Prva dimenzija se kre}e od
0 do 9 i odnosi se na geografsku lokaciju, a druga se kre}e od 0 do 364 i odnosi se na temperature.
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. 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];
// generisanje temperature
for(int i = 0; i < temperatura.length; i++)
for(int j = 0; j < temperatura[i].length; j++)
temperatura [i][j] = (float) (45.0 * Math.random() - 10.0);
//izracunavanje prosecne vrednosti za temperaturu
for(int i = 0; i < temperatura.length; i++){
float prosek = 0.0f; // prosecna vrednost
for(int j = 0; j < temperatura[i].length; j++)
prosek += temperatura[i][j];
//prikaz prosecne temperature za trenutnu lokacijuSystem.out.println("Prosecna temperatura na lokaciji " + (i+1) + " je " +
prosek/(float) temperatura[i].length);
}
}
}
Nizovi nizova promenljive du`ine
Kada su elementi jednog niza drugi nizovi, oni ne moraju biti iste du`ine. Niz se mo`e deklarisati na
slede}i na~in:
float primer [] [];
Ovim se deklari{e niz primer tipa float. Broj elemenata u prvoj dimenziji se mo`e zadti izrazom:primer = new float [6] []; // definicija sest elemenata, od kojih je svaki niz
-
8/14/2019 Java Materijal
22/76
22
Sada imamo dodeljenih {est elemenata od kojih svaki mo`e da sadr`i jednodimenzionalni niz. Ti
nizovi se dalje mogu definisati pojedina~no:
primer[2] = new float [6];
primer[5] = new float[10];
Ukoliko bismo hteli da niz primer ima trougaoni oblik, odnosno da prvi element bude niz sa jednim
elementom, drugi niz sa dva elementa, tre}i niz sa tri elementa itd., mogli biste da napi{ete:for(int i = 0; i < primer.length; i++)
primer[i] = new float[i+1];
Niste ograni~eni na dve dimenzije. Niz mo`e da ima i vi{e dimenzija. Na primer niz sa tri dimenzije
se mo`e deklarisati na slede}i na~in:
int [] [] [] triDim= new int[3] [] []; // tri dvodimenzionalna niza
Svaki od ova tri elementa u prvoj dimenziji niza mo`e da sadr`i razli~it dvodimenzionalni niz, tako
da mo`ete da napi{ete:
triDim[0] = new int[4] [];triDim[1] = new int[2] [];
triDim[2] = new int[5] [];
Dalje bismo mogli da napi{emo:
triDim[0][1] = new int[3]; //itd
Nizovi karaktera
Nizovi koje smo dosada pominjali su bili numeri~ki nizovi. Mnogo ~e{}e od numeri~kih nizova
}ete koristiti nizove znakova (karaktera). Mo`ete na primer, da deklari{ete promenljivu niza tipa
char, sa 50 ~lanova:char[] poruka = new char[50];
Sa nizovima karaktera se obi~no ne radi preko ovakvih nizova. U Javi postoji posebna klasa koja se
koristi specijalno za rad sa karakterima. To je klasa String. U pitanju je standardna klasa koja dolazi
zajedno sa Javom.
String literali
Do sada smo ve} vi{e puta koristili String literale. Skoro svaki put kada smo koristili iskaz println,
kao argument smo koristili i string literal. String literal je bilo koja vrednost napisana izme|u
dvostrukih navodnika:
Ovo je string literal
Ovo je konstantan objekat klase String, koji kompajler pravi za upotrebu u programu. Ako u okviru
Stringa `elite da ubacite i neki specijalni karakter, kao {to je znak za novi red, ili tabulator morate
da koristite escape sekvencu. Iskaz
System.out.println(Ovo je \n String konstanta);
Dodaje novi red kod {tampanja.
Znak \n je oznaka za novi red. Ovaj kod daje slede}i izlaz:
Ovo je
String konstanta
-
8/14/2019 Java Materijal
23/76
23
Objekti tipa string
Promenljiva tipa String je u stvari objekat klase String. Ova promenljiva se deklari{e sli~no kao i
ostale promenljive osnovnih tipova. Ako je potrebno ova promenjiva se mo`e inicijalizovati odmah
prilikom deklaracije:
String mojString = Moj prvi string;
Promenljiva mojString sadr`i referencu na deo memorije u kome se ~uva sam string. Mo`ete danapi{ete:
mojString = Ovo je drugi string;
Promenljiva mojString sada ukazuje na drugi deo memorije, sa drugim stringom, a prvi se odbacuje.
Objekti klase String su nepromenljivi. Ako `elite da promenite sadr`aj stringa morate da odbacite
staru referencu i da napravite novu. O izbacivanju starog stringa brine sama Java preko skuplja~a
otpada. To je mehanizam koji objekte i promenljive koji vi{e nisu potrebni, posle izvesnog vremena
izbacuje iz memorije.
Promenljiva tipa string mo`e da se inicijalizuje i na null vrednost. Iskaz
String mojString = null;
deklari{e promenljivu mojString koja ne ukazuje ni na jedan string. Dobra programerska praksa je
da stringove kojima `elite da vrednost dodelite kasnije, uvek inicijalizujete na ovaj na~in.
Operacije nad stringovima
Spajanje stringova
Spajanje dva stringa se mo`e ostvariti putem operatora +.
mojString = Prvi string se spaja + sa drugim;
Operacijom spajanja stringova preko operatora + se pravi potpuno novi objekat tipa String koji jenezavisan od operanada. Na taj novi objekat ukazuje promenljiva mojString.
Za spajanje stringova mo`ete da upotrebite i operator +=:
String fraza = Spajanje je ;
fraza += moguce izvrsiti i ovako;
Ovim se ne menja string Spajanje je . String na koji promenljiva fraza ukazuje posle nakon
izvr{enja drugog iskaza je potpuno novi objekat.
Primer:public class StringProba {
public static void main(String[] args) {String prviString = "Puno ";
String drugiString = "ruku ";
String treciString = "olaksavaju posao";
String mojString; // promenljiva za smestaj rezultata
mojString = prviString + drugiString + treciString;
System.out.println(mojString);
// konverzija celih brojeva u string i spajanje sa dva stringa
int brojRuku = 99;
mojString = brojRuku + " " + drugiString + treciString;
System.out.println(mojString);
//kombinacija stringa i celih brojeva
mojString = "pedeset pet je " + 5 + 5;
System.out.println(mojString);
-
8/14/2019 Java Materijal
24/76
24
// kombinacija celih brojeva i stringa
mojString = 5 + 5 + " je deset";
System.out.println(mojString);
}
}
Prvo spajanje je jednostavno i spaja tri stringa. Tri promenljive prviString, drugiString i treciString
se spajaju i sme{taju u ~etvrtoj promenljivoj mojString.
Drugo spajanje stringova se odnosi na spajanje celog broja 99 i stringa . Ovde pre samog
spajanja dolazi do konverzije numeri~ke vrednosti brojRuku u String, nakon ~ega se to spaja sa
stringom . Razlog je u tome {to je operator + levo asocijativan, pa se parovi kod spajanja
uskla|uju sa leve strane. Ovo je bitno kod slede}a dva spajanja.
Iskazi izgledaju sli~no, ali u jednom slu~aju 5 + 5 daje 55, a u drugom 10.
Razlika je u tome da kod prvog iskaza prilikom sabiranja uvek postoji makar jedan operand tipa
string, tako da se uvek radi o spajanju stringova. U drugom iskazu je prva operacija matemati~ko
sabiranje, a rezultat se konvertuje u String da bi se omogu}ilo spajanje sa literalom je 10.
Pore|enje stringova
Osnovni tipovi se porede pomo}u operatora ==. Za objekte tipa String (ili bilo koje druge objekte)
ovo ne va`i. Iskaz
string1 == string2
}e proveriti da li ove dve promenljive ukazuju na isti string. Ako referenciraju (ukazuju) na
razli~Ite stringove, bez obzira na to da li je sadr`aj tih stringova identi~an, ovaj iskaz vra}a false
(neta~no). Drugim re~ima, ovaj iskaz ne poredi same stringove, ve} reference na stringove.
Primer:public class PoredjenjeStringova {
public static void main(String[] args) {
String string1 = "Suvise " ;
String string2 = "kolacica";
String string3 = "Suvise kolacica";
string1 += string2;
System.out.println("Test 1");
System.out.println("string3 je sada: " + string3);
System.out.println("string1 je sada: " + string1);
if(string1 == string3){
System.out.println("string1 == string3 je tacno " + "string1 i string3
referenciraju na isti string");}else{
System.out.println("string1 == string3 je netacno " + "string1 i string3
ne referenciraju isti string");
}
// sada string1 i string3 referenciraju na iste stringove
string3 = string1;
System.out.println("Test 2");
System.out.println("string3 je sada: " + string3);
System.out.println("string1 je sada: " + string1);
if(string1 == string3){
System.out.println("string1 == string3 je tacno " + "string1 i string3referenciraju na isti string");
}else{
-
8/14/2019 Java Materijal
25/76
25
System.out.println("string1 == string3 je netacno " + "string1 i string3
ne referenciraju isti string");
}
}
}
Na po~etku su definisane i inicijalizovane tri promenljive tipa String. Nakon iskaza dodele sadr`aj
promenljivih string1 i string3 }e biti identi~an, ali pore|enje po jednakosti ipak vra}a false, po{to
promenljive ukazuju na dva razli~ita stringa.
Nakon toga smo promenili promenljivu string3, tako da ukazuje na isti objekat kao i string1. U tom
slu~aju iskaz if se ocenjuje kao ta~an, po{to string1 i string3 ukazuju na isti objekat.
Ako `elite da uporedite dve promenljive tipa String i da utvrdite da li je njihov sadr`aj identi~an,
koristi}ete metod equal, klase String. Ovaj metod poredi stringove sa pravljenjem razlike izme|u
malih i velikih slova. Dva stringa su jednaka ako su iste du`ine, ako imaju isti broj znakova i ako je
svaki znak u jednom stringu identi~an odgovaraju}em znaku u drugom.
Ako ne `elite da se pravi razlika izme|u malih i velikih slova, mo`ete da koristite metod
equalIgnoreCase().
Primer:public class PoredjenjeStringova1 {
public static void main(String[] args) {
String string1 = "Suvise " ;
String string2 = "kolacica";
String string3 = "Suvise kolacica";
string1 += string2;
System.out.println("Test 1");
System.out.println("string3 je sada: " + string3);
System.out.println("string1 je sada: " + string1);
if(string1.equals(string3)){
System.out.println("string1.equals(string3) je tacno " + "string1 i
string3 su jednaki");
}else{
System.out.println("string1.equals(string3) je netacno " + "string1 i
string3 nisu jednaki");
}
// razlikuje se velicina slova
string3 = "SUVISE kolacica";
System.out.println("Test 2");
System.out.println("string3 je sada: " + string3);
System.out.println("string1 je sada: " + string1);
if(string1.equals(string3)){
System.out.println("string1.equals(string3) je tacno " + "string1 i
string3 su jednaki");
}else{
System.out.println("string1.equals(string3) je netacno " + "string1 i
string3 nisu jednaki");
}
if(string1.equalsIgnoreCase(string3)){// poredjenje uz zanemarivanje malih i
velikih slova
System.out.println("string1.equalsIgnoreCase(string3) je tacno " +
"string1 i string3 su jednaki, ali ako se ne pravi razlika izmedju malih i
velikih slova");}else{
System.out.println("string1equalsIgnoreCase(string3) je netacno " +
"string1 i string3 nisu jednaki");
-
8/14/2019 Java Materijal
26/76
26
}
}
}
Pre nego {to se pozabavimo primerom objasni}emo sintaksu koja je vezana za objekte.
U iskazu if smo pozvali metod equals(), objekta string1. To je ista sintaksa koju smo koristili i za
poziv metode println, objekta out. Sintaksa za pozivanje metoda nekog objekta je:
imeObjekta.imeMetoda(lista argumenata odvojenih zarezima)
Metod equals() zahteva jedan argument, tipa String. U pitanju je string koji se poredi sa originalnim
objektom. 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. Va`i i obrnuto:
string3.equals(string1)
pri ~emu se dobija isti rezultat.
Metod equalsIgnoreCase() poredi stringove, ali se pri tome zanemaruje 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.
Po~etak i kraj stringa
Metod startsWith() klase String omogu}ava proveru da li neki string po~inje odre|enom
kombinacijom znakova. Ako je
string1 = Suvise kolacica;
onda iskaz
string1.startsWith(Suv)
vra}a true. Prilikom pore|enja se vodi ra~una o malim i velikim slovima, tako da iskaz
string1.startsWith(sUV)
vra}a false.
Ako `elite da proverite da li se string zavr{ava nekom kombinacijom karaktera, koristi}ete metod
endsWith(), klase String. Iskaz
string1.endsWith(ica) vra}a true. I ovde se pravi razlika izme|u malih i velikih slova.
Pristup pojedinim znakovima u stringu
Vrlo ~esto se javlja potreba za pristupom odre|enom znaku ili znacima koji su deo stringa.
Odre|enom karakteru u stringu se pristupa preko celobrojnog indeksa, koji ozna~ava poziciju znaka
u stringu, ra~unaju}i od po~etka. Prvi znak u stringu je na poziciji 0, drugi na poziciji 1 itd. Po{to je String objekat, to se i karakterima koji ga ~ine pristupa preko odre|enog metoda. U pitanju je
metod charAt(). Ovaj metod prihvata argument koji predstavlja poziciju karaktera u stringu,
odnosno indeks. Ako poku{ate da upotrebite indeks koji je manji od 0 ili ve}i od du`ine niza, desi}e
se gre{ka u programu.
Da bi se izbegle gre{ke ovakvog tipa potrebno je poznavati du`inu stringa. U tu svrhu se koristi
metod length() objekta tipa String.
U primeru koji sledi je dat program koji analizira odre|eni tekst i odre|uje broj samoglasnika,
razmaka i slova koji ga ~ine.
Primer:public class KarakteriStringa {public static void main(String[] args) {
// string koji se analizira
-
8/14/2019 Java Materijal
27/76
27
String tekst = "Ovo je tekst koji sluzi za vezbu prilikom pristupanja
elementima stringa.";
int razmaci = 0, samoglasnici = 0, slova = 0;// broj razmaka, samoglasnika i
slova u tekstu
int duzinaTeksta = tekst.length();
for (int i = 0; i < duzinaTeksta; i++){
char ch = Character.toLowerCase(tekst.charAt(i));
// provera da li je samoglasnik
if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
samoglasnici++;
// provera da li je slovo
if(Character.isLetter(ch))
slova++;
// provera da li je razmak
if(Character.isWhitespace(ch))
razmaci++;
}
System.out.println("Tekst sadrzi: samoglasnika - " + samoglasnici + "\n" +
" suglasnika - " +(slova-samoglasnici) + "\n" +
" razmaka - " + razmaci);}
}
Metod charAt(i) se koristi za odre|ivanje znaka na i-oj poziciji u stringu. Karakter koji se dobija se
pretvara u malo slovo, radi lak{eg ispitivanja da li je u pitanju samoglasnik. Karakter se u pretvara
u malo slovo pomo}u metoda toLowerCase() klase Character. Ovo je klasa koja je u Javi unapred
definisana i slu`i za rad sa karakterima.
Kasnije se u kodu pomo}u metoda isLetter(), klase Character, proverava da li je u pitanju slovo i
pomo}u metoda isWhiteSpace() iste klase, da li je u pitanju razmak (blanko karakter).
Ako `elite da ceo string pretvorite u mala ili velika slova mo`ete uporebiti metode toLowerCase() i
toUpperCase(), klase String. U tom slu~aju se ceo string pretvara u tekst sa samo malim, odnosno
samo velikim slovima.String tekst = Ovo su me{ovita slova?;
String tekstMala = tekst.toLowerCase(); // ovo su samo mala slova
String testVelika = tekst.toUpperCase(); // 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(), koji pripadaju klasu String.int indeks = 0;
indeks = tekst.indexOf(a);
U prethodnom iskazu se pretra`uje sadr`aj stringa tekst i to po~ev{i od po~etka. Vra}a se pozicija
indeksa prvog karaktera a na koji se nai|e. Ako slovo a ne postoji u stringu, vrati}e se -1.
Oba pomenuta metoda vra}aju ili indeks pojavljivanja karaktera koji se tra`i ili -1, ako karakter nije
prona|en. 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.
Ako `elite da prona|ete poslednje pojavljivanje karaktera a u nizu tekst napisa}ete:indeks = tekst.lastIndexOf(a);
Ako `elite da prona|ete poziciju znaka koji nije ni na po~etku ni na kraju, mo`ete da koristite
varijaciju ovih metoda. U ovom slu~aju se metodima {alju dva argumenta. Pored karaktera koji se
tra`i, zadaje se i pozicija od koje treba da se tra`i.indeks = tekst.index(a, startIndeks);
-
8/14/2019 Java Materijal
28/76
28
Ovde se tra`i karakter koji je zadat kao prvi argument, ali po~ev od pozicije koja je zadata kao drugi
argument. U primeru koji sledi se pronalazi prvo pojavljivanje karaktera b, ali iza prvog
pojavljivanja karaktera a.int aIndeks = -1;
int bIndeks = -1;
aIndeks = tekstIndexOf(a);
if(aIndeks >= 0)
bIndeks = tekst.indexOf(b, ++aIndeks);
Ako napi{ete
indeks = tekst.lastIndexOf(b, aIndeks);
onda tra`ite poslednje pojavljivanje karaktera b u stringu tekst, ali po~ev od indeksa aIndeks.
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, a ne samo jedan karakter. U svemu ostalom ovi metodi
rade potpuno isto kao verzije koje smo pomenuli u prethodnom odeljku.
indeks = tekst.indexOf(ovo je);
U ovom slu~aju se vra}a pozicija prvog pojavljivanja podstringa ovo je u okviru stringa tekst.
U primeru koji sledi se pretra`uje zadati string u potrazi za svim pojavljivanjima zadatog
podstringa. Vra}a se broj pojavljivanja podstringa u okviru glavnog stringa.
Primer:public class PodstringoviStringa {
public static void main(String[] args) {
// string koji se analizira
String tekst = "Ovo je string koji sluzi za probu. " +
"U njemu treba proveriti koliko puta se pojavljuje kombinacija 'je'";
int brojac = 0;// broj pojavljivanjaint indeks = -1; // trenutna pozicija indeksa
String pod = "je";
// pretraga unapred po je
indeks = tekst.indexOf(pod);
while(indeks >= 0){
brojac++;
indeks += pod.length(); // prelaz na poziciju iza poslednjeg slova prvog
pojavljivanja podstringa
indeks = tekst.indexOf(pod, indeks);
}
System.out.println("Kombinacija je se u nizu pojavljuje " + brojac + "
puta");}
}
Preraditi program, tako da se pretra`ivanje vr{i unazad, pomo}u metoda lastIndexOf().
Izdvajanje podstringova iz zadatog stringa
U klasi String postoji metod substring() koji iz niza izdvaja zadati podstring. Postoje dve verzije
ovog metoda. Jedna iz zadatog stringa vadi podstring, po~ev od zadate pozicije, a kod druge treba
zadati po~etnu i krajnju poziciju.
String grad = Novi Sad;
String poslednjaRec = mesto.substring(5);
String poslednjaRec nakon izvr{enja ovog iskaza sadr`i tekst Sad. Brojanje indeksa po~inje od 0,
a u novom podstringu se nalazi i karakter sa te po~etne pozicije.
-
8/14/2019 Java Materijal
29/76
29
Druga verzija ovog metoda tra`i dva argumenta.
String segment = mesto.substring(3,6);
String segment posle izvr{enja ovog iskaza sadr`i tekst i S. Podstring se zavr{ava na jednoj
poziciji ispred indeksa koji je zadat kao kraj (6-1=5).
Za razliku od metoda indexOf() kod koje zadavanje indeksa koji je izvan dozvoljenog opsega vra}a
-1, kod metoda substring, zadavanje indeksa koji je van granica samog stringa, dovodi do pojavegre{ke.
U primeru koji sledi se pomo}u metoda indexOf() i substring() zadati tekst razdvaja na pojedine
re~i.
Primer:public class SubstringPrimer {
public static void main(String[] args) {
String tekst = "Ovo je string koji sluzi za probu. " +
"U njemu treba izdvojiti pojedine reci";
int count = 0;
char separator = ' ';
//odredjivanje broja podnizova
int indeks = 0;
do{
++count;
++indeks; // pomera se na mesto iza poslednje pozicije
indeks = tekst.indexOf(separator, indeks);
}while(indeks != -1);
//izdvajanje podnizova u niz
String[] subStr = new String[count];// dimenzija niza je prethodno
odre\ena
indeks = 0;int endIndeks = 0;
for(int i = 0; i < count; i++){
endIndeks = tekst.indexOf(separator, indeks);
if(endIndeks == -1) //ako ne postoji znak separator
subStr[i] = tekst.substring(indeks); // izdvaja se do kraja
else // ako postoji separator
subStr[i] = tekst.substring(indeks, endIndeks);
indeks = endIndeks + 1; // pocetak za sledeci ciklus
}
// prikaz podnizova, odnosno reci
for(int i = 0; i < subStr.length; i++){System.out.println(subStr[i]);
}
}
}
U prvom delu programa smo izbrojili broj reci u zadatom stringu i taj broj kasnije upotrebili za
definisanje niza. U drugom delu smo, pomo}u metoda substring, vadili iz stringa jednu po jednu
re~.
Objekti klase StringBuffer
Objekti klase String se ne mogu menjati. Ako se `eli da izvede spajanje stringova, da se postoje}i
string pro{iri ili skrati i sl., treba koristiti klasu StringBuffer. Ove operacije se mogu izvesti ipomo}u klase String, ali je zbog nepromenljivosti ovih objekata cena ve}a. Ve}a cena se ogleda u
sporijem radu i ve}em zauzimanju memorije.
-
8/14/2019 Java Materijal
30/76
30
Objekat klase StringBuffer se mo`e napraviti na slede}i na~in:
StringBuffer primer = new StringBuffer(String za inicijalizaciju);
Prethodni iskaz kreira objekat klase StringBuffer i inicijalizuje ga stringom String za
inicijalizaciju. Objekat StringBuffer se mora kreirati uz pomo} klju~ne re~i new. Mogu}e je
napisati i slede}e:
StringBuffer mojString = null;
mojString = new StringBuffer(Novi string);
Kapacitet objekata StringBuffer
Objekti klase String imaju dodeljeno onoliko memorije koliko je potrebno za sme{tanje karaktera
koji se nalaze u tom stringu. Memorija dodeljena ovom objektu se vi{e ne mo`e menjati. Za razliku
od ovog, memorija koju zauzima objekat klase StringBuffer se mo`e menjati.
Kada se objekat StringBuffer pravi na osnovu postoje}eg stringa, njegov kapacitet je za 16 ve}i
du`ine stringa. Kapacitet se ovde izra`ava u karakterima koji mogu da stanu u taj objekat.
Kapacitet objekta StringBuffer nije fiksan. Prilikom kreiranja ovog objekta mo`ete da eksplicitnozadate njegov kapacitet:
StringBuffer buf = new StringBuffer(50);
Ovaj objekat mo`e da uskladi{ti 50 znakova. Ako se prilikom deklaracije izostavi kapacitet, onda se
koristi podrazumevani kapacitet od 16 znakova. Ne treba brinuti o tome da li objekat StringBuffer
ima dovoljan kapacitet da primi va{ string, jer se njegov kapacitet automatski prilago|ava veli~ini
stringa koji u njega treba da se smesti.
Sa druge strane kapacitet objekta StringBuffer je bitan jer uti~e na upotrebu resursa koji se koriste
za skladi{tenje i modifikaciju stringova. Ako je po~etni kapacitet suvi{e mali i ako `elite da tu
ubacite neki ve}i string, onda mora da se zauzme dodatna memorija (da se pove}a kapacite objektaStringBuffer), {to se odra`ava na produ`eno vreme procesa. Efikasnije je, ako je mogu}e, da se
kapacitet objekta unapred podesi na dovoljnu vrednost, 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.StringBuffer buf = new StringBuffer(Novi bufer);
buf.append( ovo je dodatak);
U objektu se nakon ovog nalazi tekst Novi buffer ovo je dodatak. Metod append vra}a pro{ireni
objekat StringBuffer.
Postoje razli~ite varijacije metoda append, koje omogu}avaju da se u objekat dodaju i drugiosnovni tipovi. Na primer, iskaziStringBuffer buf = new StringBuffer(Proba );
buf.append(2.3);
u objekat buf dodaju tekst 2.3. Argument koji se prosle|uje metodu je tipa double, ali se on pre
dodavanja pretvara u string i kao takav se dodaje. Sli~ni metodi postoje i za ostale osnovne tipove
(int, char, boolean).
Po{to metod append vra}a isti objekat StringBuffer, to je mogu}e koristiti i slede}i iskaz:
buf.append(dodatak ).append(2.13).append( i ovo je dodatak);
Umetanje stringova u objekat klase StringBufferMetod append koji smo pomenuli se koristi za dodavanje sadr`aja na kraj bafera. Postoji mogu}nost
da se novi sadr`aj ubaci i negde u sredinu postoje}eg objekta klase StringBuffer. U tu svrhu se
-
8/14/2019 Java Materijal
31/76
31
koristi metod insert, klase StringBuffer. Na primer ako se u baferu buf, nalazi tekst Ovo je bafer i
ako izvr{ite iskaz
buf.insert(7, dodati );
onda se u baferu nalazi tekst Ovo je dodati bafer.
Drugi argument metoda insert mo`e biti i neki od osnovnih tipova, isto kao kod metoda append. I
ovde se prilikom upotrebe nekog od osnovnih tipova prvo vr{i konverzija tog podatka u string, a tekonda se taj podatak ubacuje u bafer.
Ostali metodi klase StringBuffer
Klasa StringBuffer ima metod charAt() koji radi na isti na~in kao i kod klase String, koji smo ve}
upoznali.
U klasi StringBuffer postoji i metod setCharAt(), kojim se menja znak na zadatoj poziciji u baferu.
Metod prima dva argumenta. Prvi je indeks karaktera koji treba zameniti, a drugi je novi karakter.
buf.setCharAt(3, z);
Prethodni iskaz menja ~etvrti karakter u baferu i na njegovo mesto stavlja slovo z.
Postoji i metod za okretanje bafera, odnosno stringa koji se u njemu nalazi. U pitanju je metod
reverse, koji preokre}e string, po~ev od poslednjeg prema prvom karakteru.
StringBuffer buf = new StringBuffer(provera);
buf.reverse();
Iskaz buf.reverse() vra}a bafer sa sadr`ajem arevorp.
Vrlo ~esto }e se za same operacije sa nekim stringom koristiti objekat StringBuffer, ali }e na kraju
biti potrebno da od sadr`aja tog bafera napravimo string. Mo`e biti u pitanju {tampanje ili neka
druga operacija koja tra`i objekat tipa string. Objekat StringBuffer (kao i svi drugi objekti u Javi)
sadr`i metod toString, koji vra}a sadr`aj tog bafera, ali sada kao objekat klase String.
StringBuffer buf = new StringBuffer(proba);
String izlazIzBafera = buf.toString();
-
8/14/2019 Java Materijal
32/76
-
8/14/2019 Java Materijal
33/76
33
svaka instanca te klase, odnosno svaka konkretna osoba bi imali svoje vrednosti za visinu, te`inu i
ostale sli~ne osobine.
Promenljive klase je pridru`ena klasi. Ovakve promenljive pripadaju svim instancama te klase.
U primeru koji sledi se deklari{e klasa Sfera, koja opisuje sferu.public class Sfera {
//promenljive klase
static final double PI=3.14;
static int brojac = 0; // promenljiva klase za brojanje objekata
//promenljive instance
double xCentar;
double yCentar;
double zCentar;
double radijus;
}
Klasa se u Javi defini{e preko klju~ne re~i class iza koje sledi ime klase. Sama definicija klase,
odnosno metodi i atributi, moraju biti u okviru zagrada koje slede iza imena klase. Klju~na re~
public na po~etku prethodnog primera ka`e da se ovoj klasi mo`e da pristupi bilo sa kog mesta uprogramu.
Kod koji se odnosi na konkretnu klasu treba da bude u datoteci sa istim imenom i ekstenzijom .java.
Konstanta PI je u prethodnom primeru promenljiva klase. Promenljive klase se deklari{u preko
klju~ne re~i static. Ako ne `elite da se vrednost neke promenljive kasnije u programu menja,
odnosno ako `elite da to kompajler proverava i zabranjuje, mo`ete tu promenljivu deklarisati sa
final, {to je i ura|eno u prethodnom primeru. To zna~i da svaki naredni iskaz koji bi poku{ao da
promeni vrednost za promenljivu PI, ne bi bio ispravan. Ovo bi trebalo koristiti za sve konstante
koje imate u programu.
Slede}a promenljiva je tako|e definisana kao promenljiva klase (static). Ovo je promenljiva koju}emo koristiti za brojanje koliko je instanci te klase napravljeno u programu. Svi objekti klase Sfera
}e imati samo jednu kopiju promenljivih PI i brojac.
Naredne ~etiri promenljive su promenljive instance. Svaka instanca te klase }e imati svoje primerke
promenljivih xCentar
Metodi klase
Promenljive klase opisuju stanje objekta, ali nisu dovoljne za funkcionisanje same klase. Mora
postojati neki na~in da se sa tom klasom ne{to i uradi, a to se ~ini preko metoda.
Metoda je blok koda koji ima svoje ime i koja se mo`e izvr{avati vi{e puta sa razli~itih mesta u
programu. Pomo}u metoda mo`ete da slo`ene stvari razlo`ite na zbir manjih, kojima je lak{erukovati. Metoda se poziva preko njenog imena i mo`e, ali ne mora da vrati vrednost. Osnovna
struktura metode je:
povratni_tip imeMetode(arg1, arg2, .. argn){
}
Za metodu se mo`e definisati povratni tip koji se vra}a posle njenog izvr{enja. Ako ne `elite da
metoda vra}a vrednost, onda njen povratni tip treba zadati kao void.
Metodi se mogu proslediti odre|eni argumenti, koji se u telu metode koriste za neka izra~unavanja.
Metoda mo`e, ali ne mora da ima argumente. Broj argumenata je proizvoljan.
Povratna vrednost iz metode
Povratna vrednost se iz metoda vra}a preko iskaza return. Na primer, iskaz
-
8/14/2019 Java Materijal
34/76
34
return povratnaVrednost;
vra}a vrednost promenljive povratnaVrednost.
Nakon izvr{enja iskaza return, program nastavlja sa radom tamo odakle je metoda pozvana. Metode
koje vra}aju vrednost moraju da u telu metode imaju iskaz return. U metodi mo`e da postoji vi{e
iskaza return, naravno ako to zahteva logika samog programa.
Klju~na re~ return mo`e da se upotrebi i sama, bez ikakve promenljive. Ovo se koristi u metodamakoje ne vra}aju vrednost.
Lista argumenata
Izme|u zagrada koje slede iza imena metode se nalazi lista argumenata. Svaki argument mora da
ima svoj tip. Ovo su vrednosti koje se metodi prosle|uju u trenutku njenog poziva i koje ona dalje
interno koristi.
public class mojaKlasa(){
public int mojaMetoda(int a, double b){
int c;
return c;}
}
Argumenti koji se prosle|uju metodi mogu imati neki od osnovnih tipova (int, float, double), ali
mogu biti i drugi objekti. Ako se radi o osnovnim tipovima, onda se argumenti prosle|uju po
vrednosti. To zna~i da se za promenljivu koja se prosle|uje metodi u trenutku poziva, pravi nova
kopija, sa kojom dalje ta metoda manipuli{e. To dalje zna~i da metoda ne mo`e da promeni
vrednost promenljive u programu koji je tu metodu pozvao.
Na primer, ako negde u kodu ka`eteint c = 3;
double d = 5.;
mojaMetoda(c, d);
onda {ta god radili sa argumentom a u samoj metodi, to ne mo`e da promeni vrednost promenljive c
u programu koji je tu metodu pozvao.
Ovo ne va`i za objekte koji se prosle|uju meetodama. Objekti se prosle|uju po referenci, tako da
metoda mo`e da promeni objekat, a to se vidi u u programu iz kojeg je metoda pozvana.
Kao {to postoje dve vrste promenljivih u klasi, tako postoje i dve vrste metoda. To su metode klase
(deklarisane preko klju~ne re~i static) i metode instance. 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;
}
}
Ovo je metoda klase. Za sve instance te klase, postoji samo jedan primerak ove metode, {to i jeste
cilj, jer ta metoda vra}a broj instanci klase koji je napravljen. U okviru metoda static ne mo`ete da
pristupate nijednoj od promenljivih instanci, jer ta metoda postoji dok jo{ nije napravljen nijedan
objekat, tako da ne mora da postoji nijedna promenljiva instance.
Pristupanje ~lanu (atributu) klase u metodi
U metodu instance mo`ete da pristupite bilo kom podatku koji je ~lan te klase. Pro{iri}emo maloklasu Sfera, tako {to }emo dodati metodu za izra~unavanje zapremine.public class Sfera {
//promenljive klase
-
8/14/2019 Java Materijal
35/76
35
static final double PI=3.14;
static int brojac = 0; // promenljiva klase za brojanje objekata
//promenljive instance
double xCentar;
double yCentar;
double zCentar;
double radijus;
// 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;
}
}
Metoda zapremina je metoda instance. Ona nema ulazne argumente, ali vra}a vrednost tipa double,
u ovom slu~aju zapreminu sfere. U metodu se za izra~unavanje zapremine koristi promenljiva
instance radijus.
Promenljiva this
Svaka metoda instance ima promenljivu this, koja se odnosi na trenutni objekat za koji je metoda
pozvana. Kompajler implicitno koristi ovu promenljivu kada se pristupa promenljivim instance te
klase. Na primer, iskaz za vra}anje zapremine u definiciji klase Sfera bi mogao da izgleda ovako:return 4.0/3.0 * PI * this.radijus* this.radijus* this.radijus;
Stvar je va{eg izbora da li }ete koristiti promenljivu this ili ne u svojim metodima.
Lokalne promenljive
Ako u samoj metodi zadate neke promenljive koje se koriste samo u njoj, te promenljive su lokalneza tu metodu. @ivotni vek tih promenljivih je `ivotni vek metode. Kada se napusti metoda te
promenljive prestaju da postoje. Skuplja~ otpada u Javi brine o tome da se oslobodi memorija koju
su te promenljive zauzimale.
Ako biste na primer, definisali funkciju za promenu radijusa sfere, ona bi mogla da izgelda ovako:void promenaRadijusa (double radijus){
this.radijus = radijus;
}
Promenljiva this.radijus ukazuje na promenljivu radijus u instanci, a promenljiva radijus na ulazni
parametar.
Inicijalizacija ~lanova klase
Prilikom definisanja ~lanova klase mo`e se izvr{iti i njihova inicijalizacija. Dobra programerska
praksa je da se sve promenljive prilikom deklaracije inicijalizuju.public class Sfera {
//promenljive klase
static final double PI=3.14;
static int brojac = 0; // promenljiva klase za brojanje objekata
//promenljive instance
double xCentar = 10.0;
double yCentar= 10.0 ;
double zCentar = 10.0;
double radijus = 5.0;
}
-
8/14/2019 Java Materijal
36/76
36
Ako je prilikom inicijalizacije potrebno izvr{iti odre|ena izra~unavanja mo`ete da koristite blok za
incijalizaciju. Blokovi za incijalizaciju se ozna~avaju viti~astim zagradama, izme|u kojih se
stavljaju iskazi koji treba da se izvr{e.
Postoje stati~ki i obi~an blok za incijalizaciju. Stati~ki blok za incijalizaciju se deklari{e klju~nom
re~i static ispred viti~astih zagrada. Ovakav blok se izvr{ava jednom, prilikom u~itavanja klase i u
njemu se obi~no inicijalizaciju stati~ki ~lanovi klase.
Nestati~ki blok za inicijalizaciju se izvr{ava jednom prilikom kreiranja svake instance klase i u
njemu mogu da se inicijalizuju promenljive instance.
Primer:public class ProbaInicijalizacije{
static int[] values = new int[10];
double fl;
// blok za incijalizaciju
static{
for(int i = 0; i < values.length; i++)
values[i] = i;
}
// nestaticki blok za inicijalizaciju{
fl = 28.0;
}
}
Konstruktori
U svakoj klasi postoji jedna ili vi{e specijalnih metoda, tzv. konstruktora. Ako prilikom definisanja
klase ne zadate nijedan konstruktor, kompajler }e sam napraviti jedan, prazan, podrazumevani
konstruktor. Osnovna namena konstruktora je da obezbedi sredstva za inicijalizaciju promenljivih
instanci. Konstruktor se izvr{ava prilikom kreiranja instance klase. Ako u klasi postoje blokovi za
incijalizaciju, oni se izvr{avaju pre konstruktora.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.
Primer:public class Sfera {
//promenljive klase
static final double PI=3.14;
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 objekatapublic static int getBrojac(){
return brojac;
}
-
8/14/2019 Java Materijal
37/76
37
// 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 daima 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 pozivkonstruktora. 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 napisaliSfera 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|ujuobjekti 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.javapublic class Sfera {
//promenljive klase
static final double PI=3.14;
-
8/14/2019 Java Materijal
38/76
38
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.
-
8/14/2019 Java Materijal
39/76
39
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 koristekada 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 konstruktorSfera(){
radijus = 1.0;
xCentar = 0.0;
yCentar = 0.0;
zCentar = 0.0;brojac++;
}
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);
-
8/14/2019 Java Materijal
40/76
-
8/14/2019 Java Materijal
41/76
41
}
// izracunavanje duzine linije
double length()
{
return start.distance(end); // 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, 0);
double num =
(this.end.y - this.start.y)*(this.start.x - Linija1.start.x) -
(this.end.x - this.start.x)*(this.start.y - Linija1.start.y);
double denom =
(this.end.y - this.start.y)*(Linija1.end.x - Linija1.start.x) -
(this.end.x - this.start.x)*(Linija1.end.y - Linija1.start.y);
lokalnaTacka.x = Linija1.start.x + (Linija1.end.x -
Linija1.start.x)*num/denom;
lokalnaTacka.y = Linija1.start.y + (Linija1.end.y -
Linija1.start.y)*num/denom;
return lokalnaTacka;
}
}
Klasa Geometrija (Geometrija.java):
public class Geometrija {
public static void main(String[] args)
{
// Kreiraju se dve tacke i prikazuju se
Tacka start = new Tacka(0.0, 1.0);
Tacka end = new Tacka(5.0, 6.0);
System.out.println("Napravljene su dve tacke " + start + " i " + end);
// Kreiraju se dve linije i prikazuju se
Linija Linija1 = new Linija(start, end);
Linija Linija2 = new Linija(0.0, 3.0, 3.0, 0.0);
System.out.println("Napravljene su dve linije " + Linija1 + " i " +
Linija2);
// Presek
System.out.println("Presek je " + Linija2.intersects(Linija1));
// Pomera se krajnja tacka linije 1 i prikazuje se novi presek
end.move(1.0, -5.0);
System.out.println("Novi presek je " + Linija1.intersects(Linija2));
}
}
-
8/14/2019 Java Materijal
42/76
42
U klasi Tacka postoje dva ~lana (x i y koordinata tacke). U ovom trenutku postoje dva konstruktora,
jedan koji tacku pravi na osnovu para koordinata i drugi koji pravi novi objekat Tacka, na osnovu
postoje}eg.
U klasi smo definisali i metodu toString(), koja preklapa metodu toString() nasle|enu iz klase
Object. Ako klasa ima ovu metodu, onda se u prilikom {tampanja pomo}u operatora + (spajanje
stringova) mo`e koristiti objekat ove klase.
U klasi Linija smo liniju definisali preko dva objekta klase Tacka, {to je i prirodno.
U metodu za izra~unavanje preseka, smo koristili parametarske jedna~ine du`i (x=x1 + (x2-x1)t i
y=y1+(y2-y1)s).
Rekurzija
Metode koji smo do sada koristili se pozivaju iz drugih metoda. Proces u kome metoda poziva samu
sebe se naziva rekurzijom. U rekurzivnom metodu mora da postoji i neka logika koja }e prekinuti
poziv metode, jer bi u suprotnom dobili beskona~ane pozive.
U primeru koji sledi je data rekurzivna metoda koja ra~una stepen zadate ceoblrojne vrednosti. To
zna~i da se ra~una xn.
public class Stepen {
public static void main(String[] args)
{
double x = 5.0;
System.out.println(x + " na 4 je " + power(x,4));
System.out.println("7.5 na 5 je " + power(7.5,5));
System.out.println("7.5 na 0 je " + power(7.5,0));
System.out.println("10 na -2 je " + power(10,-2));
}
// Dize se x na n-ti stepen
static double power(double x, int n){
if(n > 1)
return x*power(x, n-1); // rekurzivni poziv
else if(n < 0)
return 1.0/power(x, -n); // Negative power of x
else
return n == 0 ? 1.0 : x; // Ako je n 0 vraca se 1, u suprotnom se vraca
x
}
}
Ako je n pozitivan broj, ve}i od 1, metoda power poziva samu sebe, ali sa ulaznim parametrom
smanjenim za 1. Ovo se ponavlja sve dok stepen ne dobije vrednost 0, u kom slu~aju se prekida
rekurzija.
Rekurzivni metodi su veoma zahtevni po pitanju resursa i vremena. Zbog toga treba da se pozivaju
samo kada je to neophodno. Navedeni primer bi se mnogo lak{e realizovao putem petlje. Na taj
na~in bi se izvr{avao mnogo efikasnije. Rekurzije najvi{e primene imaju kod struktura podataka
kao {to je stablo ili liste.
Paketi
Sve klase u Javi su organizovane u pakete. Paketi u Javi su sli~ni direktorijumima (fasciklama) koji
se koriste za organizaciju podataka na disku. I klase koje smo do sada koristili se nalaze u paketima,
ali do sada na to nismo obra}ali pa`nju.
Sve standardne klase koje postoje u Javi su tako|e organizovane u pakete. Klase koje smo do sada
koristili (String, StringBuffer) se nalaze u paketu java.lang. Ovaj paket nije potrebno nazna~avati u
-
8/14/2019 Java Materijal
43/76
43
kodu, jer je on automatski dostupan u svim programima. Postoje i drugi standardni paketi, ali se oni
uglavnom moraju eksplicitno uklju~iti u kod.
Pakovanje klase se izvodi tako {to se u datoteku u kojoj se nalazi klasa na po~etku doda iskaz za
pakovanje. Ovaj iskaz mora biti prvi u toj datoteci.
package Proba;
public class Sfera
Prethodni iskaz ka`e da je klasa Sfera pripadnik paketa Proba. U jednom paketu mo`e biti vi{e
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. Ako se prilikom definicije klase ne navede klju~na re~ public, onda se
toj klasi mo`e pristupati samo iz metoda klasa koje se nalaze u istom paketu.
Paketi su povezani sa strukturom direktorijuma na kome se nalaze dato