Professional Documents
Culture Documents
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.
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.
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.
Sa „eksplozijom” WWW-a, Java izlazi u prvi plan, zato što je na Internetu bila potrebna portabilnost koju
je programski jezik Java omogućavao.
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.
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.
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?
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.
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.
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.
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.
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).
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.
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.
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.
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
Pored osetljivosti na velika i mala slova, moramo takođe paziti da u identifikatore ne smeštamo:
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.
Da bi neka promenljiva postojala, mora se kreirati. Proces kreiranja promenljive se naziva deklarisanje.
Int promenljivaA;
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
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:
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.
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.
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.
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.
Objekti;
Klase;
Interfejsi;
Nizovi.
U Javi postoji oznaka null, koja predstavlja nedostatak vrednosti. Ona predstavlja referencu koja ne
pokazuje nijedan objekat.
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);
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:
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.
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;
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
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.
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:
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.
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.
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:
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;
}
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:
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).
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();
}
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.
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:
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();
}
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:
Ako nameravamo da koristimo istoimene klase iz različitih paketa, tada ipak moramo
eksplicitno navesti putanju do željene klase.
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.
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!
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).
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
Nasleđivanje predstavlja osobinu klase da prihvati osobine neke druge klase, pri čemu:
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;
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:
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.
prepisivanjai
preopterećivanja (override i overload).
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);
}
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).
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
proizvodnog,
organizacionog,
upravljačkog,
pa zašto je ne bi bilo i u programiranju? Ovoga puta ćemo govoriti o kontroli toka programa.
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) {
hero_is_dead = false;
} else {
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.
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;
}
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.
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!
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.
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:
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).
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)...
Kao i kod for petlje i if / else strukture, vitičaste zagrade nisu obavezne:
while (condition)
conditional code
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);
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:
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:
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.
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:
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.
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.
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