You are on page 1of 16

Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Uvod u Objektno orijentisano programiranje


i programski jezik JavaTM

Softversko inženjerstvo

Danas se za softversko inženjerstvo najčešće vezuje pojam “programiranje”. Programeri


su, u stvari, inženjeri softvera ili, popularnije, software developers. Da bi neko mogao da
bude uspešan developer, morao bi biti upoznat sa velikim brojem programskih jezika,
pretežno objektno orijentisanih, zatim bazama podataka, osnovnim strukturama i
algoritmima za manipulaciju istim. Međutim, na samom početku, budući inženjer softvera
mora imati čvrstu osnovu u aktuelnom načinu i stilu programiranja - developmenta.

Objektno orijentisan način mišljenja

Šta podrazumeva pojam objektno orijentisan? Razvoj softverskog inženjerstva u svetu


trajao je godinama. Samo programiranje softvera prošlo je kroz nekoliko faza, od kojih su
neke faze i dalje u razvoju, tj. razvijaju se paralelno sa aktuelnim. Programiranje koje je
“osvojilo svet” svodi se na niz programskih naredbi koje se sekvencijalno izvršavaju (jedna
za drugom). Ovo i jeste jedna od suvih definicija programiranja, koja danas nije
univerzalno primenjiva.

Sekvencijalno programiranje se izvodilo korišćenjem jasno definisanih programskih


komandi – sekvenci, koje su se kasnije grupisale u veće module, koji su nazvani
procedurama. Samim tim, ovakvo programiranje dobija naziv proceduralno. Veliki broj
današnjih programskih jezika je proceduralan i visoko upotrebljiv u tzv. sistemskom
programiranju (programiranje modula operativnih sistema oslanja se na podršku brzih
proceduralnih jezika poput programskog jezika C). Prilikom proceduralnog programiranja,
podaci koje program koristi (obrađuje) su odvojeni od samog koda, tj. programske logike,
što je velika mana s obzirom na umanjene mogućnosti kontrole pristupa podacima ili
njenog potpunog odsustva. Ovo je veliki sigurnosni rizik u programiranju.

U filozofiji proceduralnog programiranja, program se posmatra kao black box (crna


kutija), koja, poput procesa, prima ulazne podatke, obrađuje ih i dostavlja izlazne podatke,
tj. u slučaju korišćenja personalnih kompjutera, ispisuje na standardnom izlazu ili smešta u
memoriju računara. Sami podaci se najčešće čuvaju u nekoj globalnoj bazi podataka ili na
udaljenom serveru. Kod, kao izvršni deo programa, kod proceduralnog programiranja
smešten je unutar funkcija i procedura, koje su same po sebi black box sistem obrade
ulaza i dobijanja izlaza.

Unos ulaznih podataka Dostavljanje izlaznih podataka

Slika 1. “Black Box” filozofija proceduralnog programiranja

1/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Objektno orijentisano programiranje uvodi jedan poseban termin – objekat. OO je, kao što
ime kaže, orijentisano ka objektu, koji je osnova ovakvog programiranja. Za početak, za
objekat je najbolje reći da je jedna od osnovnih gradivnih jedinica OO programiranja. Ako
program posmatramo kao organizam, bio bi sastavljen iz modula različitih funkcija, poput
organa. Ovi funkcionalni moduli sačinjeni su iz sopstvenih delova, koji su, u stvari, objekti,
koji međusobno komuniciraju.

Definisanjem jednog ovakvog entiteta, u OO programerskoj filozofiji su sjedinjeni podaci i


ponašanje u jednom potpunom paketu (full package). Obezbeđena je jednistvena kontrola
pristupa podacima, pošto objekat nije prost tip podatka, poput celog broja ili niza znakova,
već skup primitivnijih vrsta podataka, kojima je, po potrebi, dodato određeno ponašanje.

Objekat

U programiranju, ovaj termin ima veoma jasno definisano značenje. No, oslonimo se
trenutno na definiciju objekta u logičnom smislu. Objekat je, dakle, svaki entitet koji je
potrebno predstaviti pomoću određenih standardom definisanih metoda opisivanja
prirodnih ili veštačkih entiteta, pojava, događaja. Dakle, filozofija je jednostavna, sve se
predstavlja objektom, pomoću objekta ili pomoću više različitih objekata. Sve je objekat.

Objekat je jednistvena celina koja sadrži podatke i ponašanje. Sam po sebi, može
sadržati druge podatke, cele brojeve, nizove karaktera, brojeva, druge objekte. Podaci
iskazuju stanje objekta, i zovemo ih atributi. Dakle, objekat ima stanje i ponašanje.

Uzmimo kao primer objekta jednu običnu kantu za otpadke. Da bi bila objekat, potrebno ju
je predstaviti određenim stanjem i ponašanjem. Za početak, odgovorimo na pitanje šta je
to stanje jedne kante za otpadke? To su njeni atributi poput dimenzija, boje, procentualne
popunjenosti i tako dalje. Na slci koja sledi možemo primetiti da se u kanti nalaze zgužvani
papiri. I oni su objekti, samo drugačijeg tipa nego što je kanta.

Slika 2. Objekti “kanta” i “zgužvan papir”

Na slici je data skoro verna specifikacija ova dva objekta. Primetićemo da svaki atribut ima
neku svoju vrednost. Ovo su vrednosti koje jedan objekat razlikuju od drugog (neće svaki
komad papira biti istog prečnika, iako je pojam prečnik u ovom sličaju banalizacija). Sve
ove vrednosti su određenog tipa. Možemo primetiti da su prečnici baza ove kante približne
obliku valjka dati u centimetrima. U programu, ovaj podatak bio bi zapisan kao

2/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

nenegativna celobrojna vrednost, dok bi ime materijala izrade predstavljao neki niz
karaktera. Procentualna popunjenost bi bila neki realan broj. Ono što na slici nije navedeno
kao deo specifikacije jedne kante za otpadke jeste njena mogućnost da skladišti objekte
poput ovih zgužvanih papira. U programu, ovo bi moralo biti implementirano, tj. kao
podatak/atribut/pokazivač stanja postojao bi neki niz objekata koji predstavljaju otpadke u
kanti.

Sada je potrebno odgovoriti na pitanje šta je to ponašanje jedne kante za otpadke? Iako
nam zdrav razum govori da se jedna kanta za otpadke ne “ponaša”, osim ako nije
podpomognuta dobrom tehnologijom iz sfere robotike, mi kao programeri možemo ovo
pitanje sagledati iz jednog drugačijeg ugla. Samo ponašanje ne mora značiti da sama kanta
nešto radi, već i ono što se radi sa kantom može predstavljati ponašanje. Tako, proces
ubacivanja otpadka u kantu možemo nazvati ubaci(), a proces izbacivanja svih otpadaka
iz kante izbaci(). Zagrade nam omogućuju da razlikujemo atribute od metoda, jer su ovo
zaista metode ponašanja kante, tj. metode kontrole nad njom.

Upravo smo naveli primer objekta. Sada je potrebno objasniti još neke termine OO
koncepta, od kojih je svakako najbitniji pojam klasa.

Klasa

U prirodi se može sresti veliki broj sličnih entiteta. Neki su identični, neki imaju jako male
razlike, a neki su potpuno različiti. Međutim, čovek je, zahvaljujući svojoj inteligienciji,
izvršio neke osnovne klasifikacije stvari, bića i pojava koje je sretao tokom života. Tako je,
na primer, nastala klasifikacija živih bića na ljude, životinje i biljke. Pre svega je logično da
neke pojmove zovemo zajedničkim imenima, iako se oni u nekim detaljima razlikuju.
Dakle, klasa u prirodnom poretku definiše neke zajedničke osobine i ponašanja entiteta
koje se ubrajaju pod njenu klasifikaciju, a koji se razlikuju u detaljima vezanih za određene
osobine.

U programiranju, klasa se tretira kao šablon objekta, šematski plan koji se koristi prilikom
kreiranja objekata. Klasa definiše koje će atribute i ponašanja posedovati svaki objekat te
klase, sve početne vrednosti i zahtevana ponašanja realizovana metodama. Dakle, svaki
objekat je jedna instanca svoje klase. Uzmimo kao primer našu kantu za otpadke. Za
početak, postoji više različitih kanti za odpadke. Svaka od njih imaće neke svoje dimenzije,
biće određene boje, a tokom njihovog korišćenja njihova procentualna popunjenost će se
prilično dinamično menjati. Sve one su kante, tako da bi klasa “Kanta” definisala sve
objekte tog tipa, obavezujući svaki od njih da poseduju navedene atribute da iskažu
njihovo stanje.

Sama po sebi, klasa je tip podatka višeg nivoa (celobrojne vrednosti, karakteri i ostali su
prosti – primitivni tipovi podataka). Ukoliko bi, na primer, pomenuta kanta za otpadke
mogla da prima samo zgužvani papir kao svoje otpadke, kao što bi za atribut procentualne
popunjenosti bilo naznačeno da je podatak tipa realan broj, tako bi za niz otpadaka kao
atribut bilo naznačeno da je tipa “Zgužvani papir”.

U OO konceptu, pojam kada objekat sadrži objekte (mobilni telefon sadrži ekran, tastaturu,
baterije...) naziva se kompozicija. Relacija kompozicije između dva objekta naziva se
relacija ima. Dakle, mobilni telefon IMA bateriju.

3/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Metode i komunikacija među objektima

Kao što je već rečeno, metode realizuju zahtevano ponašanje klase. Svi objekti iste klase
imaju iste metode, tj. metode koje vrše istu funkciju ili niz funkcija. One realizuju
aktivnosti objekata i obezbeđuju ponašanje. Neke metode omogućavaju izmenu vrednosti
atributa. Ovo je veoma uobičajena praksa u OO programiranju. U većini slučajeva, pristup
podacima unutar nekog objekta bi trebalo da kontroliše sam objekat – ni jedan objekat ne
bi trebalo da može da menja vrednosti atributa drugog objekta, ukoliko to nije eksplicitno
dozvoljeno ili ne postoji metoda koja je zadužena za to.

Svaka metoda se mora definisati, tj. za svaku metodu moraju biti poznati sledeći
parametri:
- ime metode (jedinstveno opisuje određeno ponašanje)
- argumenti (vrednosti koje joj se prosleđuju)
- povratna vrednost (tip povratne vrednosti)

Metode služe i za komunikaciju među objektima. Komunikacioni mehanizam između


objekata su poruke. Da bi neki objekat pozvao neku metodu drugog objekta, on mu šalje
poruku, a odgovor drugog objekta defnisan je povratnom vrednošću koja je vraćena nakon
inicijalne poruke. Na primer, ukoliko bi objekat “Pera” želeo da sazna ime objekta “Milena”,
on bi pozvao metodu objekta “Milena”, pod imenom “getIme()”, koja je zadužena da kao
svoju povratnu vrednost vrati niz karaktera koji predstavljaju ime.

Enkapsulacija i interfejsi

U toku programiranja, uvek je bitno “ko kosi, a ko vodu nosi”, tj. od velikog je značaja
verno kontrolisati pristup podacima nekog objekta. Veliki je propust ukoliko programer u
svakom momentu nije svestan ko sve može nehotice promeniti interne podatke nekog
objekta. Ovo se najviše izražava prilikom testiranja softvera, bez kojeg ni jedan softver
neće izaći na tržište.

Enkapsulacija je sposobnost objekta da sakrije svoje podatke ili da ih učini selektivno


dostupnim drugim entitetima. Određene detalje, koji nisu važni za korišćenje objekta,
potrebno je sakriti od ostalih objekata, kako oni direktnim pristupom ne bi menjali bitne
podatke. Na primer, ukoliko neki objekat ima mogućnost računanja neke složene
matematičke operacije, korisniku je potrebno pružiti interfejs koji će primiti parametre koji
su potrebni za računanje, a vratiti samo rezultat. Nije potrebno da korisnik poznaje
algoritme koji se koriste za samo izračunavanje, kao ni među-podatke (pr: vrednost
konstante Pi ili konstante e). Enkapsulacija se obezbeđuje interfejsima, tj.
implementacijom samog objekta.

Interfejs je osnovno sredstvo komunikacije među objektima. Bilo koje ponašanje objekta
mora biti pozvano porukom preko interfejsa, koji mora potpuno da opiše kako korisnik
komunicira sa objektom klase. U većini slučajeva, interfejsi su javni, što je logično, s
obzirom da su posrednici u komunikaciji među objektima i sa korisnikom (s tim što je, u
programu, sam korisnik jedan objekat, predstavljen u kodu).

4/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Na poznatom portalu Wikipedia stoji: “Interfejs je obično apstrakcija koju za sebe pruža
entitet spoljašnjoj sredini. On razdvaja metode eksterne komunikacije sa internih operacija,
što omogućava entitetu da bude modifikovan iznutra, a da to ne utiče na njegovu
komunikaciju sa sredinom.”

Dakle, interfejs je apstrakcija objekta, njegov način prezentovanja spoljašnjosti, preko


kojeg će drugi objekti komunicirati sa njime. U osnovi, interfejsi ne sadrže atribute, već
samo metode. Bitno je napomenuti da bi, ukoliko objekat poseduje neki interfejs, trebalo
da interno implementira ponašanje koje taj interfejs opisuje (ne bi bilo dobro da objekat
svojim interfejsom tvrdi kako može da izračuna integral, a da interno algoritmi za ovaj
račun ne postoje).

Nasleđivanje

Prilikom definisanja klase, pomenuli smo klasifikaciju živih bića. Kada bismo definisali klasu
“Živo biće”, mogli bi definisati neke osobine svih živih bića koje su im zajedničke, poput
atributa “starost” (sva živa bića imaju određenu starost). Takođe, kada bi definisali klasu
“Sisar”, mogli bi kao osobinu svih sisara navesti atribut “boja očiju” (svi sisari imaju oči i to
određene boje). Definisanjem klase “Čovek”, u mogućnosti smo da definišemo atribut “ime”
i tako dalje. Međutim, kada bi u klasi “Sisar” definisali atribut “starost”, postojalo bi
preklapanje atributa, jer i klasa “Živo biće ima ovaj atribut”. Naime, svi sisari su živa bića,
kao što su i svi ljudi sisari i živa bića. Ovde se može primetiti određen odnos između klasa.
Ovakve odnose definiše nasleđivanje.

Za početak, potrebno je pomenuti još jednu relaciju među objektima. To je relacija je ili
jeste. Naime, čovek JE sisar, sisar JE živo biće (naravno, iz ovoga sledi: čovek JE živo
biće).

Nasleđivanje se može definisati kao razvrstavanje klasa definisanjem istih osobina različitih
klasa (“starost” je osobina svih živih bića, pa i sisara, a time i ljudi). Ovo omogućava nekoj
klasi da nasledi atribute i metode (stanje i ponašanje) neke klase, čime se definiše odnos
između njih, gde je klasa koja nasleđuje podklasa, a klasa od koje nasleđuje superklasa.

Slika 3. Nasleđivanje i relacija JESTE

5/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Na slici 3 može se primetiti da je glavna superklasa “OBLIK”, a da su njene podklase


“PRAVOUGAONIK”,“KRUG”,“TROUGAO” i “VARNICA”. Ovo znači da važi relacija jeste, tj.
pravougaonik JESTE oblik, krug JESTE oblik i tako dalje. U programiranju, ova relacija
govori o tome da je klasa “KVADRAT” nasledila sve atribute i metode od klase
“PRAVOUGAONIK”, naravno i one koje je ona nasledila od klase “OBLIK”, zato što kvadrat
JESTE oblik.

Iz prethodnog primera se vidi da je stablo nasleđivanja potencijalno veliko. Kada bi


pokušali da hijerarhijski dođemo od žibog bića do konkretne osobe, morali bi proći neki
ovakav lanac: Živo biće – Sisar – Čovek – Amerikanac – Čarli... Potencijal mehanizma
nasleđivanja leži u apstrakciji i tehnici organizacije superklasa i podklasa.

U jednom hijerarhijskom lancu klasa, svaka podklasa je nasledila atribute i metode svoje
superklase. Takođe, nasledila je sve interfejse. Međutim, svaka klasa za sebe implementira
svoje interfejse, tj. svaka klasa na svoj način reaguje na pobude iz spoljašnje sredine, tj.
daje svoj sopstveni odgovor, koji može biti, ali najčešće nije isti kao odgovor koji bi dala
superklasa, od koje je interfejs nasleđen (poenta interfejsa jeste da ga svaka klasa
implementira na sebi svojstven način). Ovakva pojava, gde se načini implementacije
određenih ponašanja klase, tj. njenih objekata razlikuju u lancu hijerarhije nasleđivanja,
zove se polimorfizam.

JavaTM

Programski jezik Java je projektovan tako da se omogući maksimalna prenosivost. Mnogi


programski jezici definicije prepuštaju određenoj implementaciji, dok ih Java utvrđuje
sasvim određeno, sve do mašinskog jezika u kojem se Javin izvorni kod kompajlira u Javine
bajtkodove, koji su projektovani da rade na Javinoj virtuelnoj mašini (Java Virtual
Machine).

Virtuelna mašina omogućava sistem izvršavanja (runtime system), koji pruža pristup
samoj virtuelnoj mašni. Sistem izvršavanja, korišćenjem rukovodioca bezbednosti
(security manager) ili kontrole pristupa (access controler) proverava operacije čija je
bezbednost bitna. Rukovodilac bezbednosti može da zabrani aplikaciji da čita sa lokalnog
diska ili da upisuje na njega (u slučaju Applet-a, na primer), ili može da dozvoli mrežne
veze samo ka određenim mašinama. Šta će tačno biti dozvoljeno aplikaciji da radi, zavisiće
od politike bezbednosti, koja je na snazi u vreme pokretanja aplikacije. Ova politika
podešava se u operativnom sistemu na kojem je instalirana JVM.

Prilikom njihovog učitavanja na virtuelnu mašinu, klase prvo proverava


potvrdilac (bytecode verifier), koji obezbeđuje da se bajtkodovi ispravno
formiraju i zadovolje bezbednosne i sigurnosne garancije.

Kombinacija ovakvih svojstava, omogućuje Javinom kodu potpunu


nezavisnost od platforme, da bi se obezbedio bezbednosni model podesan
za izvršavanje koda učitanog preko mreže na različitim nivoima
poverenja. Javin izvorni kod, koji je kompajliran u Javine bajtkodove,
može da radi na svakoj mašini, na čijem operativnom sistemu je
instalirana JVM. Kod može da se izvršava sa određenim nivoom zaštite,
da bi se nepažljivi i zlonamerni pisci klasa sprečili da oštete sistem. Nivo

6/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

poverenja se može podesiti u zavisnosti od izvora bajtkodova.

U programskom jeziku Java postoji ogromna kolekcija već spremnih softverskih


komponenti za razne namene (Java API). Komponenete su grupisane u biblioteke klasa i
interfejsa.

JavaTM i drugi programski jezici

Naučili smo neke osnovne podatke vezane za programski jezik Java. Hajde da ga sada
uporedimo sa nekoliko aktuelnih programskih jezika. Osnovna sintaksa Jave zaista liči na C
ili C++, a svakako na C#, koji je nastao na osnovu Jave i C-a. Još jedna mala sličnost sa
programskim jezikom C jeste kompaktnost koda. Ovde se prati dobra filozofija C-olikih
jezika koja kaže: neka kod bude što manji i jednostavniji, kako bi programer mogao da ga
lako drži u glavi, bez konstantnog podsećanja. Poput programskog jezika C, u Javi postoje
opcije dodavanja eksternih paketa klasa.

Za sve programske jezike bitno je da obrate pažnju na 3 najbitnije stavke: brzina,


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

Zašto je Java sporija nego C-oliki jezici? Zato što je to interpretiran jezik, dok je C
kompajliran jezik. Šta ovo znači? To znači da se Javine klase prvo moraju interpretirati, pa
zatim kompajlirati, tj. za izvršavanje Javinog koda je potrebno mnogo više vremena. Ovo
nije slučaj kod C-a, pošto se njegov kod izvršava direktno na sistemu. Zato se ovakvi jezici
koriste za tzv “sistemsko programiranje”, a Java ne. Java je zastupljenija u implementaciji
web servisa i apsolutno dominira Internetom, s obzirom na njene prednosti u smislu
prenosivosti i izgleda i mogućnosti grafičkog korisničkog interfejsa.

Osnovna sintaksa

Jedan od najkorisnijih delova koda, koja svoje korene vuče još iz proceduralnih
programskih jezika, jesu komentari. Kao i u programskom jeziku C, i u Javi postoje
komentari unutar koda, koje kompajler “preskače” prilikom kompajliranja. Namena je da se
opišu određeni delovi programa, a da opisi ne smetaju samom kodu.

// komentar u jednom redu


/* komentar u više redova */
/** komentar za dokumentaciju */

Dokumentacioni komentari opisuju deklaracije koje za njima slede. Ovi se komentari u


programerskim okruženjima mogu izvući pomoću alatke koja ih koristi za pravljenje
dokumentacije o klasama. O tzv. JavaDoc dokumentaciji biće reči u kasnijim delovima
kursa.

7/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Java, kao i svi objektno orijentisani programski jezici, obezbeđuje alatku za rešavanje
programerskih zadataka korišćenjem notacije klasa i objekata. Svaki objekat u Javi ima
šablon – klasu, koja definiše njegove podatke (stanje) i ponašanje. članovi klase mogu da
imaju različite nivoe vidljivosti ili pristupačnosti. Svaka klasa ima 3 vrste članova: polja,
metode i druge klase.

KLASA
POLJA METODE KLASE
promenljive, koje su u sadrže izvršni kod klase, klase i interfejsi mogu
vezi sa klasom i njenim sastoje se iz naredbi biti članovi drugih klasa
objektima (čuvaju (način na koji se i interfejsa (tada su to
rezultate izračunavanja pozivaju i naredbe ugnježdene klase ili
koje obavljaju klase, tj. sadržane u metodama interfejsi)
algoritmi u njihovim usmeravaju izvršavanje
metodama) programa)

Objekti se u Javi prave korišćenjem ključne reči new. Pravljenje objekata na osnovu
definicije klase se zove i instanciranje, pa se objekti često zovu primerci ili instance
klase. Novonastali objekti se smeštaju u dinamičku oblast sistemske memorije promenljive
veličine, koja se zove heap. Svim objektima u Javi se pristupa preko referenci objekata
(svaka promenljiva koja izgleda kao da sadrži objekat u stvari sadrži referencu na taj
objekat - njegovu adresu). Tipovi ovih promenljivih su referentni tipovi, za razliku od
primitivnih tipova u kojima promenljive sadrže vrednost tog tipa. Kada ne referenciraju
nijedan objekat, vrednosti referentnih tipova su null.

U toku programiranja, može se doći do pitanja kako se rešiti nepotrebnog objekta koji je
napravljen korišćenjem komande new. Odgovor je jednostavan – prestati referenciranje
datog objekta u kodu. Nereferencirani Java objekti odmah postaju predmet interesovanja
sakupljača đubreta (garbage collector), koji ih uklanja. Ovo je jedna od velikih prednosti
Jave nad ostalim objektno orijentisanim programskim jezicima. U jeziku C++ i sličnim
potrebno je samostalno uništavati objekte koji su nepotrebni u daljem radu, a zauzimaju
memorijski prostor. Ovo zahteva da u svakom momentu programer zna koliko objekata
postoji i kako da do njih dođe. U Javi, Garbage Collector automatski rešava problem
nereferenciranih objekata, tako što se u određenim intervalima izvršava njegova funkcija
nad memorijskim prostorom koji zauzima i koristi program pisan u Javi.

Obično su za svaki objekat potrebna polja i obično je potrebno da polje u jednom objektu
bude različito od istoimenog polja u svakom drugom objektu instanciranom od iste klase.
Ipak će ponekad biti potrebna polja koja dele svi objekti iste klase. Te deljene promenljive
su poznate kao klasne promenljive, promenljive specifične za klasu, nasuprot objektima
klase. U Javi se polja specifična za klasu deklarišu ključnom rečju static, pa se ona obično
nazivaju statičkim poljima.

Hajde da damo jedan primer kada je potrebno da klasa ima statičko polje. Dakle, to mora
biti polje koje će izražavati ISTO stanje SVIH objekata koji su instancirani od te klase. Na
primer, kada bismo pravili klasu “Kalkulator” u Javi i kada bi nam bilo potrebno da s
vremena na vreme napravimo objekat ove klase kako bi izvršili određena izračunavanja,
bilo bi nam potrebno da definišemo neke konstante, poput konstante Pi. Dakle, klasa bi
imala jedno statično polje, koje bi delili svi objekti klase, s obzirom da je Pi uvek iste
vrednosti, bez obzira koji kalkulator korisitmo za izračunavanje.

8/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Stvarna korist od orijentisanosti na objekte dolazi od sakrivanja implementacije klase iza


operacija koje se izvršavaju nad njenim unutrašnjim podacima. U Javi, operacije klase se
deklarišu putem njenih metoda, tj. instrukcija koje se izvršavaju nad podacima objekta da
bi se dobili rezultati. Metode pristupaju internim detaljima implementacije, koji su inače
sakriveni od drugih objekata (pomenuli smo već sakrivanje kao enkapsulaciju).

U principu, objekti ne vrše operacije direktno nad podacima drugih objekata, iako polja
klase mogu biti javno dostupna. Dobro projektovane klase obično kriju svoje podatke, tako
da mogu da ih izmene samo metode te klase, ponekad na poziv nekog drugog objekta.

Metode i pozivanje metoda

Da bismo pravilno pozvali metodu, potrebno je obezbediti referencu odredišnog objekta i


ime metode, tako da budu razdvojeni tačkom. Argumenti se prenose metodi kao spisak
vrednosti razdvojenih zarezima i obuhvaćenih zagradama. Metode koje ne uzimaju
argumente i dalje imaju zagrade, samo u njima nema argumenata.

ImeObjekta.ImeMetode(argumenti);

Metoda može da vrati samo jednu vrednost kao rezultat. Da bi vratila više vrednosti, mora
se napraviti objekat čija je svrha da čuva vraćene vrednosti kao svoje podatke, tj. atribute
i da, zatim, vrati taj objekat.

Kada metoda bude pozvana, tok izvršenja će napustiti postojeću metodu i pokrenuti
izvršavanje tela pozvane metode (u Javi, telo metode ograničeno je vitičastim zagradama).
Kada izvršavanje pozvane metode bude završeno, postojeća metoda će nastaviti
izvršavanje koda koji se nalazi iza pozvane metode. Kada otpočne izvršavanje tela metode,
objekat koji je bio cilj pozvane metode se, posmatran iz perspektive ove metode, naziva
postojeći ili primajući objekat. Argumentima, koji su preneti ovoj metodi, se pristupa
posredstvom parametara deklarisane metode.

Svaka Java aplikacija mora da poseduje glavnu metodu, zaduženu da pokrene sam
program, tj. njegovu glavnu izvršnu klasu.

public static void main(String[] args) {}

Povremeno, primajući objekat mora da kako da sam sebe referencira. Na primer, može biti
potrebno da primajući objekat samog sebe doda nekom spisku objekata koji se negde
nalazi. Metodama je na raspolaganju implicitna referenca this, koja je referenca na
postojeći (primajući) objekat.

Kao što mogu postojati statička polja u klasi, tako mogu postojati i statičke metode, koje
se zovu klasne metode. Klasne metode su obično namenjene obavljanju klasnih operacija
specifičnih za samu klasu i obično na statičkim poljima, a ne na određenim primercima
(objektima) te klase. Deklarišu se takođe preko ključne reči static, pa se zato i zovu
statičke metode.

9/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Podestimo se primera statičkog polja u klasi “Kalkulator”, gde je Pi konstanta statična zbog
redovnog korišćenja. Zamislimo sada da je potrebno da se, testiranja ili pokazivanja radi,
svaki put prilikom korišćenja konstante Pi, ona izračuna i da prikaz o tome na standardnom
izlazu. Tada bi statičko polje zamenila statička metoda koja računa konstantu Pi, štampa
proces izračunavanja na ekran i vraća rezultat izračunavanja kao rezultat izvršavanja
metode.

Promenljive i konstante

Java ima ugrađene primitivne tipove podataka koji podržavaju cele brojeve, brojeve u
pokretnom zarezu (realne), logičke vrednosti i znakove. Ovi primitivni tipovi čuvaju
podatke koje Java direktno prepoznaje, za razliku od tipova koje definiše programer. Tip
svake promenljive se mora eksplicitno definisati.

Lokalne promenljive su nedefinisane pre inicijalizacije. U trenutku njihovog deklarisanja ih


nije potrebno inicijalizovati, međutim, ako pokušamo da koristimo lokalne promenljive pre
dodeljivanja vrednosti, kompajler će odbiti da kompajlira program, dok se to ne reši.

Primitivni podaci u Javi su:

boolean true ili false


char 16-bitni Unicode 2.1 znakovi
byte 8-bitni celi brojevi
short 16-bitni celi brojevi
int 32-bitni celi brojevi
long 64-bitni celi brojevi
float 32-bitni realni brojevi
double 64-bitni realni brojevi

Konstante su vrednosti kao što je 12, 17.9 i “zmaj”. Konstante su način na koji se navodi
vrednost koja se ne izračunava, već ostaje nepromenjena za vreme trajanja programa.
Imenovana konstanta je konstantna vrednost na koju se upućuje imenom. Imenovane
konstante se definišu tako što se deklarišu polja odgovarajućeg tipa, koja su inicijalizovana
odgovarajućom vrednošću. Ovim postupkom se ne definiše konstanta, već polje čija se
vrednost može izmeniti naredbom dodele. Da bismo vrednost učinili konstantom, moramo
deklarisati polje rezervisanom rečju final. Takva vrednost se više ne može izmeniti. I ne
samo to, već ako želimo da to polje ne bude povezano sa instancama klase, označićemo ga
kao static.

U našem primeru kalkulatora, Pi bi bila konstanta deklarisana na sledeći način:

static final Pi = 3.14;

Pomenuta metoda, koja vraća vrednost Pi (uz izračunavanja), bila bi deklarisana:

static final getPiValue();

10/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Objekti tipa String

Klasa String služi isključivo za rad sa nizovima znakova, a na nivou jezika Java pruža
podršku za njihovo inicijalizovanje. Klasa String nalazi se u standardnom Javinom paketu
klasa (Java API) i ima raznovrsne metode za rad sa objektima tipa String.

Dakle, string, sam po sebi, je niz karaktera. U Javi, kao što je navedeno u tabeli,
karakteri su 16-bitni Unicode znakovi i označavaju se kao char. Da bi ovi znakovi formirali
reč ili rečenicu (literal), potrebno je da se nalaze u jednom konkretnom objektu. U Javi,
ovaj objekat je String i to je, može se slobodno reći, najbitnija klasa u celom programskom
jeziku Java.

Vrednosti karaktera pišu se pod jednostrukim navodnicima ('b','7'), a vrednosti


stringova pod dvostrukim ("zmaj","2009."). Evo primera pozivanja jedne sistemske
metode, za štampanje stringa na standardnom izlazu:

System.out.println("Hello!");

U ovom slučaju, kompajler pravi String objekat inicijalizovan vrednošću navedenog niza
karaktera ("Hello!") i prenosi ga kao argument metodi println. Kada se pravi String
objekat, nije potrebno navesti dužinu. Može se napraviti novi String objekat i da se
inicijalizuje u jednoj naredbi, kao što je pokazano u sledećem primeru:

String ime = "Miloš Đekić";


System.out.println("Moje ime je: " + ime);

Rezultat izvršavanja ovog dela koda biće ispis sledeće rečenice na standardnom izlazu:

Moje ime je Miloš Đekić

Objašnjenje koda: Deklarisana je promenljiva tipa String, koju smo nazvali ime. Zatim joj
je, u istom redu koda, korišćenjem operatora dodela (=) dodeljena vrednost "Miloš
Đekić". U sledećem redu koda pozvana je sistemska metoda za štampanje na standardni
izlaz i kao argument prosleđen joj je sabirak dva objekta tipa String. Sabiranje je izvršeno
korišćenjem operatora sabiranja (+), a operanti su dva objekta tipa String, od kojih je
jedan predstavljen direktno preko vrednosti, a jedan korišćenjem reference na vrednost!

String objekti imaju metodu leinght(), koja vraća broj znakova u nizu karaktera. Znakovi
su indeksirani od nula do n-1 (n je dužina niza) i može im se pristupiti pomoću metode
charAt(index), koja uzima celobrojni indeks i vraća znak (karakter) na tom indeksnom
položaju. U ovom slučaju, niz je prilično sličan običnom nizu znakova, ali String objekti nisu
samo nizovi znakova, već objekti sa pomoćnim metodama za obradu. Po načinu pristupa
String objektima, oni su read-only (samo za čitanje) ili nepromenljivi.

O klasi String i radu sa objektima te klase biće reči u nekim od narednih delova kursa, gde
će se ova oblast veoma detaljno obrađivati.

11/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Proširivanje klase

Kao što je već pomenuto, jedna od glavnih koristi objektno orijentisanog programiranja je
mogućnost stvaranja podklasa, čime se proširuje postojeća klasa i menja njeno ponašanje,
ali se u primerku podklase i dalje koristi kod koji je napisan za izvornu klasu. Izvorna klasa
se zove superklasa. Kada se proširuje klasa da bi se napravila nova klasa, nova proširena
klasa nasleđuje sva polja i metode superklase!

Ako izričito ne prevazilazi ponašanje superklase, podklasa takođe nasleđuje celokupno


ponašanje svoje superklase. Osim toga, podklasa može da doda nova polja i metode, a
samim tim i novo ponašanje, karakteristično za objekte samo te klase.

Hajde da definišemo klasu “Point”, koja predstavlja neku tačku u dvodimenzionalnom


prostoru, predstavljenu pomoću dve celobrojne koordinate x i y. Ukoliko želimo da
definišemo neku tačku koju želimo da nacrtamo na ekranu, moramo joj, pored koordinata,
dodeliti i određenu boju. Pošto tačka sama po sebi nema boju, potrebno je definisati novu
klasu “Pixel”, koja će naslediti, tj. proširiti klasu “Point”. Nova klasa će, pored nasleđenih
polja koja označavaju koordinate, imati i polje koje označava boju:

class Pixel extends Point {


Color boja;
void draw() {
// algoritam crtanja pixel-a
}
}

Čisto primera radi, klasi “Pixel” dodali smo metodu draw(), koja bi bila zadužena da,
koristeći određene tehnike u Javi, nacrta pixel određene boje na ekranu. Pixel proširuje
podatke tačke, dodajući podatak o boji, a proširuje i ponašanje tačke, dodajući metodu za
crtanje na ekranu.

Objekte klase “Pixel” može da koristi svaki kod koji je napravljen da radi sa objektima
klase “Point”. Ako neka metoda očekuje parametar tipa “Point”, može mu se dati objekat
klase “Pixel” i kod će funkcionisati. Celokupan kod klase “Point” može da koristi svako, ako
mu je pri ruci neki objekat klase “Pixel” (setimo se priče o polimorfizmu).

Proširena klasa često zaobilazi ponašanje svojih superklasa, obezbeđujući nove


implementacije jedne ili više nasleđenih metoda. Proširena klasa definiše metodu istog
potpisa i tipa rezultata kao što je metoda u superklasi. Primer ćemo naći u definisanju
metode clear() u klasi “Point” i njenom redefinisanju u klasi “Pixel”:

class Point {
int x,y;
void clear() {
x = 0; y = 0;
}
}

12/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Sada, u klasi “Pixel”:

class Pixel extends Point {


Color boja;
void draw() {
// algoritam crtanja pixel-a
}
void clear() {
super.clear();
boja = null;
}
}

U navedenom primeru, zaobilazi se ponašanje metode clear(), da bi se postiglo pravo


ponašanje koje zahteva klasa “Pixel”. Metoda clear(), koju je klasa “Pixel”nasledila od
klase “Point”, prepoznaje samo polja klase “Point”, ali očigledno ne može da prepozna ništa
što je u vezi sa novim poljem boja deklarisanim u podklasi “Pixel”. Zato se ona redefiniše
unutar klase “Pixel”.

Da bi se klasa “Pixel” ispravno ponašala u pogledu metode clear(), obezbeđujemo novu


implementaciju te metode koja, korišćenjem reference super prvo poziva metodu
clear() svoje superklase. Referenca super je veoma slična referenci this, osim što ona
referencira polja ili metode iz superklase, a this iz postojećeg objekta.

Pozivanje metode super.clear() traži superklasu da bi izvršilo metodu clear(), kao što
bi to uradilo i za objekat superklase. Posle pozivanja super.clear() da očisti “Point” deo
objekta (postavi koordinate na koordinatni pocetak), dodajemo novu funkcionalnost da
bismo postavili boju na razumno praznu vrednost. Zato se opredeljujemo na null, koja se
ne odnosi ni na jedan objekat (prazna referenca).

Šta bi se u prethodnom primeru dogodilo da nije pozvan super.clear()? Metoda


clear()klase Pixel bi postavila boja na svoju vrednost null, ali promenljive x i y koje je
klasa “Pixel” nasledila od klase “Point” ne bi bile postavljene ni na jednu očišćenu vrednost.
Neočišćene vrednosti objekta klase “Pixel”, uključujući i deo nasleđen od klase “Point”,
verovatno bi bile greška u programu.

Kada se pozove super.nekaMetoda(), runtime system Jave prati hijerarhiju nasleđivanja


sve do prve klase koja sadrži neophodnu metodu. Na primer, da klasa “Point” nije imala
metodu clear(), runtime system bi pregledao superklasu klase “Point” tražeći takvu
metodu i nju bi pozvao na izvršenje. Za sve druge reference, pozivanje metode koristi
samu klasu objekta, a ne tip reference objekta.

Primer referenciranja:

Point point = new Pixel();


point.clear(); //Koristi metodu clear() klase “Pixel”

13/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

U ovom primeru se poziva verzija metode clear() klase “Pixel”, iako je promenljiva koja
čuva pixel deklarisana kao referenca “Point”. Ali, ako pozovemo super.clear() unutar
jedne od metoda klase “Pixel”, pozivanje bi koristilo implementaciju metode clear() iz
klase “Point”.

Klasa Object

Klasa Object je tzv. generička klasa u Javi. Kao takva, predstavlja šablon svih klasa koje
programer pravi tokom programiranja. Svaka klasa koju napravi programer nasleđuje klasu
Object, tj. svaki objekat u Javi JE Object! On ima svoje predefinisane metode i polja, koje u
klasama koje ga nasleđuju, po potrebi, mogu redefinisati.

Klase koje eksplicitno ne proširuju ni jednu drugu klasu, implicitno proširuju klasu Object.
Svi objekti su polimorfno klase Object, tako da je Object generički tip za reference koje
mogu da referenciraju objekte neke klase.

Object point = new Pixel();

Dat primer koda je dozvoljen, zato što je svaki objekat klase “Pixel” takođe i objekat klase
“Object”. Kada je argument koji prima neka metoda deklarisan kao tipa Object, to znači da
joj se kao argument može proslediti bilo šta, tj. objekat bilo koje klase.

Promena tipa

Pogledajmo sledeći kod:

String ime = "Miloš";


Object objekat = ime;
ime = objekat;

Napisan kod deluje prilično logično, međutim, kada bismo pokušali da pokrenemo program
koji sadrži ovaj kod, došlo bi do greške u compile rutini. Zašto? Referencu ime
deklarišemo i inicijalizujemo, a zatim je dodeljujemo referenci objekat tipa Object. Zatim
pokušavamo da ovu referencu na String ponovo dodelimo referenci ime. Zašto ovo ne
funkcioniše? Zato što je String uvek Object, a Object ne mora uvek biti String. Iako je u
ovom slučaju jasno da je Object zaista String, u compile rutini se on ne tretira tako. Da bi
se pomoglo kompajleru, potrebno mu je saopštiti da je objekat koji referencira referenca
objekat ustvari String i da može biti dodeljen referenci ime:

ime = (String)objekat;

Saopštavanje kompajleru da je tip izraza u stvari drugačijeg tipa se naziva promena tipa
ili konverzija tipa (na engleskom, termin je cast). Promena tipa se izvršava

14/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

postavljanjem novog tipa u zagrade, u obliku prefiksa, ispred izraza. Time se ne zadobija
automatsko poverenje kompajlera, već on proverava da li je to istina. Ako provera ne uspe,
ispaliće izuzetak ClassCastException za vreme izvršavanja koda. Pošto je programski jezik
Java strogo tipiziran, u pogledu dodeljivanja tipova postoje veoma stroga pravila.

Interfejsi

Ponekad je u toku programerskog rada potrebno samo deklarisati metode koje neki objekat
mora da podrži, ali ne i obezbediti implementaciju tih metoda. Sve dok njihovo ponašanje
zadovoljava određene kriterijume, detalji koji se odnose na implementaciju metoda nisu
bitni! Ove deklaracije definišu tip, a za svaku klasu koja implementira ove metode kaže se
da je tog tipa, bez obzira na činjenicu kako su metode implementirane.

Generalna ideja je da se obezbedi da metode rade jednako dobro, bile one primenjene na
listu povezanih vrednosti ili na neku drugu strukturu podataka. Ovo je moguće ako se
definiše interfejs. On je kao klasa, ali ima samo deklaraciju svojih metoda. Projektant
nekog interfejsa može da deklariše metode koje podržavaju klase koje implementiraju
interfejs i deklariše šta metode mogu da rade.

Pr: Interfejs Drawable:

public interface Drawable {


public void draw();
}

Interfejs “Drawable” deklariše jednu metodu – draw(), koja bi trebalo da predstavlja


crtanje nekog objekta na ekranu. U interfejsu se ne može napisati nikakva implementacija
metode, već je klasa koja ga implementira odgovorna da obezbedi potrebnu
implementaciju. Umesto tela metode, u interfejsu postoji samo tačka-zarez (;).

Naime, svaka klasa koja implementira interfejs “Drawable” postaje tipa “Drawable”, što u
logičnoj interpretaciji znači “može da se nacrta”. Klasa može da implementira neograničen
broj interfejsa, ali mora da implementira sve metode koje interfejs deklariše!

class Pixel extends Point implements Drawable {


Color boja;
public void draw() {
// implementacija
}
}

Interfejs može takođe da deklariše imenovane konstante koje su static i final. Pored
toga, interfejs može da deklariše druge ugnježdene interfejse, pa čak i klase. Svi članovi
interfejsa su implicitno ili eksplicitno deklarisani kao public, tako da im se može pristupiti
svuda gde se može pristupiti i samom interfejsu.

15/16
Udruženje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA –


www.fonis.rs

Interfejsi mogu da se prošire korišćenjem ključne reči extends. Jedan interfejs može da
proširi jedan ili više drugih interfejsa, dodavanjem novih konstanti i novih metoda koje
mora da implementira svaka klasa koja implementira prošireni interfejs.

Supertipovi klase su klase koje ona proširuje i interfejsi koje ona implementira,
uključujući i sve supertipove tih klasa i interfejsa. Zato objekat nije samo primerak
sopstvene klase već i svakog od njenih supertipova, uključujući i interfejse. Objekti mogu
da se koriste polimorfno, kako sa svojim superklasama tako i sa svojim superinterfejsima,
uključujući sve njihove supertipove.

Nakon što je klasa “Pixel” implementirala interfejs “Drawable”, moguće su sledeće naredbe
u kodu:

Drawable d = new Pixel();


d.draw();

Iako je referenca d tipa Drawable, u ovom slučaju možemo biti sigurni da će se, nakon
pozivanja metode d.draw(), izvršiti kod koji se nalazi u implementaciji metode d.draw()
u klasi “Pixel”.

Zadatak

Samostalno definisati jednu klasu koja predstavlja apstraktne objekte iz realnog života,
navesti njene atribute, metode, podklase. Atribute opisati nazivom i tipom podatka,
metodama navesti ulazne elemente (podatke) i njihove tipove. Kao dodatak, definisati neki
interfejs u jednoj od super klasa i objasniti kako bi on bio implementiran u nekoj podklasi.

Zadatak napisati kao Word dokument ili PDF dokument na ne više od jedne stranice A4
formata teksta ili slike (dijagrama) i poslati na mail sa attachment-om na adresu:
kursevi.fonis@gmail.com sa subject-om JAVA-ZADATAK-1. U tekstu mail-a navesti ime,
prezime i broj indeksa.

16/16

You might also like