You are on page 1of 45

Uvod u Java programiranje

Java je višenamenski programski jezik. Osnovne karakteristike Jave su:

 portabilnost,
 jednostavnost,
 objektna orijentacija,
 pouzdanost.

Java nije vezana za operativni sistem, relativno se lako uči, posebno za programere koji imaju prethodno
znanje iz C++. U svetu u kome dominiraju aplikacije, Java je na prvom mestu. Java je kreirana za eru
„Internet of things“ i samim tim će njen značaj sve više rasti.

Java je objektno orijentisan jezik što u suštini znači da razbija program n a


elemente, tj. Objekte.

Ti Objekti su kao pojedinačne lego kocke. To vama, kao programerima, čini život mnogo lakšim! Zašto?

Recimo da želite da dodate dugme u svoj program – treba samo da uzmete „lego kockicu” za dugme i
stavite je gde želite u svoj program. Ne morate znati kako je kockica napravljena, već je dovoljno da znate
šta radi i kako da je koristite.
Iako nije platformski zavisna, ipak postoje različite edicije i oblici njenog izvršavanja.

 Java SE (Standard Edition)


 Java EE (Enterprise Edition)
 Java ME (Micro Edition).
Ove edicije imaju istu osnovu, ali se razlikuju po tome što svaka ima dodatni specijalizovani set biblioteka
za određenu oblast.

Standard Edition se koristi za kreiranje različitih vrsta desktop aplikacija. Enterprise Edition je
namenjen kreiranju robusnih serverskih aplikacija. Micro Edition je namenjena proizvodnji aplikacija za
mobilne telefone i ostale ručne i pokretne uređaje.

Šta sve možemo napraviti pomoću Jave?


 Multiplatformske desktop aplikacije,
 web aplikacije,
 aplikacije za mobilne uređaje,
 RIA web aplikacije...
1
Istorijat Jave
 1991. godine James Gosling počinje rad na razvijanju programskog jezika OAK.
 Sledeće godine, Sun Microsystems predstavlja Star7, PDA uređaj sa TouchScreen-om i animiranim
grafičkim korisničkim okruženjem, na kojem OAK debituje.
 Oak, 1995. godine menja naziv u Java.

Sa „eksplozijom” WWW-a, Java izlazi u prvi plan, zato što je na Internetu bila potrebna portabilnost koju
je programski jezik Java omogućavao.

Java i drugi programski jezici


Java i C
Osnovna sintaksa Jave zaista liči na C ili C++, a svakako na C#, koji je nastao na osnovu Jave i C-a.
Još jedna mala sličnost sa programskim jezikom C je kompaktnost koda.

Ovde se prati dobra filozofija C-olikih jezika koja kaže: neka kod bude što manji i jednostavniji, kako bi
programer mogao da ga lako drži u glavi, bez konstantnog podsećanja. Poput programskog jezika C,
u Javi postoje opcije dodavanja eksternih paketa klasa.

Za sve programske jezike bitno je da obratite pažnju na tri najbitnije stavke:

 brzina,
 sigurnost,
 prenosivost.

Dok je programski jezik C, tj. C++ najbrži programski jezik, on svakako zaostaje u
pogledu sigurnosti.
Na polju prenosivosti je na zadovoljavajućem nivou. U odnosu na ovog ozbiljnog konkurenta, Java je
odlična na poljima sigurnosti i prenosivosti, a na istom nivou je i brzina. Dakle, Java je najbalansiraniji
programski jezik, po pitanju tri ključne performanse. To ne znači da je bolja od, na primer, C++. Svaki
programski jezik ima svoje prednosti.

Zašto je Java sporija od C-olikih jezika?


Zato što je Java interpretiran jezik, dok je C kompajliran jezik. Šta ovo znači?

To znači da se Javine klase:

 prvo moraju interpretirati, pa zatim


 kompajlirati,
tj. za izvršavanje Javinog koda je potrebno mnogo više vremena.

Ovo nije slučaj kod C-a, pošto se njegov kod izvršava direktno na sistemu. Zato se ovakvi jezici koriste
za tzv. „sistemsko programiranje”, a Java ne. Java je zastupljenija u implementaciji web servisa i
apsolutno dominira Internetom, s obzirom na njene prednosti u smislu prenosivosti i izgleda i
mogućnosti grafičkog korisničkog interfejsa.

Java nema veze sa JavaScript-om, iako oba jezika koriste sličnu sintaksu baziranu na C sintaksi .

2
Kako Java funkcioniše?

 Java program započinje kao izvorni kod.


 Fajl koji sadrži java izvorni kod ima ekstenziju .java.
 Kompajliranje izvornog koda obavlja Java kompajler (javac).
 Rezultat ovog kompajliranja je fajl sa ekstenzijom .class
 Sadržaj ovog fajla naziva se bytecode.
 JVM (Java virtual Machine) pretvara bytecode u mašinski jezik.

Izvršavanje bilo kog programa događa se uvek u jednom od dva oblika:

1. Interpretacija - prevođenje i izvršavanje koda u realnom vremenu.


2. Kompajliranje - kod će prvo biti preveden u izvorni jezik okruženja, a zatim startovan svaki put u
prevedenom obliku.

Java virtual Machine


Jedini preduslov da Java program funkcioniše u nekom okruženju je postojanje JVM (Java virtual
Machine).

Java virtualna Mašina predstavlja jednu vrstu softverskog procesora sa svojim


setom instrukcija.
Sastoji se od ogromnog broja biblioteka.

 JVM se može naći u sklopu JRE i JDK-a.


 JRE (Java Runtime Environment) izvršava programe napisane u Java jeziku.
 JDK je set alata za razvoj aplikacija i zahteva prisustvo JRE-a.
Kako sve to izgleda u praksi? Kako da napravite Java program i startujete ga? Pratite nas.

3
Instalacija
Da biste startovali Java program, na računaru morate imati Java virtualnu Mašinu (JVM). JVM može biti
instaliran zasebno ili u sklopu JRE i JDK paketa.

 JRE možete preuzeti sa adrese: https://www.java.com/en/download/


Ukoliko imate nameru da kreirate Java programe, a ne samo da ih koristite, najbolje je da na računaru
obezbedite JDK.

 JDK možete preuzeti sa Oracle-ovog sajta.


Iz liste distribucija, odabiramo, preuzimamo i instaliramo onu koja odgovara našem operativnom sistemu:
Instalacija JDK-a ne zahteva naročitu interakciju sa korisnikom, pa će se kompletna procedura instalacije
odigrati gotovo automatski. Nakon završene instalacije, na disku će se naći direktorijum Java sa dva
poddirektorijuma.

Posle prethodnih koraka, Java će biti instalirana na sistemu.

Instalacija okruženja za rad u Javi

Kao i za ostale programske jezike i za Javu postoji više okruženja za programiranje. Njihova razlika je
u ceni i opcijama. Neki su besplatni, a neki komercijalni.

NetBeans je veoma popularno Java okruženje sa velikom podrškom zajednice i veoma je lako naći
rešenje za problem nastao u ovom programu. Besplatan je i partner je Oracle kompanije koja
preporučuje njegovo korišćenje. U našem kursu, biće korišćen NetBeans program.

Možete ga preuzeti sa Oracle-ovog sajta gde smo skinuli i JDK a možete ga naći i na njihovom oficijelnom
sajtu: ovde.

Na slici ispod se vidi da postoji više verzija ovog programa, jer se NetBeans ne koristi samo za Javu, već i
za druge programske jezike. Za početak možete skinuti samo Java SE ili ukoliko želite, ceo paket.

4
Pokretanje Java projekta
NetBeans svaki Java program tretira kao jedan projekat.

Prilikom kreiranja projekta, NetBeans ima nekoliko pitanja za nas:

 Kako će se zvati projekat?


 Gde će se projekat nalaziti?
 Da li da bude krerana glavna klasa aplikacije i kako da se zove?
Okruženje zatim kreira fajl sa sadržajem (i nazivom) koji smo odredili u prethodnom koraku:

5
Sintaksa
Sintaksa bilo kog jezika predstavlja skup pravila koja korisnik jezika mora da ispoštuje kako bi ostali
korisnici tog jezika mogli da ga razumeju. Programski jezik Java, kao i većina drugih modernih jezika,
najveći deo sintaksepreuzima iz jezika C/C++.

Ljudi koji su kreirali Javu izabrali su C++ kao uzor, zato što je ovaj jezik predstavljao jedan od
najrasprostranjenijih u tom trenutku i na taj način su mnogim programerima olakšali učenje ovog jezika.

C++ i Java su sintaksno veoma slični.

Ipak, Java omogućava nešto veću slobodu u pisanju. Tačnije, ne obavezuje nas da se bavimo stvarima
koje nisu u kontekstu projekta, a moraju se ispoštovati da bi program funkcionisao, kao što je rukovanje
memorijom i slično.

Svaki program u Javi sastoji se od sledećih elemenata:

1. Linije
2. Blokovi
3. Komentari
4. Identifikatori.

Linije i blokovi
Linija predstavlja najmanji samostalni deo jednog programa. Svaki Java program sastoji se iz linija
koda.

Veličina nekog koda se meri u linijama (100 linija koda, 1245 linija koda, itd...).
Često pravilo programerske sintakseje da svaka linija koda mora biti završena oznakom ; (tačka-zarez).

Validna linija koda:


int x=1;

Nije validna linija:


int x=1

U posebnim slučajevima, oznaka ; se ne mora pojaviti na kraju linije.

Ti slučajevi su specifične naredbe za kontrolu toka ili petlje:


If(x==10)
System.out.println(“x je 10”);

Blokovi
Blokovi su delovi koda oivičeni vitičastim zagradama. Ovi delovi koda mogu i ne moraju imati sadržaj
(ali je druga varijanta besmislena).

6
Komentari
Komentar je tekst u programu koji služi za objašnjenje delova programa drugim programerima, ali
služi i kao podsetnik programeru koji taj program piše. Java prevodilac zanemaruje komentare i
potpuno ih preskače prilikom prevođenja programa.

Iako za Java prevodilac komentari kao da ne postoje, to ne znači da su nevažni. Bez komentara je vrlo
teško razumeti kako radi neki iole složeniji program. Zbog toga nikako nemojte olako shvatati pisanje
komentara u programu.

Komentari u kodu mogu se označiti na nekoliko načina:

Komentarisanje jedne linije koda (//)


// Moj komentar

Komentarisanje više linija (/* */)


/*
Ovo je komentar
u više linija
*/

Dokumentacioni komentari
/**
* dokumentacija
*/

Dokumentacioni komentari opisuju deklaracije koje za njima slede. Ovi se komentari u programerskim
okruženjima mogu izvući pomoću alatke koja ih koristi za pravljenje dokumentacije o klasama.

Komentari koda omogućavaju da u kodu nešto napišemo, ali da to ne bude


izvršeno niti tretirano kao deo programa.

Zašto bismo tako nešto uradili?


 Da bismo vodili beleške o delovima programa.
 Da bismo olakšali rad našim kolegama.
 Da bismo privremeno isključili/uključili neki deo koda.

7
Identifikatori
Programiranje se u suštini svodi na davanje i korišćenje imena. Zbog svoje važnosti u
programiranju, imena imaju poseban zvanični termin i često se nazivaju identifikatori.

Identifikatore u programu ne možete pisati proizvoljno, već postoje striktna pravila


kako se oni grade.
Mogu se sastojati od niza znakova, jednog ili više njih. Ovi znakovi moraju biti:

 slova,
 cifre ili
 donja crta ( _ ).
Pored toga, moraju početi slovom ili donjom crtom, nikako brojem. Takođe, Java je osetljiva na velika i
mala slova.

To znači da identifikator koji je napisan malim slovima, ne predstavlja isto što i identifikator
napisan velikim slovima:

class MajstorProgramiranja nije isto što i

class majstorprogramiranja

Pored osetljivosti na velika i mala slova, moramo takođe paziti da u identifikatore ne smeštamo:

1. prazne karaktere (space), kao ni


2. specijalne karaktere.
Radi bolje razumljivosti, Java programeri se za pisanje imena (identifikatora) pridržavaju
nekih neformalnih konvencija:

 imena klasa uvek počinju velikim slovom,


 imena promenljivih i metoda počinju malim slovom;
 imena konstanti se pišu sa svim velikim slovima;
 ako se ime sastoji od nekoliko reči, onda svaku novu reč u imenu pišemo velikim početnim
slovom: brojNajboljihUčenika

8
Promenljive
Promenljive su privremeni kontejneri u koijma se skladište neke vrednosti. Nakon što je vrednost
uskladištena u memoriju, ona biva reprezentovana kroz promenljivu.

Promenljive su dakle: smisleni nazivi za neke vrednosti u memoriji.

Šta se radi sa promenljivama?

Da bi neka promenljiva postojala, mora se kreirati. Proces kreiranja promenljive se naziva deklarisanje.

Sledećom linijom koda predstavljeno je deklarisanje jedne celobrojne promenljive:

Int promenljivaA;

Deklaracija se sastoji iz dva dela:

1. tip podataka koji će promenljiva predstavljati


2. naziv promenljive.

Iako pri samom imenovanju promenljivih ne moramo poštovati nikakva jezička pravila, poželjno je da
koristimo jednu od nekoliko notacija za pisanje. Jedna od najpopularnijih je Camel Case notacija, koja
podrazumeva veliko slovo na početku svake reči u promenljivoj, kao na primer:

imeMojePromenljive

Inicijalizacija promenljive predstavlja dodelu vrednosti.

Promenljive se mogu prvo deklarisati, a zatim inicijalizovati ili inicijalizovati prilikom deklaracije:

Int imeMojePromenljive;
imeMojePromenljive = 1;

Ili:

Int imeMojePromenljive = 1;

9
Prilikom imenovanja promenljivih postoji nekoliko pravila kojih se moramo držati:

 Promenljive ne smeju početi:


1. brojem,
2. ključnom rečju jezika u kome pišemo ili
3. specijalnim karakterom.
 Osetljive su na velika i mala slova.
 Promenljiva mora biti jedna reč.

Takođe, preporučuje se intuitivno imenovanje promenljivih. Ovu preporuku treba ozbiljno da shvatite
čak i prilikom konstrukcije najmanjih programa. jer se i ovakvi programi veoma brzo prošire, a pamćenje
informacija o promenljivama se lako otrgne kontroli.

Konstante
Promenljiva može sadržati promenljive vrednosti istog tipa tokom izvršavanja programa. U izvesnim
slučajevima, međutim, vrednost neke promenljive u programu ne treba da se menja nakon dodele
početne vrednosti.

U Javi se u naredbi deklaracije promenljive može dodati službena reč „final” kako bi se obezbedilo to da
se promenljiva ne može promeniti nakon što se inicijalizuje.

Na primer:
final int MAX_POENA = 100;

Svaki pokušaj promene vrednosti promenljive MAX_POENA proizvodi grešku. Ove „nepromenljive
promenljive” se nazivaju konstante, jer njihove vrednosti ostaju konstantne za sve vreme
izvršavanja programa.

Konvencija u Javi za pisanje konstanti je da se njihova imena pišu velikim slovima, a da


se rečiodvajaju donjom crtom.

Ovaj stil se koristi i u standardnim klasama Jave u kojima su definisane mnoge konstante. Tako, na
primer, u klasi „Math” se nalazi konstanta PI koja sadrži vrednost broja π ili u klasi „Integer” se nalazi
konstanta MIN_VALUE koja sadrži minimalnu vrednost tipa „int”.

10
Prosti i složeni tipovi podataka
Tipovi podataka spadaju u najosnovniije elemente jezika Java.
Slično većini savremenih programskih jezika i Java podržava više tipova podataka, koji se inače koriste
za deklarisanje promenljivih i za pravljenje nizova.

Java je strogo tipizirani jezik, jer za razliku od jezika C i C++ gde možete, na primer, vrednost u
pokretnom zarezu da dodelite celobrojnoj promenljivoj, u Javi to nije moguće. Promenljive koje se
deklarišu pod određenim tipom, ne mogu skladištiti vrednosti drugog tipa.

Podela tipova podataka


U većini jezika, tipovi podataka se dele na

 proste i
 složene.
Prosti tipovi podataka se još nazivaju i primitivni tipovi i tu spadaju:

1. byte
2. short
3. int
4. long
5. float
6. double
7. char
8. boolean.

Prosti (primitivni) tipovi podataka


Oni se mogu svrstati u četiri grupe:

 Celi brojevi - u ovu grupu spadaju: byte, short, int i long.


 Brojevi u pokretnom zarezu - double i float koji su namenjeni za realne vrednosti.
 Znakovi - ovde pripada samo tip char koji je namenjen simbolima u skupu znakova (na primer,
slovima i brojevima).
 Logičke vrednosti - ovde spada tip boolean, specijalni tip koji može sadržati samo dve vrednosti
tačno i netačno (true ili false).
Svaki od osam primitivnih tipova poseduje odgovarajuću klasu koja omogućava određene dodatne
mogućnosti nad primitivnim tipovima koje u protivnom ne bi bile moguće.

To su wrapper klase primitivnih tipova. Kako i samo ime kaže, o ovim klasama se može razmišljati kao
o određenom „omotaču” koji objedinjuje primitivne tipove i paket dodatnih funkcionalnostinad njima.

11
Rukovanje tekstualnim vrednostima

U programskom jeziku Java, za rukovanje tekstualnim vrednostima koristimo tip String. Mnogo je
zgodnije rukovati kompletnim rečima ili rečenicama, nego karakterima, pa iz tog razloga ovaj tip
podataka postoji u gotovo svakom programskom jeziku.

Za tip String kažemo i da je specijalni tip, pošto ima osobine prostog tipa, iako je zapravo objektni
tip. Ovo je jedini objektni tip koji se može kreirati kao i svaki drugi prosti tip. Ipak, ovaj tip, zbog svoje
objektne osobenosti, poseduje pregršt metoda i svojstava koja olakšavaju rad sa vrednostima ovog tipa.

String message = “Hello!!!”;


System.out.println(message);

Složeni (referentni) tipovi podataka


Složeni tipovi obično podrazumevaju više informacija na jednom mestu. Nazivaju se još i referentni
tipovi.

 Objekti;

 Klase;

 Interfejsi;

 Nizovi.

U Javi postoji oznaka null, koja predstavlja nedostatak vrednosti. Ona predstavlja referencu koja ne
pokazuje nijedan objekat.

String message = null;


System.out.println(message);

run:
null
BUILD SUCCSESSFUL (total time: 0 seconds)

12
Operatori u Javi
String s1 = “Hello “;
String s2 = “from string“;

System.out.println(s1 + s2);
run: “Hello from string“

Inkrement/Dekrement operatori
Inkrement i dekrement operatori omogućavaju povećanje, odnosno smanjivanje promenljive za
jedan. Ovaj operator se može pojaviti u jednom od dva oblika:
int x = 10;
x++; // dodavanje broja 1 na x
x--; // oduzimanje broja 1 na x

int x = 10;
++x; // dodavanje broja 1 na x
--x; // oduzimanje broja 1 na x

Oba slučaja imaju isti epilog kada je u pitanju promenljiva x, koja će biti povećana i smanjena za
jedan (što znači da će biti prvo 11, a zatim opet 10).

U sledeća dva primera, konačni epilog je uvek isti po x, ali je drugačiji po promenljivu y:
int x = 10;
int y = ++x;
System.out.println(x);
System.out.println(y);
run:
11
11
BUILD SUCCSESSFUL (total time: 0 seconds)

int x = 10;
int y = x++;
System.out.println(x);
System.out.println(y);

13
run:
11
10
BUILD SUCCSESSFUL (total time: 0 seconds)

U prvom slučaju, inkrement je izvršen pre dodele vrednosti, a u drugom nakon njene dodele.
Prethodno opisano ponašanje inkrementa i dekrementa može imati ozbiljne posledice po aplikaciju,
ukoliko na njih ne obratimo pažnju.

Na primer:
int a = 2,b = 3;
add(a,b++);
add(a,++b);

Rezultat će prvi put biti 5, a drugi put 7.

Dat je kod:
int a = 2, b = 3;
int res = a * (b++) + b;
int res1 = a * (++b) + b;

System.out.println(res);

System.out.println(res1);

Dva rezultata (res i res1) će se dramatično razlikovati nakon izvršenja koda. Pokušajte da pogodite koji će
rezultat biti u oba slučaja i zbog čega.

Operator negacije
Operator negacije se predstavlja oznakom !. Operator negacije negira izjavu koja sledi:

 !danas je lep dan (znači da danas nije lep dan)

 !ja ne volim Javu (znači ja volim Javu)

Operator negacije se najčešće koristi u saradnji sa boolean tipovima podataka.

3. Operatori poređenja
Ovi operatori služe za poređenje vrednosti operanda i kao rezultat koji daju
isključivo vrednost tipa boolean.
== Ovaj operator proverava da li je leva strana jednaka desnoj strani i vraća rezultat tipa boolean (true
ili false).

<, <=, >, >= Ove operatore koristimo da proverimo da li je neka vrednost veća od druge, ili veća ili
jednaka sa drugom.

14
4. Logički operatori
Logički operatori koriste se za spajanje više izraza kreiranih upotrebom operatora poređenja.

Prva dva operatora prikazana u tabeli su logički „i” i logički „ili” operatori.

Primer korišćenja AND (i) operatora:


int x = 5;
int y = 10;
boolean res = x<10 && x>5;
System.out.println(res);

res = x<10 || x>5;


System.out.println(res);

Kod logičkih operatora prepoznajemo jednu važnu osobenost – bočne efekte. Kod operatora „ili” (||),
ukoliko je prvi uslov ispunjen (x<10), drugi se ne proverava.

Kod operatora i (&&), ako prvi uslov nije ispunjen, drugi se neće proveravati. Ova pojava može dovesti
do neželjenih efekata po tok programa, ukoliko na nju ne obratimo pažnju.

Na primer, u sledećem programu bismo mogli očekivati da će na izlazu biti napisano: true i 11, jer x jeste
5 i y jeste 10.
int x = 5;
int y = 10;

boolean res = (x==5 || ++y==10);


System.out.println(res);
System.out.println(y);

Umesto očekivanog rezultata, biće ispisano: true i 10, jer program nikada nije stigao do
inkrementa promenljive y.

Da bismo stvorili jedan koliko-toliko funkcionalan program, u bilo kom jeziku, potrebni su nam, pored
promenljivih i operatori. Hajde da i njih savladamo pa da vaš napredak ide svojim tokom.

Klasifikacija operatora
Postoji generalna klasifikacija na:

1. Operatore dodeljivanja
2. Aritmetičke operatore
3. Operatore poređenja
4. Logičke operatore.
Postoji još nekoliko vrsta operatora (String operatori, Type operatori, inkrement-dekrementoperatori), ali
se oni generalno baziraju na pomenuta četiri osnovna operatora.

15
1. Operatori dodeljivanja
U Javi (a i u ostalim jezicima), postoji samo jedan operator dodeljivanja: = i sa njim smo se već upoznali
u prethodnim lekcijama. Operator = znači da će sve što se nalazi sa leve strane, dobiti vrednost onoga
što se nalazi sa desne strane:
int x = 10;
String poruka = “Zdravo iz Jave“;

2. Aritmetički operatori
Podrazumevaju:

 Sabiranje

 Oduzimanje

 Množenje

 Deljenje

 Modulo/moduo (celobrojni ostatak od deljenja), piše se znakom za procenat (%).


int modulo = 10 % 3;
System.out.println(modulo);

run:
1
BUILD SUCCSESSFUL (total time: 0 seconds)

Četiri operatora standardnih aritmetičkih operacija nije potrebno bliže objašnjavati. To su, kao u
matematici, operatori za:

 sabiranje,
 oduzimanje,
 množenje i
 deljenje.

Aritmetički operator +, pored toga što se koristi za sabiranje brojčanih vrednosti, ima još jednu funkciju.
Ova funkcija se ogleda u mogućnosti sabiranja tekstualnih vrednosti, što se
naziva nadovezivanje ili konkatenacija stringova.

Već smo rekli da tip podataka String ima specijalan tretman u Javi, pošto je zapravo objektni, ali se sa
njim može rukovati kao da je primitivni. Kada kažemo to, mislimo na primenu aritmetičkog operatora +
nad stringovima.

16
Uvod u objektno orijentisano programiranje
Sigurno ste nekada čuli za sintagmu objektno orijentisano programiranje, ali Vam možda nije jasno o
čemu se radi. Da bismo dobro objasnili, potrebno je da savladate još pojmova – objekti, klase, metode,
interfejs, paket… Sve to vas čeka u ovom nivou, ali da krenemo od početka. Kakav je to objektno
orijentisan jezik i pristup?

Java je objektno orijentisan jezik, stoga pisanje Java programa zahteva poznavanje osnovnih pojmova
objektno orijentisanog programiranja kao što su objekti i klase.

Objektno orijentisan pristup programiranju se zasniva na manipulisanju objektima.

To znači da se ostvarivanje programske logike postiže definisanjem klasa raznih


objekata i međusobnim dejstvom tih objekata. Iako nije prvi, ni jedini objektno orijentisani programski
jezik, Java predstavlja simbol objektno orijentisanog programiranja.

Primer
Savršen primer za objašnjenje OOP-a (Objektno orijentisanog programiranja) je škola: U odeljenju 8/1 u
učionici 1, učenik Perica radi zadatak iz matematike. U odeljenju 8/2 u učionici 2, učenik Jovica radi
zadatak iz fizike. Zadatke su u različitim odeljenjima i učionicama zadali profesor matematike Zoran i
profesor fizike Goran. Objekti su:

 Perica,
 Jovica,
 odeljenje 8/1,
 odeljenje 8/2,
 učionica 1,
 učionica 2,
 prof. Zoran,
 prof. Goran,
 matematika,
 fizika.
vidimo da profesori Zoran i Goran vode nastavni proces, da upoznaju učenike sa novim gradivom, zadaju
im zadatke i ocenjuju ih. Oni imaju i zajednička svojstva (ime, stručna sprema, predmet koji predaju...).

Pripadaju jednoj od klasa učesnika u školi, klasi Profesor. Po istom principu mogu da postoje i:

 klasa Učenik (Perica, Jovica, Mikica, Dragica),


 klasa Predmet (matematika, fizika, hemija, biologija),
 klasa Odeljenje (8-1, 8-2, 6-3, 5-1)....
Obratite pažnju na to da može postojati više objekata iste klase. Škola ima više odeljenja, učenika,
profesora... Slično tome, objektno orijentisani programi razlažu zadatke na više klasa i objekatakako bi
programi bili efikasniji i bolji.

Na taj način se programi mogu lakše menjati i poboljšavati.

17
Objekti i klase

Šta je objekat?
Objekat ili instanca je jedan primerak nečega, napravljen prema određenom uzorku (klasi). Svaka ptica
je jedan objekat (instanca) pomenute klase Ptica, dok je svaki čovek objekat klase Čovek.

Da li je ptica instanca klase Avion? Verovatno ne. Ali i ptica i avion mogu biti instanca klase: Leteći
objekat. Da li ste se malo zbunili? :) Samo polako i zabuna će nestati.

Šta je klasa?
Klasa predstavlja šablon po kome se proizvode objekti. Vrlo je važno da razumemo da se u Javi klase
definišu, a objekti se konstruišu na osnovu tih klasa.

Klase generalizuju entitete realnog sveta, dok objekti predstavljaju specifične


manifestacije ovih entiteta.
Polako ćemo to da savladamo i sve će biti jasno za dalje učenje. Evo jednog dobrog primera iz realnog
života.

Zamislite tehnički nacrt zgrade i zgradu koja je izgrađena po tom nacrtu. Tehnički nacrt zgrade
predstavlja klasu, a sama zgrada predstavlja objekat konstruisan na osnovu te klase. Pored toga, kao što
se po jednom nacrtu može izgraditi više zgrada, tako se i na osnovu jedne klase može konstruisati više
objekata te klase.

Kreiranje klase i objekata


Prvi korak u kreiranju klase i objekata je kreiranje klase. Iako je u nekim jezicima moguće kreirati objekat
bez prethodnog kreiranja klase, u Javi to nije moguće. Da bismo u Javi kreirali klasu, kreiramo novi
fajl (koji se zove kao i klasa koju hoćemo da kreiramo).

U Netbeansu već postoji šablon za kreiranje ovakvog fajla, pa treba samo da aktiviramo kontekstni meni
desnim klikom na odgovarajući paket, a zatim odaberemo opciju new -> Java Class ...

18
...zatim preimenujemo klasu i kliknemo na finish dugme. Tako smo kreirali novu klasu. Kod imenovanja
klasa poštujemo ista pravila kao i kod imenovanja promenljivih, pri čemu poštujemo pravilo da nazive
klasa pišemo početnim velikim slovom, a ukoliko naziv ima više reči, onda i svaki početak
reči takođe.

Na primer:

 class Person,
 class MojaKlasa,
 class NekaDrugaKlasa….
package javaapplication;
public class Person {

Prvom linijom definisan je paket u kome se nalazi klasa definisana u kodu ispod. Sledi definicija klase.
Pratite.

Zaglavlje:

 Public modifikator (public)


 Ključna reč class
 Naziv klase (Person).
Telo:

 Predstavljeno je vitičastim zagradama


 Trenutno je prazno.

19
Kada kreiramo klasu, možemo je koristiti za kreiranje objekata.
Person person = new Person();

Napisana linija znači: napravi jedan objekat po šablonu Person i smesti ga u promenljivu koja se
zove person. Klasa Person sadrži neke informacije. Tačnije, ona sadrži polja u koja možemo smestiti
informacije:

 ime,
 prezime,
 godište,
 visinu,
 težinu....
class Person {
String name;
String surname;
int age;
int height;
int weight;
}

Sledećim kodom bismo mogli instancirati jednu osobu po šablonu Person:


Person person = new Person();
person.name = “Pera”;
person.surname = “Perić”;
person.age = 15;
person.height = 165;
person.weight = 55;

Ako ovako nešto uradimo u kodu, ništa se neće dogoditi na izlazu, ali će program znati da postoji
promenljiva (objekat) sa nazivom Person, koja sadrži podatke koji karakterišu jednog čoveka.

20
Članovi klase (polja i metode)
Kako se dele članovi klase?
Članovi klase se dele na:

1. instancne i
2. statičke.
Članovi su:

 polja
 metode
 druge klase.

Modifikatori pristupa predstavljaju opseg dostupnosti određenih članova klase. Modifikatori pristupa su:

 Private – članovi su vidljivi samo u okviru klase u kojoj se nalaze.


 Package-private – svi drugi članovi istog paketa imaju pristup komponenti.
 Protected – elementima se može pristupiti iz same klase gde su definisani i iz izvedenih klasa.
 Public – bilo koji objekat ima pristup nad elementom.

Polja klase su zapravo promenljive koje se nalaze u okviru klase.

Na prethodnom primeru ne postoje modifikatori pristupa i zato su polja javna. Kada bismo
postavili privatni modifikator na neko od polja, ono ne bi bilo dostupno izvan klase:

21
Metode
Pored polja, među članovima klase nalaze se i metode. One nisu ništa drugo do funkcije koje se
nalaze unutar klasa.

Java je potpuno objektan jezik i funkcija kao pojam i ne postoji, već samo metoda. Metoda koja se
aktivira automatski prilikom instanciranja klase, zove se konstruktor. Konstruktor se zove isto kao i
klasa i nema povratni tip.

Pored konstruktora, još jedan veoma važan metod je main. Pokretanjem Java aplikacije, prvo što se
poziva je main metod. Ovaj metod već vrlo dobro poznajemo, jer bez njega nije moguće startovati Java
program (to ne znači da program mora imati ovaj metod).

Podsetimo se metoda main. Sada bi neke stvari trebalo da budu mnogo jasnije:

22
Jedna od ključnih osobina metoda je mogućnost prihvatanja i vraćanja parametara.

Parametri koji ulaze u metod, nazivaju se ulazni parametri a parametri koje metod
vraća se nazivaju izlazni parametri.
Prilikom kreiranja metode, moramo naznačiti koje će parametre vratiti, a koje će prihvatiti. Metodane
mora vratiti ništa, ne mora ni prihvatiti ništa, ali onog trenutka kada je kreiramo, u obavezi smo
da ispoštujemo njenu definiciju (potpis).

Za vraćanje vrednosti iz metode, koristimo ključnu reč return.


Jedan parametrizovan statički metod, može izgledati ovako:

Metodu kasnije možemo pozvati na sledeći način:

public static void main(String[] args) {


int res = add(2,3);
System.out.println(res);
}

Neretko, metod ne vraća nikakav rezultat. Kod ovakvih metoda moramo dati do znanja sistemu da metod
neće vraćati ništa, i to radimo ključnom rečju void.

23
Apstraktne klase
Apstraktne klase su šabloni za kreiranje drugih klasa.

Njihova osnovna osobina je da se ne mogu instancirati, već jedino naslediti ili koristiti u
statičkomkontekstu. Da bismo učinili klasu apstraktnom, dodajemo joj modifikator abstract.

To što klasa ne može biti instancirana, ne znači da ne može sadržati funkcionalnosti i polja.Svaka
klasa koja nasledi apstraktnu klasu može se normalno upotrebljavati i imaće na raspolaganju sve
elemente klase koju je nasledila.

Međutim, ukoliko je klasa koja nasleđuje apstraktnu klasu takođe apstraktna i za nju važe ista pravila.

package abstractclasses;
public abstract class Person {
public String firstName;
public String lastName;
public void show() {
System.out.println(firstName + " " + lastName);
}
}

Apstraktne metode
Nisu samo klase apstraktne, već i metode. Ako se prethodno znanje sleglo i sve Vam je jasno, onda
možemo nastaviti dalje. Da vidimo o čemu se radi.

Dakle, apstraktna klasa može sadržati apstraktne metode. Ovo su metode koje nemaju telo, već
sadrže samo potpis:
package abstractclasses;
public abstract class Person {
public String firstName;
public String lastName;
public abstract void show();
}

Čemu služi metod koji ne može da uradi ništa i koji u stvari ne


postoji?
Apstraktan metod predstavlja neku vrstu ugovora između apstraktne klase i klase koja jenasleđuje. On
garantuje da će klasa koja nasleđuje ispoštovati uslove za učešće u ostatku sistema.

24
Primer
Svaka benzinska pumpa ima isti sistem za ubacivanje goriva u automobil. Prilikom izgradnje pumpe,
kreator pumpe mora ispoštovati standarde. Krajnji cilj je taj, da kada se pumpa jednom nađe u sistemu,
vozači ne razmišljaju o tome da li će crevo odgovarati ulazu rezervoara.

Recimo da postoji šablon za kreiranje benzinskih stanica i da on zahteva metod fillCar:


package gasstation;
public abstract class BaseStation {
public abstract void fillCar ();
}

Ako bismo nasledili ovu klasu sopstvenom praznom klasom, Java bi odmah prijavila problem, jer nismo
ispoštovali ugovor/dogovor i nismo implementirali apstraktan metod fillCar:

Kada implementiramo fillCar, Java više ne pravi problem.

25
Interfejsi
Zanima vas šta je interfejs? Zvuči Vam poznato, ali ne znate pouzdano. Hajde da to jasno definišemo,
trebaće Vam to znanje.

Ponekad ćemo hteti da kreiramo samo apstraktnu klasu, koja će sadržati isključivo
apstraktne metode bez ostatka logike. To je dozvoljeno. Ipak, mnogo se češće u takvoj situaciji
kreira Interfejs.

Interfejs je ugovor kojim se obavezujemo da će se ispoštovati sve njegove stavke, pri čemu su
stavke ovog ugovora metode, odnosno njihova implementacija. Kreira se na isti način kao i klasa, u
zasebnom .java fajlu, poštuje se ista konvencija imenovanja.

Interfejs (treba da) sadrži samo metode. Iako postoji tehnička mogućnost pridruživanja polja interfejsima,
ona se ređe koristi.

package interfaces;
public interface Champion {
public void reciveHit();
public void primaryFire();
public void secondaryFire();
}

Interfejs pridružujemo klasi pomoću ključne reči implements.

Kada smo pridružili interfejs klasi, moramo implementirati sve njegove metode! Jedna od važnih razlika
između interfejsa i klasa je i to što jedna klasa može naslediti samo jednu roditeljsku klasu, ali može
implementirati neograničen broj intefejsa.

26
Paketi
Paketi su sistem za grupisanje sistemskih komponenti po srodnosti.
Pakete možemo tretirati kao „kutije“ u kojima se nalaze klase. Takođe, unutar kutija, mogu se nalaziti
i druge kutije. Jedna od ključnih osobina paketa je što omogućavaju istoimene klase unutar istog
projekta.

Paket se fizički, na fajl sistemu, realizuje kroz direktorijum, tako da kreiranjem novog direktorijuma
unutar aplikacije zapravo kreiramo novi paket. Da bismo u NetBeans-u kreirali novi paket, koristimo opciju
kontekstnog menija projekta:

New -> Java Package, a zatim unosimo željeni naziv paketa.


Sve što se kreira unutar jednog paketa, vidljivo je implicitno dok smo unutar tog paketa. Sve što se ne
nalazi u paketu, nije vidljivo bez tačne putanje. Da bi kod bio pregledniji i kraći, možemo da umesto
navođenja kompletne putanje svaki put, učitamo klasu ili kompletan paket ključnom rečju import.

Ako nameravamo da koristimo istoimene klase iz različitih paketa, tada ipak moramo
eksplicitno navesti putanju do željene klase.

Koje pakete razlikuje Java?


Java razlikuje:

 ugrađene i
 korisnički definisane pakete.
Ugrađeni paketi su oni koje dobijamo na raspolaganju instaliranjem Java Developer Kit-a. Korisnički
definisani su oni koje sami napravimo ili koje preuzmemo, a ne spadaju u sastavni deo jezika.

Svi ugrađeni paketi nalaze se u paketu Java (njegovi su podpaketi).


Kao Java developeri, trebalo bi da budemo upoznati sa većim delom ovih paketa i njihovih klasa.Paket
java.lang je podrazumevano dostupan svakoj Java aplikaciji i njega ne moramo eksplicitno učitavati
naredbom import.

27
Enkapsulacija

Stigli ste na pola puta. Kroz primere ćemo objasniti šta su enkapsulacija, nasleđivanje i polimorfizam, ali
ne u genetici, već u programiranju, mada ima nekih analogija. Da ne pričamo više, hajde da počnemo da
učimo!

Pojam enkapsulacije podrazumeva sakrivanje kompleksne logike neke


funkcionalnosti.
Za ovo je odličan primer automobil. Ono što mi, kao vozači, znamo, je da treba da okrenemo ključda
bismo aktivirali motor. Ali, ono što ceo proces aktivacije motora podrazumeva je mnogo
kompleksnije.

Ako postoji klasa Person i poseduje metodu run, tada najverovatnije nećemo hteti da znamo šta se u
toj metodi događa, već hoćemo samo da vidimo krajnji rezultat, a to je trčanje (run).

Person somePerson = new Person();


somePerson.run();

Metode i svojstva ugrađenih Java klasa upravo oslikavaju primer enkapsulacije. Mi u našim
programima koristimo ove metode i svojstva bez ikakvog znanja o načinu njihovog funkcionisanja.

28
Nasleđivanje

Jedna od prednosti objektno orijentisanog programiranja nad proceduralnim programiranjem je olakšana


višekratna upotreba postojećeg programskog koda. To je omogućeno primenom
koncepta nasleđivanja klasa čime se mogu definisati nove klase na osnovu postojećih klasa.

Nasleđivanje predstavlja osobinu klase da prihvati osobine neke druge klase, pri čemu:

 klasa, koja biva nasleđena, ima status roditeljske, dok


 klasa koja nasleđuje ima status deteta klase.

Sve klase u Javi imaju neku drugu klasu iznad, koja se može nazvati njihovim roditeljem.

Specijalna klasa, jedina koja nema svog roditelja, je klasa koja se zove Object.

Svi drugi objekti u Javi predstavljaju naslednike ovog tipa. Ukoliko klasa nema kreiranog roditelja, ona
kao svoju nadklasu ima klasu Object. Da bismo naglasili da klasa u Javi nasleđuje neku drugu klasu
koristimo ključnu reč extends.

29
Na sledećem primeru klasa Student nasleđuje klasu Person:
Package inheritance;
public class Person {
public String firstName;
public String lastName;

public Person (String firstName, String lastName) {

this.firstName = firstName;
this.lastName = lastName;
}
public void show() {
System.out.println(“Person: “ + firstName + “ “ + lastName);
}
}

package inheritance;
public class Student extends Person {
public String indexNumber;
public Student (String firstName, String lastName, String indexNumber) {
super (firstName, lastName);
this.indexNumber = indexNumber;
}
}

Klasa Student ima dve zanimljive komponente sa kojima se ranije nismo sreli:

1. this (ukazuje na aktuelni objekat),


2. super (ukazuje na roditelja).
Takođe, primećujemo da klasa nije nasledila konstruktor. Klasu Student možemo koristiti i bez znanja o
postojanju klase Person.

Ako ne želimo da dozvolimo dalje nasleđivanje klase, među njene modifikatore uključujemo i ključnu
reč final. Final kod definicije klase znači da ona ne može da se nasledi, dok kod definicije polja
znači da neće moći da mu bude dodeljena vrednost (konstanta).

30
Polimorfizam
Polimorfizam u OOP-u znači da će se istoimeni metod u jednoj klasi različito ponašati od istoimenog
metoda u drugoj klasi, pri čemu obe klase imaju različitog roditelja.

Na primer, ako bismo rekli da su Pas i Ptica podklase klase Životinja, te da obe imaju metod kreciSe,
ova dva metoda, iako se isto zovu, imala bi potpuno drugačiju realizaciju, jer ptica leti, a pas hoda.

Da bismo vršili polimorfovanje klase, moramo poznavati pojmove:

 prepisivanjai
 preopterećivanja (override i overload).

Prepisivanje je pojava u kojoj metoda roditeljske klase biva prepisana od strane


dete klase.

Na primer, kada bismo u klasi Student, dodali sledeći kod, mogli bismo da kažemo da je došlo
do prepisivanja:
@override
public void show() {
System.out.println(“Student: “ + firstName + “ “ + lastName);
}

Metod već postoji u klasi Person i biće prepisan:


public void show() {
System.out.println(“Person: “ + firstName + “ “ + lastName);
}

Iako smo prepisali roditeljski metod, to ne znači da je on bespovratno izgubljen, odnosno da je stvarno
prepisan. Ukoliko nam bude bio potreban, možemo doći do njega pomoću ključne rečisuper.

Jedan od najčešćih slučajeva prepisivanja je prepisivanje metode toString. Ako pokušamo da prikažemo
objekat klase Student na izlazu, dobićemo rezultat poput sledećeg:
System.out.println(student);
inheritance.Student@15db9742

To je zato što Java automatski poziva roditeljski toString metod (i to ne od klase Person, već od prve
roditeljske klase koja ima toString, a to je klasa Object).

Ako prepišemo metod toString u klasi Student:


@Override
public String toString() {
return “Hello from “ + firstName;
}
31
Na izlazu dobijamo kao rezultat: Hello from John.

Preopterećenje je kada unutar jedne klase napravimo više istoimenih metoda sa različitim potpisom:
@Override
public void show(){
System.out.println("Student: " + firstName + " " + lastName + " " + indexNumber);
super.show();
}
public void show(String firstName){
System.out.println(firstName);
}
public void show(String firstName, String lastName){
System.out.println(firstName + " " + lastName);
}

Jedini način da specificiramo koji ćemo metod pozvati, je da upotrebimo njegov potpis:
student.show();
student.show(“John”);
student.show(“John”,”Jackson”);

32
Uvod u kontrolu toka

Kontrola je sastavni deo svakog procesa:

 proizvodnog,
 organizacionog,
 upravljačkog,
pa zašto je ne bi bilo i u programiranju? Ovoga puta ćemo govoriti o kontroli toka programa.

Nijedan program ne bi imao smisla ukoliko ne bismo mogli da unutar njega


donosimo neke odluke.
Donošenje odluka u programu utiče na njegov tok, te se ovaj proces naziva kontrolom toka programa.
U osnovne načine kontrole toka jednog programa spadaju:

1. grananje i
2. petlje.
Eventualno, u kontrolu toka mogu biti svrstane i strukture za kontrolu izuzetaka (try/catch blokovi).

33
IF / ELSE struktura
Osnovni način za kontrolu toka je selekcija. Osnovni način za realizaciju selekcije u Javi je IF /
ELSE struktura.

Ova struktura funkcioniše tako što se na osnovu rezultata izraza, izvrši jedan ili drugi deo programa. Za
realizaciju koristimo naredbe IF i ELSE u kombinaciji sa vitičastim zagradama.
boolean hero_is_dead = true;
if (hero_is_dead) {

System.out.println(“Hero is dead. Reviving”);

hero_is_dead = false;

} else {

System.out.println(“Hero is not dead. Nothing to do.”);


}

Ternarni operator je skraćenica za IF / ELSE strukturu opisanu u prethodnom primeru. On uvek


prosleđuje jednu od dve vrednosti na levu stranu i to po principu:

Uslov ? "vrednost ukoliko je uslov tačan" : "vrednost ukoliko je uslov netačan"


Implementacija ternarnog operatora izgleda ovako:
System.out.println (

hero_is_dead ? ”Hero is dead. Reviving” : “Hero is not dead. Nothing to do.”


);

Šta bi se desilo ukoliko bi heroj mogao imati jedno od tri stanja:

1. full_health,
2. critical_health i
3. is_dead?
Recimo da su ta stanja označena brojevima 3, 2, 1 respektivno.
byte hero_state = 1;
if (hero_state == 1) {

System.out.println(“I am dead!”);
hero_state = 3;

34
System.out.println(“Alive again!”);

} else
if (hero_state==2) {
System.out.println(“I am in critical condition. Help me!”);

} else
if(hero_state==3) {
System.out.println(“I am at full health”);
}

U zavisnosti od toga u kom stanju je heroj kada evaluacija počne izvršiće se određeni uslovljeni
blok. Pošto je nama heroj state 1 (mrtav), izvršava se prvi blok i nakon toga program se nastavlja van IF
/ ELSE strukture.

Stoga će nam nakon startovanja ovog programa na izlazu pisati:

I am dead!

Alive again!

35
Switch / case struktura
Kada se vrši evaluacija jedne promenljive, IF / ELSE nije najbolje moguće rešenje. Mnogo češće, u ovu
svrhu koristimo switch / case konstrukciju.

Switch / case ne radi ništa što već ne možemo uraditi sa if / else, već samo obrađuje specifičnu
situaciju tretiranja jedne iste promenljive kroz više uslova. Ključni element switch / case strukture
su logično switch i case, ali takođe bitnu ulogu imaju i ključne reči (elementi) break i default.

videli smo evaluaciju promenljive hero_state kroz IF / ELSE strukturu, rešenje istog problema pomoću
switch / case strukture izgleda ovako:
byte hero_state = 1;
switch(hero_state) {
case 1:
System.out.println("I am dead!");
break;
case 2:
System.out.println("Alive again!");
break;
case 3:
System.out.println("I am at full health!");
break;
}

Kod switch / case postoje važne osobenosti koje se moraju znati:

 vitičaste zagrade nisu opcione, već su obavezne switch (hero_state): { }


 Switch može da radi sa celobrojnim vrednostima, karakterima i stringovima, ali ne i sa
decimalnim brojevima, niti sa kompleksnim tipovima.
 Break nije obavezan u strukturi, ali će, ukoliko ga nema automatski, biti izvršena i sledeća grana
uslova:
switch(hero_state) {
case 1:
System.out.println("I will be executed!");
case 2:
System.out.println("I will also be executed");
}

36
Uvod u petlje
Pošto smo se pozabavili grananjem, da vidimo šta su to petlje. Očekuje nas više petlji, pa hajde jednu po
jednu da objasnimo.

Petlje su sistemi u programima koji nam omogućavaju da jednu stvar uradimo više puta. Možemo ih
postići ugrađenim tehnologijama (for, while, foreach), a takođe i ručno, rekurzijom.

Ugrađene tehnologije za realizaciju petlje u Javi su:

 for (kada znamo koliko puta hoćemo da ponovimo kod)

 while (kada ne znamo koliko puta hoćemo da ponovimo kod)

 do while (kada ne znamo koliko puta hoćemo da izvršimo kod, ali moramo ga izvršiti bar jednom).

Svaki put kada dođe do izvršavanja bloka koda u petlji, kaže se da je izvršena iteracija petlje. Gde sve
možemo koristiti petlje? Kao i u slučaju if / else odnosno switch / case uslova, na ovo pitanje možemo
jednostavno odgovoriti: svuda!

Svi akteri na sceni se iscrtavaju pomoću for petlje:

37
For petlja
For petlja je osnovna petlja u gotovo svim programskim jezicima. Ona se
smatra simbolom petlji. For petlja se realizuje pomoću ključne reči for. Izvršava se sve dok
je određeni uslov ispunjen.

For petlja ima sledeću strukturu:


for(inicijalizacija; provera uslova; modifikacija) {
kod petlje (sve ono što će se izvršiti više puta)
}

For petlja se implementira na sledeći način:

Primećujemo da se struktura deli na dve logičke celine:

1. inicijalizaciju i
2. telo.
Za razliku od switch / case strukture, for petlja ne zahteva korišćenje blokova, pri čemu se kao i kod if /
else blokova, tada petlja odnosi samo na prvu sledeću liniju:

Inicijalni deo for petlje se:

 deli na tri celine odvojene oznakom ;


 u petlji se definiše ’’ i ’’ i ta promenljiva se odnosi samo na tu petlju
 nakon završetka petlje, promenljiva (i) nije vidljiva za spoljašnji svet.
Ako hoćemo da se u inicijalizaciji petlje tretira promenljiva koja je vidljiva i u svetu izvan petlje, treba da
je definišemo izvan petlje:
38
int i;
for (i=0; i<5; i++) {
System.out.println("i is" + i);
}

U petlji možemo kreirati bilo kakav kod, pa čak i samu petlju. Ovo kreiranje takozvane petlje u petlji,
naziva se gnežđenje petlje:
for (int i=0; i<5; i++) {
for (int j=0; j<10; j++) {
System.out.println(’’i is ’’ + i + ’’ and j ’’ + j);
}
}

Foreach petlja
Foreach petlja je varijacija for petlje, koja se koristi za rad sa iterabilnim objektima (nizovima i listama).

Foreach u Javi ne postoji kao zasebna komanda, već se realizuje kroz specijalan
oblik for petlje (enhanced for).

Primer foreach petlje:


int [] numbers = {1,5,2,3,7};
for (int val : numbers) {
System.out.println(val);
}

Da bismo razumeli pun potencijal foreach petlje, neophodno je da budemo upoznati sa nizovima, pa je
najbolje proučavati je nakon savladavanja nizova u nekoj od narednih lekcija.

39
While petlja
While petlja je karakteristična po tome što je koristimo obično kada ne znamo koliko puta treba da se
izvrši kod unutar nje. While petlja nema sistem inicijalizacije kontrolnih promenljivih, niti manipulacije
njima. Ona jednostavno startuje neki kod sve dok je određeni uslov ispunjen.

Ovo je opasna osobina, jer vrlo lako može dovesti do mrtve petlje.
Ali sa druge strane, while vrlo često upravo i koristimo kako bismo ostvarili mrtvu petlju.

While petlja ima veoma širok dijapazon upotrebe. Sva grafička okruženja koja rade u realnom vremenu,
sadrže po jednu ovakvu petlju (Igre).

Takođe, while petlju u pozadini imaju i serveri, programi za striming (video, audio)...

Struktura while petlje se sastoji od:

 ključne reči while,


 uslova u malim zagradama i
 uslovljenog koda:
while(condition) {
conditional code
}

Kao i kod for petlje i if / else strukture, vitičaste zagrade nisu obavezne:
while (condition)
conditional code

While petlju moramo kontrolisati ručno. Sami moramo kreirati kontrolnu


promenljivu imanipulaciju tom promenljivom tokom izvršavanja petlje:
int number = 5;
while (number >= 2) {
System.out.println(number);
number--;
}

Ovde treba da budete vrlo pažljivi, jer je veoma lako izgubiti kontrolu nad petljom!

40
Do-while petlja
Do-while je samo varijacija while petlje. Ona garantuje da će se telo petlje izvršiti bar jednom. Struktura
do while petlje je slična strukturi while petlje:
do {
code block
} while (condition);

Sledeći kod zbog neispunjenja uslova, ignoriše telo while petlje:


int number = 5;
while (number > 5) {
System.out.println(“Number is bigger then 5”);
}

U sledećem kodu poruka će biti prikazana, jer je prvo došlo do aktivacije tela, a tek onda doprovere
uslova:
do {
System.out.println(“Number is bigger then 5”);
} while(number>5);

Kada ručno kontrolišemo petlju, postoje dve stvari koje ćemo hteti da uradimo:

1. da preskočimo iteraciju i
2. da prekinemo kompletnu petlju.

Druga stavka ima i varijaciju – napuštanje spoljašnje petlje. U ovu svrhu, koriste se dve ključne reči:

 break i
 continue.

Break momentalno napušta petlju prekidajući izvršavanje tela, a continue momentalno prelazi na
sledeću iteraciju petlje i prekida izvršavanje tela u aktuelnoj iteraciji.

41
Sledeći primer prekida while petlju onog trenutka kad promenljiva number dobije vrednost 3:
int number = 0;
while (number < 5) {
if(number == 3) {
break;
}
System.out.println(number);
number++;
}

U trenutku kad program naiđe na ključnu reč continue unutar while petlje, prekinuće
izvršavanje tog bloka i preći na sledeću iteraciju.
int number = 0;
while (number < 5) {
if(number == 3) {
number++;
continue;
}
System.out.println(number);
number++;
}

42
Nizovi
Svi programski jezici znaju za nizove, pa tako i Java. U kombinaciji sa prethodno naučenim tehnikama,
savladavanje nizova učiniće nas dovoljno kompetentnim da možemo da rešimo i neke kompleksnije
probleme. Nizovi u Javi se naročito dobro slažu sa petljama.

Da bismo deklarisali jednu promenljivu koja će sadržati niz treba da tipu (nazivu) promenljivedodamo i
prazne uglaste zagrade:
int[] = x;

Samom deklaracijom niza, ne možemo raditi sa njim ništa pre nego što mu odredimo
veličinu i inicijalizujemo ga. Niz inicijalizujemo:

 ključnom rečju new, čemu sledi


 naziv tipa i takođe
 uglaste zagrade, samo ovaj put sa brojem članova između.
int [] array = new int[5];

Prethodna linija znači da je inicijalizovan niz koji u sebi sadrži pet vrednosti tipa int. Da bismo dodelili
neku vrednost određenom članu niza, koristimo takođe uglaste zagrade i indeks, ali ovaj put sa
primenom jednakosti:
array [0] = 5;
array [1] = 10;
array [2] = 15;
array [3] = 25;
array [4] = 30;

Ako unapred znamo koje će vrednosti niz sadržati, tada možemo inicijalizovati niz direktnim unosom
vrednosti:

int [] array = {5,10,15,25,30};

Ovakva sintaksa podrazumeva da se u vitičaste zagrade smeste sve vrednosti


niza, poređane prema indeksima.
Iako znamo da kreiramo niz, uzmemo podatak iz njega ili stavimo neki podatak u njega, ovo najčešće
nije dovoljno za efikasan rad sa nizovima, jer ćemo često sa nizovima da radimo još nešto.

Na primer, da ih prebrojimo, da ih spojimo, razdvojimo, kopiramo, a naročito, da konvertujemo niz u


string i obrnuto. Ove probleme moćemo rešiti ručno, ali takođe, većina njih već postoji ugrađena u Javu.

U radu sa nizovima, podatak koji nam najčešće treba je njegova dužina. Najlakši način da dobijemo
dužinu niza, je korišćenjem njegovog svojstva length.

int [] array = {2,3,4,5,6};


System.out.println(“Niz array ima “ + array.length + “ članova”);

43
Kloniranje niza

Često će nam biti potrebno i kloniranje niza, to znači kreiranje novog niza, identičnog izvornom. Možemo
to izvesti na dva načina:

1. pomoću metode clone samog array objekta i


2. pomoću statičke metode arraycopy, klase System.
Pored pomenute dve metode za kloniranje niza, Java SE takođe ima kompletnu klasu, čija je namena
isključivo pomoć pri rukovanju nizovima. Ova klasa se naziva Arrays, a sadrži metode za:

 pretragu nizova,
 sortiranje,
 popunjavanje nizova,
 pretvaranje niza u listu.

višedimenzionalni niz
Osim jednodimenzionalnih nizova, Java je u stanju da prepozna i takozvane višedimenzionalne nizove.
Ovakvi nizovi korisni su za rad sa podacima koji imaju matričnu ili tabelarnu formu.

Multidimenzionalni nizovi su odličan način za skladištenje tabelarno struktuiranih podataka. Kreiranje


višedimenzionalnog niza pomoću inicijalizatora je pregledno i jednostavno:
int [] [] multiArray = {
{2,5,8},
{1,4,3}
};

višedimenzionalni niz može imati neograničen broj dimenzija (ne baš bukvalno neograničen, već do
255), ali verovatno nikada nećemo kreirati više od tri, dok je najčešći scenario, upotreba dve dimenzije.

Podnizovi višedimenzionalnog niza ne moraju biti svi iste veličine. Oni nizovi koji imaju različit broj
članova u svojim podnizovima, nazivaju se nazupčeni nizovi.

int [] [] multiArray = {
{2,5,8},
{1,4,3,6,10}
};

Inicijalizator je pogodan kada znamo koji će tačno biti sadržaj višedimenzionalnog niza. U suprotnom,
nizove ćemo verovatno inicijalizovati programabilno.

Na primer, na sledeći način:

int [] [] multiArray = new int [3][];


multiArray[0] = new int [3];
multiArray[1] = new int [3];
multiArray[2] = new int [3];
44
Vrednosti se iz višedimenzionalnog niza mogu preuzeti na sličan način kao i iz jednodimenzionalnog, pri
čemu svake nove uglaste zagrade predstavljaju jednu dimenziju:

int [] [] multiArray = {
{2,5,8},
{1,4,3}
};
System.out.println(multiArray[1][2]);

U poslednjem nivou ovog kursa bavimo se Nizovima. Ako imate minimalno predznanje iz matematike,
savladaćete lako gradivo koje vas čeka. Nizove smo voleli još kao mali, sada ćemo naučiti kako da ih
pametno koristimo.

Niz je složeni tip koji podrazumeva smeštanje više vrednosti u jednoj promenljivoj.
Vrednosti koje se smeštaju u niz moraju biti istog tipa i taj tip određujemo prilikom kreiranja niza.
Takođe, broj vrednosti koje možemo smestiti u niz mora se odrediti prilikom kreiranja niza i nakon toga
se ne može više menjati (imutabilnost).

Svaka vrednost unutar niza, identiikuje se pomoću takozvanog indeksa niza, broja koji određuje
njenu poziciju. Svaka vrednost u jednom nizu naziva se član niza. Svaki član ima svoj indeks koji
koristimo za pristup tom članu.

Članovi mogu biti bilo kog tipa, ali se njihovi tipovi unutar niza ne smeju (i ne
mogu) razlikovati. Promenljiva kojom je predstavljen niz, sadrži zapravo adresu prvog člana niza.

Primer
Ako imamo jedan skup brojeva 3, 5, 2, 6, 1, 6, primećujemo da se broj 6 ponavlja. To znači da, ako
bismo rekli da želimo da iz liste izvučemo broj 6, ne bismo imali preciznu informaciju o kom se od dva
moguća broja šest, zapravo radi.

Jedan od načina da se ovo reši, bio bi uvođenje numeracije elemenata ovog skupa:

broj: 3, 5, 2, 6, 1, 6 pozicija: 0, 1, 2, 3, 4, 5

Primećujemo da brojanje pozicije počinje od nule. Na ovaj način možemo da identifikujemo svaki broj u
svakom trenutku. Ukoliko želimo da prikažemo neki od ova dva broja šest, izabrali bismo njihovu
poziciju, poziciju 3 ili poziciju 5.

45

You might also like