Professional Documents
Culture Documents
01 - Uvod U OO I Javu
01 - Uvod U OO I Javu
1/16
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.
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
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
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
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.
5/16
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
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.
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.
7/16
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
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.
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.
9/16
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:
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:
10/16
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:
11/16
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:
12/16
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
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:
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
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:
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
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:
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