66
Matematički fakultet Univerzitet u Beogradu Master rad Elektronske lekcije o osnovnim konceptima objektno orijentisanog programiranja u programskom jeziku Java Mentor: Student: prof. dr Mirosalav Marić Jovana Radosavljević Beograd, 2017.

Elektronske lekcije o osnovnim konceptima objektno

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Elektronske lekcije o osnovnim konceptima objektno

Matematički fakultet

Univerzitet u Beogradu

Master rad

Elektronske lekcije o osnovnim konceptima objektno

orijentisanog programiranja u programskom jeziku Java

Mentor: Student:

prof. dr Mirosalav Marić Jovana Radosavljević

Beograd,

2017.

Page 2: Elektronske lekcije o osnovnim konceptima objektno

Članovi komisije:

1. prof. dr Mirosalav Marić - mentor

2. prof. dr Dušan Tošić

3. prof. dr Vladimir Filipović

Page 3: Elektronske lekcije o osnovnim konceptima objektno

Sadržaj Uvod ................................................................................................................................................ 5

1. Elektronske lekcije o programskom jeziku Java ......................................................................... 6

2. Uvod u Javu ................................................................................................................................ 8

2.1. Istorijat i poreklo programskog jezika Java ......................................................................... 8

2.2. Podešavanje okruženja ......................................................................................................... 9

2.3. Kreiranje prvog programa .................................................................................................... 9

2.3.1. Unošenje programa ..................................................................................................... 13

2.3.2. Prevođenje programa .................................................................................................. 14

2.3.3. Pokretanje programa ................................................................................................... 14

2.4. Elementi jezika Java .......................................................................................................... 15

3. Tipovi podataka ........................................................................................................................ 16

3.1. Primitivni tip podataka ....................................................................................................... 16

3.1.1. Celi brojevi.................................................................................................................. 16

3.1.2. Brojevi u pokretnom zarezu ........................................................................................ 17

3.1.3. Znakovi ....................................................................................................................... 18

3.1.4. Logičke vrednosti........................................................................................................ 19

3.2. Referentni tip podatka ........................................................................................................ 20

4. Elementarne konstrukcije .......................................................................................................... 21

4.1. Identifikatori ...................................................................................................................... 21

4.2. Literali ................................................................................................................................ 21

4.2.1. Cleobrojni literali ........................................................................................................ 21

4.2.2. Literali za brojeve u pokretnom zarezu ...................................................................... 22

4.2.3. Logički literali ............................................................................................................. 22

4.2.4. Znakovni i String literali ............................................................................................. 22

4.3. Operatori ............................................................................................................................ 23

4.4. Ključne reči ........................................................................................................................ 27

4.5. Komentari .......................................................................................................................... 27

5. Modifikatori .............................................................................................................................. 28

5.1. Pristupni modifikatori ........................................................................................................ 28

5.2. Ostali Modifikatori............................................................................................................. 29

6. Upravljačke naredbe ................................................................................................................. 30

6.1. Uslovne naredbe................................................................................................................. 30

6.1.1. Naredba if .................................................................................................................... 30

Page 4: Elektronske lekcije o osnovnim konceptima objektno

6.1.2. Naredba switch ............................................................................................................ 33

6.2. Naredbe za iteraciju ........................................................................................................... 34

6.2.1. Petlja for ...................................................................................................................... 34

6.2.2. Petlja while .................................................................................................................. 36

6.2.3. Petlja do-while ............................................................................................................ 37

6.3. Naredbe za skokove ........................................................................................................... 38

6.3.1. Naredba break ............................................................................................................. 38

6.3.2. Naredba continue ........................................................................................................ 39

6.3.3. Naredba return ............................................................................................................ 40

7. Upoznavanje sa metodama, objektima i klasama ..................................................................... 42

7.1. Metode ............................................................................................................................... 42

7.1.1. Kreiranje metode ......................................................................................................... 42

7.1.2. Pozivanje metode ........................................................................................................ 43

7.1.3. Preopterećenje metoda ................................................................................................ 44

7.2. Objekti i Klase ................................................................................................................... 45

7.2.1. Opšti oblik klase ......................................................................................................... 46

7.2.2. Vrste promenljivih ...................................................................................................... 48

7.2.3. Statički i nestatički članovi klase ................................................................................ 49

7.2.4. Kreiranje objekta ......................................................................................................... 51

7.2.5. Konstruktori ................................................................................................................ 52

7.2.6. Ključna reč this ........................................................................................................... 54

8. Osnovni koncepti objekno orijentisanog programiranja ........................................................... 56

8.1. Nasleđivanje ....................................................................................................................... 56

8.2. Polimorfizam...................................................................................................................... 58

8.3. Apstrakcija ......................................................................................................................... 60

8.4. Enkapsulacija ..................................................................................................................... 62

8.5. Interfejsi ............................................................................................................................. 63

9. Zaključak................................................................................................................................... 65

Literatura ....................................................................................................................................... 66

Page 5: Elektronske lekcije o osnovnim konceptima objektno

5

Uvod

Kako se današnji svet ne može zamisliti bez upotrebe savremene tehnologije (računara,

pametnih telefona, tableta, itd.), potražnja za stručnjacima iz oblasti informacionih tehnologija je

u stalnom porastu, a samim tim i potreba za učenjem programskih jezika je sve veća. Programski

jezik Java uživa veliku popularnost zbog svoje jednostavnosti, platformske nezavisnosti i objektne

orjentisanosti. Imajući u vidu sve veću primenu u izradi aplikacija za mobilne telefone i tablet

uređaje, koji koriste Android operativni sistem, Java je postala jedan od najzastupljenijih

programskih jezika. Iz navedenih razloga korisno je približiti osnove programskog jezika Java

mladim programerima, kako bi stekli neophodno znanje za dalje učenje i napredovanje u svetu

programiranja.

Ovaj rad ima za cilj da kroz elektronske lekcije osobama koje se prvi put susreću sa

programiranjem na jednostavan način približi osnovne principe objektno orjentisanog

programiranja u programskom jeziku Java.

Uvodni deo rada je posvećen istoriji i karakteristikama programskog jezika Java, podešavanju

okruženja, kreiranju i pokretanju prvog programa..

U glavnom delu rada obrađivaće se elektronske lekcije, koje bi trebalo da obezbede upoznavanje

sa objektima, klasama i metodama, načinom njihovog kreiranja i svim pojmovima potrebnim za

njihovo međusobno funkcionisanje (promenljive, elementarne konstrukcije, modifikatori,

upravljačke naredbe, itd.). Pored osnovnih pojmova, biće obrađeni i osnovni koncepti na kojima

se zasniva objektno orjentisano programiranje - apstrakcija, nasleđivanje, polimorfizmi,

enkapsulacija.

U zaključku će biti istaknute mogućnosti, prednosti, mane kao i značaj učenja i popularizovanja

programskog jezika Java.

Page 6: Elektronske lekcije o osnovnim konceptima objektno

6

1. Elektronske lekcije o programskom jeziku Java

Elektronske lekcije o programskom jeziku Java kreirane su za potrebe lakšeg učenja i

razumevanja objektno orijentisanog programiranja kroz programski jezik Java. Zamišljene su kao

materijali koji se mogu koristiti u toku nastave ili kao priručnik učenicima za samostalno učenje.

Elektronske lekcije obuhvataju 7 poglavlja i to su:

Uvod u Javu;

Tipovi podataka;

Elementarne konstrukcije;

Modifikatori;

Upravljačke naredbe;

Upoznavanje sa metodama, objektima i klasama;

Osnovni koncepti objektno orijentisanog programiranja.

Svako poglavlje sadrži po nekoliko lekcija koje su koncipirane tako da sadrže osnovne definicije

i kratak opis pojmova potrebnih za razumevanje konkretne teme. Pojedine lekcije iz prvog

poglavlja imaju formu uputstva, gde se kroz niz koraka čitaocu predstavljaju prvi koraci,

neophodni za učenje i programiranje u programskom jeziku Java. Lekcije su propraćene primerima

kojima se konkretizuje ono što lekcija opisuje.

Elektronske lekcije su javno dostupne i nalaze se na adresi:

http://alas.matf.bg.ac.rs/~ml08170/elektronske%20lekcije/java/index.html

Početna stranica sajta se može videti na slici 1.1.

Slika 1.1 – Početna stranica

Page 7: Elektronske lekcije o osnovnim konceptima objektno

7

Nakon pritiska na dugme Start sa početne strane pristupa se stranici sa materijalima. Sa leve strane

nalazi se sadržaj, tačnije spisak svih obrađenih lekcija, i u svakom trenutku korisnik može

pritiskom na naslov otvoriti željenu lekciju. Glavni deo sadrži primere, slike i tekst o izabranoj

temi. Na dnu glavnog dela nalaze se strelice kojima se može preći na sledeću ili vratiti na prethodnu

lekciju (slika 1.2).

Slika 1.2 – Prikaz lekcije

Page 8: Elektronske lekcije o osnovnim konceptima objektno

8

2. Uvod u Javu

„Ono što se želelo postići programskim jezikom Java, a što je najvećim delom i ostvareno,

predstavlja povezivanje velikog broja različitih domena, tako da se omogućava funkcionisanje

aplikacionog servera i funkcionisanje mobilnog telefona, kreiranje naučnih programa, razvoj

softvera, implementacija međuplanetarne navigacije i još mnogo štošta....“ – James Gosling

Java je jednostavan, objektno orijentisan, nezavisan od platforme, prenosiv, bezbedan, robustan,

interpretiran, distribuiran i dinamički programski jezik.

Jednostavan – programeri mogu lako da nauče i efikasno koriste Javu.

Objektno orijentisan – programi se grade pomoću grupe objekata koji zajedno

funkcionišu.

Nezavisan od platforme – programi mogu da se izvršava bez modifikacija u okviru

različitih okruženja.

Prenosiv – isti kôd radi na svim računarima.

Bezbedan – Java omogućava konstrukciju sistema koji su zaštićeni od virusa i

zlonamerne modifikacije.

Robustan - jezik Java je namenjen za pisanje programa koji moraju biti pouzdani na

mnogo načina. Java se u velikoj meri ističe u ranoj proveri mogućih problema, kasnijoj

dinamičkoj proveri (tokom izvršavanja) i eliminaciji situacija koje su sklone generisanju

greške.

Interpretiran - Java interpreter može direktno da izvršava Java bajtkôd na bilo kojoj

mašini, na kojoj se taj interpreter postavi.

Distribuiran – program može da zahteva izvršavanje procedure koja se nalazi bilo gde na

mreži.

2.1. Istorijat i poreklo programskog jezika Java

Priča o programskom jeziku Java počinje 1995. godine kada su James Gosling i grupa

programera radeći na projektu kompanije Sun Mycrosistems razvili novi programski jezik.

Tačnije, početkom 1991. kreirani su prvi koncepti jezika koji je prvobitno dobio ime Oak, ali je

1995. godine promenjen i predstavljen kao Java.

Osnovni motiv je bila potreba za jednostavnim jezikom koji će biti lak za korišćenje, pouzdan

i nezavisan od platforme. Bio je potreban jezik koji bi se mogao koristiti za pravljenje softvera,

namenjenog različitim elektronskim uređajima u domaćinstvu, kao što su mikrotalasne pećnice i

daljinski upravljači. Problem sa jezicima C i C++ (kao i sa većinom drugih jezika), leži u tome što

se pri prevođenju u binarni oblik oni moraju usmeriti na određeni procesor. Iako se program pisan

na jeziku C++ može prevesti za bilo koji procesor, za to je potreban prevodilac namenjen

konkretnom procesoru. Problem je bio u tome što su prevodioci skupi i sporo se prave. Očigledno

je bilo potrebno lakše i jeftinije rešenje. U pokušaju da dođu do njega, Gosling i ostali počeli su

da rade na prenosivom jeziku koji ne zavisi od platforme i čiji bi kôd mogao da se izvršava na

Page 9: Elektronske lekcije o osnovnim konceptima objektno

9

različitim procesorima i u različitim okruženjima. Ovi napori su konačno doveli do rađanja Jave

[1].

Java je srodnik jezika C++, koji je direktan potomak jezika C. Veći deo svojih osobina Java

je nasledila od ova dva jezika. Iz jezika C je preuzela sintaksu, a mnoge objektno orijentisane

osobine Jave nastale su pod uticajem jezik C++. Zapravo, više karakteristika koje definišu Javu

potiču od njenih prethodnika ili su nastale u procesima njihovog poboljšavanja. Kako svaka

inovacija programskog jezika nastaje iz potreba da se reši određeni temeljni problem, tako ni Java

nije izuzetak u tom pogledu. Nakon izlaska Jave u jesen 1995. Java programi mogli su da se

izvršavaju kao deo veb stranica u Netscape Navigator čitaču veba. Ova funkcionalnost pomogla je

u reklamiranju Jave i privuklo nekoliko stotina hiljada programera u prvih šest meseci postojanja

novog programskog jezika.

Čak i nakon što Java više nije bila nov programski jezik, korist od primene ovog programskog

jezika je postala potpuno jasna, a programeri su i dalje bili privučeni njome. Danas postoji više

profesionalnih programera koji koriste programski jezik Java nego onih koji koriste programski

jezik C++ [2].

2.2. Podešavanje okruženja

Kada se govori o Javi važno napraviti razliku između Java programskog jezika i Java platforme.

Java programski jezik je formalni jezik za prezentaciju računarskih programa, pomoću njega se

računaru, čoveku čitljivim tekstom, daju instrukcije i naredbe za izvršenje različitih zadataka. Kada

se napiše program on se ne izvršava direktno na računaru već pomoću standardizovanog okruženja

koje se zove Java platforma. Najpre Java prevodilac (javac) prevodi program sa izvornog koda u

bajtkod koji razume Java virtualna mašina (Java Virtual Machine - JVM) i na njoj se program

izvršava. Java interpreter tumači bajtkod i izvršava akcije koje su specificirane u bajtkodu, unutar

JVM. Java platforma pored Java virtualne mašine podrazumeva i skup unapred definisanih Java

klasa koje postoje pri svakoj instalaciji Jave. Ove klase su dostupne za korišćenje od strane Java

programa. Java platforma se još i naziva izvršno okruženje (Java Runtime Environment - JRE) [3].

Za razvoj aplikacija potreban je Java Development Kit - JDK. On se sastoji od Java Runtime

Environment-a i alata za razvoj, prevođenje, praćenje i debagovanje aplikacija. Ako se za JRE

kaže da je to okruženje za pokretanje Java programa, onda JDK predstavlja okruženje za razvijanje

i pokretanje Java programa.

JDK se može preuzeti na http://www.oracle.com/technetwork/java/javase/downloads/index.html .

Iz ponuđene liste, treba izabrati onu instalaciju koja odgovara operativnom sistemu koji se koristi

na datom računaru (x86 je instalacija za 32-bitnu, a x64 za 64-bitnu mašinu). Da bi preuzimanje

bilo moguće, potrebno je označiti opciju Accept License Agreement. Trenutno aktuelna verzija je

jdk-8u5 (slika 2.1).

Kada je instalaciona (.exe) datoteka preuzeta, potrebno je dvoklikom na nju pokrenuti instalaciju.

Zatim, prateći uputstvo, dovoljno je prihvatati ponuđena podešavanja, prelazeći na sledeći korak

klikom na Next (slike 2.2 i 2.3).

Page 10: Elektronske lekcije o osnovnim konceptima objektno

10

Slika 2.1 – Preuzimanje JDK-a

Slika 2.2 – Pokretanje instalacije JDK-a

Slika 2.3 – Instalacija JDK-a

Page 11: Elektronske lekcije o osnovnim konceptima objektno

11

Kada se došlo do završnog koraka, trebalo bi da u izabranom direktorijumu (ako smo prihvaćena

podrazumenavana podešavanja C:\Program Files\Java) postoje dva nova foldera "jre1.8.0_51" i

"jdk1.8.0_51".

Pored instalacije JDK potrebno je dodati putanju do jdk1.8.0_51 direktorijuma u PATH

environment promenljivu. Na taj način kompajler i interpreter se mogu pokretati bilo gde, bez

navođenja putanja do njih.

Koraci za podešavanje ove putanje su sledeći:

desni klik na "Computer",

zatim klik na "Properties""Advanced system settings",

izabrati "Environment Variables""System variables""New" (slika 2.4) ,

kreirati novu promenljivu "JAVA_HOME" , a kao vrednost postaviti putanju do lokacije

gde se nalazi instalacija JDK na računaru (slika 2.5) ,

izabrati "PATH" sistemsku promenljivu, a zatim izmeniti postojeću vrednost Path

promenljive, dodavanjem sledećeg izraza ;%JAVA_HOME%\bin (slika 2.6).

Slika 2.1.4 – kreiranje sistemske promenljive

Slika 2.4 – Kreiranje sistemske promenljive

Slika 2.5 – Kreiranje sistemske promenljive

Page 12: Elektronske lekcije o osnovnim konceptima objektno

12

Za kreiranje programa potreban je i razvojni alat, u kome će se pisati izvorni kôd i pokretati

program. Programerima su na raspolaganju mnoga grafička razvojna okruženja NetBeans, Eclipse,

DrJava, BlueJ, JCreator, itd. Među ovim okruženjima ne može se izdvojiti jedno koje je najbolje,

jer svako ima svoje prednosti i mane, a izbor je najčešće stvar ličnog ukusa. Za potrebe ovog

elektronskog kursa korišćen je razvojni alat - Eclipse IDE (slika 2.7).

Nakon uspešnog preuzimanja, potrebno je raspakovati paket na željenoj lokaciji i u folderu

pronaći eclipse.exe datoteku, pa dvoklikom na nju otvoriti razvojno okruženje. Pri pokretanju

Slika 2.7 – Preuzimanje Eclipse

Slika 2.6 – Podešavanje sistemske proemneljive

Page 13: Elektronske lekcije o osnovnim konceptima objektno

13

eclipse.exe najpre treba izabrati Workspase, tj. folder u kome će se čuvati vaš java projekat. Može

se ostaviti podrazumevani, ponuđeni direktorijum ili izabrati željeni.

Kada je instaliran JDK, podešena JAVA_HOME varijabla, preuzet i pokrenut Eclipse razvojni

alat, može se reći da je okruženje podešeno za kreiranje prvog programa u jeziku Java.

2.3. Kreiranje prvog programa

Kreiranje programa obuhvata tri glavna koraka: unošenje, prevođenje (kompajliranje) i pokretanje

programa.

2.3.1. Unošenje programa

Program u jeziku Java se na logičkom nivou sastoji od jedne ili više klasa. Izvorni tekst svake

klase se piše u posebnoj datoteci čiji naziv mora početi imenom klase koju sadrži, a ekstenzija te

datoteke mora biti .java.

Slika 2.8 – Pokretanje Eclipse

Page 14: Elektronske lekcije o osnovnim konceptima objektno

14

U nastavku je prikazan primer 1. koji se sastoji od samo jedne klase Zdravo.

U ovom primeru, koristeći bilo koji editor, tekst klase treba sačuvati u datoteku pod nazivom

Zdravo.java. Treba voditi računa i o tome da raspored velikih i malih slova u imenu klase i

imenu datoteke mora biti isti. Java pravi razliku između malih i velikih slova.

2.3.2. Prevođenje programa

Pre izvršavanja program u programskom jeziku Java se mora prevesti u odgovarajući bajtkod.

Svaka klasa u programu može se prevoditi nezavisno od drugih klasa programa. Prevođenje jedne

klase obavlja Java prevodilac koji se pokreće iz komandne linije kao na slici 2.8.

Prevodilac javac napraviće datoteku pod nazivom Zdravo.class koja sadrži bajtkod programa.

Kao što je ranije pomenuto, bajtkod je međuproizvod sačinjen od naredbi koje treba da izvrši Java

virtualna mašina.

2.3.3. Pokretanje programa

Pokretanjem izvršavanja neke klase započinje se izvršavanje metode u toj klasi sa službenim

imenom main.U datom primeru klase Zdravo ta metoda se sastoji od samo jedne naredbe kojom

se ispisuje određena poruka na ekranu.

Izvršavanje dobijenog bajtkoda neke klase obavlja se Java interpreterom koji se pokreće

komandom java. Za konkretan primer to izgleda kao na slici 2.9.

public class Zdravo {

public static void main(String[] args) {

System.out.println("Zdravo svete!");

}

}

C:\> javac Zdravo.java

C:\> java Zdravо

Primer 1. – Prvi program „Zdravo svete!“

Slika 2.8. – Komanda za prevođenje koda

Slika 2.9 – Komanda za pokretanje programa

Page 15: Elektronske lekcije o osnovnim konceptima objektno

15

Кada se program izvrši na ekranu se ispisuje poruka data na slici 2.10.

2.4. Elementi jezika Java

Skup znakova (engl. character set) koji se koristi u jeziku Java čine mala i velika slova engleskog

alfabeta, mala i velika slova većine alfabeta sveta, deset decimalnih cifara i veći broj znakova

interpunkcije. Pravi se razlika između malih i velikih slova kako u službenim delovima programa

tako i unutar običnih tekstova .

Leksički simboli (engl. tokens) su nedeljivi nizovi znakova. U jeziku Java dele se na identifikatore,

konstante, ključne reči, komentare, operatore i separatore. Leksički simboli mogu da se pišu, uz

nekoliko izuzetaka, spojeno ili međusobno razdvojeno proizvoljnim brojem „belih” znakova. Beo

znak između leksičkih simbola je neophodan, ako bi se njegovim izostavljanjem dobio drugi

postojeći leksički simbol [4].

U bele znakove (engl. white spaces) spadaju znak za razmak, tabulacija, vertikalna tabulacija,

prelazak u novi red i prelazak na novi list.

U širem smislu u bele znakove se ubrajaju i komentari, jer ih prevodilac zanemaruje prilikom

prevođenja.

Naredbe (engl. statements) su nizovi leksičkih simbola. Postoje deklarativne i izvršne naredbe.

Deklarativnim naredbama definišu se neki elementi programa (podaci, metode, klase...), dok se

izvršnim naredbama izvode neke obrade.

Programi su nizovi naredbi pomoću kojih se ostvaruju složene obrade podataka.

Zdravо svete!

Slika 2.10 – Prikaz poruke na ekranu

Page 16: Elektronske lekcije o osnovnim konceptima objektno

16

3. Tipovi podataka

Java je strogo tipiziran jezik. To proizilazi iz činjenica da u programskom jeziku Java svaka

promenljiva ima svoj tip, svaki izraz ima svoj tip, a svaki tip je strogo definisan. Takođe u svim

operacijama dodeljivanja vrednosti – bilo da su eksplicitne ili da se obavljaju prosleđivanjem

parametara u pozivima metoda – proverava se kompatibilnost tipova. Nema automatskog

nametanja niti pretvaranja nekompatibilnih tipova. Java prevodilac proverava sve izraze i

parametre i utvrđuje da li su svi tipovi međusobno saglasni. Svako neslaganje tipova predstavlja

grešku koja se mora ispraviti da bi prevodilac završio prevođenje klase.

3.1. Primitivni tip podataka

U programskom jeziku Java je definisano osam elementarnih tipova podataka: bajt (byte), kratak

celobrojni (short), celobrojni (int), dugačak celobrojni (long), znakovni (char), broj u pokretnom

zarezu (float), broj u pokretnom zarezu dvostruke tačnosti (double) i logički tip (boolean).

Primitivni tipovi predstavljaju jednostavne vrednosti, a ne složene objekte. Iako je Java u principu

potpuno objektno orijentisana, njeni primitivni tipovi podataka to nisu. Svi primitivni tipovi imaju

tačno određenu veličinu memorije u bajtovima za zapisivanje odgovarajućih vrednosti. Zbog toga

svi primitivni tipovi podataka imaju tačno definisan opseg vrednosti koje im pripadaju.

3.1.1. Celi brojevi

U jeziku Java su definisana četiri tipa celobrojnih podataka: byte, short, int i long. Sve su to

pozitivni i negativni brojevi sa predznakom. Dužinu celobrojnog tipa podataka ne treba shvatati

kao količinu memorije koju on zauzima, već kao ponašanje koje on nameće promenljivama i

izrazima tog tipa. Izvršno okruženje jezika Java je slobodno da koristi bilo koju veličinu sve dok

se tipovi podataka ponašaju onako kako su deklarisani. Veličina i opseg celobrojnih tipova

podataka široko variraju, i prikazani su u tabeli 1.

Slika 3.1 – Primitivni tipovi

Page 17: Elektronske lekcije o osnovnim konceptima objektno

17

Tip Veličina Opseg vrednosti

long 64 od -9.223.372.036.854.775.808 do 9.223.372.036.854.775.807

int 32 od -2.147.483.648 do 2.147.483.647

short 16 od -32.768 do 32.767

byte 8 od -128 do 127

byte – najmanji celobrojni tip podatka, to je 8-bitni ceo broj u opsegu -128 do 127. Podrazumevana

vrednost promenljive tipa byte je 0. Promenljive tipa byte posebno su korisne pri radu s tokovima

podataka sa mreže ili iz datoteke. Promenljive tipa byte deklariše se pomoću rezervisane reči byte,

na sledeći način:

short – je 16-bitni broj s predznakom. Opseg vrednosti mu je između -32.768 i 32.767.

Podrazumevana vrednost promenljive tipa short je 0. Verovatno je to tip koji se najmanje koristi.

int – tip celobrojnih podataka koji se najčešće koristi. To je 32-bitni ceo broj s predznakom, čiji je

opseg vrednosti od -2.147.483.648 do 2.4832.147.647. Podrazumevana vrednost promenljive tipa

int je 0. Promenljiva tipa int se često koristi za upravljanje petljama i za indeksiranje nizova.

long – je 64-bitni ceo broj sa predznakom koji je pogodan kada tip int nije dovoljan za datu

vrednost. Podrazumevana vrednost promenljive tipa long je 0. Opseg vrednosti tipa long veoma

je velik. To ga čini pogodnim kada treba raditi sa veoma velikim brojevima.

3.1.2. Brojevi u pokretnom zarezu

Brojevi u pokretnom zarezu poznatiji kao realni brojevi koriste se za izračunavanje izraza gde je

potreban i decimalan deo. Postoje dva tipa brojeva u pokretnom zarezu: float i double, koji

predstavljaju brojeve jednostruke i dvostruke tačnosti. Njihova veličina i opseg vrednosti prikazani

su u tabeli 3.2.

byte a; byte b;

short s; short t;

int i; int j;

long l;

long k;

Tabela 1 – Opseg vrednosti celobrojnih tipova podataka

Page 18: Elektronske lekcije o osnovnim konceptima objektno

18

Tip Veličina Opseg vrednosti

double 64 od 4.9e-324 do 1.8e+308

float 32 od 1,4e-045 do 3,4e+038

float – predstavlja brojeve sa jednostrukom tačnošću i zauzima 32 bita memorije. Podrazumevana

vrednost promenljive tipa float je 0.0f. Rad sa brojevima jednostruke tačnosti na nekim

procesorima je brži i zahteva dva puta manje memorije od brojeva dvostruke tačnosti, ali rezultati

postaju netačni kada su argumenti vrlo veliki ili vrlo mali. Promenljive tipa float korisne su

potrebne vrednosti s decimalnim delom, ali ne i velika preciznost.

double – decimalni broja, dvostruke tačnosti, zauzima 64 bita memorije. Podrazumevana vrednost

promenljive tipa double je 0.0d. Računanje s brojevima dvostruke tačnosti na nekim savremenim

procesorim, optimizovanim za brze matematičke proračune, brže je nego sa brojevima jednostruke

tačnosti.matematičke funkcije npr. sin(), cos() i sqrt() kao rezultat daju vrednosti tipa double. Kada

tokom mnogobrojnih iteracija treba održati tačnost ili raditi sa brojevima koje imaju više značajnih

cifara, najbolji je tip double.

3.1.3. Znakovi

U programskom jeziku Java je char tip koji se koristi za predstavljanje znakova. Međutim treba

imati u vidu da char u programskom jeziku Java nije isto što i char u jezicima C i C++. U jezicima

C i C++ tip char je veličine 8 bitova. To nije slučaj u programskom jeziku Java, jer Java za

predstavljanje znakova koristi standard Unicode. Unicode definiše potpun skup međunarodnih

znakova koji može da prikaže znake iz svih svetskih jezika. Za jedinstveno predstavljanje svakog

znaka Unicode koristi 16 bitova – zato u jeziku Java tip char zauzima 16 bitova. Opseg vrednosti

tipa char je između 0 i 65536, nema negativnih vrednosti. U primeru 2. ilustrovana je upotreba

promenljive tipa char.

double d;

float f;

float l;

Tabela 2 – Opseg vrednosti realnih tipova podataka

Page 19: Elektronske lekcije o osnovnim konceptima objektno

19

Nakon pokretanja ovog programa, na ekranu se ispisuje poruka kao na slici 3.2.

3.1.4. Logičke vrednosti

Za logičke vrednosti u jeziku Java koristi se primitivni tip podataka boolean. Može imati samo

jednu od dve moguće vrednosti true (tačno) ili false (netačno). Podrazumevana vrednost

promenljive tipa boolean je false. Vrednost tog tipa daju svi operatori za poređenje. Tip boolean

je takođe obavezan tip u uslovnim izrazima koji upravljaju kontrolnim naredbama, kao što su if ,

for, while.

Primer 3. prikazuje upotrebu logičke vrednosti.

Ovaj program će pri pokretanju imati ispis na ekranu kao na slici 3.3.

ch1 i ch2: X Y

public class PrimerBoolean { public static void main(String[] args) {

boolean b; // deklaracija promenljive

// ispisuje podrazumevanu vrednost prom. tipa boolean

System.out.println("Vrednost b je: " + b);

b = true;

// ispisuje novu dodeljenu vrednost prom. tipa boolean

System.out.println("Vrednost b je: " + b);

}

}

public class PrimerChar { public static void main(String[] args) {

char ch2 = 'Y'; // inicijalizacija promenljive

char ch1 = 88; // kod za slovo X

// ispis vrednosti prom. tipa char

System.out.println("ch1 i ch2: " + ch1 + " " + ch2);

}

}

Vrednost b je: false

Vrednost b je: true

Primer 2. – Upotreba proemnljive tipa char

Slika 3.2 – Prikaz poruke ne ekranu

Primer 3. – Upotreba promenljive tipa boolean

Slika 3.3 – Prikaz poruke ne ekranu

Page 20: Elektronske lekcije o osnovnim konceptima objektno

20

3.2. Referentni tip podatka

Promenljiva referentnog tipa (klasni tip) sadrže reference na podatke, odnosno adresu na kojo se

mogu naći odgovarajući podaci. Podaci su smešteni u objektima. Dok promenljiva primitivnog

tipa sadrži binarnu reprezentaciju neke vrednosti, promenljiva referentnog tipa sadrži binarnu

reprezentaciju adrese nekog objekta.

Promenljiva referentnog tipa se kreira pomoću definisanih konstruktora neke klase. Te klase mogu

biti definisane od strane programera ili se koriste neke već postojeće klase iz biblioteke jezika Java

(npr.String). Kreiranje objekata vrši se pomoću ključne reči new.

Ako bi se ovaj izraz raščlanio, zapravo se izvršavaju sledeće tri akcije:

1. Dog pas = new Dog(); - deklaracija promenljive, alocira se prostor u memoriji za

referentnu promenljivu čije ime je pas koja je tipa Dog, ona je od tog trenutka pa zauvek

tipa Dog;

2. Dog pas = new Dog(); - kreiranje objekta, alocira se prostor za novi objekat tipa

Dog;

3. Dog pas = new Dog(); - dodeljuje se novi objekat tipa Dog referentnoj promenljivoj pas,

pa se od ovog trenutka objektu tipa Dog pristupa preko reference pas [5].

Tip objekta je određen klasom. U programskom jeziku Java, referenca na objekat ne mora da bude

isto što i adresa objekta u memoriji. Referenca je jednostavno vrednost na osnovu koje Java

virtualna mašina može da pristupi objektu.

Slika 3.4 – Referentni tip

Dog pas = new Dog();

Page 21: Elektronske lekcije o osnovnim konceptima objektno

21

4. Elementarne konstrukcije

Elemente jezika koje prevodilac izdvaja tokom prevođenja programa kao nedeljive celine

(tokene) čine: identifikatori, literali, separatori, operatori, ključne reči, komentar.

4.1. Identifikatori

Identifikatori (engl. identifiers) služe za označavanje svih vrsta elemenata programa: podataka,

simboličkih konstanti, tipova podataka koje definiše programer, potprograma i oznaka koje služe

kao odredišta za naredbe skokova. Pravila kojih se moramo pridržavati pri korišćenju

identifikatora su sledeće:

Svi identifikatori počinju slovom, donjom crtom (_) ili znakom dolar ($). Prvi znak ne sme

da bude cifra;

Posle prvog znaka identifikator može da sadrži bilo koju kombinaciju znakova;

Ključne reči se ne smeju koristiti za identifikatore;

Pravi se razlika između malih i velikih slova (engl. case sensitivity), tako da su A i a dva

različita identifikatora.

4.2. Literali

Literali (engl. literals) se koriste da izraze konkretne vrednosti bilo kog tipa unutar programa.

Literal može biti konstantna vrednost primitivnog tipa ili String objekta.

4.2.1. Cleobrojni literali

Celi brojevi su verovatno najčešći tip podataka u programiranju. Svaka celobrojna vrednost

predstavlja celobrojni literal. Za celobrojne literale važi sledeće:

celobrojne vrednosti mogu biti izražene dekadnim, oktalnim ili heksadekadnim

literalima,

dekadni - nikada ne počinju cifrom 0,

oktalni - počinju cifrom 0,

heksadekadni - počinju znacima 0x ili 0X,

literali tipa long imaju sufiks L ili l.

int a = 75; // u dekadnom sistemu

int b = 0113; // u oktalnom sistemu

int c = 0x4b; // u heksadekadnom

Page 22: Elektronske lekcije o osnovnim konceptima objektno

22

4.2.2. Literali za brojeve u pokretnom zarezu

Brojevi u pokretnom zarezu (realni brojevi) predstavljaju vrednosti iz dekadnog sistema koje

sadrže i decimalni deo. Oni se mogu prikazivati u standardnom ili naučnom formatu. Standardni

format se sastoji od celobrojnog dela, decimalne tačke i decimalnog dela. Naučni format koristi

broj u pokretnom zarezu, napisan u standardnom formatu, kojem sledi sufiks koji označava stepen

broja 10 s kojim treba pomnožiti navedeni broj. Stepen broja 10 označava se slovom e ili E, iza

koga sledi pozitivan ili negativan ceo broj.

Za ove literale važi sledeće:

predstavljaju brojeve sa decimalama, stoga oni uključuju i decimalnu tačku ili e karakter,

literali za brojeve u pokretnom zarezu su podrazumevano tipa double, može stajati sufiks

D ili d,

literali za brojeve u pokretnom zarezu tipa flaot sadrži sufiks F ili f .

4.2.3. Logički literali

Logički literali su jednostavni. Postoje samo dve vrednosti koje podatak tipa boolean može imati:

true i false. Vrednosti true i false ne pretvaraju se ni u kakav numerički ekvivalent. Literal true

nije jedinica, niti je literal false jednak null. U jeziku Java se logički literali mogu dodeliti samo

promenljivama tipa Boolean ili koristiti u izrazima s logičkim operatorima.

4.2.4. Znakovni i String literali

Znakovi u programskom jeziku Java predstavljaju indekse u skupu znakova Unicode. To su 16-

bitne vrednosti koje se mogu pretvariti u cele brojeve i obrađivati pomoću celobrojnih operatora

npr. operatorima za sabiranje i oduzimanje. Za ovaj tip literal važi sledeće:

znakovni literali predstavljaju konstante od jednog karaktera, između jednostrukih

navodnika,

String literali predstavljaju više karaktera, između dvostrukih navodnika,

bilo koji karakter može se izraziti njegovim numeričkim ASCII kodom stavljajući karakter

'\', a zatim ASCII kôd zapisan u oktalnom ili heksadekadnom zapisu.

double num1 = 3.01e25; // 3.01 * 10^25

double num2 = 7.69852;

char a = '\u0041'; // kod za slovo A char b = 'a';

String s = "zdravo svete";

Page 23: Elektronske lekcije o osnovnim konceptima objektno

23

U datoj tabeli 3 opisani su specijalni znakovni literali.

Tabela 3 – Specijalni znakovni literali

Literal Opis

'\n' novi red (newline)

'\r' povratak na početak reda (carriage return)

'\f' sledeća strana (formfeed)

'\b' brisanje znaka levo od kursora (backspace)

'\s' razmak (space)

'\t' tabulator (tab)

'\'' jednostruki navodnik

'\"' dvostruki navodnik

'\\' kosa crta nalevo (backslash)

'\ddd' oktalni kôd karaktera

'\uxxx' heksadekadni kôd karaktera iz UNICODE skupa

4.3. Operatori

Operatori (engl. operators) omogućavaju izvršavanje operacija nad promenljivim dajuci pri tom

određeni rezultat.

Aritmetički operatori su operatori koji se mogu primenjivati na vrednosti bilo kog numeričkog tipa

- byte, short, int, long, float, double. U aritmetičke operatore spadaju pet binarnih --, +, *, /, % i

dva unarna operatora ++, --. Primenjivanje binarnih operatora odgovara matematičkim

operacijama - sabiranje, oduzimanje, množenje, osim u slućaju deljenja. U programskom jeziku

Java operatorom / vrši se celobrojno deljenje (npr. pri deljenu vrednosti 5 / 2 rezultat bi bio 2, dok

se razlomljeni deo odbacuje).

Neka promenljiva a ima vrednost 10 i promenljiva b vrednost 5, u tabeli 4 opisani su svi aritmetički

operatori.

Operator Opis Primer

+ Binarni operator koji vraća vrednost zbira dva broja a + b bilo bi 15

- Binarni operator koji vraća vrednost razlike dva broja a – b bilo bi 5

* Binarni operator koji vraća vrednost proizvoda dva broja a * b bilo bi 50

/ Binarni operator koji vraća celobrojnu vrednost količnika dva broja, a eventualne decimale odbacuje

a / b bilo bi 2

% Binarni operator daje ostatak pri deljenju dve vrednosti a % b bilo bi 0

Tabela 4 – Aritmetički operatori

Page 24: Elektronske lekcije o osnovnim konceptima objektno

24

++ Unarni operator koji daje vrednost uvećanu za 1 a ++ bilo bi 11

-- Unarni operator koji daje vrednost umanjenu za 1 a – bilo bi 9

Relacijski operatori se koriste za upoređivanje vrednosti bilo kog numeričkog tipa ili tipa char.

Ovi operatori vraćaju vrednost true ili false (tipa boolean). Kada se upoređuju znakovi tipa char,

tj. karakteri, zapravo se porede njihove numeričke Unicode vrednosti (npr. 'a'<'z' vraća

vrednost true, jer kôd znaka a ima menjaju vrednost od kôda znaka z).

Neka promenljiva a ima vrednost 10 i promenljiva b vrednost 5, u tabeli 5 opisani su svi relacijski

operatori.

Operator Opis Primer

== Proverava da li su dve vrednosti jednake i ako jesu vraća vrednost true, u suprotnom false

(a == b) bi bilo netačno

!= Proverava da li su dve vrednosti različite ako jesu vraća vrednost true, u suprotnom false

(a != b) bi bilo netačno

> Proverava da li je leva vrednost veća od desne i ako jeste vraća vrednost true, u suprotnom false

(a > b) bi bilo tačno

< Proverava da li je leva vrednost manja od desne i ako jeste vraća vrednost true, u suprotnom false

(a < b) bi bilo tačno

>= Proverava da li je leva vrednost veća ili jednaka desnoj i ako jeste vraća vrednost true, u suprotnom false

(a >= b) bi bilo tačno

<= Proverava da li je leva vrednost manja ili jednaka desnoj i ako jeste vraća vrednost true, u suprotnom false

(a <= b) bi bilo tačno

Logički operatori se primenjuju na logičke izraze i daju isto logičke vrednost.

Neka promenljiva a ima vrednost true i promenljiva b vrednost false, u tabeli 6 opisani su svi

logički operatori.

Operator Opis Primer

&&

Logičko I (konjunkcija) - binarni logički operator koji daje rezultat true kada su oba izraza true, u svakom dugom slučaju vraća false

(a && b) bi bilo netačno

||

Logičko ILI (disjunkcija) - binarni logički operator koji daje rezultat true kada je bar jedan od izraza true, u suprotnom daje false

(a || b) bi bilo tačno

!

Negacija - unarni logički operator koji vraća true kada se primeni na operandu koja ima vrednost false i obrnuto.

!(a && b) bi bilo tačno

Tabela 5 – Relacijski operatori

Tabela 6 – Logički operatori

Page 25: Elektronske lekcije o osnovnim konceptima objektno

25

Operatori nad bitovima se mogu primenjivati nad tipovima int, long, short, char i byte.

Neka je a = 60 i b = 13 u binarnom zapisu ovi brojevi su a = 0011 1100 i b = 0000 1101, u tabeli

7 opisani su svi bitovski operatori.

Operator Opis Primer

& Bitovsko I (Konjukcija nad bitovima) - prepisuje jedinice iz binarnog zapisa u rezultat ukoliko one postoje u obe operande

(a & b) bi bilo 12, što je zapisano binarno - 0000 1100

| Bitovsko ILI (Disjunkcija nad bitovima) - prepisuje jedinice iz binarnog zapisa u rezultat ukoliko one postoje u bar jednoj operandi

(a | b) bi bilo 61, što je zapisano binarno - 0011 110

^ Bitovsko ekskluzivno ILI - prepisuje jedinice iz binarnog zapisau rezultat ukoliko one postoje u samo jednoj operandi, u drugoj ne

(a ^ b) bi bilo 49, što je zapisano binarno - 0011 0001

~ Bitovski unarni operator koji daje inverzni binarni zapis datog broja, tamo gde su jedinice u rezultat upisuje nule i tamo gde su nule u rezultat upisuje jedinice

( ~ a) bi bilo -61, što je binarno zapisano - 1100 0011

<< Levo pomeranje (šiftovanje) — primenom ovog operatora bitovi prve operande se pomeraju u levo za broj pozicija naveden kao druga operanda.

(a << 2) bi bilo 240, što je binarno zapisano - 1111 0000

>> Desno pomeranje (šiftovanje) — primenom ovog operatora bitovi prve operande se pomeraju u desno za broj pozicija naveden kao druga operandai.

(a >> 2) bi bilo 15, što je binarno zapisano - 1111

>>>

Desno pomeranje (šiftovanje) — primenom ovog operatora bitovi prve operande se pomeraju u desno za broj pozicija naveden kao druga operanda. Na početna upražnjena mesta upisuju se nule

(a >>> 2) bi bilo 15, što je binarno zapisano - 0000 1111

Operator izbora:

izraz1 ? izraz2 : izraz3;

Najpre se izračunava izraz1, ako on ima ne-nula vrednost (tj. ako je vrednost true), onda se

izračunava vrednost izraza izraz2 i to je rezultat čitavog uslovnog izraza, u suprotnom se

izračunava vrednost izraz3 i to je rezultat uslovnog izraza.

Tabela 7 – Bitovski operatori

Page 26: Elektronske lekcije o osnovnim konceptima objektno

26

Operator dodele je binarni operatori koji neku vrednost pridružuje datoj promenljivoj i obeležava

se simbolom =. Za većinu binarnih operatora postoje odgovarajući složeni operatori dodele +=, -=, /=, %=, &= itd.

U tabeli 8 su opisani svi operatori dodele koji se koriste u jeziku Java.

Operator Opis Primer

= Dodeljuje levoj operandi vrednost operande ili izraza sa desne strane.

c = a + b vrednost zbira a i b će biti dodeljena promenljivoj c

+= Dodeljuje levoj operandi vrednost zbira leve i desne operande

c += a je ekvivalentno sa c = c + a

-= Dodeljuje levoj operandi vrednost razlike leve i desne operande

c -= a je ekvivalentno sa c = c - a

*= Dodeljuje levoj operandi vrednost proizvoda leve i desne operande

c *= a je ekvivalentno sa c = c * a

/= Dodeljuje levoj operandi vrednost celobrojnog deljenja leve i desne operande

c /= a je ekvivalentno sa c = c / a

%= Dodeljuje levoj operandi ostatak pri deljenju leve i desne operande

c %= a je ekvivalentno sa c = c % a

<<= Pomeranje u levo za broj desne operande c <<= 2 je isto kao i c = c << 2

>>= Pomeranje u desno za broj desne operande c >>= 2 je isto kao i c = c >> 2

&= Bitovsko I sa operatorom dodele - primenjuje se na levu i desnu operandu, a rezultat smešta u levu

c &= 2 je isto kao i c = c & 2

^= Bitovsko ekskluzivno ILI sa operatorom dodele - primenjuje se na levu i desnu operandu, a rezultat smešta u levu

c ^= 2 je isto kao i c = c ^ 2

|= Bitovsko ILI sa operatorom dodele - primenjuje se na levu i desnu operandu, a rezultat smešta u levu

c |= 2 je isto kao i c = c | 2

Tabela 8 – Operatori dodele

Page 27: Elektronske lekcije o osnovnim konceptima objektno

27

4.4. Ključne reči

Ključne reči (engl. keywords) jezika Java su rezervisane reči i ne mogu biti korišćene kao

identifikatori. U ključne reči spadaju i const i goto, iako se ne koriste u jeziku Java, ali bi njihova

pojava u programu mogla da zbuni programere koji su ranije koristili jezike C i C++.

Sve ključne reči su pobrojane tabeli 9.

abstract assert boolean break byte case

catch char class continue const default

do double else enum extends false

final finally float for goto if

implements import instanceof int interface long

native new null package private protected

public return short static strictfp super

switch synchronized this throw throws transient

true try void volatile while

4.5. Komentari

Komentari (engl. comments) su tekstovi na prirodnom jeziku, namenjeni čitaocu programa radi

lakšeg razumevanja namene i funkcionisanja programa. Takve konstrukcije se zanemaruju

prilikom prevođenja programa. Iako za prevodilac komentari kao da ne postoje, to ne znači da su

oni nevažni. Bez komentara je jako teško shvatiti i malo složenije programe.

Postoje tri vrste komentara.

Komentari u jednom redu, započinju znakom // i obuhvataju tekst do kraja tog reda.

Komentari koji sadrže tekst koji se prostire u više redova, započinju znakom /* i završavaju

se znakom */.

Dokumentacioni komentari započinju /** i završavaju se znakom */ obuhvataju tekst u više

redova. Ovi komentari služe za pisanje dokumentacije o klasi direktno unutar njenog

izvornog koda. Pored običnog teksta dokumentacioni komentari mogu da sadrže i HTML

tagove i specijalne reči koje počinju znakom @.

Tabela 9 – Ključne reči

Page 28: Elektronske lekcije o osnovnim konceptima objektno

28

5. Modifikatori

Modifikatori (engl. modifiers) su ključne reči koje stoje u definiciji klasa, metoda ili

promenljivih i bliže ih određuju. Modifikatori su opcioni i njihov redosled nije bitan. U nekim

situacijama su implicitno definisani tj. podrazumeva se njihovo korišćenje. U programskom jeziku

Java se modifikatori mogu podeliti na dve grupe, oni koji se koriste za kontrolu pristupa i ostali

modifikatori.

5.1. Pristupni modifikatori

U programskom jeziku Java se koristi nekoliko modifikatora za određivanje nivoa pristupa nekoj

klasi, metodi ili promenljivoj.

Postoje 4 modifikatora pristupa i sledi opis za svaki od njih.

private - označava da je metoda ili promenljiva uz koju stoji vidljiva samo unutar klase u

kojo je definisana, znači da joj se iz druge klase ne može pristupati. Klase i interfejsi ne

mogu da budu private.

public - označava da je klasa, metoda ili promenljiva uz koju stoji javna, dakle, može joj

se pristupati iz bilo koje klase.

protected - označava da je metoda ili promenljiva vidljiva unutar klase u kojoj je

definisana, u potklasama koje su izvedene (nasleđene) od te klase i paketa unutar kojeg se

ta klasa nalazi.

podrazumevani pristupni modifikator - je zapravo slučaj kada pri deklaraciji modifikatori

ne bude definisan, tada je metoda ili promenljiva deklarisana bez modifikatora vidljiva u

svim klasama na nivou paketa [7].

public class Auto { private String boja; private int brzina; ... }

//metoda main() je uvek public

public void main (String[] arguments){ ...

}

class Vrata { //metoda je protected protected boolean otvoriVrata(Vrata d) { ... } }

Page 29: Elektronske lekcije o osnovnim konceptima objektno

29

5.2. Ostali Modifikatori

Pored modifikatora pristupa, u programskom jeziku Java je dostupno i nekoliko modifikatora koji

specificiraju odgovarajuće karakteristike određenih promenljivih, metoda ili klasa.

static - se koristi uz promenljive i metode. Promenljiva uz koju stoji modifikator static

postoji i kada nije kreirana instanca te klase - one se jos naziva klasne promenljiva (engl.

class variable). Metoda uz koju stoji modifikator static može biti pozivana preko imena

klase i kada nema kreiranih instanci te klase - one se jos nazivaju klasne metode (engl.

class methods).

final - se koristi uz promenljive, metode i klase. Promenljiva uz koju stoji final modifikator

se inicijalizuje samo jednom, vrednost se ne menja. Kod promenljivih referentnog tipa sa

modifikatorom final obezbeđuje da se ta promenljiva ne može preorjentisati da pokazuje

na neki drugi objekat. Metode uz koju stoji final modifikator ne može biti redefinisana u

okviru neke podklase. Iz klasa uz koju stoji final modifikator ne može se kreirati potklasa.

abstract - se koristi uz metode i klase. Metode uz koju stoji abstract modifikator je

deklarisana bez implementacije. Definicija te metode se mora obezbediti u okviru neke

neapstraktne podklase. Ako klasa sadrži bar jednu abstract metodu mora biti abstract. Ako

je klasa abstract ne mora da sadrži abstract metode. Klasa uz koju stoji abstract

modifikator ne može biti instancirana tj. ne može kreirati objekte te klase. Apstraktne klase

služe isključivo da budu nasleđene.

synchronized - se koristi za metode. Dve niti ne mogu simultano da izvršavaju metodu.

native - se koristi u specijalnim situacijama, kada je potreban pristup naredbama

operativnog sistema ili procesora, odnosno nekim metodama i nekom kodu koji nije Java

kôd. Sprečavanje kompajlera da tumači ono što se nalazi u okviru te metode, postiže se

modifikatorom native, koji komunicira sa kompajlerom omogućavajući da unutra postoji

kôd koji nije kôd programskog jezika Java.

volatile - koristi se za promenljive. Vrednost se moze menjati nezavisno od Java programa,

kompajler ne prati njene promene.

transient - je sigurnosni mehanizam, odnosi se isključivo na promenljive, i komunicira sa

promenljivom koja ima modifikator transient tako da ona ne može da napusti virtuelnu

mašinu. Bilo kakvo snimanje klase u kojoj se nalazi promenljiva tipa transient, ili puštanje

kroz mrežu instance klase koja u sebi ima promenljivu transient, će prouzrokovati da ta

promenljiva nestane iz klase, dakle neće više postojati, odnosno povećava sigurnost te

promenljive. Promenljiva može da postoji samo u okviru virtuelne mašine.

Page 30: Elektronske lekcije o osnovnim konceptima objektno

30

6. Upravljačke naredbe

Upravljačke naredbe se koriste za upravljanje toka programa na osnovu promena stanja u

programu. U programskom jeziku Java se koriste uslovne naredbe, naredbe za iteracije i naredbe

za skokove. Uslovne naredbe omogućuju da program izabere različit tok izvršavanja na osnovu

rezultata izračunavanja određenog izraza ili stanja određene promenljive. Naredbe za iteracije

omogućavaju programu da jednu ili više naredbi ponovi više puta. Naredbe za skokove

omogućavaju nelinearno izvršavanje programa.

6.1. Uslovne naredbe

Java podržava dve uslovne naredbe: if i switch. Po moću njih se upravlja izvršavanjem programa

na osnovu uslova koji su poznati samo u vreme izvršavanja.

6.1.1. Naredba if

Naredba if je naredba za uslovno grananje, koja omogućava da se program usmeri na jednu od dve

različite putanje. Opšti oblik naredbe if izgleda ovako:

if (uslov) naredba1; else naredba2;

Unutar naredbe if, svaka naredba može da bude prosta naredba ili složen iskaz unutar vitičastih

zagrada. Uslov je svaki izraz koji vraća vrednost tipa boolean. Odredba else nije obavezna.

Naredba if radi na sledeći način: testira dati uslov, koliko je on tačan (true) izvršava se naredba1,

ukoliko je uslov netačan (false) izvršava se naredba2 (ukoliko postoji odredba else).

U primeru 4. proverava se da li je vrednost promenljive a manja od 15 i ispisuje odgovarajuću

poruku ukoliko je uslov ispunjen.

Pri pokretanju ovog programa na ekranu se ispisuje poruka kao na slici 6.1

public class Test {

public static void main(String args[]) {

int a = 10; // inicijalizacija promenljive

// ukoliko je uslov ispunjen ispisuje se poruka

if (a < 15)

System.out.print("Uslov je tačan!");

}

}

Uslov je tačan!

Primer 4. – Ispitivanje uslova

Slika 6.1 – Ispis nakon provere uslova

Page 31: Elektronske lekcije o osnovnim konceptima objektno

31

Izraz koji upravlja naredbom if najčešće sadrži operatore za poređenje, ali to nije obavezno.

Naredbom if može se upravljati i samo pomoću promenljive tipa boolean.

U primeru 5. ilustruje se upotrebu uslova u obliku promenljive tipa boolean i odredbe else.

Na ekranu će biti ispisana poruka kao na slici 6.2.

Mogućnost da se jedna naredba if umetne unutar druge naredbe if ili else naziva se ugnježdeno

uslovljavanje. Kod ovog tipa uslovljavanja potrebno je voditi računa da se naredba else uvek

odnosi na najbližu naredbu if u istom bloku, koja je slobodna (tj. nije već povezana sa nekom

drugom else naredbom).

U primeru 6. prikazano je ugnježdeno uslovljavanje i grupisanje if i else naredbe

Unutrašnje else se odnosi na if (k>100), jer je to najbliže slobodno else unutar istog bloka.

Poslednja odredba else je povezana sa if( i == 10). Iako je prvo slobodno if(j<20), ono ne može

biti povezano sa poslednjim else jer nisu u istom bloku.

Stepenasta naredba if – else – if zasniva se na sekvenci ugnježdenih uslova i izgleda ovako:

public class Test {

public static void main(String args[]) {

boolean parnost = false; // inicijalizacija promenljive

// ukoliko je uslov ispunjen ispisuje se prva poruka

// u suprotnom ispisuje se poruka iz naredbe else

if (parnost)

System.out.print("Broj je paran!");

else

System.out.print("Broj je neparan!");

}

}

Broj je neparan!

if(i == 10) { if(j < 20) a = b;

if(k > 100) c = d;

else a = c; } else a = d;

Primer 5. – Ispitivanje uslova kroz if – else naredbu

Slika 6.2 – Ispis nakon nardebe if - else

Primer 6. – Ugnežđeno uslovljavanje

Page 32: Elektronske lekcije o osnovnim konceptima objektno

32

if (uslov1) naredba1; else if (uslov2) naredba2; else if (uslov3) naredba3; . . . else naredba;

Naredba if se izvršava odozgo na dole sve dok jedan od uslova ne bude ispunjen, tada se izvršava

naredba koja prati taj uslov. Ukoliko nijedan od uslova nije ispunjen izvršava se naredba iz krajnje

else odredbe. Dakle, krajnja else odredba je zapravo podrazumevana akcija, ukoliko nje nema, a

svi drugi uslovi su false nista se ne dešava.

U primeru 7. prikazuje se upotreba stepenaste if – else – if naredbe, ispisuje se ocena na osnovu

osvojenih bodova.

Pri pokretanju ovog programa, na ekranu se dobija poruku kao na slici 6.3.

public class Test {

public static void main(String args[]) {

int bodovi = 22; // inicijalizacija promenljive

// redom se proveravaju uslovi sve do prvog koji je ispunjen

if (bodovi < 10) {

System.out.println("nedovoljan 1");

} else if (bodovi >= 10 && bodovi < 20) {

System.out.println("dovoljan 2");

} else if (bodovi >= 20 && bodovi < 30) {

System.out.println("dobar 3");

} else if (bodovi >= 30 && bodovi < 40) {

System.out.println("vrlo dobar 4");

} else if (bodovi >= 40 && bodovi < 50) {

System.out.println("odličan 5");

} else {

System.out.println("Pogrešan unos!");

}

}

}

dobar 3

Primer 7. – Stepenasto uslovljavanje if-else-if

Slika 6.3. – Ispis nakon stepenastog uslovljavanja

Page 33: Elektronske lekcije o osnovnim konceptima objektno

33

6.1.2. Naredba switch

Naredba switch koristi se za testiranje uslova. Kod naredbe switch se izbor jednog od više

alternativnih blokova naredbi za izvršavanje vrši na osnovu jednog celobrojnog ili znakovnog

izraza (char, int, short ili byte). U zavisnosti od vrednosti tog izraza izvršava se niz naredbi

pridružen jednom od slučajeva označenih klauzulama case. Pri tom se redom traži prva konstanta

uz klauzulu case koja je jednaka vrednosti izraza i izvršava se niz naredbi pridružen tom slučaju.

Opšti oblik naredbe switch izgleda ovako:

switch (izraz) {

case vrednost1: naredbe1

break;

case vrednost2: naredbe2 break;

. . . default: podrazmevane naredbe }

Ukoliko se nijedna konstanta ne poklapa sa vrednošću izraza, izvršava se naredba default. Pošto

naredba default nije obavezna, u slučaju kada se nijedna konstanta ne poklopi sa vrednošću iz

izraza, a default ne postoji, ništa se ne dešava. Naredba break se koristi unutar naredbe switch kao

završetak grupe naredbi.

Upotreba naredbe switch može se videti u primeru 8.

public class Test {

public static void main(String[] args) {

int br = 20; // inicijalizacija promenljive

// promenljiva br se poredi vrednostima koje stoje uz case

// kada su vrednosti jednake izvršava se naredba

switch (br) {

case 10:

System.out.println("vrednost je 10");

break;

case 20:

System.out.println("vrednost je 20");

break;

case 30:

System.out.println("vrednost je 30");

break;

default:

System.out.println("nije nijedan od slučajeva");

}

}

}

Primer 8. – Ispitivanje uslova naredbeom switch

Page 34: Elektronske lekcije o osnovnim konceptima objektno

34

Nakon pokretanja ovog programa dobija se poruka kao na slici 6.4.

6.2. Naredbe za iteraciju

Kako je pri kreiranju programa nekada potrebno izvršiti određene naredbe više puta, u

programskim jezicima obezbeđene su strukture koje omogućavaju ciklično izvršavanje naredbi. U

programskom jeziku Java u tu svrhu koriste se sledeće naredbe: naredba for, while i do-while.

6.2.1. Petlja for

Petlja for koristi se za ciklično izvršavanje bloka naredbi više puta. Preporučuje se korišćenje ove

petlje kada unapred znamo koliko puta treba izvršiti neki deo koda. Postoje dva oblika for petlje -

prvi je tradicionalni oblik koji se koristi od prve verzije Jave, drugi oblik nazivamo „for-each” i

postoji od JDK 5.

Opšti oblik tradicionalne naredbe for izgleda ovako:

for (inicijalizacija; uslov; iteracija) {

//kôd koji se izvršava

}

Ukoliko je potrebno da se izvršava samo jedna naredba vitičaste zagrade nisu neophodne. Petlja

for funkcioniše na sledeći način:

Prvi korak je inicijalizacija (engl.initialization) koji se izvršava pri ulasku u petlju i on se izvršava

samo jednom. To je izraz kojim se zadaje neka početna vrednost kontrolne promenljive. Zatim se

izvršava uslov (engl. condition), to je izraz postavljen pomoću relacijskih operatora, koji

ima boolean vrednost. Ukoliko je uslov ispunjen izvršiće se kôd, a potom će se kontrolnoj

promenljivoj dodeliti nova vrednost koju definišemo na mestu iteracija. Ukoliko uslov nije

ispunjen izlazi se iz for petlje i program nastavlja dalje. Iteracija je uglavnom operator kojim se

menja vrednost kontrolne promenljive, najčešće je uvećavanje ili smanjenje za jedan

(increment/decrement). Dakle, ciklus se ponavlja, svaki put uz proveravanje uslova, izvršavanje

tela petlje i izvršavanja iterativnog izraza, sve dok uslov ne postane neispunjen.

vrednost je 20

Slika 6.4 – Ispis nakon izvršene switch naredbe

Page 35: Elektronske lekcije o osnovnim konceptima objektno

35

U primeru 9. koristeći for petlju ispisuju se brojevi od 1 do 10.

U ovom primeru kontrolna promenljiva je deklarisana unutar for petlje, time je obezbeđeno da ova

promenljiva postoji samo unutar petlje. Dakle, kada je ovu promenljivu potrebno koristiti izvan

for petlje, nikako ne sme biti deklarisana unutar petlje pri inicijlizaciji, jer ona prestaj da postoji

po završetku petlje.

Kada je potrebno da izraz za iteraciju ili inicijalizaciju sadrži više naredbi, taj slučaj se rešava

pomoću zareza. U odeljku za iteraciju ili inicijalizaciju moguće je uneti više izraza odvojenih

zarezom. To je obično slučaj kada petljom upravljaju dve ili više promenljivih.

U primeru 11. prikazana je for petlja kojom upravljaju dve promenljive.

Program daje ispis kao na slici 6.5.

Počev od JDK 5, definisana je i „for-each” verzija za petlju for. Ova petlja namenjena je strogo

sekvencijalnom kretanju kroz kolekcije objekata (kao što je niz) od njenog početka do kraja. Opšti

oblik „for-each” verzije petlje videti u nastavku:

public class Test {

public static void main(String args[]) {

//i se umanjuje za 1 sve dok je i>10 i svaki put kada je uslov

//ispunjen ispisuje se vrednost promenljive i

for (int i = 10; i > 0; i--)

System.out.println(i);

}

}

public class Test {

public static void main(String args[]) {

//i se povećava,a j umanjuje za 1 i

// sve dok je i<j stampaju se vrednosti obe promenljive

for (int i = 1, j = 4; i < j; i++, j--) {

System.out.println("i = " + i);

System.out.println("j = " + j);

}

}

}

Primer 9. – Jednostavna for petlja

Primer 10. – Dve promenljive u for petlji

i = 1

j = 4

i = 2

j = 3

Slika 6.5 – Ispis nakon izvršene for petlje

Page 36: Elektronske lekcije o osnovnim konceptima objektno

36

for (tip iteraciona promenljiva : kolekcija) {

//kôd koji se izvršava }

U ovoj deklaraciji tip označava tip promenljive, a iteraciona promenljiva je ime promenljive koja

će primati elemente kolekcije, jedan po jedan od njeno početka pa do kraja. U svakom ciklusu

iteraciona promenljiva prima vrednost jednog elementa kolekcije, zatim se izvršava blok naredbi,

ciklusi se ponavljaju onoliko puta koliko ima elemenata u datoj kolekciji. Pošto iteraciona

promenljiva prima vrednost elemenata kolekcije, ona mora biti istog tipa kao i tip elemenata

kolekcije.

Kroz primer 11. može se videti upotreba „for-each” petlje.

Pri pokretanju ovog programa dobija se ispis kao na slici 6.6.

6.2.2. Petlja while

While petlja je najosnovnija petlja programskog jezika Java. Ona ciklično izvršava naredbu ili

blok naredbi sve dok je upravljački izraz tačan. Opšti oblik izgleda ovako:

while (uslov) {

//kôd koji se izvršava }

Konstrukcija while se sastoji od bloka naredbi i uslova. Uslov se prvo ispituje – ako je uslov tačan,

naredbe unutar bloka se izvršavaju. Ovo se ponavlja sve dok uslov ne postane netačan. Zbog toga

public class Test {

public static void main(String args[]) {

int brojevi[] = { 1, 2, 3, 4, 5 };

//„for-each” prolazi kroz niz i ispisuje svaki element for (int i : brojevi)

System.out.println("i = " + i);

}

}

i = 1

i = 2

i = 3

i = 4

i = 5

Primer 11. – Jednostavna for-each petlja

Slika 6.6 – Ispis nakon izvršene for–each petlje

Page 37: Elektronske lekcije o osnovnim konceptima objektno

37

što while petlja proverava uslov pre nego što izvrši blok naredbi, upravljačka struktura je često

poznata i kao pred-test petlja. Uslov može da bude svako logički izraz.

Za razliku od for petlje kod while petlje promenljivu moramo prethodno definisati. Ova petlja se

u zavisnosti od uslova i promenljive koju odredimo može izvršiti ni jednom, jednom ili više puta.

U primeru 12. će kroz while petlju biti ispisani brojevi od 15 do 20.

Nakon izvršenja while petlje na ekranu se prikazuje ispis kaon a slici 6.7.

6.2.3. Petlja do-while

Kod while petlje uslov prekida se proverava na početku svake iteracije. U nekim slučajevima,

međutim, pogodnije je proveriti taj uslov na kraju svakog izvršavanja tela petlje. U takvim

slučajevima koristi se do-while petlja, koja uslov prekida proverava na kraju, a na početku se

nalazi ključna reč do.

Opšti oblik ove petlje je:

do {

//kôd koji se izvršava } while (uslov);

Ovo znači da se kôd mora uvek izvršiti prvo i onda se procenjuje izraz ili test stanja. Ako je tačno,

izvršava se telo petlje ponovo. Ovaj proces se ponavlja sve dok izraz ima tačnu vrednost.

public class Test {

public static void main(String args[]) {

int i = 15; // inicijalizacija promenljive

//počevši od inicijalne vrenosti za i, proverava se uslov

//dok je i<21 ispisuju se vrednosti, zatim se i uvećava za 1

while (i < 21) {

System.out.println(i);

i++;

}

}

}

15

16

17

18

19

20

Slika 6.7 – Ispis nakon izvršene while petlje

Primer 12. – Jednostavna while petlja

Page 38: Elektronske lekcije o osnovnim konceptima objektno

38

U primeru 13. prikazana je upotreba do-while petlje

Po izvršavanju programa na ekranu se ispisuju brojevi od 10 do 1 kao na slici 6.8.

Petlja iz prethodnog primera može se napisati i na sledeći način:

U ovom primeru u okviru uslova kombinuju se dva izraza - prvi umanjuje vrednost promenljive

za jedan, zatim se ta nova vrednost upoređuje sa nulom. Ako je uslov ispunjen, petlja se nastavlja,

u suprotnom se više ne izvršava.

6.3. Naredbe za skokove

Java obezbeđuje tri naredbe za skokove: break, continue i return. Njihova uloga je da preusmere

tok izvršavanje programa. Ove naredbe obezbeđuju da se izvršavanje programa ne nastavi od

sledeće naredbe po redu, već se tok prekida i usmerava na drugo mesto u programu, koje je

određeno naredbom koja je na datom mestu upotrebljena.

6.3.1. Naredba break

Naredba break u programskom jeziku Java ima dva mesta upotrebe: kada se koristi unutar petlje

i za završavanje niza naredbi u naredbi switch.

public class Test {

public static void main(String args[]) {

int i = 10; // inicijalizacija promenljive

// prvo se izvršavaju naredbe, zatim proverava uslov i sve dok

//je uslov ispunjen naredbe se ciklicno ponavljaju

do {

System.out.print(i);

i--;

} while (i > 0);

}

}

10 9 8 7 6 5 4 3 2 1

do{

System.out.println(i);

} while(--i > 0 );

Primer 13. – Jednostavna do-while petlja

Slika 6.8 – Ispis nakon izvršene do-while petlje

Page 39: Elektronske lekcije o osnovnim konceptima objektno

39

Pomoću break naredbe moguće je prekinuti rad petlje i izaći iz nje u nekoj vanrednoj okolnosti

kada za to ima potrebe, a uslov petlje je ispunjen. Kada program naiđe na naredbu break preskače

se sve što sledi u okviru te petlje I program nastavlja sa izvršavanjem prve naredbe koja sledi van

petlje.

Primer 14. ilustruje upotrebu break naredbe.

Ovaj program će dati sledeći izlaz kao na slici 6.9.

Naredbom break prekinuto je ispisivanje brojeva iz datog niza, iako je naredbom for predviđeno

da se ispišu svi brojevi datog niza.

Ova naredba se može koristiti na više mesta u istoj petlji. Kada se break koristi unutar naredbe

switch, ona utiče samo na nju , ne i na petlju koja je možda obuhvata.

6.3.2. Naredba continue

Nekada je potrebno da se ciklus petlje skrati, da se u određenom trenutku neke naredbe preskoče i

tok prebaci na kraj petlje. Takve situacije se rešavaju pomoću continue naredbe. U okviru while i

do–while petlje ova naredba preusmerava tok programa na izraz za proveru uslova koji upravlja

petljom. Kod for petlje naredba continue šalje tok programa na izraz za iteraciju, zatim se

proverava uslov i nastavlja dalje.

public class Test {

public static void main(String args[]) {

int[] numbers = { 10, 20, 30, 40, 50 };

//for-each petljom ispisuju se el. niza sve dok se ne ispuni

//ulov x==30, tada se break naredbom izlazi iz petlje

for (int x : numbers) {

if (x == 30)

break;

System.out.print(x);

System.out.print("\n");

}

}

}

Slika 6.9 – Ispis nakon prekida for petlje

10

20

Primer 14. – Upotreba break naredbe

Page 40: Elektronske lekcije o osnovnim konceptima objektno

40

Primer 15. ilustruje upotrebu continue naredbe kroz for petlju.

Ovaj program će imati ispis kao na slici 6.10.

Naredbom continue u ovom primeru se preskoči slučaj kada promenljiva x ima vrednost 30, tako

da taj element niza neće biti ispisan na ekranu.

6.3.3. Naredba return

Naredba return obezbeđuje bezuslovni izlazak iz metode. Programska kontrola se vraća

pozivaocu metode. O ovoj naredbi se može detaljnije govoriti u okviru upoznavanja sa metodama.

Naredba return se najviše koristi pri kreiranju rekurzivnih metoda. Ova naredba dopušta

specificiranje povratne vrednosti koja se vraća pozivaocu metode.

Kroz primer 16. prikazana je upotreba return naredbe.

public class Test {

public static void main(String args[]) {

int[] numbers = { 10, 20, 30, 40, 50 };

//for-each petljom ispisuju se el. niza,za x==30 naredba

//continue preskače korak za ispisivanje i petlja nastavlja

dalje

for (int x : numbers) {

if (x == 30)

continue;

System.out.print(x + " ");

}

}

}

public class Test {

public static void main(String args[]) {

boolean status = true;

//ispis pre return naredbe

System.out.print(("Pre naredbe return.");

//uslov je true, naredbom return prekida se izvršavanje metode

if (status)

return;

System.out.print("Ovo se neće izvršiti.");

}

}

Primer 15. – Upotreba continue naredbe

10 20 40 50

Slika 6.10 – Ispis nakon prekida for petlje

Primer 16. – Upotreba return naredbe

Page 41: Elektronske lekcije o osnovnim konceptima objektno

41

Nakon izvršenja programa dobija se poruka kao na slici 6.11.

Kao što se može primetiti kôd koji se nalazi nakon naredbe return nije se izvršio pri pokretanju

ovog programa. Na izlazu je ispisan samo tekst koji se zadaje naredbom pre return naredbe.

Naredba return bezuslovno prekida metodu u kojoj se izvrši, kontrola se vraća pozivaocu metode.

Pre naredbe return.

Slika 6.11 – Ipis poruke nakonreturn naredbe

Page 42: Elektronske lekcije o osnovnim konceptima objektno

42

7. Upoznavanje sa metodama, objektima i klasama

7.1. Metode

Koncept potprograma je sve prisutan u programskim jezicima, ali se pojavljuje pod različitim

imenima: metoda, procedura, funkcija i slično. Njegova glavna svrha je to da se složeni program

podeli u manje delove koji se mogu lakše i nezavisno razvijati. Osim što je deo programa i što

obično obavlja jednostavniji zadatak, potprogram ima sličnu logičku strukturu kao glavni program.

Metode (engl. methods) su potprogrami koji obavljaju neki specifični zadatak. Sastoje se od niza

naredbi i promenljivih koje predstavljaju neku funkcionalnu celinu. Metoda mora imati

jedinstveno ime koje se može koristiti na različitim mestima u programu kao zamena za ceo niz

naredbi. Za korišćenje metode koristi se termin "pozivanje" metode. Pri svakom pozivu izvršava

se niz naredbi koje sadrži ta metoda. Pre početka izvršavanja naredbi, metodi se mogu proslediti

neke vrednosti koje se nazivaju argumenti metode. Takođe na kraju izvršavanja naredbi, metod

može imati povratnu vrednost koju ta metoda vraća kao rezultat.

7.1.1. Kreiranje metode

Metoda se sastoji iz dva dela: zaglavlja i tela metode. Telo metode se sastoji od niza naredbi

između vitičastih zagrada. Zaglavlje metode sadrži sve informacije koje su neophodne za

pozivanje metode.

Opšti oblik pisanja metoda u programskom jeziku Java i opis svih pojmova iz njene sintakse:

modifikator povratniTip imeMetode (listaParametara ) {

//telo metode

}

modifikator - određuje nivo pristupa metode tj. definiše odakle se metoda može videti

(public, private, protected, ili nije naveden ako se koristi u istoj klasi),

povratniTip - pokazuje kog tipa će biti povratna vrednost metode, ukoliko metoda vraća

neku vrednost (int, double, float, ..., String, ArrayList...). Ukoliko metoda ne vraća neku

konkretnu vrednost ona je tipa void,

imeMetode - ovo je ime metode, koje bi po neformalnoj konvenciji trebalo da opisuje šta

je funkcija metode,

listaParametara - predstavljaju ulazne podatke metoda koji se obrađuju naredbama u telu

metode,

telo metode - sadrži blok naredbi koje se izvršavaju pozivanjem metode.

Page 43: Elektronske lekcije o osnovnim konceptima objektno

43

7.1.2. Pozivanje metode

Kreiranjem neke metode definiše se se kako ona radi, ali se ne izvršava sve dok se ne pozove na

nekom mestu u program. Pozivanje metode programskom jeziku Java može imati tri oblika.

Prvi i osnovni oblik je:

imeMetode (listaArgumenata );

Dakle, kada u programu, na mestu gde je potrebno izvršiti neki zadatak, navedemo ime metode i

argumente u zagradi. Ovaj način pozivanja metode je moguć samo ukoliko se naredba poziva i

definicija metode nalaze u istoj klasi.

U okviru primera 17. kreirana je metoda minDvaBroja() unutar iste klase u okviru koje je pozvana.

Nakon pokretanja ovog programa dobija se ispis kaon a slici 7.1.

Kada se poziva metoda koja je definisana u drugoj klasi korsti se notacija sa tačkom. Pri tom, način

pozivanja takve metode zavisi od toga da li je ta metoda statička(klasna) ili nestatička(objektna).

Ukoliko je metoda definisana modifikatorom static ona pripada celoj klasi u kojoj je kreirana i

poziva se na ovaj način:

imeKlase.imeMetode (listaArgumenata );

public class Test {

public static void main(String[] args) {

int a = 20;

int b = 8;

//pozivanje metode

int c = minDvaBroja(a, b);

System.out.println("Minimum je " + c);

}

//metoda koja upoređuje dve prosleđene vrednosti i vraća minimum

public static int minDvaBroja(int n1, int n2) {

int min;

if (n1 > n2)

min = n2;

else

min = n1;

return min;

}

}

Minimum je 8

Primer 17. – Kreiranje i pozivanje metode

Slika 7.1 – Ipis poruke nakon poziva metode

Page 44: Elektronske lekcije o osnovnim konceptima objektno

44

Gde je imeKlase u ovom pozivu ime one klase u kojoj je definisana metoda koja se poziva. Treći

način pozivanja metode se koristi za nestatičke metode koje pripadaju pojedinim objektima, a ne

celoj klasi. Zato se one moraju pozivati uz odgovarajuće objekte. Opšti oblik poziva nestatičke

metode iz druge klase je –

imeObjekta.imeMetode (listaArgumenata );

U ovom zapisu imeObjekta predstavlja referentnu promenljivu koja pokazuje na onaj objekat za

koji se poziva metoda.

7.1.3. Preopterećenje metoda

Situaciju u kojoj neka klasa sadrži dve metode koje imaju isto ime, ali različite parametre naziva

se preopterećenje metoda (engl. overloading). Ovo je jedna od najkorisnijih osobina Java

programskog jezika i jedan od načina na koji Java podržava polimorfizam. Preopterećene metode

se razlikuju po tipu ili broji parametara. Kada se pozove jedna od metoda, na osnovu tipa ili broja

argumenata utvrđuje se o kojoj verziji metode je reč, zatim se izvršavaju naredbe u okviru te

metode.Ako bi, gledajući prethodni primer, bilo potrebno da se izračuna minimum dva broja koja

su tipa double, taj problem bi bio rešen koristeći postupak preopterećenja metoda.

U primeru 18. ilustrovana je upotreba preopterećenja metoda.

public class Test {

public static void main(String[] args) {

int a = 20;

int b = 8;

double c = 3.6;

double d = 7.1;

//poziv iste metode sa različitim tipovima promenljivih

int rez1 = minDvaBroja(a, b);

double rez2 = minDvaBroja(c, d);

System.out.println("Minimum je " + rez1);

System.out.println("Minimum je " + rez2);

}

//metoda koja upoređuje dve vrednosti tipa int i vraća minimum

public static int minDvaBroja(int n1, int n2) {

int min;

if (n1 > n2)

min = n2;

else

min = n1;

return min;

}

//metoda koja upoređuje dve vrednosti tipa double i vrća minimum

public static double minDvaBroja(double n1, double n2) {

double min;

if (n1 > n2)

min = n2;

else

min = n1;

Page 45: Elektronske lekcije o osnovnim konceptima objektno

45

Pri pokretanju ovog programa, na ekranu bi se dobio ispis kao na slici 7.2.

7.2. Objekti i klase

Objekat (engl. object) je najvažniji pojam za shvatanje objektno orjentisanog koncepta

programiranja.

Prostim opažanjem može se uočiti bezbroj primera objekata iz stvarnog života - knjiga, mačka,

bicikl, sto, automobil, telefon... Za sve te objekte može se reći da imaju jedinstveni identitet i

svojstva - stanje i ponašanje.

Ako bi se za primer objekta uzela mačka, može se primetiti da ona ima svoja stanja (ime, boju,

starost, rasu) i razna ponašanja (spavanje, mjaukanje, trčanje, grebanje), pored toga ne mogu se

naći dve identične mačke, pa ima i svoj jedinstveni identitet.. Automobil, takođe, ima stanja (boju,

brzinu, marku) i svoja ponašanja (kretanje, ubrzavanje, kočenje). Pošto dva automobila istog tipa,

iste boje i sa istim dodacima izgledaju identično, oni moraju da imaju identifikacioni broj po kome

će se razlikovati.

Softverski objekti su konceptualno vrlo slični objektima iz realnog života, oni mogu predstavljati

ne samo realne, nego i apstraktne entitete (npr.bankarski sistem) iz odgovarajućeg problemskog

domena.

Svaki objekat u programiranju – ima svoj jedinstveni identitet, svoje stanje (engl. state) i ponašanje

(engl. behavior):

Stanje - (svojstva, atributi) predstavljaju polja podataka sa svojim trenutnim vrednostima;

Ponašanje - (akcije, operacije) definiše se metodama;

Identitet - nekog objekta se odnosi na neko njegovo svojstvo po kojem se on razlikuje od

bilo kojeg drugog objekta.

Po definiciji objekat je određeni primerak ili instanca (engl. instance) neke klase.

Klasa (engl. class) je šablon ili nacrt po kojem se kreiraju objekti. U stvarnom svetu svakodnevno

se nailazi na razne primerke jedne iste vrste. Postoje na hiljade automobila iste marke i istog

Minimum je 8

Minimum je 3.6

Primer 18. – Preoptrećene metode

Slika 7.2 – Ipis nakon pozivanje preopterećenih metoda

return min;

}

}

Page 46: Elektronske lekcije o osnovnim konceptima objektno

46

modela, i svaki napravljen po istom šablonu sa istim karakteristikama. U softverskom svetu se

kaže se da je jedan auto primerak (instanca) klase automobila. Svaka klasa poseduje informacije o

osobinama objekta koje se čuvaju u instancama promenljivih.

Klasa definiše sadržaj objekta (karakteristike i ponašanja), ali ga ne popunjava, tj. ne daje

konkretne vrednosti atributima. Klasa je softverski opis objekta. Ona definiše sadržaj i strukturu

objekta koji se, na osnovu toga, može kreirati. Popunjavanjem sadržaja i strukture dobija se

pojedinačni objekat. Dok klasa definiše od čega se sastoji neki objekat, objekat je stvarni primerak

klase. Na primer, recept za pravljenje soka od višnje je analogno klasi, a sam sok od višnje, koji

može da se pije, je objekat.

Na kraju. važno je zapamtiti da u programiranju klasa definišu novi tip podataka.

7.2.1. Opšti oblik klase

Klasa se deklariše pomoću ključne reči class. Opšti oblik definicije klase je:

class imeKlase {

tip promenljiva_instance1; tip promenljiva_instance2; … tip promenljiva_instanceN; tip imeMetode1 (lista-parametra) { //telo metode } tip imeMetode2 (lista-parametra) { //telo metode }

. . . tip imeMetodeN (lista-parametra) { //telo metode }

}

Promenljive definisane unutar klase nazivaju se promenljive instance. One definišu stanje objekata

(atributi), I svaki objekat sadrži sopstvenu kopiju tih promenljivih. Kôd klase se nalazi u

metodama. Metode i promenljive nazivaju se zajedničkim imenom članovi klase. U opštem

slučaju, metode klase određuju ponašanje objekta tj. akcije i operacije nad atributima.

Page 47: Elektronske lekcije o osnovnim konceptima objektno

47

Primer 19. prikazuje jednostavnu klasu koja ima samo tri atributa.

Nakon pokretanja, dobija se ispis na ekranu kao na slici 7.3.

Ova klasa definiše novi tip podataka koji se zove Kutija. To ime se koristi za deklarisanje objekta

tipa Kutija. Svaki objekat ove klase imaće svoje vrednosti za promenljive širina, visina, dubina.

U Test klasi napravljen je objekat ove klase i dodeljene su mu vrednosti za dimenzije. Za te

vrednosti program računa i ispisuje zapreminu.

U okviru primera 20. proširena je klasa Kutija iz prethodnog primera i pored promenljivih kreirana

je i jedna metoda koja izračunava zapreminu.

class Kutija {

double sirina;

double visina;

double dubina;

}

class Test {

public static void main(String[] args) {

//kreiranje objekta klase Kutija

Kutija mojaKutija = new Kutija();

double zapremina;

//dodela vrednosti atributima

mojaKutija.sirina = 10;

mojaKutija.visina = 15;

mojaKutija.dubina = 20;

zapremina = mojaKutija.sirina * mojaKutija.sirina *

mojaKutija.sirina;

System.out.println("Zapremina je " + zapremina);

}

}

Zapremina je 3000.0

Primer 19. – Kreiranje objekta klase Kutija

Slika 7.3 – Ispis zapremine za određeni kreirani objekat

class Kutija {

double sirina;

double visina;

double dubina;

//metoda koja vraća zapreminu konkretnog objekta

double zapremina(){

return sirina * visina * dubina;

} }

Page 48: Elektronske lekcije o osnovnim konceptima objektno

48

Nakon pokretanja programa dobija se ispis kao na slici 7.4.

U Test klasi kreirana su dva objekta klase Kutija i za oba je izračunata zapremina, pozivanjem

metode iz klase Kutija.

7.2.2. Vrste promenljivih

Promenljiva je imenovani prostor u memoriji kojim program može da manipuliše. Svaku

promenljivu karakterišu: ime, tip i vrednost. Ime promenljive je identifikator. Tip promenljive je

jedan od dostupnih tipova podataka koje Java obezbeđuje. Promenljiva sadrži vrednost ili je

pokazivač na objekat. Ako sadrži vrednost, ta vrednost je literal (primitivni tip).

Svaka promenljiva mora biti deklarisana pomoću naredbe za deklaraciju promenljivih. Pored

deklarisanja, naredbom za deklaraciju mogu biti zadate i početne vrednosti promenljivih.

Postoje tri vrste promenljivih u programskom jeziku Java:

class Test {

public static void main(String[] args) {

//kreiranje objekata klase Kutija

Kutija mojaKutija1 = new Kutija();

Kutija mojaKutija2 = new Kutija();

//dodela vrednosti atributima

mojaKutija1.sirina = 10;

mojaKutija1.visina = 15;

mojaKutija1.dubina = 20;

mojaKutija2.sirina = 5;

mojaKutija2.visina = 8;

mojaKutija2.dubina = 4;

double zapremina;

//pozivanje metode za izračunavanje zapremine prve kutije

zapremina = mojaKutija1.zapremina();

System.out.println("Zapremina prve kutije je " + zapremina);

//pozivanje metode za izračunavanje zapremine druge kutije

zapremina = mojaKutija2.zapremina();

System.out.println("Zapremina druge kutije je " + zapremina);

}

}

Zapremina prve kutije je 3000.0

Zapremina druge kutije je 160.0

Slika 7.4 – Ispis nakon proširenja klase Kutija

Primer 20. – Proširena klasa Kutija

Page 49: Elektronske lekcije o osnovnim konceptima objektno

49

Lokalna promenljive - deklarisane unutar metode, konstruktora ili bloka naredbi. One

postoje samo za vreme izvršavanja metode, kostruktora ili bloka, po završetku izvršavanja

one se brišu iz memorije. Zato se ni ne mogu koristiti negde izvan svoje metode.

Modifikatori pristupa se ne mogu koristiti uz lokalne promenljive. Ove promenljive moraju

imati eksplicitno dodeljenu vrednost pre korišćenja, jer im se pri alociranju ne dodeljuje

nikakav podrazumevana vrednost.

Instancne promenljive - deklarišu se u klasi ali izvan metoda, konstruktora ili bilo kakvih

blokova. Instancne promenljive se kreiraju u trenutku kreiranja objekat korišćenjem

ključne reči new i prestaju da postoje kada objekat bude uništen. Modifikatori pristupa se

mogu koristiti uz ovaj tip promenljive. Vidljive su za sve metode, konstruktore ili blokove

unutar klase. Instancne promenljive imaju podrazumevane vrednosti. Za brojeve,

podrazumevana vrednost je 0, za boolean je false, a za referencu objekata je null.

Vrednosti se mogu dodeliti tokom deklaracije ili unutar konstruktora. Može im se pristupiti

direktno pozivom imena promenljive unutar klase. Međutim, u okviru statičkih metoda,

treba ih pozvati koristeći sledeći poziv referencaObjekta.imePromenljive.

Klasne promenljive - nazivaju se i statičkim, deklarišu se unutar klase upotrebom

modifikatora static pri deklaraciji. Statičke promenljive se stvaraju kada se program

pokreće i prestaju da postoje kada se program zaustavi. Ove promenljive se automatski

inicijalizuju podrazumevanim vrednostima (iste kao kod instancnih promenljivih). Može

im se pristupiti i kada ne postoji instanca te klase, i to pozivanjem klase na sledeći način -

imeKlase.imepromenljive. Kada se statičke promenljive proglase javnim konstantama

pomoću modifikatora public i final, onda se imena takvih promenljivih pišu velikim

slovom .

7.2.3. Statički i nestatički članovi klase

Članovi klase mogu biti statički, oni koji u definiciji sadrže modifikator static,

ili nestatički (objektni).

Već je pomenuto da klasa opisuje objekte sa zajedničkim osobinama i da svaki objekat neke klase

ima istu strukturu, koja se sastoji od promenljivih (atributa) i metoda definisanih unutar njegove

klase. Preciznije je reći da nestatički deo neke klase opisuje objekte koji pripadaju toj klasi. To

znači da će promenljive koja ne sadrže static dobiti svoje aktuelne vrednosti pri kreiranju

konkretnog objekta. Pri tom različiti objekti mogu imati različite vrednosti za tu promenljivu. Za

statička polja aktuelne vrednosti se nalaze u samoj klasi i iste su za sve objekte [6].

Stoga se statičke promenljive i metode mogu koristiti nezavisno od objekta klase u kojoj su

definisane. Pristupa im se tako što se navede ime klase, zatim operator tačka i ime promenljive ili

metode.

Što se tiče metoda, najpoznatiji primer statičke metode je metoda main(). Ona mora biti static

jer se poziva pre kreiranja bilo kakvog objekta.

Međutim, važno napomenuti da statičke metode imaju neka ograničenja i to:

mogu direktno pozivati samo druge statičke metode,

Page 50: Elektronske lekcije o osnovnim konceptima objektno

50

mogu direktno pristupati samo statičkim podacima,

u njima se ne mogu koristiti ključne reči this i super.

Primer 21. prikazuje klasu koja sadrži statičku metodu, statičke promenljive i statički blok za

inicijalizaciju

Pri pokretanju programa, dobija se ispis na ekranu kao na slici 7.5.

Dakle, pošto se učita klasa Test, izvršavaju se svi njeni elementi označeni kao static. Najpre se

promenljivoj x dodeli vrednost 5, zatim se izvršava blok označen sa static koji ispisuje poruku I

dodeljuje promenljivoj y vrednost x*5. Potom se poziva metoda main()koja poziva metodu

stampaj().

U primeru 22 biće prikazan slučaj kada se statičkoj metodi I promenljivoj pristupa preko imena

klase u kojoj su definisani.

class Test {

//statičke promenljive

static int x = 5;

static int y;

//metoda za ispis vrednosti promenljivih

static void stampaj() {

System.out.println("x je " + x);

System.out.println("y je " + y);

}

//statički blok

static {

System.out.println("Statički blok za inicijalizaciju.");

y = x * 5;

}

public static void main(String[] args) {

stampaj();

}

}

Statički blok za inicijalizaciju.

x je 5

y je 25

Primer 21. – Statičke promenljive i statički blok

Slika 7.5 – Ispis nakon pokretanja programa

Page 51: Elektronske lekcije o osnovnim konceptima objektno

51

Primer 22. ilustruje upotrebu statičke metode i promenljive iz druge klase.

Nakon pokretanja, dobija se ispis kao na slici 7.6.

7.2.4. Kreiranje objekta

Objekat određene klase kreira se u dva koraka. Prvo se deklariše promenljiva čiji tip odgovara

klasi. Ta promenljiva ne definiše objekat, već samo može da pokazuje na njega. Zatim se kreira

stvarna fizička kopija objekta koja se dodeljuje toj promenljivoj. To se postiže pomoću ključne

reči new. Operator new dinamički dodeljuje memoriju za objekat i programu vraća reference na

taj blok memorije. Ta referenca se smešta u promenljivu, ona predstavlja adresu objekta koji je

napravljen u memoriji pomoću ključne reči new.

U primeru gde je kreirana klasa Kutija, kreiran je i objekat te klase i to na sledeći način:

Kutija mojaKutija = new Kutija( );

U ovom izrazu izvršena su oba opisana koraka koja se izvršavaju pri kreiranju objekta. Da bi

postupak bio jasniji ovaj izraz se može razložiti na dva izraza:

Kutija mojaKutija; mojaKutija = new Kutija( );

class Stampanje {

//statičke promenljive

static int x = 5;

static int y = 30;

//statička metoda

static void pozovi() {

System.out.println("x je " + x);

}

}

class Test {

public static void main(String[] args) {

//pozivanje statičke metode

Stampanje.pozovi();

System.out.println("y je " + Stampanje.y);

}

}

x je 5

y je 30

Primer 22. – Statičke metode i promenljive

Slika 7.6 – Ispis nakon pokretanja programa

Page 52: Elektronske lekcije o osnovnim konceptima objektno

52

U prvom izrazu deklariše se promenljiva mojaKutija koja će sadržati reference na objekat tipa

Kutija. Ta promenljiva ima podrazumevanu vrednost null i ne pokazuje ni na jedan objekat. U

drugom koraku najpre se pomoću ključne reči new kreira objekat u memoriji, zatim se operatorom

dodele promenljivoj mojaKutija dodeljuje referenca na njega. Zapravo mojaKutija sadrži

memorijsku adresu objekta.

7.2.5. Konstruktori

Kao što je već pomenuto operator new u trenutku izvršavanja dodeljuje memoriju objektu. Opšti

oblik upotrebe ovog operatora je:

promenljiva = new imeKlase( );

U ovom izrazu promenljiva je istog tipa kao i objekat koji se kreira, a imeKlase je klasa čija se

instanca kreira. Pomoću imena klase iza koga slede zagrade zadaje se konstruktor klase.

Konstruktor (engl. constructor) je specijalni tip metode koji se koristi da inicijalizuje objekt.

Konstruktor se poziva u trenutku kreiranja objekta. On konstruiše vrednosti, tj. obezbeđuje podatke

za objekt i otuda mu to ime. Svaka klasa ima bar jedan konstruktor. Ukoliko programer eksplicitno

ne kreira konstruktor za neku klasu, kompajler će automatski dodati podrazumevani (engl. default)

konstruktor.

Postoje dva definisana pravila za konstruktore.

Ime konstruktora mora biti isto kao ime njegove klase.

Konstruktor ne sme vraćati nikakav određeni tip.

Primer 23. prikazuje upotrebu konstruktora koji svakoj kutiji dodeljuje iste vrednosti.

class Kutija {

double sirina;

double visina;

double dubina;

// konstruktor koji dodeljuje iste vrednosti atributima za svaki

//objekat

Kutija() {

sirina = 5;

visina = 5;

dubina = 5;

}

// metoda koja vraća zapreminu

double zapremina() {

return sirina * visina * dubina;

}

}

Page 53: Elektronske lekcije o osnovnim konceptima objektno

53

Nakon pokretanja programa dobija se ispis kao na slici 7.7.

Podrazumevani konstruktor obezbeđuje podrazumevane vrednosti za objekt, i to 0 za numeričke

promenljive, false za logičke promenljive, \u0000 za znakovne promenljive, null za klasni tip

promenljive.

Kako konstruktor u ovom primeru nije preterano upotrebljiv, jer svim kutijama dodeljuje iste

dimenzije, potrebno je definisati konstruktor koji kreira objekte različitih dimenzija. U jednoj klasi

dozvoljeno je definisati više konstruktora i po potrebi pozivati odgovarajući.

U primeru 24. prikazana je upotreba konstruktora sa parametrima.

Zapremina je 125.0

class Test7 {

public static void main(String[] args) {

//kreiranje kutije čije su dimenzije zadate konstruktorom

Kutija mojaKutija = new Kutija();

double zapremina;

// pozivanje metode za izracunavanje zapremine

zapremina = mojaKutija.zapremina();

System.out.println("Zapremina je " + zapremina);

}

}

Primer 23. –Upotreba konstruktora

Slika 7.7 – Ispis nakon pokretanja programa

class Kutija {

double sirina;

double visina;

double dubina;

// konstruktor koji dodeljuje iste vrednosti atributima za svaki

//objekat

Kutija() {

sirina = 5;

visina = 5;

dubina = 5;

}

// konstruktor sa parametrima

Kutija(double s, double v, double d) {

sirina = s;

visina = v;

dubina = d;

}

Page 54: Elektronske lekcije o osnovnim konceptima objektno

54

Nakon pokretanja programa dobija se ispis kao na slici 7.8.

U Test klasi kreirana su dva objekta klase Kutija, pomoću konstruktora sa parametrima. Pri pozivu

konstruktora, svaki objekat se inicijalizuje vrednostima parametara konstruktora.

7.2.6. Ključna reč this

Ključna reč this u programskom jeziku Java koja se koristi kao referenca na objekat date klase.

Parametrima konstruktora često se daju ista imena koja imaju objektni atributi klase, pa je

neophodno napraviti razliku između lokalne promenljive i atributa objekta. To se postiže

umetanjem prefiksa this uz objektne atribute.

double zapremina() {

return sirina * visina * dubina;

}

}

class Test1 {

public static void main(String[] args) {

// kreiranje objekta pomoću konstruktor sa parametrima

Kutija mojaKutija1 = new Kutija(10, 15, 20);

Kutija mojaKutija2 = new Kutija(5, 8, 4);

double zapremina;

zapremina = mojaKutija1.zapremina();

System.out.println("Zapremina je " + zapremina);

zapremina = mojaKutija2.zapremina();

System.out.println("Zapremina je " + zapremina);

}

}

Zapremina je 3000.0

Zapremina je 160.0

class Kutija {

double sirina;

double visina;

double duzina;

// konstruktor sa paremetrima i ključna reč this

Kutija(double sirina, double visina, double duzina) {

this.sirina = sirina;

this.visina = visina;

this.duzina = duzina;

}

}

Slika 7.8 – Ispis nakon pokretanja programa

Primer 25. – Upotreba ključne reči this

Primer 24. – Konstruktor sa parametrom

Page 55: Elektronske lekcije o osnovnim konceptima objektno

55

U primeru 25. nazivi objektnih atributa i parametara konstruktora su isti. Iz tog razloga bi došlo

do greške i kreirani objekti ne bi dobili željene vrednosti za njihove atribute širinu, visinu i dužinu,

da se ključnom rečju this nije napravila razlika između naziva atributa i parametara.

Pored toga, rezervisana reč this može biti upotrebljena da pozove konstruktor date klase. Naime,

kada klasa ima više konstruktora, a želi se ponovna upotreba konstruktora koristi se - this(). Treba

imati u vidu jedno ograničenje kada se o ovoj upotrebi radi - Poziv nekog konstruktora pomoću

this mora biti prva naredba u drugom konstruktoru.

Primer 26. ilustruje upotrebu ključne reči this pri pozivu drugog konstruktora.

Pri pokretanju ovog programa dobija se ispis kao na slici 7.9.

class Kutija {

double sirina;

double visina;

double duzina;

// konstruktor sa parametrima

Kutija(double sirina, double visina, double duzina) {

this.sirina = sirina;

this.visina = visina;

this.duzina = duzina;

}

// konstruktor koji poziva konstruktor sa parametrima

Kutija() {

this(4, 6, 8);

}

double zapremina() {

return sirina * visina * duzina;

}

}

class Test {

public static void main(String[] args) {

// poziv konstruktor koji poziva konstruktor

Kutija mojaKutija = new Kutija();

double zapremina;

zapremina = mojaKutija.zapremina();

System.out.println("Zapremina je " + zapremina);

}

}

Zapremina je 192.0

Primer 26. – Konstruktor sa parametrom

Slika 7.9 – Ipis nakon pokretanja programa

Page 56: Elektronske lekcije o osnovnim konceptima objektno

56

8. Osnovni koncepti objekno orijentisanog programiranja

8.1. Nasleđivanje

Nasleđivanje (engl. inheritance) je jedan od osnovnih koncepata objektno orijentisanog

programiranja, ono predstavlja mehanizam koji obezbeđuje da jedna klasa nasleđuje sve atribute

(polja) i ponašanja (metode) neke druge klase. Ideja na kojoj se zasniva nasleđivanje je da se mogu

kreirati nove klase koje u potpunosti preuzimaju funkcionalnost postojeće klase. Ta nova klasa

sadrži sve sto i klasa od koje je nastala, ali i nove, samo svoje atribute ili metode.

Dakle, različite klase mogu imati neka zajednička svojstva koja se, recimo, čuvaju u nekoj opštoj

klasi, koju onda mogu deliti razne klase. Klasa koja nasleđuje neku drugu klasu naziva se izvedena

klasa ili potklasa (eng. subclass), a klasa čija se svojstva nasleđuju natklasa (engl. superclass).

Nasleđivanje se obezbeđuje ključnom rečju extends i sintaksa nasleđivanja izgleda ovako:

class imePodklase extends imeSuperklase {

//polja i metode

}

Klasa može da ima samo jednu natklasu, ali svaka klasa može da ima neograničeni broj izvedenih

klasa.

Za jednostavan primer nasleđivanja može se uzeti nova klasa UkrasnaKutija, koja nasleđuje već

poznatu klasu Kutija (primer 25). Primerak nove klase bi bila kutija pa bi imala sve osobine jedne

kutije, ali i nešto što je karakteristično samo za nju, a to je u ovom slučaju boja. Pozivanjem

konstruktora nove klase dodeliće se vrednosti svim atributima jedne ukrasne kutije, znači objekat

nove klase dobiće vrednosti za visinu, dužinu, širinu i boju.

Treba primetiti da se na ovaj način kôd duplira, time što se u okviru novog konstruktora eksplicitno

dodeljuju vrednosti promenljivama koje su zajedničke za obe klase - visina, dužina, širina. Pa se

na neki način kôd iz konstruktora natklase ponavlja u novom konstruktoru. Osim što je neefikasno,

ovaj postupak zahteva i da potklasi bude dozvoljen pristup tim članovima. Nekada je potrebno da

natklasa čuva svoje podatke tj. da joj pojedini članovi imaju modifikator pristupa private, pa u

tom slučaju potklasa ne bi mogla da pristupi tim promenljivama direktno, niti da ih inicijalizuje.

Ovaj problem u programskom jeziku Java je regulisan pomoću ključne reči super.

Kad god potklasa treba da se „obrati” svojoj natklasi ona to može učiniti pomoći ključne reči

super.

Page 57: Elektronske lekcije o osnovnim konceptima objektno

57

U primeru 27. prikazano nasleđivanje i upotreba ključne reči super za pozivanje konstruktora

natklase.

Nakon pokretanja ovog programa dobija se poruka kao na slici 8.1.

public class Kutija {

double sirina;

double visina;

double duzina;

// konstruktor sa parametrima

Kutija(double sirina, double visina, double duzina) {

this.sirina = sirina;

this.visina = visina;

this.duzina = duzina;

}

double zapremina() {

return sirina * visina * duzina;

}

}

public class UkrasnaKutija extends Kutija {

String boja;

//konstruktor izvedene klase

UkrasnaKutija(String boja, double sirina, double visina, double duzina){

//pozivanje konstruktora natklase

super(sirina, visina, duzina);

this.boja = boja;

}

}

class Test {

public static void main(String[] args) {

//kreiranje instance izvedene klase

UkrasnaKutija ukrasnaKutija = new UkrasnaKutija("plava",5,3,4);

double zapremina;

//pozivanje metode iz natklase

zapremina = ukrasnaKutija.zapremina();

System.out.println("Boja kutije je " + ukrasnaKutija.boja);

System.out.println("Zapremina je " + zapremina);

}

}

Boja kutije je plava

Zapremina je 60.0

Slika 8.1 – Ispis nakon kreiranja objekta izvedene klase

Primer 27. – Nasleđivanje

Page 58: Elektronske lekcije o osnovnim konceptima objektno

58

8.2. Polimorfizam

Polimorfizam (engl. polymorphism) u programskom jeziku Java je koncept objektno orijentisanog

programiranja koji predstavlja mogućnost da se jedan isti poziv metoda ponaša različito u

zavisnosti od tipa objekta nad kojim se metod primenjuje. Reč polimorfizam se izvodi iz dve grčke

reči: poly (više) i morphe (oblik). Dakle, polimorfizam znači više oblika.

Kada se posmatra promenljivu tipa bazne klase, npr. Zivotinja, osim što se u njoj može čuvati

referenca na objekat te klase, Zivotinja, što je uobičajno, može se takođe čuvati i referenca na

objekat proizvoljne potklase npr. Pas, Macka, Patka. Štaviše, to je jedan od uslova koji moraju biti

ispunjeni da bi polimorfizam funkcionisao.

Dakle, promenljiva tipa Zivotinja može da pokazuje na promenljivu tipa Pas, Macka, Patka, jer

sve su to životinje i nastale su iz klase Zivotinja. Pa u konstataciji - Pas je zivotinja. – nema greške,

jer pas jeste životinja. Kako je svaka klasa direktno ili indirektno izvedena iz klase Object, tako

se može reći - Pas je objekat - i da opet konstatacija bude istinita.

Imajući ovo u vidu, može se zaključiti da se reference na objekat neke klase mogu čuvati u

promenljivama tipa klase iz koje je izvedena. Koncept polimorfizma se ogleda u tome što se

metode mogu ponašati različito u zavisnosti od toga na koji objekat neka promenljiva pokazuje.

Metod koji će se polimorfno pozivati mora biti deklarisan i u baznoj i u izvedenim klasama za čije

se objekte poziva taj metod.

Polimorfizam se primenjuje isključivo na metode, ne i na atribute klase.

Uslovi koji moraju biti ispunjeni su:

u promenljivoj tipa bazne klase nalazi se referenca na objekat izvedene,

pozvani metod mora biti definisan u izvedenoj klasi,

potpisi metoda u baznoj i izvedenoj klasi moraju biti isti,

povratni tipovi metoda bazne i izvedene klase moraju biti isti,

pristupni nivo metoda izvedene klase ne sme biti restriktivniji od odgovarajućeg

pristupnog nivoa bazne.

U primeru 28. ilustrovano je kako funkcioniše princip polimorfizma kroz metod oglasavanje(), on

će se u zavisnosti od vrste životinje različito ponašati. Primer preuzet iz [6].

Slika 8.2 – Polimorfizam

Page 59: Elektronske lekcije o osnovnim konceptima objektno

59

class Zivotinja {

String vrsta;

//konstruktor

Zivotinja(String vrsta) {

this.vrsta = vrsta;

}

oglasavanje() {

}

}

class Pas extends Zivotinja {

String ime;

String rasa;

//konstruktor koji poziva super konstruktor natklase

Pas(String ime, String rasa){

super(“Pas”);

this.ime=ime;

this.rasa=rasa;

}

//metoda za oglasavanje pasa

oglasavanje() {

System.out.println("Av, Av!");

}

} class Patka extends Zivotinja {

String boja;

//konstruktor koji poziva super konstruktor natklase

public Patka(String boja){

super(“Patka”);

this.boja=boja;

}

//metoda za oglasavanje patke

public oglasavanje() {

System.out.println("Kva, Kva!");

}

} public class Test {

public static void main(String[] args) {

//prom. klase Zivotinja pokazuje na objekat njene potklase Pas

Zivotinja pas = new Pas("Badi", "labrador");

//prom. klase Zivotinja pokazuje na objekat njene potklse Patka

Zivotinja patka = new Patka("žuta");

// poziv polimorfne metode oglasavanje()

System.out.println("Pas kaže: ");

pas.oglasavanje();

System.out.println("Patka kaže: ");

patka.oglasavanje();

}

}

Primer 28. – Polimorfizam

Page 60: Elektronske lekcije o osnovnim konceptima objektno

60

Nakon pokretanja programa, dobija se sledeči kao na slici 8.3.

Metoda se ponaša polimorfno, u zavisnosti od tipa objekta ispisuje odgovarajuću poruku.

8.3. Apstrakcija

Mehanizmom nasleđivanja klase mogu da budu povezane hijerarhijskim vezama (superklasa-

potklasa). Potklasa nasleđuje sva svojstva (atribute i metode) svih superklasa u hijerarhiji. Klase

na višim hijerarhijskim nivoima su uopštenije, tj. sadrže opštija svojstva koja važe za veći broj

potklasa. Ponekad, superklasa postane toliko uopštena da ona ne može da ima direktnu svoju

primenu u vidu nekog objekta. Takva klasa se onda naziva apstraktnom klasom.

Apstraktna klasa je klasa koja je deklarisana ključnom reči abstract i ne može da kreira svoje

objekte. Potreba za apstraktnom klasom proizilazi iz potrebe za kreiranjem apstraktnih metoda,

koje omogućavaju korišćenje prednosti polimorfizma.

Za potrebe pojašnjavanja ovog koncepta može se razmotriti primer gde bi bazna klasa bila klasa

Povrs i njenje polimorfne metode obim() i povrsina(), a izvedene klase Krug i Pravougaonik. Telo

metoda bi u baznoj klasi ostalo prazno, jer nije moguće implementirati ga, pošto ne postoji

univerzalni način za računanje površine površi kada se ne zna o kojoj površ je reč. Međutim

prisustvo tog metoda u baznoj klasi je neophodno, jer to zahteva polimorfizam. Takav metod

moguće je proglasiti apstraktnim. To se čini navođenjem ključne reči abstract ispred povratnog

tipa metoda i tačka-zarez (;) umesto tela metoda:

abstract double povrsina();

Ako klasa ima bar jednu apstraktnu metodu i sama postaje apstraktna, te se i u prvom redu njene

definicije, ispred reči class, mora navesti ista ključna reč, abstract. Ukoliko se u klasi koja je

izvedena iz neke apstraktne klase ne predefinišu sve apstraktne nasleđene metode, onda će i sama

izvedena klasa biti apstraktna, i u tom slučaju neće biti moguće kreiranje ni objekata izvedene

klase.

Primer 29. prikazuje upotrebu apstrakne klase.

Pas kaže: Av, Av! Patka kaže: Kva, Kva!

public abstract class Povrs{

public abstract double obim();

public abstract double povrsina();

} //klasa pravougaonik izvedena iz klase Povrs

class Pravougaonik extends Povrs{

private double a;

private double b;

Slika 8.3 – Ispis nakon pokretanja programa

Page 61: Elektronske lekcije o osnovnim konceptima objektno

61

Nakon pokretanja programa dobika se ipis kao na slici 8.4.

Važno je zapamtiti da apstraktne metode ne smeju biti privatne (private), jer u tom slučaju neće

biti nasleđene, pa se ne mogu predefinisati u izvedenim klasama.

//konstruktor

public Pravougaonik(double a, double b) {

this.a = a;

this.b = b;

}

//implementacija apstraktnog metoda za racunanje obima pravougaonika

double obim() {

return 2 * a + 2 * b;

}

//impl. apstraktnog metoda za racunanje povrsine pravougaonika

double povrsina() {

return a * b;

}

}

// klasa Krug izvedena iz klase Provs

class Krug extends Povrs {

private double r;

//konstruktor

public Krug(double r) {

this.r = r;

}

//implementacija apstraktnog metoda za racunanje obima kruga

double obim() {

return 2 * r * Math.PI;

}

// implementacija apstraktnog metoda za racunanje povrsine kruga

double povrsina() {

return r * r * Math.PI;

}

}

class Test {

public static void main(String args[]) {

Povrs p = new Pravougaonik(2, 3);

System.out.println("obim pravougaonika je " + p.obim());

Povrs s = new Krug(3);

System.out.println("obim kruga je " + s.obim());

}

}

obim pravougaonika je 10.0 obim kruga je 18.84955592153876

Primer 29. – Apstrakcija

Slika 8.4 – ispis nakon pokretanja programa

Page 62: Elektronske lekcije o osnovnim konceptima objektno

62

8.4. Enkapsulacija

Enkapsulacija (eng. encapsulation) je još jedan od osnovnih principa objektno orijentisanog

programiranja. Enkapsulacija podrazumeva skrivanje podataka od spoljnih pristupa. Primena

enkapsulacije je izuzetno bitna, pogotovo kod velikih projekata. Poštovanjem pravila

enkapsulacije obezbeđuje se da objekti imaju strogo kontrolisane ulaze i izlaze, a samim tim se

smanjuje mogućnost greške, logičke nedoslednosti ili grešaka u programu.

Skrivanje podataka se postiže upotrebom ključne reči private. Na taj način niko van te klase ne

može neplanirano da promeni podatak. Svako pristupanje podacima vrši se isključivo preko javnih

metoda kreiranih za te potrebe a to su metode - getXXX() i setXXX().

Metoda getXXX() služi za dohvatanje podataka, tj. ona vraća vrednost neke promenljive, dok

metoda setXXX() služi za postavljanje neke nove vrednosti promenljive. Metode "geteri" moraju

vraćaju isti tip podatka koji je i promenljiva čiji su oni "geter". Metode koje setuju podatke,

"seteri", moraju da primaju podatak istog tipa kao što je i podatak koji setuju. Koristeći "seter" ili

"geter" metode, klasa može postati dostupna samo za čitanje (engl. read-only) ili samo za pisanje

(engl. write-only). Na taj način se obezbeđuje kontrola nad podacima.

Primer 30. prikazuje kako se upotrebljava enkapsulacija.

public class Student{

private String ime;

private String prezime;

//geter za promenljivu ime, vraca ime

public String getIme(){

return ime;

}

//seter za promenljivu ime, postavlja ime

public void setIme(String ime){

this.ime=ime;

}

//geter za promenljivu prezime, vraca prezime

public String getPrezime(){

return prezime;

}

//seter za promenljivu prezime, postavlja vrednost

public void setPrezime(String prezime){

this.prezime=prezime;

}

}

public class Test{

public static void main(String[] args){

Student s = new Student();

s.setIme("Petar");

s.setPrezime("Petrovic");

System.out.println(s.getIme()+" "+s.getPrezime());

}

}

Primer 30. – Enkapsulacija

Page 63: Elektronske lekcije o osnovnim konceptima objektno

63

Nakon pokretanja programa dobija se ispis kao na slici 8.5.

8.5. Interfejsi

Interfejsi (engl. interfaces) u programskom jeziku Java predstavljaju mehanizam za postizanje

potpune apstrakcije. Kada je potrebno specificirati zajednička svojstva povezanih klasa, ali i

nepovezanih klasa koristi se interfejs. To je zapravo kolekcija apstraktnih metoda i konstanti, a u

većini slučajeva, sadrži samo metode. Kako se za metode podrazumeva da su public i abstract, pa

se ove ključne reči ne navode. Metode u interfejsu ne mogu biti statičke. Interfejs se definiše kao

klasa, ali koristeći ključnu reč - interface.

public interface imeInterfejsa {

}

Interfejs se može posmatrati i kao jedna specifična klasa u jeziku Java. Svaki interfejs, pri

kompajliranju, se pretvara u posebnu datoteku sa bajtkodom. Može se koristiti kao tip podataka za

referencu promenljive. Kao i apstraktna klasa, interfejs ne može da ima svoj objekat.

Interfejs se koristi tako što ga implementira neke klasa, pomoću ključne reči - implements. To se

postiže na sledeći način: public class imeKlase implements imeInterfejsa {

}

Svaka metoda deklarisana u interfejsu mora imati definiciju unutar klase da bi bilo moguće kreirati

konkretne objekte te klase.

Važno je zapamtiti nekoliko pravila kojih se treba pridržavati u radu sa interfejsima.

Metode koje se definišu unutar klase koja implementira interfejs moraju biti javne (public).

Ukoliko se ne definiše bar jedna metoda u klasi koja implementira interfejs, ta klasa postaje

apstraktna.

Klasa može implementirati više interfejsa.

Interfejs može da nasleđuje interfejs (nasleđivanje).

Interfejs može da nasleđuje više interfejsa (višestruko nasleđivanje).

Petar Petrovic

Slika 8.5 – Ipis poruke nakon pokretanja programa

Page 64: Elektronske lekcije o osnovnim konceptima objektno

64

Primer 31. ilustruje implementiranje interfejsa. Primer preuzet iz [8].

Nakon pokretanja programa dobija se ipis kao na slici 8.6.

public interface Printable {

void print();

}

public interface Showable {

void show();

}

//klasa A1 implementira dva interfejsa

public class A1 implements Printable, Showable {

//implementacija metode iz interfejsa Printable

public void print() {

System.out.println("Thank you");

}

//implementacija metode iz interfejsa Showable

public void show() {

System.out.println("Bye");

}

public static void main(String args[]) {

A1 obj = new A1();

obj.print();

obj.show();

}

}

Thank you

Bye

Primer 31. - Interfejsi

Slika 8.6 – Ipis poruke nakon pokretanja programa

Page 65: Elektronske lekcije o osnovnim konceptima objektno

65

9. Zaključak

Java je savremeni programski jezik koji se zasniva na konceptima objektno

orijentisanostnog programiranja. Prvobitno je dizajniran sa ciljem da sa što manje dodataka,

omogući programerima razvoj aplikacija bilo koje vrste. Od svojih početaka programski jezik Java

je bio u središtu kulture inovacija. Prvo izdanje Jave promenilo je način programiranja za internet.

Java virtualna mašina i bajtkôd izmenili su način razmišljanja o problemima bezbednosti i

prenosivosti koda. Apleti su oživeli do tada statičan internet. Kako se Java koristi i za

programiranje aplikacija za Android operativni sistem, ona je sastavni deo revolucije koja je

pokrenuta sa pojavom pametnih telefona. Svet Jave nikada nije dugo stajao u mestu, aktuelna

verzija je Java SE 8.

U odnosu na druge programske jezike, Javu najčešće upoređuju sa programskim jezicima:

C, C++, C#, Pajton. Može se reći da su pojedini jezici brži i u određenim poljima su svakako lakši

za korišćenje, ali širok spektar mogućnosti i univerzalnost implementacije programa (princip

“napiši jednom, pokreni bilo gde”) čini programski jezik Java uvek korak ispred ostalih

programskih jezika. Ako je verovati statističkim podacima od četiri programera na svetu, jedan

programira na ovom jeziku.

Na prethodnim stranicama ovog rada predstavljene su elektronske lekcije o osnovnim

pojmovima i konceptima objektno orijentisanog programiranja u Javi. Treba imati u vidu da se

lekcije mogu koristiti i u svrhu razumevanja objektno orijentisanog programiranja kao tehnike

programiranja. Kako je objektna orijentisanost osobina i drugih programskih jezika (C++, C#,

Smalltalk,itd.), može se istrgnuti iz konteksta jezika Jave i iz ovih lekcija usvojiti koncept koji je

i za druge jezike isti.

S druge strane, svako ko želi da nauči programski jezika Java, trebalo bi da učenje započne

sa osnovama objektno orijentisnog programiranja. U ovom radu su prikazani i objašnjeni primeri

koda koji su neophodni za savladavanje početnog nivoa znanja. Stoga bi elektronske lekcije na

jednostavan i zanimljiv način trebalo da olakšaju razumevanje i učenje programskog jezika Java.

Takođe, zbog javne dostupnosti ove lekcije mogu biti od koristi i široj populaciji i na taj način

doprineti približavanju programskog jezika Java osobama koje se nisu susretale sa

programiranjem.

Page 66: Elektronske lekcije o osnovnim konceptima objektno

66

Literatura

[1] Herbert Schildt, Java kompletan priručnik, Mikro Knjiga, Beograd 2014.

[2] Marko Čupić, Programiranje u Javi:

http://java.zemris.fer.hr/nastava/opjj/book-2015-09-30.pdf

Pristupljeno aprila 2017.

[3] David Flanagan, Java in a Nutshell, O’REILLY, fifth edition, 2005.

[4] Laslo Kraus, Programski jezik Java, Akademska misao, Beograd 2015.

[5] Kathy Sierra, Bert Bates, Head First Java, O’REILLY, second edition, 2005.

[6] Sajt kompanije Oracle, Java documentation:

https://docs.oracle.com/javase

Pristupljeno jula 2017.

[7] Sajt za samostalno učenje sa materijalima iz oblasti programiranja Tutorials point:

https://www.tutorialspoint.com/java

Pristupljeno maja 2017.

[8] Elektronska baza edukacionih radova, priručnika i knjiga iz oblasti Računarstava Znanje.org:

http://www.znanje.org/knjige/computer/Java

Pristupljeno jula 2017.