pdf - Ncd.matf.bg.ac.rs
pdf - Ncd.matf.bg.ac.rs
pdf - Ncd.matf.bg.ac.rs
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