58
Objektno orijentisano programiranje Java, nasleđivanje

Objektno orijentisano programiranje

  • Upload
    pete

  • View
    99

  • Download
    1

Embed Size (px)

DESCRIPTION

Java, nasleđivanje. Objektno orijentisano programiranje. 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 ) - PowerPoint PPT Presentation

Citation preview

Page 1: Objektno orijentisano programiranje

Objektno orijentisano programiranje

Java, nasleđivanje

Page 2: Objektno orijentisano programiranje

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

Page 3: Objektno orijentisano programiranje

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

Page 4: Objektno orijentisano programiranje

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.

Page 5: Objektno orijentisano programiranje

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

Page 6: Objektno orijentisano programiranje

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

Page 7: Objektno orijentisano programiranje

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.

Page 8: Objektno orijentisano programiranje

Š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

Page 9: Objektno orijentisano programiranje

Nasleđivanje atributa

● Slika vredi 1000 reči:

Page 10: Objektno orijentisano programiranje

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.

Page 11: Objektno orijentisano programiranje

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 publicako su izvedena i bazna klasa u istom paketu, nasleđuju se svi atributi osim private atributa (public, protected i atributi bez pristupnih atributa)

Page 12: Objektno orijentisano programiranje

Međusobni odnos pristupnih atributa – važno kod overriding-a i polimorfizma

● po rastućoj restriktivnosti:public – najmanje restriktivan, svuda dostupanprotected – sprečava pristup iz klasa izvan paketa, ali ne ograničava nasleđivanje ako je klasa publicbez pristupnog atributa – pristup se ograničava na klase iz istog paketa i sprečava se nasleđivanje u potklasama definisanim u drugim paketimaprivate – pristup samo unutar klase

Page 13: Objektno orijentisano programiranje

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.

Page 14: Objektno orijentisano programiranje

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

Page 15: Objektno orijentisano programiranje

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 :)

Page 16: Objektno orijentisano programiranje

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.

Page 17: Objektno orijentisano programiranje

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

Page 18: Objektno orijentisano programiranje

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

Page 19: Objektno orijentisano programiranje

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!!!:

Page 20: Objektno orijentisano programiranje

Slika

Page 21: Objektno orijentisano programiranje

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.

Page 22: Objektno orijentisano programiranje

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)

Page 23: Objektno orijentisano programiranje

Izvođenje klase

public class Zivotinja{ public Zivotinja(String sVrsta){

vrsta=sVrsta; }

public String toString(){return ”Ovo je ” + vrsta;

}private String vrsta;

}

Page 24: Objektno orijentisano programiranje

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 }

Page 25: Objektno orijentisano programiranje

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).

Page 26: Objektno orijentisano programiranje

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.

Page 27: Objektno orijentisano programiranje

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 }

Page 28: Objektno orijentisano programiranje

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 )

Page 29: Objektno orijentisano programiranje

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

Page 30: Objektno orijentisano programiranje

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.

Page 31: Objektno orijentisano programiranje

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

Page 32: Objektno orijentisano programiranje

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

Page 33: Objektno orijentisano programiranje

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.

Page 34: Objektno orijentisano programiranje

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še metod 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

Page 35: Objektno orijentisano programiranje

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 ; }

Page 36: Objektno orijentisano programiranje

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

Page 37: Objektno orijentisano programiranje

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:

Page 38: Objektno orijentisano programiranje

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

Page 39: Objektno orijentisano programiranje

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

Page 40: Objektno orijentisano programiranje

Slika

Page 41: Objektno orijentisano programiranje

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

Page 42: Objektno orijentisano programiranje

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

Page 43: Objektno orijentisano programiranje

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 )

Page 44: Objektno orijentisano programiranje

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 } // .... }

Page 45: Objektno orijentisano programiranje

Rezime – polimorfizam

poziv metoda za objekat izvedene klase mora biti preko promenljive tipa bazne klasepozvani metod mora biti definisan u izvedenoj klasipozvani metod mora takođe biti deklarisan kao član bazne klasepotpisi metoda u baznoj i izvedenoj klasi moraju biti istipovratni tipovi metoda bazne i izvedene klase moraju biti ili isti ili kovarijantnipristupni atribut metoda izvedene klase ne sme biti restriktivniji od odgovarajućeg pristupnog atributa bazne klase

Page 46: Objektno orijentisano programiranje

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.

Page 47: Objektno orijentisano programiranje

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

Page 48: Objektno orijentisano programiranje

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

Page 49: Objektno orijentisano programiranje

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

Page 50: Objektno orijentisano programiranje

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.

Page 51: Objektno orijentisano programiranje

Apstraktne klase

● izmene u primeru:public abstract class Zivotinja{

public abstract void zvuk(); // apstraktni metod // dalje sve isto ... }

● public abstract <=> abstract public● i još za metod to mora ići pre povratnog tipa● Apstraktni metod ne može biti private pošto se

private metod ne može naslediti, a time ni predefinisati u potklasi

Page 52: Objektno orijentisano programiranje

Apstraktne klase● Objekat apstraktne klase se ne može instancirati, ali se može

deklarisati promenljiva tipa apstraktne klase, npr:Zivotinja ljubimac = null; //deklaracija prom. tipa Z.

● Dalje se ova promenljiva može koristiti kao u primeru za polimorfizam

● Kada izvodimo klasu iz apstraktne bazne klase, ne moramo da definišemo sve apstraktne metode u potklasi. U tom slučaju, i potklasa će takođe biti apstraktna i nećemo moći da instanciramo ni objekte potklase

● Ako je klasa apstraktna, moramo koristiti ključnu reč abstract kada je definišemo, čak i kada samo nasleđuje apstraktni metod svoje superklase. Pre ili kasnije moramo imati potklasu koja ne sadrži apstraktne metode. Onda možemo kreirati objekte tog klasnog tipa

Page 53: Objektno orijentisano programiranje

Univerzalna superklasa● Sve naše klase do sada su potklase standardne klase Object,

pa je ona superklasa svake klase.● Ne moramo to nikada eksplicitno naglašavati, jer se dešava

automatski.● Posledice:

promenljiva tipa Object može da čuva referencu na objekat proizvoljnog klasnog tipa, što je korisno kada želimo da pišemo metod koji rukuje objektima nepoznatog tipa. Možemo da definišemo parametar metoda tipa Object, pa se referenca na objekat proizvoljnog tipa može proslediti metodu naše klase nasleđuju članove klase Object. To su metodi ( 7 public i 2 protected )

Page 54: Objektno orijentisano programiranje

public metodi klase Object● toString() - vraća String objekat koji opisuje tekući objekat. U

nasleđenoj verziji metoda, to će biti ime klase, za kojim sledi '@' pa heksadecimalna reprezentacija objekta. Možemo ga predefinisati u našim klasama da vraća naš String objekat ( String-reprezentaciju objekta klase)

● equals() - poredi referencu na objekat prosleđen kao argument sa referencom na tekući objekat i vraća true ako su jednake ( referišu na isti objekat). Inače se vraća false (različiti objekti; čak i ako imaju iste vrednosti atributa)

● hashCode()● getClass(), notify(), notifyAll(), wait() - ne mogu se predefinisati u

našim klasama – definisani ključnom rečju final u definiciji klase Object

● sada je jasno otkuda polimorfno ponašanje metoda toString() u našim izvedenim klasama kada naša bazna klasa ne definiše ovaj metod. Uvek postoji toString() metod u svim našim klasama koji je nasleđen od klase Object

Page 55: Objektno orijentisano programiranje

protected metodi klase Object

● clone() - kreira objekat koji je kopija tekućeg objekta bez obzira na njegov tip. Tip može biti proizvoljan, pošto promenljiva tipa Object može referisati na objekat proizvoljne klase. Ne radi sa svim objektima i ne radi uvek baš ono što želimo

● finalize() - poziva se prilikom uništavanja objekta. Može se predefinisati da bi se dodao sopstveni kod za oslobađanje resursa koje je objekat koristio

Page 56: Objektno orijentisano programiranje

Klasa Object

● Pošto sve naše klase nasleđuju metode definisane u klasi Object, trebalo bi ih malo detaljnije pogledati

● toString() - sada je jasno zašto se uvek mora deklarisati kao public (tako je deklarisan u klasi Object)

Page 57: Objektno orijentisano programiranje

Određivanje klase objekta● metod getClass() koji sve naše klase nasleđuju od Object klase vraća

objekat tipa Class koji određuje klasu objekta● Ako imamo promenljivu ljubimac tipa Zivotinja koja može sadržati

referencu na objekat klase Pas, Macka ili Krava, da bismo otkrili na šta ona zaista referiše, možemo pisati:

Class tipObjekta = ljubimac.getClass(); System.out.println(tipObjekta.getName());

● Metod getName() je član klase Class i vraća puno kvalifikovano ime aktuelne klase objekta za koji je pozvan kao String objekat

● Zapamtiti da objekat Class vraća aktuelnu klasu objekta. Npr.String s = ”neki string”;

Object str = s; // referencu na String objekat čuvamo kao tip Object System.out.println(str.getClass().getName());ispisaće java.lang.String. Činjenica da je referenca smeštena u

promenljivoj tipa Object ne utiče na tip samog objekta

Page 58: Objektno orijentisano programiranje

Određivanje klase objekta

● Kada se program izvršava, postoje instance klase Class koje reprezentuju svaku od klasa i interferjsa našeg programa. Takođe postoji i Class objekat za svaki tip niza u našem programu i za svaki primitivni tip. Generiše ih JVM kada se učitava naš program. Pošto je primarna svrha Class-a da ga koristi JVM, nema public konstruktora, pa ne možemo sami kreirati objekte klase Class