12.11.2014 Views

pdf - Ncd.matf.bg.ac.rs

pdf - Ncd.matf.bg.ac.rs

pdf - Ncd.matf.bg.ac.rs

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Objektno orijentisano programiranje<br />

vežbe, školska 2010/11<br />

Univerzitet u Beogradu, Matematički fakultet<br />

Biljana Stojanović


Nasleđivanje. Polimorfizam.<br />

Apstraktne klase. Interfejsi.<br />

čas 05


Nasleđivanje klasa<br />

Koncept nasleđivanja je vrlo bitan deo OO programiranja.<br />

Nasleđivanje – kreiranje nove klase koja je bazirana na<br />

već definisanoj klasi.<br />

Bazna klasa (natklasa) je klasa iz koje se vrši izvođenje.<br />

Izvedena klasa naziva se još i direktna potklasa bazne klase.<br />

Moguće je izvoditi klasu iz izvedene klase.<br />

3<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje klasa<br />

class Zivotinja {<br />

…<br />

}<br />

class Pas extends Zivotinja {<br />

…<br />

}<br />

Ključna reč extends kaže da je klasa Zivotinja bazna klasa za<br />

klasu Pas, tj. klasa Pas nasleđuje klasu Zivotinja.<br />

4<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje klasa<br />

5<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje klasa<br />

Objekat izvedene klase u sebi sadrži kompletan objekat<br />

bazne klase (sa svim članicama - promenljivim i<br />

metodima), kao i nove članove koji su definisani u<br />

izvedenoj klasi.<br />

Ipak, članice definisane u baznoj klasi ne moraju uvek biti<br />

dostupne metodima specifičnim za izvedenu klasu!<br />

6<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje klasa<br />

Za članicu bazne klase koja je dostupna unutar izvedene<br />

klase kažemo da je nasleđena članica.<br />

Napomena! Članovi bazne klase koji nisu nasleđeni i<br />

dalje su deo objekata izvedene klase!<br />

7<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje članica klase<br />

8<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje članica klase<br />

Potklasa definisana u istom paketu kao i bazna klasa<br />

nasleđuje sve osim private članica bazne klase.<br />

Potklasa definisana van paketa bazne klase ne nasleđuje<br />

private članice i članice bez atributa.<br />

Ista pravila važe i za statičke članice klase.<br />

9<br />

Objektno orijentisano programiranje<br />

mart 2011


Skrivene članice klase<br />

Članica izvedene klase može imati isto ime kao i<br />

članica bazne klase, čime članica bazne klase biva<br />

skrivena. Tipovi članica i atributi pristupa mogu da se<br />

razlikuju.<br />

Svaka upotreba tog imena odnosi se na članicu<br />

izvedene klase.<br />

Članici bazne klase se pristupa pomoću<br />

super.imeČlanice.<br />

Ovo nije poželjan pristup pri definisanju izvedene<br />

klase!<br />

10<br />

Objektno orijentisano programiranje<br />

mart 2011


Nasleđivanje metoda<br />

Metodi bazne klase (sa izuzetkom konstruktora) nasleđuju<br />

se po istom principu kao i članice promenljive.<br />

Konstruktori bazne klase se nikad ne nasleđuju!!!<br />

U izvedenoj klasi moguće je pozvati konstruktor natklase<br />

i to za inicijaliz<strong>ac</strong>iju onog dela koji je nasleđen. Razlog je<br />

logičan, jer objekat izvedene klase u sebi sadrži objekat<br />

bazne klase, pa je najbolji način za inicijaliz<strong>ac</strong>iju nasleđenog<br />

dela upravo poziv konstruktora natklase.<br />

Metodi bazne klase koji su nasleđeni u izvedenoj klasi<br />

mogu da pristupe svim članovima bazne klase unutar<br />

izvedene klase, čak i onima koji nisu nasleđeni.<br />

11<br />

Objektno orijentisano programiranje<br />

mart 2011


Primer: Zivotinja - Pas<br />

Klasa Pas nasleđuje samo metod toString() iz klase Zivotinja,<br />

jer se konstruktor i private članice ne nasleđuju.<br />

Članica v<strong>rs</strong>ta se ne nasleđuje, tj. ne može joj se pristupiti iz<br />

metoda klase Pas. Međutim, ona mora biti pravilno<br />

inicijalizovana, što se vrši pozivom konstruktora bazne<br />

klase iz konstruktora izvedene klase – super(...) sa<br />

odgovarajućim brojem argumenata.<br />

Poziv konstruktora bazne klase mora biti prva naredba u<br />

telu konstruktora izvedene klase. Ako je nema, kompajler<br />

sam umeće poziv default konstruktora super().<br />

Napomena! Ovo može dovesti do greške, u slučaju da u<br />

baznoj klasi jesmo definisali konstruktor, a nismo<br />

podrazumevani konstruktor.<br />

12<br />

Objektno orijentisano programiranje<br />

mart 2011


Overriding (predefinisanje) metoda bazne klase<br />

Moguće je definisati metod izvedene klase koji ima<br />

isti potpis kao i metod bazne klase.<br />

Atribut pristupa predefinisanom metodu u<br />

izvedenoj klasi ne sme biti restriktivniji od atributa<br />

pristupa u baznoj klasi!<br />

Ovim se postiže da metod u izvedenoj klasi<br />

preklapa metod bazne klase.<br />

Metod bazne klase još uvek postoji u izvedenoj<br />

klasi i moguće je pozvati ga u izvedenoj klasi.<br />

Primer: metod toString() klase Pas preklapa metod<br />

toString() klase Zivotinja<br />

13<br />

Objektno orijentisano programiranje<br />

mart 2011


Izbor pristupnih atribura za bazne članove<br />

Metode koji čine neki spoljni interfejs klase treba<br />

deklarisati kao public. Sve dok nisu predefinisani u<br />

izvedenoj klasi, biće u njoj dostupni. Obično ne treba<br />

deklarisati promenljive članice kao public, osim ako nisu<br />

konstante namenjene opštoj upotrebi.<br />

Ako će se klasa koristiti kao bazna klasa za neke druge<br />

klase, članice je poželjno deklaristi kao private, a obezbediti<br />

public metode za pristup i manipul<strong>ac</strong>iju njima kada je<br />

potrebno.<br />

Protected članovi se najčešće koriste u paketima klasa sa<br />

neograničenim pristupom svim članicama iz istog paketa,<br />

pri čemu je pristup van paketa ograničen na potklase.<br />

14<br />

Objektno orijentisano programiranje<br />

mart 2011


Polimorfizam<br />

Polimorfizam označava mogućnost da se jedan isti poziv<br />

metoda ponaša različito u zavisnosti od tipa objekta nad<br />

kojim se metod primenjuje.<br />

Polimorfizam radi sa objektima izvedene klase.<br />

Moguće je da se referenca na objekat izvedene klase čuva<br />

u promenljivoj tipa bazne klase (direktne ili indirektne).<br />

Ovo je obavezno da bi imali mogućnost polimorfizma.<br />

15<br />

Objektno orijentisano programiranje<br />

mart 2011


Polimorfizam<br />

16<br />

Objektno orijentisano programiranje<br />

mart 2011


Polimorfizam<br />

Koji će metod biti pozvan, zavisi od tipa objekta nad kojim se<br />

metod poziva, a ne od tipa promenljive koja sadrži referencu na<br />

objekat!<br />

Napomena! Polimorfizam se primenjuje isključivo na metode,<br />

ne i na članice promenljive. Npr. promenljiva tipa Pas se može<br />

koristiti isključivo za pristup članicama pod<strong>ac</strong>ima klase Pas. Čak<br />

i kada referiše na objekat tipa Čivava, možemo je koristiti samo<br />

za pristup članicama pod<strong>ac</strong>ima koje se odnose na deo Pas<br />

objekta Čivava.<br />

17<br />

Objektno orijentisano programiranje<br />

mart 2011


Polimorfizam<br />

Za polimorfizam je neophodno sledeće:<br />

Poziv metoda nad objektom izvedene klase vrši se preko<br />

promenljive bazne klase<br />

Metod koji se poziva mora biti deklarisan u baznoj klasi<br />

Metod koji se poziva mora biti deklarisan u izvedenoj klasi<br />

Potpis metoda u baznoj i izvedenoj klasi mora biti isti<br />

Povratni tip metoda u izvedenoj klasi mora biti isti kao i u<br />

baznoj klasi ili tipa koji je njegova potklasa (tada kažemo da<br />

su povratni tipovi kovarijantni)<br />

18<br />

Objektno orijentisano programiranje<br />

mart 2011


Primer<br />

public class Zivotinja {<br />

Zivotinja kreirajObjekat{ … }<br />

}<br />

public class Pas extends Zivotinja {<br />

Pas kreirajObjekat{ … }<br />

}<br />

19<br />

Objektno orijentisano programiranje<br />

mart 2011


Apstraktne klase<br />

Apstraktna klasa je klasa koja ima jedan ili više<br />

metoda koji su deklarisani, a nisu definisani –<br />

nazivamo ih apstraktnim metodima.<br />

Deklar<strong>ac</strong>iji apstraktnog metoda prethodi ključna<br />

reč abstr<strong>ac</strong>t i oni nemaju telo metoda.<br />

U prvom redu definicije klase navodi se ključna reč<br />

abstr<strong>ac</strong>t, da bi se klasa deklarisala kao apstraktna.<br />

Apstraktni metod ne može biti private, jer private<br />

metod ne može biti nasleđen, a samim tim ni<br />

redefinisan u potklasi.<br />

20<br />

Objektno orijentisano programiranje<br />

mart 2011


Primer<br />

public abstr<strong>ac</strong>t class Zivotinja {<br />

public abstr<strong>ac</strong>t void zvuk();<br />

}<br />

Ovim smo klasu Zivotinja deklarisali kao apstraktnu,<br />

pošto sadrži apstraktni metod zvuk().<br />

Metod zvuk() će biti predefinisan u izvedenim klasama.<br />

21<br />

Objektno orijentisano programiranje<br />

mart 2011


Apstraktne klase<br />

Ne može se instancirati objekat apstraktne klase,<br />

ali je moguće deklarisati promenljivu tipa<br />

apstraktne klase.<br />

Zivotinja ljubim<strong>ac</strong> = null;<br />

Ova promenljiva se kasnije može koristiti da<br />

sačuva referencu na konkretan objekat izvedene<br />

klase.<br />

Ukoliko nisu svi apstraktni metodi bazne klase<br />

definisani u izvedenoj klasi, ona će takođe biti<br />

apstraktna klasa.<br />

Ako je klasa apstraktna, mora se koristiti ključna<br />

reč abstr<strong>ac</strong>t prilikom njene definicije.<br />

22<br />

Objektno orijentisano programiranje<br />

mart 2011


Interfejsi<br />

Interfejs je kolekcija konstanti i/ili apstraktnih<br />

metoda i najčešće i sadrži samo metode.<br />

Interfejs definiše samo prototip metoda.<br />

U klasama koje implementiraju dati interfejs<br />

definiše se telo metoda.<br />

Metodi u interfejsu su uvek public i abstr<strong>ac</strong>t,<br />

konstante uvek public, static i final i to se ne piše<br />

eksplicitno.<br />

Metodi u interfejsu su po definiciji uvek instancni,<br />

tj. ne mogu biti statički.<br />

Interfjes se definiše kao i klasa, jedino se umesto<br />

ključne reči class koristi ključna reč interf<strong>ac</strong>e.<br />

23 Objektno orijentisano programiranje<br />

mart 2010


Interfejsi (nastavak)<br />

Interfejs definiše eksternu formu skupa metoda<br />

koji imaju određenu funkcionalnost.<br />

Svaki metod deklarisan unutar interfejsa mora da<br />

ima definiciju unutar klase koja implementira<br />

interfejs, ako želimo da kreiramo objekte te klase.<br />

Ukoliko se neki metod interfejsa ne definiše u klasi<br />

koja ga implementira, klasa mora biti deklarisana<br />

kao apstraktna.<br />

Pošto su metodi u interfejsu po definiciji public,<br />

moramo koristiti ključnu reč public kada ih<br />

definišemo u odgovarajućoj klasi (atribut pristupa<br />

ne sme biti manje restriktivan).<br />

24 Objektno orijentisano programiranje<br />

mart 2010


Interfejsi (nastavak)<br />

U Javi, klasa može da nasledi samo jednu klasu, ali može da<br />

implementira više interfejsa.<br />

public class Klasa implements Klasa1, Klasa2, Klasa3{ … }<br />

Možemo definisati interfejse bazirane jedne na drugima<br />

koristeći ključnu reč extends.<br />

public interf<strong>ac</strong>e Konverzija extends KonverzioniFaktori { … }<br />

Za razliku od klasa koje mogu da naslede samo jednu klasu,<br />

interfejs može da nasledi proizvoljan broj drugih interfejsa.<br />

public interf<strong>ac</strong>e NoviInt extends Int1, Int2 { … }<br />

// Interfejs NoviInt nasleđuje sve metode i konstante koje su<br />

članice interfejsa Int1 i Int2 - ovo je primer višestrukog<br />

nasleđivanja.<br />

25 Objektno orijentisano programiranje<br />

mart 2010


Interfejsi (nastavak)<br />

Napomena! Ako dva ili više nad-interfejsa deklarišu<br />

metod sa istim potpisom, metod mora da ima i isti<br />

povratni tip u svim interfejsima. U suprotnom, klasa koja<br />

implementira interfejse neće moći da implementira oba<br />

metoda, pošto imaju isti potpis, jer svaki metod u klasi<br />

mora da ima jedinstveni potpis.<br />

26 Objektno orijentisano programiranje<br />

mart 2010


Upotreba interfejsa<br />

Interfejs sa deklarisanim metodima definiše skup<br />

oper<strong>ac</strong>ija, čime se postiže da objekti različitih klasa<br />

(koje implementiraju dati interfejs) mogu da dele<br />

isti skup oper<strong>ac</strong>ija.<br />

Interfejs definiše tip, pa se polimorfizam može<br />

sprovesti kroz skup klasa koje implementiraju isti<br />

interfejs. Ovo je bitno svojstvo interfejsa.<br />

Ne može se kreirati objekat interfejsnog tipa, ali se<br />

može deklarisati promenljiva interfejsnog tipa koja<br />

može da čuva referencu na objekat svakog od<br />

tipova koji implementiraju taj interfejs. To znači da<br />

se promenljiva može iskoristiti za polimorfan poziv<br />

metoda deklarisanih u interfejsu.<br />

27 Objektno orijentisano programiranje<br />

mart 2010


Upotreba interfejsa<br />

Parametar metoda može biti interfejsnog tipa.<br />

Dakle, metodu kao argument može biti predata referenca<br />

na objekat proizvoljnog tipa koji implementira dati<br />

interfejs.<br />

28 Objektno orijentisano programiranje<br />

mart 2010


Univerzalna natklasa<br />

Sve klase koje definišemo su podrazumevano potklase<br />

klase Object iz paketa java.lang.<br />

Posledice:<br />

Promenljiva tipa Object može da čuva referencu na objekat<br />

proizvoljnog tipa. Ovo je korisno kod metoda koji mogu da<br />

prihvate kao argument objekte različitog tipa.<br />

Klasa koju definišemo nasleđuje članice klase Object. Sve<br />

članice ove klase su metodi.<br />

29<br />

Objektno orijentisano programiranje<br />

mart 2011


Klasa Object<br />

Bitniji public metodi klase Object:<br />

toString() – vraća String reprezent<strong>ac</strong>iju objekta. Ukoliko u klasi ne<br />

predefinišemo metod toString() on vraća<br />

ime_klase@heksadekadna_reprezent<strong>ac</strong>ija_objekta.<br />

equals() – poredi referencu na objekat prosleđen kao argument i<br />

referencu na tekući objekat i vraća true ukoliko su jednake, tj.<br />

referišu na isti objekat. U suprotnom, vraća false, čak i kad objekti<br />

imaju jednake vrednosti svojih članica.<br />

getClass() – vraća objekat tipa Class koji identifikuje klasu<br />

tekućeg objekta. Ne može se preklapati, deklarisan je sa final.<br />

30<br />

Objektno orijentisano programiranje<br />

mart 2011


Klasa Object<br />

Protected metodi klase Object:<br />

clone() – kreira objekat koji je kopija tekućeg objekta nezavisno<br />

od tipa jer je povratni tip metoda clone() upravo Object.<br />

finalize() – automatski se poziva pre nego što je objekat konačno<br />

uništen i memorija oslobođena. Može se predefinisati u klasi – na<br />

primer koristan je ako objekti klase koriste resu<strong>rs</strong>e koji traže<br />

neku specijalnu akciju kada bivaju uništeni, kao što je slučaj sa<br />

grafičkim resu<strong>rs</strong>ima, fontovima i sl. Metod finalize() takođe daje<br />

inform<strong>ac</strong>iju da je objekat zaista uništen.<br />

31<br />

Objektno orijentisano programiranje<br />

mart 2011


Određivanje tipa objekta<br />

Class tipObjekta = ljubim<strong>ac</strong>.getClass();<br />

/* Promenljiva ljubim<strong>ac</strong> je tipa Zivotinja i referiše na<br />

konkretan primerak klase Zivotinja. */<br />

System.out.println(tipObjekta.getName());<br />

/* metod getName() je član klase Class i vraća puno<br />

kvalifikovano ime klase */<br />

Napomena! Objekat tipa Class se odnosi na aktuelnu klasu<br />

nekog objekta.<br />

String s = “Ovo je string”;<br />

Object str = s;<br />

System.out.println(str.getClass().getName()); /* rezultat je<br />

java.lang.String */<br />

32<br />

Objektno orijentisano programiranje<br />

mart 2011

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!