Objektno orijentisano programiranje
vežbe, školska 2010/11
Univerzitet u Beogradu, Matematički fakultet
Biljana Stojanović
Nasleđivanje. Polimorfizam.
Apstraktne klase. Interfejsi.
čas 05
Nasleđivanje klasa
Koncept nasleđivanja je vrlo bitan deo OO programiranja.
Nasleđivanje – kreiranje nove klase koja je bazirana na
već definisanoj klasi.
Bazna klasa (natklasa) je klasa iz koje se vrši izvođenje.
Izvedena klasa naziva se još i direktna potklasa bazne klase.
Moguće je izvoditi klasu iz izvedene klase.





3
Objektno orijentisano programiranje
mart 2011
Nasleđivanje klasa
class Zivotinja {
…
}
class Pas extends Zivotinja {
…
}

4
Ključna reč extends kaže da je klasa Zivotinja bazna klasa za
klasu Pas, tj. klasa Pas nasleđuje klasu Zivotinja.
Objektno orijentisano programiranje
mart 2011
Nasleđivanje klasa
5
Objektno orijentisano programiranje
mart 2011
Nasleđivanje klasa
Objekat izvedene klase u sebi sadrži kompletan objekat
bazne klase (sa svim članicama - promenljivim i
metodima), kao i nove članove koji su definisani u
izvedenoj klasi.
Ipak, članice definisane u baznoj klasi ne moraju uvek biti
dostupne metodima specifičnim za izvedenu klasu!


6
Objektno orijentisano programiranje
mart 2011
Nasleđivanje klasa
Za članicu bazne klase koja je dostupna unutar izvedene
klase kažemo da je nasleđena članica.
Napomena! Članovi bazne klase koji nisu nasleđeni i
dalje su deo objekata izvedene klase!


7
Objektno orijentisano programiranje
mart 2011
Nasleđivanje članica klase
8
Objektno orijentisano programiranje
mart 2011
Nasleđivanje članica klase
Potklasa definisana u istom paketu kao i bazna klasa
nasleđuje sve osim private članica bazne klase.
Potklasa definisana van paketa bazne klase ne nasleđuje
private članice i članice bez atributa.
Ista pravila važe i za statičke članice klase.



9
Objektno orijentisano programiranje
mart 2011
Skrivene članice klase




10
Članica izvedene klase može imati isto ime kao i
članica bazne klase, čime članica bazne klase biva
skrivena. Tipovi članica i atributi pristupa mogu da se
razlikuju.
Svaka upotreba tog imena odnosi se na članicu
izvedene klase.
Članici bazne klase se pristupa pomoću
super.imeČlanice.
Ovo nije poželjan pristup pri definisanju izvedene
klase!
Objektno orijentisano programiranje
mart 2011
Nasleđivanje metoda




Metodi bazne klase (sa izuzetkom konstruktora) nasleđuju
se po istom principu kao i članice promenljive.
Konstruktori bazne klase se nikad ne nasleđuju!!!
U izvedenoj klasi moguće je pozvati konstruktor natklase
i to za inicijalizaciju onog dela koji je nasleđen. Razlog je
logičan, jer objekat izvedene klase u sebi sadrži objekat
bazne klase, pa je najbolji način za inicijalizaciju nasleđenog
dela upravo poziv konstruktora natklase.
Metodi bazne klase koji su nasleđeni u izvedenoj klasi
mogu da pristupe svim članovima bazne klase unutar
izvedene klase, čak i onima koji nisu nasleđeni.
11
Objektno orijentisano programiranje
mart 2011
Primer: Zivotinja - Pas



12
Klasa Pas nasleđuje samo metod toString() iz klase Zivotinja,
jer se konstruktor i private članice ne nasleđuju.
Članica vrsta se ne nasleđuje, tj. ne može joj se pristupiti iz
metoda klase Pas. Međutim, ona mora biti pravilno
inicijalizovana, što se vrši pozivom konstruktora bazne
klase iz konstruktora izvedene klase – super(...) sa
odgovarajućim brojem argumenata.
Poziv konstruktora bazne klase mora biti prva naredba u
telu konstruktora izvedene klase. Ako je nema, kompajler
sam umeće poziv default konstruktora super().
Napomena! Ovo može dovesti do greške, u slučaju da u
baznoj klasi jesmo definisali konstruktor, a nismo
podrazumevani konstruktor.
Objektno orijentisano programiranje
mart 2011
Overriding (predefinisanje) metoda bazne klase





13
Moguće je definisati metod izvedene klase koji ima
isti potpis kao i metod bazne klase.
Atribut pristupa predefinisanom metodu u
izvedenoj klasi ne sme biti restriktivniji od atributa
pristupa u baznoj klasi!
Ovim se postiže da metod u izvedenoj klasi
preklapa metod bazne klase.
Metod bazne klase još uvek postoji u izvedenoj
klasi i moguće je pozvati ga u izvedenoj klasi.
Primer: metod toString() klase Pas preklapa metod
toString() klase Zivotinja
Objektno orijentisano programiranje
mart 2011
Izbor pristupnih atribura za bazne članove



14
Metode koji čine neki spoljni interfejs klase treba
deklarisati kao public. Sve dok nisu predefinisani u
izvedenoj klasi, biće u njoj dostupni. Obično ne treba
deklarisati promenljive članice kao public, osim ako nisu
konstante namenjene opštoj upotrebi.
Ako će se klasa koristiti kao bazna klasa za neke druge
klase, članice je poželjno deklaristi kao private, a obezbediti
public metode za pristup i manipulaciju njima kada je
potrebno.
Protected članovi se najčešće koriste u paketima klasa sa
neograničenim pristupom svim članicama iz istog paketa,
pri čemu je pristup van paketa ograničen na potklase.
Objektno orijentisano programiranje
mart 2011
Polimorfizam



Polimorfizam označava mogućnost da se jedan isti poziv
metoda ponaša različito u zavisnosti od tipa objekta nad
kojim se metod primenjuje.
Polimorfizam radi sa objektima izvedene klase.
Moguće je da se referenca na objekat izvedene klase čuva
u promenljivoj tipa bazne klase (direktne ili indirektne).
Ovo je obavezno da bi imali mogućnost polimorfizma.
15
Objektno orijentisano programiranje
mart 2011
Polimorfizam
16
Objektno orijentisano programiranje
mart 2011
Polimorfizam


Koji će metod biti pozvan, zavisi od tipa objekta nad kojim se
metod poziva, a ne od tipa promenljive koja sadrži referencu na
objekat!
Napomena! Polimorfizam se primenjuje isključivo na metode,
ne i na članice promenljive. Npr. promenljiva tipa Pas se može
koristiti isključivo za pristup članicama podacima klase Pas. Čak
i kada referiše na objekat tipa Čivava, možemo je koristiti samo
za pristup članicama podacima koje se odnose na deo Pas
objekta Čivava.
17
Objektno orijentisano programiranje
mart 2011
Polimorfizam

Za polimorfizam je neophodno sledeće:





18
Poziv metoda nad objektom izvedene klase vrši se preko
promenljive bazne klase
Metod koji se poziva mora biti deklarisan u baznoj klasi
Metod koji se poziva mora biti deklarisan u izvedenoj klasi
Potpis metoda u baznoj i izvedenoj klasi mora biti isti
Povratni tip metoda u izvedenoj klasi mora biti isti kao i u
baznoj klasi ili tipa koji je njegova potklasa (tada kažemo da
su povratni tipovi kovarijantni)
Objektno orijentisano programiranje
mart 2011
Primer
public class Zivotinja {
Zivotinja kreirajObjekat{ … }
}
public class Pas extends Zivotinja {
Pas kreirajObjekat{ … }
}
19
Objektno orijentisano programiranje
mart 2011
Apstraktne klase




20
Apstraktna klasa je klasa koja ima jedan ili više
metoda koji su deklarisani, a nisu definisani –
nazivamo ih apstraktnim metodima.
Deklaraciji apstraktnog metoda prethodi ključna
reč abstract i oni nemaju telo metoda.
U prvom redu definicije klase navodi se ključna reč
abstract, da bi se klasa deklarisala kao apstraktna.
Apstraktni metod ne može biti private, jer private
metod ne može biti nasleđen, a samim tim ni
redefinisan u potklasi.
Objektno orijentisano programiranje
mart 2011
Primer
public abstract class Zivotinja {
public abstract void zvuk();
}
 Ovim smo klasu Zivotinja deklarisali kao apstraktnu,
pošto sadrži apstraktni metod zvuk().
 Metod zvuk() će biti predefinisan u izvedenim klasama.
21
Objektno orijentisano programiranje
mart 2011
Apstraktne klase




22
Ne može se instancirati objekat apstraktne klase,
ali je moguće deklarisati promenljivu tipa
apstraktne klase.
Zivotinja ljubimac = null;
Ova promenljiva se kasnije može koristiti da
sačuva referencu na konkretan objekat izvedene
klase.
Ukoliko nisu svi apstraktni metodi bazne klase
definisani u izvedenoj klasi, ona će takođe biti
apstraktna klasa.
Ako je klasa apstraktna, mora se koristiti ključna
reč abstract prilikom njene definicije.
Objektno orijentisano programiranje
mart 2011
Interfejsi






23
Interfejs je kolekcija konstanti i/ili apstraktnih
metoda i najčešće i sadrži samo metode.
Interfejs definiše samo prototip metoda.
U klasama koje implementiraju dati interfejs
definiše se telo metoda.
Metodi u interfejsu su uvek public i abstract,
konstante uvek public, static i final i to se ne piše
eksplicitno.
Metodi u interfejsu su po definiciji uvek instancni,
tj. ne mogu biti statički.
Interfjes se definiše kao i klasa, jedino se umesto
ključne reči class koristi ključna reč interface.
Objektno orijentisano programiranje
mart 2010
Interfejsi (nastavak)




24
Interfejs definiše eksternu formu skupa metoda
koji imaju određenu funkcionalnost.
Svaki metod deklarisan unutar interfejsa mora da
ima definiciju unutar klase koja implementira
interfejs, ako želimo da kreiramo objekte te klase.
Ukoliko se neki metod interfejsa ne definiše u klasi
koja ga implementira, klasa mora biti deklarisana
kao apstraktna.
Pošto su metodi u interfejsu po definiciji public,
moramo koristiti ključnu reč public kada ih
definišemo u odgovarajućoj klasi (atribut pristupa
ne sme biti manje restriktivan).
Objektno orijentisano programiranje
mart 2010
Interfejsi (nastavak)

U Javi, klasa može da nasledi samo jednu klasu, ali može da
implementira više interfejsa.
public class Klasa implements Klasa1, Klasa2, Klasa3{ … }

Možemo definisati interfejse bazirane jedne na drugima
koristeći ključnu reč extends.
public interface Konverzija extends KonverzioniFaktori { … }

Za razliku od klasa koje mogu da naslede samo jednu klasu,
interfejs može da nasledi proizvoljan broj drugih interfejsa.
public interface NoviInt extends Int1, Int2 { … }
// Interfejs NoviInt nasleđuje sve metode i konstante koje su
članice interfejsa Int1 i Int2 - ovo je primer višestrukog
nasleđivanja.
25
Objektno orijentisano programiranje
mart 2010
Interfejsi (nastavak)

Napomena! Ako dva ili više nad-interfejsa deklarišu
metod sa istim potpisom, metod mora da ima i isti
povratni tip u svim interfejsima. U suprotnom, klasa koja
implementira interfejse neće moći da implementira oba
metoda, pošto imaju isti potpis, jer svaki metod u klasi
mora da ima jedinstveni potpis.
26
Objektno orijentisano programiranje
mart 2010
Upotreba interfejsa



27
Interfejs sa deklarisanim metodima definiše skup
operacija, čime se postiže da objekti različitih klasa
(koje implementiraju dati interfejs) mogu da dele
isti skup operacija.
Interfejs definiše tip, pa se polimorfizam može
sprovesti kroz skup klasa koje implementiraju isti
interfejs. Ovo je bitno svojstvo interfejsa.
Ne može se kreirati objekat interfejsnog tipa, ali se
može deklarisati promenljiva interfejsnog tipa koja
može da čuva referencu na objekat svakog od
tipova koji implementiraju taj interfejs. To znači da
se promenljiva može iskoristiti za polimorfan poziv
metoda deklarisanih u interfejsu.
Objektno orijentisano programiranje
mart 2010
Upotreba interfejsa


Parametar metoda može biti interfejsnog tipa.
Dakle, metodu kao argument može biti predata referenca
na objekat proizvoljnog tipa koji implementira dati
interfejs.
28
Objektno orijentisano programiranje
mart 2010
Univerzalna natklasa


Sve klase koje definišemo su podrazumevano potklase
klase Object iz paketa java.lang.
Posledice:


29
Promenljiva tipa Object može da čuva referencu na objekat
proizvoljnog tipa. Ovo je korisno kod metoda koji mogu da
prihvate kao argument objekte različitog tipa.
Klasa koju definišemo nasleđuje članice klase Object. Sve
članice ove klase su metodi.
Objektno orijentisano programiranje
mart 2011
Klasa Object

Bitniji public metodi klase Object:



30
toString() – vraća String reprezentaciju objekta. Ukoliko u klasi ne
predefinišemo metod toString() on vraća
[email protected]_reprezentacija_objekta.
equals() – poredi referencu na objekat prosleđen kao argument i
referencu na tekući objekat i vraća true ukoliko su jednake, tj.
referišu na isti objekat. U suprotnom, vraća false, čak i kad objekti
imaju jednake vrednosti svojih članica.
getClass() – vraća objekat tipa Class koji identifikuje klasu
tekućeg objekta. Ne može se preklapati, deklarisan je sa final.
Objektno orijentisano programiranje
mart 2011
Klasa Object

Protected metodi klase Object:


31
clone() – kreira objekat koji je kopija tekućeg objekta nezavisno
od tipa jer je povratni tip metoda clone() upravo Object.
finalize() – automatski se poziva pre nego što je objekat konačno
uništen i memorija oslobođena. Može se predefinisati u klasi – na
primer koristan je ako objekti klase koriste resurse koji traže
neku specijalnu akciju kada bivaju uništeni, kao što je slučaj sa
grafičkim resursima, fontovima i sl. Metod finalize() takođe daje
informaciju da je objekat zaista uništen.
Objektno orijentisano programiranje
mart 2011
Određivanje tipa objekta
Class tipObjekta = ljubimac.getClass();
/* Promenljiva ljubimac je tipa Zivotinja i referiše na
konkretan primerak klase Zivotinja. */
System.out.println(tipObjekta.getName());
/* metod getName() je član klase Class i vraća puno
kvalifikovano ime klase */
Napomena! Objekat tipa Class se odnosi na aktuelnu klasu
nekog objekta.
String s = “Ovo je string”;
Object str = s;
System.out.println(str.getClass().getName()); /* rezultat je
java.lang.String */
32
Objektno orijentisano programiranje
mart 2011
Download

pdf