You are on page 1of 16

Udruenje 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 inenjerstvo
Danas se za softversko inenjerstvo najee vezuje pojam programiranje. Programeri su, u stvari, inenjeri softvera ili, popularnije, software developers. Da bi neko mogao da bude uspean developer, morao bi biti upoznat sa velikim brojem programskih jezika, preteno objektno orijentisanih, zatim bazama podataka, osnovnim strukturama i algoritmima za manipulaciju istim. Meutim, na samom poetku, budui inenjer softvera mora imati vrstu osnovu u aktuelnom nainu i stilu programiranja - developmenta.

Objektno orijentisan nain miljenja


ta podrazumeva pojam objektno orijentisan? Razvoj softverskog inenjerstva u svetu trajao je godinama. Samo programiranje softvera prolo 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 izvravaju (jedna za drugom). Ovo i jeste jedna od suvih definicija programiranja, koja danas nije univerzalno primenjiva. Sekvencijalno programiranje se izvodilo korienjem jasno definisanih programskih komandi sekvenci, koje su se kasnije grupisale u vee module, koji su nazvani procedurama. Samim tim, ovakvo programiranje dobija naziv proceduralno. Veliki broj dananjih programskih jezika je proceduralan i visoko upotrebljiv u tzv. sistemskom programiranju (programiranje modula operativnih sistema oslanja se na podrku brzih proceduralnih jezika poput programskog jezika C). Prilikom proceduralnog programiranja, podaci koje program koristi (obrauje) su odvojeni od samog koda, tj. programske logike, to je velika mana s obzirom na umanjene mogunosti 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, obrauje ih i dostavlja izlazne podatke, tj. u sluaju korienja personalnih kompjutera, ispisuje na standardnom izlazu ili smeta u memoriju raunara. Sami podaci se najee uvaju u nekoj globalnoj bazi podataka ili na udaljenom serveru. Kod, kao izvrni deo programa, kod proceduralnog programiranja smeten 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

Udruenje 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 kae, orijentisano ka objektu, koji je osnova ovakvog programiranja. Za poetak, za objekat je najbolje rei da je jedna od osnovnih gradivnih jedinica OO programiranja. Ako program posmatramo kao organizam, bio bi sastavljen iz modula razliitih funkcija, poput organa. Ovi funkcionalni moduli sainjeni su iz sopstvenih delova, koji su, u stvari, objekti, koji meusobno komuniciraju. Definisanjem jednog ovakvog entiteta, u OO programerskoj filozofiji su sjedinjeni podaci i ponaanje u jednom potpunom paketu (full package). Obezbeena je jednistvena kontrola pristupa podacima, poto objekat nije prost tip podatka, poput celog broja ili niza znakova, ve skup primitivnijih vrsta podataka, kojima je, po potrebi, dodato odreeno ponaanje.

Objekat
U programiranju, ovaj termin ima veoma jasno definisano znaenje. No, oslonimo se trenutno na definiciju objekta u loginom smislu. Objekat je, dakle, svaki entitet koji je potrebno predstaviti pomou odreenih standardom definisanih metoda opisivanja prirodnih ili vetakih entiteta, pojava, dogaaja. Dakle, filozofija je jednostavna, sve se predstavlja objektom, pomou objekta ili pomou vie razliitih objekata. Sve je objekat. Objekat je jednistvena celina koja sadri podatke i ponaanje. Sam po sebi, moe sadrati druge podatke, cele brojeve, nizove karaktera, brojeva, druge objekte. Podaci iskazuju stanje objekta, i zovemo ih atributi. Dakle, objekat ima stanje i ponaanje. Uzmimo kao primer objekta jednu obinu kantu za otpadke. Da bi bila objekat, potrebno ju je predstaviti odreenim stanjem i ponaanjem. Za poetak, 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 moemo primetiti da se u kanti nalaze zguvani papiri. I oni su objekti, samo drugaijeg tipa nego to je kanta.

Slika 2. Objekti kanta i zguvan papir

Na slici je data skoro verna specifikacija ova dva objekta. Primetiemo da svaki atribut ima neku svoju vrednost. Ovo su vrednosti koje jedan objekat razlikuju od drugog (nee svaki komad papira biti istog prenika, iako je pojam prenik u ovom sliaju banalizacija). Sve ove vrednosti su odreenog tipa. Moemo primetiti da su prenici baza ove kante pribline obliku valjka dati u centimetrima. U programu, ovaj podatak bio bi zapisan kao

2/16

Udruenje 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 mogunost da skladiti objekte poput ovih zguvanih 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 ponaanje jedne kante za otpadke? Iako nam zdrav razum govori da se jedna kanta za otpadke ne ponaa, osim ako nije podpomognuta dobrom tehnologijom iz sfere robotike, mi kao programeri moemo ovo pitanje sagledati iz jednog drugaijeg ugla. Samo ponaanje ne mora znaiti da sama kanta neto radi, ve i ono to se radi sa kantom moe predstavljati ponaanje. Tako, proces ubacivanja otpadka u kantu moemo nazvati ubaci(), a proces izbacivanja svih otpadaka iz kante izbaci(). Zagrade nam omoguuju da razlikujemo atribute od metoda, jer su ovo zaista metode ponaanja 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 moe sresti veliki broj slinih entiteta. Neki su identini, neki imaju jako male razlike, a neki su potpuno razliiti. Meutim, ovek je, zahvaljujui svojoj inteligienciji, izvrio neke osnovne klasifikacije stvari, bia i pojava koje je sretao tokom ivota. Tako je, na primer, nastala klasifikacija ivih bia na ljude, ivotinje i biljke. Pre svega je logino da neke pojmove zovemo zajednikim imenima, iako se oni u nekim detaljima razlikuju. Dakle, klasa u prirodnom poretku definie neke zajednike osobine i ponaanja entiteta koje se ubrajaju pod njenu klasifikaciju, a koji se razlikuju u detaljima vezanih za odreene osobine. U programiranju, klasa se tretira kao ablon objekta, ematski plan koji se koristi prilikom kreiranja objekata. Klasa definie koje e atribute i ponaanja posedovati svaki objekat te klase, sve poetne vrednosti i zahtevana ponaanja realizovana metodama. Dakle, svaki objekat je jedna instanca svoje klase. Uzmimo kao primer nau kantu za otpadke. Za poetak, postoji vie razliitih kanti za odpadke. Svaka od njih imae neke svoje dimenzije, bie odreene boje, a tokom njihovog korienja njihova procentualna popunjenost e se prilino dinamino menjati. Sve one su kante, tako da bi klasa Kanta definisala sve objekte tog tipa, obavezujui svaki od njih da poseduju navedene atribute da iskau njihovo stanje. Sama po sebi, klasa je tip podatka vieg nivoa (celobrojne vrednosti, karakteri i ostali su prosti primitivni tipovi podataka). Ukoliko bi, na primer, pomenuta kanta za otpadke mogla da prima samo zguvani papir kao svoje otpadke, kao to bi za atribut procentualne popunjenosti bilo naznaeno da je podatak tipa realan broj, tako bi za niz otpadaka kao atribut bilo naznaeno da je tipa Zguvani papir. U OO konceptu, pojam kada objekat sadri objekte (mobilni telefon sadri ekran, tastaturu, baterije...) naziva se kompozicija. Relacija kompozicije izmeu dva objekta naziva se relacija ima. Dakle, mobilni telefon IMA bateriju.

3/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Metode i komunikacija meu objektima


Kao to je ve reeno, metode realizuju zahtevano ponaanje klase. Svi objekti iste klase imaju iste metode, tj. metode koje vre istu funkciju ili niz funkcija. One realizuju aktivnosti objekata i obezbeuju ponaanje. Neke metode omoguavaju izmenu vrednosti atributa. Ovo je veoma uobiajena praksa u OO programiranju. U veini sluajeva, pristup podacima unutar nekog objekta bi trebalo da kontrolie sam objekat ni jedan objekat ne bi trebalo da moe da menja vrednosti atributa drugog objekta, ukoliko to nije eksplicitno dozvoljeno ili ne postoji metoda koja je zaduena za to. Svaka metoda se mora definisati, tj. za svaku metodu moraju biti poznati sledei parametri: ime metode (jedinstveno opisuje odreeno ponaanje) argumenti (vrednosti koje joj se prosleuju) povratna vrednost (tip povratne vrednosti)

Metode slue i za komunikaciju meu objektima. Komunikacioni mehanizam izmeu objekata su poruke. Da bi neki objekat pozvao neku metodu drugog objekta, on mu alje poruku, a odgovor drugog objekta defnisan je povratnom vrednou koja je vraena 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 zaduena 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 znaaja verno kontrolisati pristup podacima nekog objekta. Veliki je propust ukoliko programer u svakom momentu nije svestan ko sve moe nehotice promeniti interne podatke nekog objekta. Ovo se najvie izraava prilikom testiranja softvera, bez kojeg ni jedan softver nee izai na trite. Enkapsulacija je sposobnost objekta da sakrije svoje podatke ili da ih uini selektivno dostupnim drugim entitetima. Odreene detalje, koji nisu vani za korienje objekta, potrebno je sakriti od ostalih objekata, kako oni direktnim pristupom ne bi menjali bitne podatke. Na primer, ukoliko neki objekat ima mogunost raunanja neke sloene matematike operacije, korisniku je potrebno pruiti interfejs koji e primiti parametre koji su potrebni za raunanje, a vratiti samo rezultat. Nije potrebno da korisnik poznaje algoritme koji se koriste za samo izraunavanje, kao ni meu-podatke (pr: vrednost konstante Pi ili konstante e). Enkapsulacija se obezbeuje interfejsima, tj. implementacijom samog objekta. Interfejs je osnovno sredstvo komunikacije meu objektima. Bilo koje ponaanje objekta mora biti pozvano porukom preko interfejsa, koji mora potpuno da opie kako korisnik komunicira sa objektom klase. U veini sluajeva, interfejsi su javni, to je logino, s obzirom da su posrednici u komunikaciji meu objektima i sa korisnikom (s tim to je, u programu, sam korisnik jedan objekat, predstavljen u kodu).

4/16

Udruenje 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 obino apstrakcija koju za sebe prua entitet spoljanjoj sredini. On razdvaja metode eksterne komunikacije sa internih operacija, to omoguava entitetu da bude modifikovan iznutra, a da to ne utie na njegovu komunikaciju sa sredinom. Dakle, interfejs je apstrakcija objekta, njegov nain prezentovanja spoljanjosti, preko kojeg e drugi objekti komunicirati sa njime. U osnovi, interfejsi ne sadre atribute, ve samo metode. Bitno je napomenuti da bi, ukoliko objekat poseduje neki interfejs, trebalo da interno implementira ponaanje koje taj interfejs opisuje (ne bi bilo dobro da objekat svojim interfejsom tvrdi kako moe da izrauna integral, a da interno algoritmi za ovaj raun ne postoje).

Nasleivanje
Prilikom definisanja klase, pomenuli smo klasifikaciju ivih bia. Kada bismo definisali klasu ivo bie, mogli bi definisati neke osobine svih ivih bia koje su im zajednike, poput atributa starost (sva iva bia imaju odreenu starost). Takoe, kada bi definisali klasu Sisar, mogli bi kao osobinu svih sisara navesti atribut boja oiju (svi sisari imaju oi i to odreene boje). Definisanjem klase ovek, u mogunosti smo da definiemo atribut ime i tako dalje. Meutim, kada bi u klasi Sisar definisali atribut starost, postojalo bi preklapanje atributa, jer i klasa ivo bie ima ovaj atribut. Naime, svi sisari su iva bia, kao to su i svi ljudi sisari i iva bia. Ovde se moe primetiti odreen odnos izmeu klasa. Ovakve odnose definie nasleivanje. Za poetak, potrebno je pomenuti jo jednu relaciju meu objektima. To je relacija je ili jeste. Naime, ovek JE sisar, sisar JE ivo bie (naravno, iz ovoga sledi: ovek JE ivo bie). Nasleivanje se moe definisati kao razvrstavanje klasa definisanjem istih osobina razliitih klasa (starost je osobina svih ivih bia, pa i sisara, a time i ljudi). Ovo omoguava nekoj klasi da nasledi atribute i metode (stanje i ponaanje) neke klase, ime se definie odnos izmeu njih, gde je klasa koja nasleuje podklasa, a klasa od koje nasleuje superklasa.

Slika 3. Nasleivanje i relacija JESTE

5/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Na slici 3 moe se primetiti da je glavna superklasa OBLIK, a da su njene podklase PRAVOUGAONIK,KRUG,TROUGAO i VARNICA. Ovo znai da vai 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 nasleivanja potencijalno veliko. Kada bi pokuali da hijerarhijski doemo od ibog bia do konkretne osobe, morali bi proi neki ovakav lanac: ivo bie Sisar ovek Amerikanac arli... Potencijal mehanizma nasleivanja lei u apstrakciji i tehnici organizacije superklasa i podklasa. U jednom hijerarhijskom lancu klasa, svaka podklasa je nasledila atribute i metode svoje superklase. Takoe, nasledila je sve interfejse. Meutim, svaka klasa za sebe implementira svoje interfejse, tj. svaka klasa na svoj nain reaguje na pobude iz spoljanje sredine, tj. daje svoj sopstveni odgovor, koji moe biti, ali najee nije isti kao odgovor koji bi dala superklasa, od koje je interfejs nasleen (poenta interfejsa jeste da ga svaka klasa implementira na sebi svojstven nain). Ovakva pojava, gde se naini implementacije odreenih ponaanja klase, tj. njenih objekata razlikuju u lancu hijerarhije nasleivanja, zove se polimorfizam.

JavaTM
Programski jezik Java je projektovan tako da se omogui maksimalna prenosivost. Mnogi programski jezici definicije preputaju odreenoj implementaciji, dok ih Java utvruje sasvim odreeno, sve do mainskog jezika u kojem se Javin izvorni kod kompajlira u Javine bajtkodove, koji su projektovani da rade na Javinoj virtuelnoj maini (Java Virtual Machine). Virtuelna maina omoguava sistem izvravanja (runtime system), koji prua pristup samoj virtuelnoj mani. Sistem izvravanja, korienjem rukovodioca bezbednosti (security manager) ili kontrole pristupa (access controler) proverava operacije ija je bezbednost bitna. Rukovodilac bezbednosti moe da zabrani aplikaciji da ita sa lokalnog diska ili da upisuje na njega (u sluaju Applet-a, na primer), ili moe da dozvoli mrene veze samo ka odreenim mainama. ta e tano biti dozvoljeno aplikaciji da radi, zavisie od politike bezbednosti, koja je na snazi u vreme pokretanja aplikacije. Ova politika podeava se u operativnom sistemu na kojem je instalirana JVM. Prilikom njihovog uitavanja na virtuelnu mainu, klase prvo proverava potvrdilac (bytecode verifier), koji obezbeuje da se bajtkodovi ispravno formiraju i zadovolje bezbednosne i sigurnosne garancije. Kombinacija ovakvih svojstava, omoguuje Javinom kodu potpunu nezavisnost od platforme, da bi se obezbedio bezbednosni model podesan za izvravanje koda uitanog preko mree na razliitim nivoima poverenja. Javin izvorni kod, koji je kompajliran u Javine bajtkodove, moe da radi na svakoj maini, na ijem operativnom sistemu je instalirana JVM. Kod moe da se izvrava sa odreenim nivoom zatite, da bi se nepaljivi i zlonamerni pisci klasa spreili da otete sistem. Nivo

6/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

poverenja se moe 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


Nauili smo neke osnovne podatke vezane za programski jezik Java. Hajde da ga sada uporedimo sa nekoliko aktuelnih programskih jezika. Osnovna sintaksa Jave zaista lii na C ili C++, a svakako na C#, koji je nastao na osnovu Jave i C-a. Jo jedna mala slinost sa programskim jezikom C jeste kompaktnost koda. Ovde se prati dobra filozofija C-olikih jezika koja kae: neka kod bude to manji i jednostavniji, kako bi programer mogao da ga lako dri u glavi, bez konstantnog podseanja. Poput programskog jezika C, u Javi postoje opcije dodavanja eksternih paketa klasa. Za sve programske jezike bitno je da obrate panju na 3 najbitnije stavke: brzina, sigurnost, prenosivost. Dok je programski jezik C, tj. C++ najbri programski jezik, on svakako zaostaje u pogledu sigurnosti. Na polju prenosivosti je na zadovoljavajuem nivou. U odnosu na ovog ozbiljnog konkurenta, Java je odlina na poljima sigurnosti i prenosivosti, a na istom nivou je i brzina. Dakle, Java je najbalansiraniji programski jezik, po pitanju 3 kljune performanse. To ne znai da je bolja od na primer C++, svaki programsi jezik ima svoje prednosti. Zato je Java sporija nego C-oliki jezici? Zato to je to interpretiran jezik, dok je C kompajliran jezik. ta ovo znai? To znai da se Javine klase prvo moraju interpretirati, pa zatim kompajlirati, tj. za izvravanje Javinog koda je potrebno mnogo vie vremena. Ovo nije sluaj kod C-a, poto se njegov kod izvrava 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 mogunosti grafikog korisnikog interfejsa.

Osnovna sintaksa
Jedan od najkorisnijih delova koda, koja svoje korene vue jo iz proceduralnih programskih jezika, jesu komentari. Kao i u programskom jeziku C, i u Javi postoje komentari unutar koda, koje kompajler preskae prilikom kompajliranja. Namena je da se opiu odreeni delovi programa, a da opisi ne smetaju samom kodu.

// komentar u jednom redu /* komentar u vie redova */ /** komentar za dokumentaciju */


Dokumentacioni komentari opisuju deklaracije koje za njima slede. Ovi se komentari u programerskim okruenjima mogu izvui pomou alatke koja ih koristi za pravljenje dokumentacije o klasama. O tzv. JavaDoc dokumentaciji bie rei u kasnijim delovima kursa.

7/16

Udruenje 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, obezbeuje alatku za reavanje programerskih zadataka korienjem notacije klasa i objekata. Svaki objekat u Javi ima ablon klasu, koja definie njegove podatke (stanje) i ponaanje. lanovi klase mogu da imaju razliite nivoe vidljivosti ili pristupanosti. Svaka klasa ima 3 vrste lanova: polja, metode i druge klase.

KLASA
POLJA
promenljive, koje su u vezi sa klasom i njenim objektima (uvaju rezultate izraunavanja koje obavljaju klase, tj. algoritmi u njihovim metodama)

METODE
sadre izvrni kod klase, sastoje se iz naredbi (nain na koji se pozivaju i naredbe sadrane u metodama usmeravaju izvravanje programa)

KLASE
klase i interfejsi mogu biti lanovi drugih klasa i interfejsa (tada su to ugnjedene klase ili interfejsi)

Objekti se u Javi prave korienjem kljune rei new. Pravljenje objekata na osnovu definicije klase se zove i instanciranje, pa se objekti esto zovu primerci ili instance klase. Novonastali objekti se smetaju u dinamiku oblast sistemske memorije promenljive veliine, koja se zove heap. Svim objektima u Javi se pristupa preko referenci objekata (svaka promenljiva koja izgleda kao da sadri objekat u stvari sadri referencu na taj objekat - njegovu adresu). Tipovi ovih promenljivih su referentni tipovi, za razliku od primitivnih tipova u kojima promenljive sadre vrednost tog tipa. Kada ne referenciraju nijedan objekat, vrednosti referentnih tipova su null. U toku programiranja, moe se doi do pitanja kako se reiti nepotrebnog objekta koji je napravljen korienjem komande new. Odgovor je jednostavan prestati referenciranje datog objekta u kodu. Nereferencirani Java objekti odmah postaju predmet interesovanja sakupljaa ubreta (garbage collector), koji ih uklanja. Ovo je jedna od velikih prednosti Jave nad ostalim objektno orijentisanim programskim jezicima. U jeziku C++ i slinim potrebno je samostalno unitavati 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 doe. U Javi, Garbage Collector automatski reava problem nereferenciranih objekata, tako to se u odreenim intervalima izvrava njegova funkcija nad memorijskim prostorom koji zauzima i koristi program pisan u Javi. Obino su za svaki objekat potrebna polja i obino je potrebno da polje u jednom objektu bude razliito 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 specifine za klasu, nasuprot objektima klase. U Javi se polja specifina za klasu deklariu kljunom reju static, pa se ona obino nazivaju statikim poljima. Hajde da damo jedan primer kada je potrebno da klasa ima statiko polje. Dakle, to mora biti polje koje e izraavati 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 izvrili odreena izraunavanja, bilo bi nam potrebno da definiemo neke konstante, poput konstante Pi. Dakle, klasa bi imala jedno statino polje, koje bi delili svi objekti klase, s obzirom da je Pi uvek iste vrednosti, bez obzira koji kalkulator korisitmo za izraunavanje.

8/16

Udruenje 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 izvravaju nad njenim unutranjim podacima. U Javi, operacije klase se deklariu putem njenih metoda, tj. instrukcija koje se izvravaju nad podacima objekta da bi se dobili rezultati. Metode pristupaju internim detaljima implementacije, koji su inae sakriveni od drugih objekata (pomenuli smo ve sakrivanje kao enkapsulaciju). U principu, objekti ne vre operacije direktno nad podacima drugih objekata, iako polja klase mogu biti javno dostupna. Dobro projektovane klase obino 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 odredinog objekta i ime metode, tako da budu razdvojeni takom. Argumenti se prenose metodi kao spisak vrednosti razdvojenih zarezima i obuhvaenih zagradama. Metode koje ne uzimaju argumente i dalje imaju zagrade, samo u njima nema argumenata.

ImeObjekta.ImeMetode(argumenti);
Metoda moe da vrati samo jednu vrednost kao rezultat. Da bi vratila vie vrednosti, mora se napraviti objekat ija je svrha da uva vraene vrednosti kao svoje podatke, tj. atribute i da, zatim, vrati taj objekat. Kada metoda bude pozvana, tok izvrenja e napustiti postojeu metodu i pokrenuti izvravanje tela pozvane metode (u Javi, telo metode ogranieno je vitiastim zagradama). Kada izvravanje pozvane metode bude zavreno, postojea metoda e nastaviti izvravanje koda koji se nalazi iza pozvane metode. Kada otpone izvravanje tela metode, objekat koji je bio cilj pozvane metode se, posmatran iz perspektive ove metode, naziva postojei ili primajui objekat. Argumentima, koji su preneti ovoj metodi, se pristupa posredstvom parametara deklarisane metode. Svaka Java aplikacija mora da poseduje glavnu metodu, zaduenu da pokrene sam program, tj. njegovu glavnu izvrnu klasu.

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


Povremeno, primajui objekat mora da kako da sam sebe referencira. Na primer, moe biti potrebno da primajui objekat samog sebe doda nekom spisku objekata koji se negde nalazi. Metodama je na raspolaganju implicitna referenca this, koja je referenca na postojei (primajui) objekat. Kao to mogu postojati statika polja u klasi, tako mogu postojati i statike metode, koje se zovu klasne metode. Klasne metode su obino namenjene obavljanju klasnih operacija specifinih za samu klasu i obino na statikim poljima, a ne na odreenim primercima (objektima) te klase. Deklariu se takoe preko kljune rei static, pa se zato i zovu statike metode.

9/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Podestimo se primera statikog polja u klasi Kalkulator, gde je Pi konstanta statina zbog redovnog korienja. Zamislimo sada da je potrebno da se, testiranja ili pokazivanja radi, svaki put prilikom korienja konstante Pi, ona izrauna i da prikaz o tome na standardnom izlazu. Tada bi statiko polje zamenila statika metoda koja rauna konstantu Pi, tampa proces izraunavanja na ekran i vraa rezultat izraunavanja kao rezultat izvravanja metode.

Promenljive i konstante
Java ima ugraene primitivne tipove podataka koji podravaju cele brojeve, brojeve u pokretnom zarezu (realne), logike vrednosti i znakove. Ovi primitivni tipovi uvaju podatke koje Java direktno prepoznaje, za razliku od tipova koje definie programer. Tip svake promenljive se mora eksplicitno definisati. Lokalne promenljive su nedefinisane pre inicijalizacije. U trenutku njihovog deklarisanja ih nije potrebno inicijalizovati, meutim, ako pokuamo da koristimo lokalne promenljive pre dodeljivanja vrednosti, kompajler e odbiti da kompajlira program, dok se to ne rei. Primitivni podaci u Javi su:

boolean char byte short int long float double

true ili false 16-bitni Unicode 2.1 znakovi 8-bitni celi brojevi 16-bitni celi brojevi 32-bitni celi brojevi 64-bitni celi brojevi 32-bitni realni brojevi 64-bitni realni brojevi

Konstante su vrednosti kao to je 12, 17.9 i zmaj. Konstante su nain na koji se navodi vrednost koja se ne izraunava, ve ostaje nepromenjena za vreme trajanja programa. Imenovana konstanta je konstantna vrednost na koju se upuuje imenom. Imenovane konstante se definiu tako to se deklariu polja odgovarajueg tipa, koja su inicijalizovana odgovarajuom vrednou. Ovim postupkom se ne definie konstanta, ve polje ija se vrednost moe izmeniti naredbom dodele. Da bismo vrednost uinili konstantom, moramo deklarisati polje rezervisanom reju final. Takva vrednost se vie ne moe izmeniti. I ne samo to, ve ako elimo da to polje ne bude povezano sa instancama klase, oznaiemo ga kao static. U naem primeru kalkulatora, Pi bi bila konstanta deklarisana na sledei nain:

static final Pi = 3.14;


Pomenuta metoda, koja vraa vrednost Pi (uz izraunavanja), bila bi deklarisana:

static final getPiValue();

10/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Objekti tipa String


Klasa String slui iskljuivo za rad sa nizovima znakova, a na nivou jezika Java prua podrku 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 oznaavaju se kao char. Da bi ovi znakovi formirali re ili reenicu (literal), potrebno je da se nalaze u jednom konkretnom objektu. U Javi, ovaj objekat je String i to je, moe se slobodno rei, najbitnija klasa u celom programskom jeziku Java. Vrednosti karaktera piu 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 sluaju, kompajler pravi String objekat inicijalizovan vrednou navedenog niza karaktera ("Hello!") i prenosi ga kao argument metodi println. Kada se pravi String objekat, nije potrebno navesti duinu. Moe se napraviti novi String objekat i da se inicijalizuje u jednoj naredbi, kao to je pokazano u sledeem primeru:

String ime = "Milo eki"; System.out.println("Moje ime je: " + ime);


Rezultat izvravanja ovog dela koda bie ispis sledee reenice na standardnom izlazu:

Moje ime je Milo eki


Objanjenje koda: Deklarisana je promenljiva tipa String, koju smo nazvali ime. Zatim joj je, u istom redu koda, korienjem operatora dodela (=) dodeljena vrednost "Milo eki". U sledeem redu koda pozvana je sistemska metoda za tampanje na standardni izlaz i kao argument prosleen joj je sabirak dva objekta tipa String. Sabiranje je izvreno korienjem operatora sabiranja (+), a operanti su dva objekta tipa String, od kojih je jedan predstavljen direktno preko vrednosti, a jedan korienjem reference na vrednost! String objekti imaju metodu leinght(), koja vraa broj znakova u nizu karaktera. Znakovi su indeksirani od nula do n-1 (n je duina niza) i moe im se pristupiti pomou metode charAt(index), koja uzima celobrojni indeks i vraa znak (karakter) na tom indeksnom poloaju. U ovom sluaju, niz je prilino slian obinom nizu znakova, ali String objekti nisu samo nizovi znakova, ve objekti sa pomonim metodama za obradu. Po nainu pristupa String objektima, oni su read-only (samo za itanje) ili nepromenljivi. O klasi String i radu sa objektima te klase bie rei u nekim od narednih delova kursa, gde e se ova oblast veoma detaljno obraivati.

11/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Proirivanje klase
Kao to je ve pomenuto, jedna od glavnih koristi objektno orijentisanog programiranja je mogunost stvaranja podklasa, ime se proiruje postojea klasa i menja njeno ponaanje, ali se u primerku podklase i dalje koristi kod koji je napisan za izvornu klasu. Izvorna klasa se zove superklasa. Kada se proiruje klasa da bi se napravila nova klasa, nova proirena klasa nasleuje sva polja i metode superklase! Ako izriito ne prevazilazi ponaanje superklase, podklasa takoe nasleuje celokupno ponaanje svoje superklase. Osim toga, podklasa moe da doda nova polja i metode, a samim tim i novo ponaanje, karakteristino za objekte samo te klase. Hajde da definiemo klasu Point, koja predstavlja neku taku u dvodimenzionalnom prostoru, predstavljenu pomou dve celobrojne koordinate x i y. Ukoliko elimo da definiemo neku taku koju elimo da nacrtamo na ekranu, moramo joj, pored koordinata, dodeliti i odreenu boju. Poto taka sama po sebi nema boju, potrebno je definisati novu klasu Pixel, koja e naslediti, tj. proiriti klasu Point. Nova klasa e, pored nasleenih polja koja oznaavaju koordinate, imati i polje koje oznaava 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 zaduena da, koristei odreene tehnike u Javi, nacrta pixel odreene boje na ekranu. Pixel proiruje podatke take, dodajui podatak o boji, a proiruje i ponaanje take, dodajui metodu za crtanje na ekranu. Objekte klase Pixel moe da koristi svaki kod koji je napravljen da radi sa objektima klase Point. Ako neka metoda oekuje parametar tipa Point, moe mu se dati objekat klase Pixel i kod e funkcionisati. Celokupan kod klase Point moe da koristi svako, ako mu je pri ruci neki objekat klase Pixel (setimo se prie o polimorfizmu). Proirena klasa esto zaobilazi ponaanje svojih superklasa, obezbeujui nove implementacije jedne ili vie nasleenih metoda. Proirena klasa definie metodu istog potpisa i tipa rezultata kao to je metoda u superklasi. Primer emo nai 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

Udruenje 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 ponaanje metode clear(), da bi se postiglo pravo ponaanje koje zahteva klasa Pixel. Metoda clear(), koju je klasa Pixelnasledila od klase Point, prepoznaje samo polja klase Point, ali oigledno ne moe da prepozna nita to je u vezi sa novim poljem boja deklarisanim u podklasi Pixel. Zato se ona redefinie unutar klase Pixel. Da bi se klasa Pixel ispravno ponaala u pogledu metode clear(), obezbeujemo novu implementaciju te metode koja, korienjem reference super prvo poziva metodu clear() svoje superklase. Referenca super je veoma slina referenci this, osim to ona referencira polja ili metode iz superklase, a this iz postojeeg objekta. Pozivanje metode super.clear() trai superklasu da bi izvrilo metodu clear(), kao to bi to uradilo i za objekat superklase. Posle pozivanja super.clear() da oisti 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 oienu vrednost. Neoiene vrednosti objekta klase Pixel, ukljuujui i deo nasleen od klase Point, verovatno bi bile greka u programu. Kada se pozove super.nekaMetoda(), runtime system Jave prati hijerarhiju nasleivanja sve do prve klase koja sadri neophodnu metodu. Na primer, da klasa Point nije imala metodu clear(), runtime system bi pregledao superklasu klase Point traei takvu metodu i nju bi pozvao na izvrenje. 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

Udruenje 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. generika klasa u Javi. Kao takva, predstavlja ablon svih klasa koje programer pravi tokom programiranja. Svaka klasa koju napravi programer nasleuje klasu Object, tj. svaki objekat u Javi JE Object! On ima svoje predefinisane metode i polja, koje u klasama koje ga nasleuju, po potrebi, mogu redefinisati. Klase koje eksplicitno ne proiruju ni jednu drugu klasu, implicitno proiruju klasu Object. Svi objekti su polimorfno klase Object, tako da je Object generiki 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 takoe i objekat klase Object. Kada je argument koji prima neka metoda deklarisan kao tipa Object, to znai da joj se kao argument moe proslediti bilo ta, tj. objekat bilo koje klase.

Promena tipa
Pogledajmo sledei kod:

String ime = "Milo"; Object objekat = ime; ime = objekat;


Napisan kod deluje prilino logino, meutim, kada bismo pokuali da pokrenemo program koji sadri ovaj kod, dolo bi do greke u compile rutini. Zato? Referencu ime deklariemo i inicijalizujemo, a zatim je dodeljujemo referenci objekat tipa Object. Zatim pokuavamo da ovu referencu na String ponovo dodelimo referenci ime. Zato ovo ne funkcionie? Zato to je String uvek Object, a Object ne mora uvek biti String. Iako je u ovom sluaju jasno da je Object zaista String, u compile rutini se on ne tretira tako. Da bi se pomoglo kompajleru, potrebno mu je saoptiti da je objekat koji referencira referenca objekat ustvari String i da moe biti dodeljen referenci ime:

ime = (String)objekat;
Saoptavanje kompajleru da je tip izraza u stvari drugaijeg tipa se naziva promena tipa ili konverzija tipa (na engleskom, termin je cast). Promena tipa se izvrava

14/16

Udruenje 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, ispalie izuzetak ClassCastException za vreme izvravanja koda. Poto 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 podri, ali ne i obezbediti implementaciju tih metoda. Sve dok njihovo ponaanje zadovoljava odreene kriterijume, detalji koji se odnose na implementaciju metoda nisu bitni! Ove deklaracije definiu tip, a za svaku klasu koja implementira ove metode kae 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 mogue ako se definie interfejs. On je kao klasa, ali ima samo deklaraciju svojih metoda. Projektant nekog interfejsa moe da deklarie metode koje podravaju klase koje implementiraju interfejs i deklarie ta metode mogu da rade. Pr: Interfejs Drawable:

public interface Drawable { public void draw(); }


Interfejs Drawable deklarie jednu metodu draw(), koja bi trebalo da predstavlja crtanje nekog objekta na ekranu. U interfejsu se ne moe napisati nikakva implementacija metode, ve je klasa koja ga implementira odgovorna da obezbedi potrebnu implementaciju. Umesto tela metode, u interfejsu postoji samo taka-zarez (;). Naime, svaka klasa koja implementira interfejs Drawable postaje tipa Drawable, to u loginoj interpretaciji znai moe da se nacrta. Klasa moe da implementira neogranien broj interfejsa, ali mora da implementira sve metode koje interfejs deklarie!

class Pixel extends Point implements Drawable { Color boja; public void draw() { // implementacija } }
Interfejs moe takoe da deklarie imenovane konstante koje su static i final. Pored toga, interfejs moe da deklarie druge ugnjedene interfejse, pa ak i klase. Svi lanovi interfejsa su implicitno ili eksplicitno deklarisani kao public, tako da im se moe pristupiti svuda gde se moe pristupiti i samom interfejsu.

15/16

Udruenje studenata informatike Fakulteta Organizacionih Nauka u Beogradu

- Kurs objektno orijentisanog programiranja u programskom jeziku JAVA


www.fonis.rs

Interfejsi mogu da se proire korienjem kljune rei extends. Jedan interfejs moe da proiri jedan ili vie drugih interfejsa, dodavanjem novih konstanti i novih metoda koje mora da implementira svaka klasa koja implementira proireni interfejs. Supertipovi klase su klase koje ona proiruje i interfejsi koje ona implementira, ukljuujui i sve supertipove tih klasa i interfejsa. Zato objekat nije samo primerak sopstvene klase ve i svakog od njenih supertipova, ukljuujui i interfejse. Objekti mogu da se koriste polimorfno, kako sa svojim superklasama tako i sa svojim superinterfejsima, ukljuujui sve njihove supertipove. Nakon to je klasa Pixel implementirala interfejs Drawable, mogue su sledee naredbe u kodu:

Drawable d = new Pixel(); d.draw();


Iako je referenca d tipa Drawable, u ovom sluaju moemo biti sigurni da e se, nakon pozivanja metode d.draw(), izvriti 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 vie 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