Download
java nasle ivanje n.
Skip this Video
Loading SlideShow in 5 Seconds..
Objektno orijentisano programiranje PowerPoint Presentation
Download Presentation
Objektno orijentisano programiranje

Objektno orijentisano programiranje

164 Vues Download Presentation
Télécharger la présentation

Objektno orijentisano programiranje

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Java, nasleđivanje Objektno orijentisano programiranje

  2. Nasleđivanje • Veoma važan aspekt objektno orijentisanog programiranja je kreiranje nove klase na osnovu već postojeće klase ( standardne ili korisnički definisane klase ) • Taj proces naziva se izvođenje. Nova klasa je izvedena klasa ili direktna potklasa klase iz koje je izvedena, dok se klasa iz koje se vrši izvođenje naziva bazna klasa ili superklasa. • Izvedena klasa može poslužiti kao bazna u daljem postupku izvođenja

  3. Konkretan primer • Možemo definisati klasu Pas koja predstavlja psa proizvoljne rase: • class Pas{ // članovi klase Pas } • Ova klasa može sadržati atribut ime, i atribut rasa. • Iz klase Pas možemo izvesti klasu Sarplaninac koja predstavlja pse koji pripadaju rasi šarplaninac

  4. Konkretan primer – nastavak • class Sarplaninac extends Pas { // članovi klase Sarplaninac } • Ključna reč extends označava da je Pas bazna klasa za klasu Sarplaninac, pa će objekat klase Sarplaninac imati članove nasleđene od klase Pas, pored članova klase Sarplaninac koji se pojavljuju u definiciji te klase. • rasa će za sve instance klase Sarplaninac biti "Sarplaninac", dok će ime u opštem slučaju biti različito za svakog šarplaninca.

  5. Primer • Objekat klase Sarplaninac je specijalizovana instanca objekta klase Pas, što odražava odnose iz stvarnosti. • Šarplaninac je očigledno pas i ima sve karakteristike psa, ali ima i neke jedinstvene karakteristike koje ga razlikuju od svih ostalih pasa koji nisu šarplaninci. • Mehanizam nasleđivanja dodaje sve karakteristike bazne klase, u ovom slučaju klase Pas, karakteristikama izvedene klase. • Članovi izvedene klase definišu karakteristike koje razlikuju izvedenu od bazne klase, tako da se izvedena klasa može smatrati specifikacijom objekata koji su specijalizacije objekta bazne klase

  6. Nasleđivanje klasa • Objekat izvedene klase uvek u sebi ima kompletan objekat bazne klase, sa svim atributima i metodima. Međutim, to ne znači da su svi članovi definisani u baznoj klasi dostupni metodima specifičnim za izvedenu klasu. Neki jesu, a neki nisu. • Nasleđeni član bazne klase je onaj koji je dostupan unutar izvedene klase • Ako član bazne klase nije dostupan u izvedenoj klasi, on onda nije nasleđeni član, ali i dalje predstavlja deo objekta izvedene klase

  7. Nasleđeni član • Nasleđeni član je ”pravi” član izvedene klase i dostupan je svim njenim metodima. • Objekti izvedene klase sadržaće sve nasleđene članove bazne klase – i atribute i metode, kao i članove specifične za izvedenu klasu. • Upamtiti da objekat izvedene klase uvek u sebi sadrži kompletan objekat bazne klase, uključujući sve atribute i metode koji nisu nasleđeni.

  8. Šta se nasleđuje? • Koji atributi i koji metodi bazne klase se nasleđuju u izvedenoj klasi? • Odvojeno objašnjenje za atribute i metode, jer postoje neke istančane razlike

  9. Nasleđivanje atributa • Slika vredi 1000 reči:

  10. Nasleđivanje atributa • Slika prikazuje koji pristupni atributi dopuštaju nasleđivanje članova klase u potklasi • Prikazano je šta se dešava kada je potklasa u istom paketu kao i bazna klasa, a šta kada su potklasa i bazna klasa u različitim paketima • Upamtiti da nasleđivanje utiče na dostupnost člana u izvedenoj klasi, ne na samo prisustvo. • Klasa sama po sebi može biti public. To je čini dostupnom iz proizvoljnog paketa. Klasi koja nije deklarisana kao public može se pristupati samo iz klasa unutar istog paketa.

  11. Nasleđivanje atributa - nastavak • To npr. znači da se ne mogu definisati objekti ne-public klase unutar klasa iz drugih paketa • To takođe znači da ako želimo da izvedemo klasu iz klase u drugom paketu, bazna klasa mora biti deklarisana kao public. • VAŽNO: • ako izvedena klasa nije u paketu bazne klase, ne nasleđuju se private i atributi definisani bez pristupnog atributa (nasleđuju se public i protected) i bazna klasa mora biti deklarisana kao public • ako su izvedena i bazna klasa u istom paketu, nasleđuju se svi atributi osim private atributa (public, protected i atributi bez pristupnih atributa)

  12. Međusobni odnos pristupnih atributa – važno kod overriding-a i polimorfizma • po rastućoj restriktivnosti: • public – najmanje restriktivan, svuda dostupan • protected – sprečava pristup iz klasa izvan paketa, ali ne ograničava nasleđivanje ako je klasa public • bez pristupnog atributa – pristup se ograničava na klase iz istog paketa i sprečava se nasleđivanje u potklasama definisanim u drugim paketima • private – pristup samo unutar klase

  13. Statički atributi klase • Data pravila nasleđivanja se odnose kako na nestatičke, tako i na statičke članove klase • Dakle, private i static atribut bazne klase neće biti nasleđen u izvedenoj, dok će protected i static atribut biti nasleđen i deliće ga svi objekti izvedene, kao i bazne klase.

  14. Skriveni atributi • Atribut izvedene klase može imati isto ime kao i atribut bazne klase. To generalno nije preporučeno prilikom dizajniranja klase, ali moguće je da se desi slučajno. Kada se tako nešto desi, atribut bazne klase i dalje može biti nasleđen, ali biće sakriven atributom izvedene klase koji ima isto ime. • Mehanizam sakrivanja se primenjuje kad god postoje istoimeni atributi u baznoj i izvedenoj klasi, bez obzira na njihove tipove i pristupne atribute

  15. Skrivanje atributa • Upotreba imena člana izvedene klase uvek se odnosi na član definisan kao deo te klase. Za referisanje nasleđenog člana bazne klase, moramo ga kvalifikovati ključnom rečju super, da ukažemo da je to što hoćemo član superklase. • Nije dopuštena upotreba super.super.nešto za referisanje skrivenog imena člana bazne klase bazne klase :)

  16. Skrivanje atributa • U većini situacija nećemo imati potrebu da referišemo nasleđene atribute na ovaj način, pošto nećemo namerno duplirati imena. • Takva situacija obično može nastati ako koristimo klasu kao osnovu koja se uzastopno menja dodavanjem novih atributa – npr. to može biti standardna Java klasa ili klasa koju je neko drugi pisao, pa pošto naš kod ne pretpostavlja postojanje člana bazne klase sa istim imenom, skrivanje nasleđenog člana je upravo ono što želimo. To dopušta menjanje bazne klase bez uticaja na naš kod.

  17. Nasleđeni metodi – osim konstruktora • ”Obični metodi” ( metodi koji nisu konstruktori ) bazne klase, nasleđuju se u izvedenoj klasi na isti način kao atributi bazne klase. • Metodi deklarisani kao private u baznoj klasi, ne nasleđuju se • Metodi deklarisani bez pristupnog atributa nasleđuju se samo ako je izvedena klasa u istom paketu kao bazna • Ostali se svi nasleđuju

  18. Nasleđeni metodi - konstruktori • Konstruktori se razlikuju od običnih metoda. • Konstruktori bazne klase se nikada ne nasleđuju, bez obzira na njihove pristupne atribute. • Zamršenost konstruktora u hijerarhiji klasa može se videti razmatranjem postupka kreiranja objekata izvedene klase

  19. Objekti izvedene klase • Izvedena klasa je produžetak (proširenje) bazne klase. • Nasleđivanje se odnosi na to koji članovi bazne klase su dostupni u izvedenoj klasi, ne koji članovi bazne klase postoje u objektu izvedene klase. • Objekat potklase sadrži sve članove originalne bazne klase, plus sve nove članove koje smo definisali u izvedenoj klasi. Slika!!!:

  20. Slika

  21. Objašnjenje slike • Članovi bazne klase postoje svi u objektu izvedene klase, samo ne možemo pristupati nekima od njih u metodima koje definišemo u izvedenoj klasi • Činjenica da ne možemo pristupati nekim članovima bazne klase, ne znači da su oni suvišni – oni predstavljaju ključne članove objekata naše izvedene klase. • Objekat klase Sarplaninac treba sve atribute klase Pas koji ga čine objektom klase Pas, iako neki od njih možda nisu dostupni metodima klase Sarplaninac • Naravno, nasleđeni metodi bazne klase mogu pristupati svim članovima bazne klase, uključujući i onima koji nisu nasleđeni.

  22. Objekti izvedene klase • Iako konstruktori bazne klase nisu nasleđeni u izvedenoj klasi, oni se mogu pozivati da inicijalizuju članove bazne klase. I više od toga! Ako ne pozovemo konstruktor bazne klase iz konstruktora naše izvedene klase, kompajler će pokušati da uradi to za nas. • (pošto objekat izvedene klase u sebi sadrži objekat bazne klase, dobar način za inicijalizovanje tog baznog dela objekta izvedene klase je korišćenjem konstruktora bazne klase)

  23. Izvođenje klase • public class Zivotinja{ public Zivotinja(String sVrsta){ vrsta=sVrsta; } public String toString(){ return ”Ovo je ” + vrsta; } private String vrsta; }

  24. Izvođenje klase • Izvodimo klasu zasnovanu na klasi Zivotinja, da bismo definisali pse. To možemo uraditi neposredno, bez menjanja definicije klase Zivotinja • public class Pas extends Zivotinja { // konstruktori za objekat klase Pas private String ime; // ime psa private String rasa; // rasa psa }

  25. Izvođenje klase • Ključna reč extends u definiciji potklase koristi se za identifikovanje imena direktne superklase • Klasa Pas će naslediti samo metod toString() klase Zivotinja, jer private atributi i konstruktori ne mogu da se naslede. • Naravno, objekat klase Pas će imati atribut vrsta, koji treba da ima vrednost ”Pas”, kome neće moći da se pristupa metodima definisanim u klasi Pas(pošto je to private atribut bazne klase).

  26. Izvođenje klase • Dodali smo dve instancne promenljive u izvedenoj klasi ( ime – za čuvanje imena određenog psa, i rasa ) • Potrebno je još dodati sredstvo za kreiranje objekata klase Pas.

  27. Konstruktori izvedene klase • Za proizvoljan objekat izvedene klase, treba osigurati da je private član vrsta bazne klase, ispravno inicijalizovan. To se radi pozivanjem konstruktora bazne klase iz konstruktora izvedene klase: • public class Pas extends Zivotinja { public Pas(String sIme){ super(”Pas”); // poziv baznog konstuktora ime=sIme; // dato ime rasa=”Nepoznata”; // podrazumevana vrednost rase } public Pas(String sIme, String sRasa){ super(”Pas”); // poziv baznog konstruktora ime = sIme; // dato ime rasa = sRasa; // data rasa } private String ime; // ime psa private String rasa; // rasa psa }

  28. Poziv baznog konstruktora • super() • pozivanje baznog konstruktora iz konstruktora izvedene klase • ključna reč super kao ime metoda poziva konstruktor superklase (direktne bazne klase) • Ključna reč super ima i druge upotrebe u izvedenoj klasi ( videli smo već da skrivenom članu bazne klase možemo pristupati kvalifikovanjem njegovog imena rečju super )

  29. Poziv konstruktora bazne klase • Uvek je potrebno pozivati odgovarajući konstruktor bazne klase u konstruktorima izvedene klase. • Poziv konstruktora bazne klase mora biti prva naredba u telu konstruktora izvedene klase • Ukoliko to nije slučaj, kompajler će ubaciti poziv podrazumevanog konstruktora bazne klase za nas: • super(); //poziv podraz. konstruktora bazne klase

  30. Poziv konstruktora bazne klase • Nažalost, to može rezultovati greškom pri kompajliranju. Kako to? • Kada definišemo sopstveni konstruktor u klasi, kompajler ne kreira podrazumevani konstruktor jer pretpostavlja da mi brinemo o svim detaljima konstruisanja objekata uključujući i potrebu za podrazumevanim konstruktorom. Ukoliko u baznoj klasi nismo definisali svoj podrazumevani konstruktor, tj. konstruktor bez parametara – kada kompajler umetne poziv podrazumevanog konstruktora, dobije se greška.

  31. Testiranje izvedene klase • public class TestIzvedene{ public static void main(String[] args){ Pas pas=new Pas(”Mange”, ”Nemacki ovcar”); Pas poznatPas= new Pas(”Lesi”); System.out.println(pas); System.out.println(poznatPas); } } • Izlaz je: Ovo je Pas Ovo je Pas

  32. Rad programa • println() će implicitno pozvati toString() za objekte klase Pas. • uspešno je pozivan nasleđeni metod toString(), ali on ”poznaje” samo atribute bazne klase. U najmanju ruku, znamo da je private atribut vrsta ispravno inicijalizovan. • nama, međutim, treba verzija toString() za izvedenu klasu

  33. Predefinisanje (overriding) metoda bazne klase • Može se definisati metod u izvedenoj klasi koji ima isti potpis kao i neki metod bazne klase. • Pristupni atribut metoda u izvedenoj klasi može biti isti kao u baznoj klasi ili manje restriktivan, ali ne sme biti restriktivniji. • To znači da ako u baznoj klasi definišemo public metod, u svakoj izvedenoj klasi metod mora takođe biti deklarisan kao public.

  34. Predefinisanje (overriding) metoda bazne klase • Kada se na taj način definiše metod, za objekat izvedene klase pozivaće se metod izvedene klase, a ne metod nasleđen od bazne klase. Metod u izvedenoj klasi predefinišemetod bazne klase. Metod bazne klase je još uvek tu, i još uvek je moguće pozivati ga u izvedenoj klasi. • Dodajemo metod toString() u definiciju izvedene klase: • public String toString(){ return name + ” , ” + rasa; } • Primetimo i da toString() mora biti public

  35. Predefinisanje metoda bazne klase • Za ispis atributa vrsta bazne klase, nije moguće referisati ga u izvedenoj klasi, pošto nije nasleđen. Ali, možemo pozivati ”baznu” verziju ovog metoda pomoću ključne reči super. • Prepravljena verzija metoda u izvedenoj klasi: public String toString(){ return super.toString() + ”\n” + ime + ” , ” + rasa ; }

  36. Predefinisanje metoda bazne klase • Ključnu reč super koristimo za poziv bazne verzije metoda toString() koji je skriven verzijom istoimenog metoda izvedene klase. • Istu notaciju koristimo i za referisanje atributa superklase koji su skriveni istoimenim atributima izvedene klase • toString() verzija bazne klase vraća String reprezentaciju za bazni deo objekta. U verziji izvedene klase, na to nadovežemo extra informacije o izvedenom delu objekta

  37. Izbor pristupnih atributa bazne klase • Ne postoje jedinstvena pravila za izbor odgovarajućih pristupnih atributa. Šta ćemo izabrati, zavisi od toga za šta će nam klase služiti u budućnosti, ali postoje neka uputstva koja valja razmotriti. Ta uputstva prate osnovne principe objektno orijentisanog programiranja:

  38. Izbor pristupnih atributa bazne klase • metode koji čine spoljašnji interfejs klase treba deklarisati kao public. Sve dok nema predefinišućih metoda definisanih u izvedenoj klasi, public metodi bazne klase biće nasleđeni i potpuno dostupni kao deo spoljašnjeg interfejsa ka izvedenoj klasi. Atribute ne treba deklarisati kao public, osim ako to nisu konstante opšte namene. • ako očekujemo da će drugi koristiti naše klase kao bazne, one će biti sigurnije ako su atributi private, a obezbedimo public metode za pristup i manipulaciju njima, ako je to potrebno. Na taj način, mi kontrolišemo kako objekat izvedene klase može da utiče na članove bazne klase • protected članove bazne klase treba koristiti u paketu u kome želimo neometani pristup podacima iz proizvoljne klase tog paketa, a izvan paketa slobodan pristup je ograničen na potklase • izostavljanje pristupnog atributa za član klase čini ga direktno dostupnim drugim klasama istog paketa, dok sprečava da bude nasleđen u potklasi van paketa – efektivno, to je private kada se gleda iz drugog paketa

  39. Polimorfizam • Osim korišćenja za definisanje novih klasa na osnovu postojećih, nasleđivanje klasa obezbeđuje i tzv. polimorfizam • Polimorfizam omogućuje da se poziv metoda ponaša različito u zavisnosti od tipa objekta na koji je primenjen. • slika

  40. Slika

  41. Polimorfizam • Polimorfizam ”radi” sa objektima izvedene klase • Do sada smo uvek koristili promenljivu datog tipa da bismo referencirali objekte istog tipa. Izvedene klase uvode novu fleksibilnost: • osim što možemo čuvati referencu na objekat izvedene klase u promenljivoj tipa te klase, takođe možemo čuvati tu referencu u promenljivoj tipa direktne ili indirektne natklase. • ŠTA VIŠE: da bi polimorfizam funkcionisao, referenca na objekat izvedene klase MORA se čuvati u promenljivoj tipa direktne ili indirektne natklase

  42. Polimorfizam • Polimorfizam: to koji metod će biti pozvan određuje se na osnovu tipa objekta za koji je metod pozvan, a ne na osnovu tipa promenljive korišćene za smeštanje reference na objekat. • Metod mora biti deklarisan u baznoj klasi ( tip promenljive koja se koristi za čuvanje reference ), kao i u izvedenoj klasi za čiji se objekat vrši pozivanje metoda • Nije moguće pozivati metod za objekat izvedene klase koristeći promenljivu tipa bazne klase ako metod nije član bazne klase. • Svaka definicija metoda u izvedenoj klasi mora imati isti potpis kao u baznoj klasi i mora imati pristupni atribut koji nije restriktivniji

  43. Polimorfizam • Metodi koji imaju isti potpis imaju isto ime i liste parametara sa istim brojem parametara, pri čemu su odgovarajući parametri istog tipa. • Za polimorfno ponašanje, povratni tip metoda izvedene klase mora biti ili isti kao kod metoda bazne klase ili njegova potklasa ( u tom slučaju za povratne tipove se kaže da su kovarijantni)

  44. Primer • public class Zivotinja { Zivotinja kreirajStvorenje() { // Kod za kreiranje objekta klase Zivotinja } //... } • public class Pas extends Zivotinja { Pas kreirajStvorenje(){ // Kod za kreiranje objekta klase Pas } // .... }

  45. Rezime – polimorfizam • poziv metoda za objekat izvedene klase mora biti preko promenljive tipa bazne klase • pozvani metod mora biti definisan u izvedenoj klasi • pozvani metod mora takođe biti deklarisan kao član bazne klase • potpisi metoda u baznoj i izvedenoj klasi moraju biti isti • povratni tipovi metoda bazne i izvedene klase moraju biti ili isti ili kovarijantni • pristupni atribut metoda izvedene klase ne sme biti restriktivniji od odgovarajućeg pristupnog atributa bazne klase

  46. Polimorfizam • Pošto promenljiva baznog tipa može da čuva referencu na objekat proizvoljnog izvedenog tipa, vrsta smeštenog objekta nije poznata dok se program ne izvrši. Tako se izbor metoda koji će se izvršiti vrši dinamički u vreme izvršavanja programa i ne može biti učinjen u vreme njegovog kompajliranja.

  47. Polimorfizam • !!! Polimorfizam se primenjuje samo na metode, ne i na atribute. Kada pristupamo atributu objekta neke klase, tip promenljive uvek određuje klasu kojoj atribut pripada. To povlači da promenljiva tipa Pas može da se koristi samo za pristup atributima klase Pas. Čak i kada ona referiše na objekat klase Sarplaninac, možemo je koristiti samo za pristup atributima objekta klase Pas koji je unutar objekta klase Sarplaninac

  48. Upotreba polimorfizma • Kao što smo videli, polimorfizam se zasniva na činjenici da možemo pridružiti objekat potklase promenljivoj tipa superklase. • Zivotinja zivotinja = new Pas(”Rotvajler”); • Dodajemo metod zvuk() u klasu Pas i takođe izvodimo još klase Macka i Patka iz klase Zivotinja i dodajemo metod zvuk() i u klasu Zivotinja • Samo određeni objekat klase Zivotinja proizvodi specifični zvuk pa metod u baznoj klasi ne radi ništa • Polimorfizam je fundamentalni deo objektno orijentisanog programiranja

  49. Apstraktne klase • metod zvuk() u klasi Zivotinja nije radio ništa jer smo želeli da dinamički pozivamo metod zvuk() u objektima potklase • taj metod nema značenje u kontekstu generičke klase Zivotinja pa njegovo implementiranje nema mnogo smisla • To je česta situacija u OO programiranju • Često se kreira superklasa iz koje se izvode potklase, samo da bi se koristile prednosti polimorfizma

  50. Apstraktne klase • Apstraktna klasa je klasa u kojoj su jedan ili više metoda deklarisani, ali nisu definisani. Tela tih metoda su izostavljena jer njihova implementacija nema mnogo smisla. • Pošto nemaju definiciju i ne mogu se izvršiti, ti metodi se zovu apstraktni metodi. • Deklaracija apstraktnog metoda se završava ; i na početku se navodi ključna reč abstract. • Da bi se klasa deklarisala kao apstraktna, ista ključna reč, abstract navodi se ispred ključne reči class u prvom redu definicije klase.