Nasledjivanje Nasledjivanje l l l Smatra se da

  • Slides: 49
Download presentation
Nasledjivanje

Nasledjivanje

Nasledjivanje l l l Smatra se da je mogućnost višestrukog korištenja koda (code reusability)

Nasledjivanje l l l Smatra se da je mogućnost višestrukog korištenja koda (code reusability) ključna prednost objektno orijentiranih jezika nad tradicionalnim. Objekt može naslediti atribute i metode od drugog objekta. Može zadržati one koje mu trebaju, a zameniti one koje mu ne trebaju.

Nasleđivanje klasa Pomoću koncepta nasleđivanja, klasa koja je izvedena iz osnovne klase, nasleđuje atribute

Nasleđivanje klasa Pomoću koncepta nasleđivanja, klasa koja je izvedena iz osnovne klase, nasleđuje atribute i javne metode osnovne klase. Java osnovnu klasu naziva natklasa (superclass) dok izvedenu klasu naziva potklasa (subclass).

Nadklasa i podklasa Opšti oblik definicije nasleđivanja klasa: class Natklasa {…} class Potklasa extends

Nadklasa i podklasa Opšti oblik definicije nasleđivanja klasa: class Natklasa {…} class Potklasa extends Natklasa // Klasa Potklasa nasledjuje klasu Natklasa. {…} Potklasa može da nasledi samo jednu klasu.

Kreiranje potklase Kreiranjem podklase proširuju(extends) se svojstva (properties) i metode (methods) osnovne klase. class

Kreiranje potklase Kreiranjem podklase proširuju(extends) se svojstva (properties) i metode (methods) osnovne klase. class A { private int a; void Stampaj() {System. out. println(a); } } class B extends A {private int b; int Pomnozi () { return a*b; } }

Grafički prikaz natklase i podklase

Grafički prikaz natklase i podklase

Prekrivanje metoda l. U potklasi je moguće prekriti, pregaziti, (override) metode koje imaju isto

Prekrivanje metoda l. U potklasi je moguće prekriti, pregaziti, (override) metode koje imaju isto ime i potpis kao metode osnovne klase. class A { int a; void Stampaj() {System. out. println(a); }} class B extends A {int b; void Stampaj() {System. out. println(a * b); }}

Šta se nasleđuje? Koji atributi i koji metodi bazne klase se nasleđuju u izvedenoj

Šta se nasleđuje? Koji atributi i koji metodi bazne klase se nasleđuju u izvedenoj klasi? l Odvojeno objašnjenje za atribute i metode l

Nasleđivanje atributa

Nasleđivanje atributa

Nasleđivanje atributa l Nasleđivanje utiče na dostupnost člana u izvedenoj klasi, ne na samo

Nasleđivanje atributa l Nasleđivanje utiče na dostupnost člana u izvedenoj klasi, ne na samo prisustvo.

Nasleđivanje atributa Klasa sama po sebi može biti public. To je čini dostupnom iz

Nasleđivanje atributa 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. Znači : Ne mogu se definisati objekti ne-public klase unutar klasa iz drugih paketa l l To takođe znači da ako želimo da izvedemo klasu iz klase u drugom paketu, bazna klasa mora biti deklarisana kao public.

Ako izvedena klasa nije u paketu bazne klase, • ne nasleđuju se private i

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

Ako su izvedena i bazna klasa u istom paketu, nasleđuju se svi atributi osim private atributa (public, protected i atributi bez pristupnih atributa)

Načini pristupa do članica nadređene klase, kroz primere Primer prvi class A { int

Načini pristupa do članica nadređene klase, kroz primere Primer prvi class A { int a; /* Ispred navedenog clana ne stoji nikakav nacin pristupa, sto podrzumeva javan pristup do datog clana natklase za sve klase koje se nalaze u paketu gde se nalazi natklasa */ } class B extends A { …void stampaj(String s) {System. out. println("A i B su: " + a +" "+ b); } }

Drugi primer class A { public int a; /* Ispred navedenog clana stoji nacin

Drugi primer class A { public int a; /* Ispred navedenog clana stoji nacin pristupa public kojim se omogucava javan pristup do clana natklase za sve klase nezavisno od toga kom paketu one pripadaju. */ }

primer treci class A { protected int a; /* Ispred navedenog clana stoji nacin

primer treci class A { protected int a; /* Ispred navedenog clana stoji nacin pristupa protected kojim se omogucava javan pristup do clana natklase za sve potklase nezavisno od toga kom paketu one pripadaju i svih klasa koje se nalaze u istom paketu gde se nalazi i natklasa. */ }

Kompatibilnost objektnih tipova Objekat (referentna promenljiva, odnosno referenca na objekat) natklase može da dobije

Kompatibilnost objektnih tipova Objekat (referentna promenljiva, odnosno referenca na objekat) natklase može da dobije reference na bilo koji objekat koji pripada klasi koja je izvedena iz natklase.

class A {int a; public static void main(String args[]) {B bobj=new B(); A aobj;

class A {int a; public static void main(String args[]) {B bobj=new B(); A aobj; aobj = bobj; /* Referenca na objekat aobj moze da se dodeli referenca na bilo koji objekat koji pripada klasi koja je izvedena iz klase A. Objekat bobj pripada klasi B koja je izvedena iz klase A. */ aobj. stampaj(); } // Pozvace se metoda stampaj() klase B. A(){a=0; } void stampaj(){System. out. println("A je: " +a); } } class B extends A { int b; void stampaj(){System. out. println("A i B su: " + a +" "+ b); }}

Ključna reč super U Javi se ključna reč super koristi da ukaže na klasu

Ključna reč super U Javi se ključna reč super koristi da ukaže na klasu koja je na prvom višem nivou hijerarhije od klase, koja u okviru neke od svojih metoda, koristi ključnu reč super. Postoje dva slučaja korišćenja ključne reči super: a) kada se želi pristupiti članicama nadređene klase b) kada se želi pristupiti konstruktoru nadređene klase

a) kada se želi pristupiti članicama nadređene klase class A {int a; public static

a) kada se želi pristupiti članicama nadređene klase class A {int a; public static void main(String args[]) { B bobj=new B(); bobj. stampaj(); C cobj=new C(); cobj. stampaj(); }} class B extends A { int b; void stampaj(){System. out. println("A i B su: " + super. a +" "+ b); }} // Iz klase B kod poziva super. a poziva se A. a.

l class C extends B { int c; l void stampaj(){System. out. println("A, B,

l class C extends B { int c; l void stampaj(){System. out. println("A, B, C su: " + A. a + “ “ + super. b +" "+ c); }} l // Iz klase C kod poziva super. b poziva se B. b. Ukoliko se zeli eksplicitni poziv atr. neke klase navodi se A. a.

b) kada se želi pristupiti konstruktoru nadređene klase Opšti oblik pristupa konstruktoru nadređene klase

b) kada se želi pristupiti konstruktoru nadređene klase Opšti oblik pristupa konstruktoru nadređene klase je: Super(lista parametara) za parametrizovane konstruktore ili Super() za default konstruktore

class A {int a; public static void main(String args[]) {B bobj=new B(); bobj. stampaj();

class A {int a; public static void main(String args[]) {B bobj=new B(); bobj. stampaj(); } A(){a=0; } A(int a 1) { a = a 1; } void stampaj(){System. out. println("A je: " +a); } }

class B extends A { int b; B(){super(); // za default konstruktor klase A

class B extends A { int b; B(){super(); // za default konstruktor klase A ili super(5); // za parametrizirani konstruktor klase A. b=2; } void stampaj(){System. out. println("A i B su: " + super. stampaj() +” “+ b); } }

Naredba super() koja poziva konstruktor nadklase mora u konstruktoru tekuće klase da bude prva

Naredba super() koja poziva konstruktor nadklase mora u konstruktoru tekuće klase da bude prva naredba. B(){super(); // metoda super() je prva naredba konstruktora B(). b=2; } Ukoliko bi pokušali da pozovemo: B(){b=2; super(); // metoda super() nije prva naredba konstruktora. } kod kompajliranja bi se javila greška: “ call to super must be first statement in constructor. ”

Takođe, ukoliko bi pokušali iz neke ne konstruktor metode, da pozovemo preko naredbe super(),

Takođe, ukoliko bi pokušali iz neke ne konstruktor metode, da pozovemo preko naredbe super(), konstruktor nadređene klase, javila bi se kod kompajliranja ista poruka o grešci

Pozivanje konstruktora u hijerarhiji klasa • Konstruktori, u hijerarhiji klasa, se pozivaju po redosledu

Pozivanje konstruktora u hijerarhiji klasa • Konstruktori, u hijerarhiji klasa, se pozivaju po redosledu izvođenja, od natklase ka potklasama. • Naredba super() ukoliko postoji, kod eksplicitnog poziva konstruktora nadklase, ne utiče na redosled izvršenja konstruktora (jer se naredba super u kontruktoru tekuće klase uvek poziva kao prva naredba). • Ukoliko naredba super() ne postoji, izvršavaju se podrazumevani konstruktori klasa.

Kasno povezivanje objekata sa metodom (jak polimorfizam) • Kod programskog jezika C++ postoje obične

Kasno povezivanje objekata sa metodom (jak polimorfizam) • Kod programskog jezika C++ postoje obične i virtuelne metode. Obične metode se povezuju sa objektima u vreme kompajliranja (early bindig), dok se virtuelene metode povezuju sa objektom u vreme izvršenja programa (late binding), pomocu tabela virtuelnih metoda. • Kod Jave su metode podrazumevano virtuelne, što znači da se one povezuju sa objektima u vreme izvršenja programa.

Apstraktne klase se definišu na isti način kao i obične klase, ali one za

Apstraktne klase se definišu na isti način kao i obične klase, ali one za razliku od običnih klasa ne mogu da imaju pojavljivanja. • • Apstraktne klase se javljaju u slučaju postojanja potrebe da klasa ima bar jednu apstraktnu metodu. • Klasa koja ima jednu ili više apstraktnih metoda mora da se definiše kao apstraktna klasa. •

 • Apstraktna metoda nema telo i odgovornost realizacije te metode se prenosi do

• Apstraktna metoda nema telo i odgovornost realizacije te metode se prenosi do metode klase koja je nasledila apstraktnu klasu, u kojoj se nalazi ta apstraktna metoda. • Ispred apstraktne klase i apstraktnih metoda se stavlja ključna reč abstract.

Apstraktne klase i metode se definišu na sledeći način: • a) abstract class ime_klase

Apstraktne klase i metode se definišu na sledeći način: • a) abstract class ime_klase {…} - apstraktne klase b)abstract tip ime_metode(lista parametara) - apstr. metode •

 • Apstraktna klasa ne može imati apstraktne konstruktore niti statičke metode. • Potklase

• Apstraktna klasa ne može imati apstraktne konstruktore niti statičke metode. • Potklase apstraktne klase moraju realizovati sve apstraktne metode natklase. U suprotnom one takođe postaju apstraktne klase. • Apstraktne klasa mogu da imaju main() metodu. Samim tim program može da se izvrši pozivom apstraktne klase.

abstract class A {int a; public static void main(String args[]) { A aobj =

abstract class A {int a; public static void main(String args[]) { A aobj = new A(); // ne moze da se kreira jer je klasa A abstraktna. B bobj=new B(); A raobj; // jedino moze da se definise referenca na objekat //apstraktne klase. raobj = bobj; // referenca na objekat apstraktne //klase moze da dobije // referencu na objekat konkretne klase.

raobj. stampaj(); } // referentni objekat apstraktne klase moze da //pozove clanice objekta konkretne

raobj. stampaj(); } // referentni objekat apstraktne klase moze da //pozove clanice objekta konkretne klase. A(){a=0; } abstract void stampaj(); // apstratna metoda nema telo. }

l l l l class B extends A { void stampaj() { System. out.

l l l l class B extends A { void stampaj() { System. out. println("A i B su: " + a +" "+ b); } } // navedena metoda predstavlja realizaciju apstraktne klase stampaj iz // apstrakne klase A.

Rezervisana reč final kod metoda klasa Ukoliko se ključna reč final koristi kod definicije

Rezervisana reč final kod metoda klasa Ukoliko se ključna reč final koristi kod definicije metode, onemogućava se prekrivanje takvih metoda u izvedenim klasama. class A { // Definisanje final metode koja se ne moze prekriti. final void stampaj(){System. out. println("A je: " +a); } } class B extends A { // Ova metoda se ne moze prekriti, jer je metoda stampaj() klase A definisana kao // final. void stampaj(){ System. out. println("A i B su: " + a +" "+ b); } }

Rezervisana reč final Kod poziva final metode iz objekta koji pripada klasi, u kojoj

Rezervisana reč final Kod poziva final metode iz objekta koji pripada klasi, u kojoj je definisana final metoda, pri kompaliranju, u program se neposredno ugrađuje kod koji se nalazi u telu final metode. Sličan postupak se dešava kod inline metoda u C++ i makroa kod C programskog jezika. Navedeni postupak se ne može izvesti, ukoliko se final metoda poziva iz referentnce na objekat koji pripada klasi koja je iznad u hijerarhiji u odnosu na klasu kojoj pripada final metoda.

Rezervisana reč final kod definisanja klase Ukoliko se ključna reč final koristi kod definicije

Rezervisana reč final kod definisanja klase Ukoliko se ključna reč final koristi kod definicije klase, onemogućava se nasleđivanje takvih klasa. final class A { …} class B extends A // Klasa B ne moze da nasledi klasu A jer je ista final. {…}

Klasa Object Java sadrži klasu Object iz koje su izvedene sve druge klase. Object

Klasa Object Java sadrži klasu Object iz koje su izvedene sve druge klase. Object klasa je natklasa svih drugih klasa. Na taj način je moguće definisati reference na objekat klase Object koji može da prihvati objekat bilo koje klase.

A sad mali rezime, p re zime l l Java ne podržava višestruko nasleđivanje

A sad mali rezime, p re zime l l Java ne podržava višestruko nasleđivanje tako da svaka klasa može imati samo jednu osnovnu klasu. Tvrdnja da izvedena klasa nasleđuje sve članove osnovne klase nije baš sasvim tačna. Naime, u skladu sa pravilima za pristup članovima klase može se reći da izvedena klasa nasleđuje:

l l sve javne i zaštićene članove osnovne klase sve članove osnovne klase bez

l l sve javne i zaštićene članove osnovne klase sve članove osnovne klase bez specifikatora pristupa pod uslovom da je izvedena klasa u istom paketu kao i osnovna klasa.

Zaključujemo da se privatni članovi osnovne klase ne nasleđuju, što je i normalno jer

Zaključujemo da se privatni članovi osnovne klase ne nasleđuju, što je i normalno jer izvedena klasa nema pravo da im pristupi.

l l U nekim knjigama se može naći i tvrdnja da izvedena klasa ne

l l U nekim knjigama se može naći i tvrdnja da izvedena klasa ne nasleđuje metode koje preklapa, tj. obezbeđuje svoje metode sa istim potpisom. Sa ovom tvrdnjom se ne bismo složili jer izvedena klasa i dalje ima mogućnost da takvim metodima pristupi i da ih koristi uz pomoć ključne reči super.

l l l Posebno je zanimljiv odnos izvedene klase prema metodima nasleđenim iz osnovne

l l l Posebno je zanimljiv odnos izvedene klase prema metodima nasleđenim iz osnovne klase. Moguća su dva slučaja: izvedena klasa obezbeđuje potpuno novu implementaciju metoda ne oslanjajući se na verziju metoda iz osnovne klase izvedena klasa koristi verziju metoda iz osnovne klase i dodaje mu neke nove funkcionalnosti.

l Postoji dosta slučajeva kada osnovna klasa ne nudi nikakvu implementaciju nekog svog metoda

l Postoji dosta slučajeva kada osnovna klasa ne nudi nikakvu implementaciju nekog svog metoda i tada izvedena klasa nema izbora ona mora obezbediti novu implementaciju metoda

l l Za razliku od ovoga mnogo je češći slučaj kada izvedena klasa nadgrađuje

l l Za razliku od ovoga mnogo je češći slučaj kada izvedena klasa nadgrađuje metod iz osnovne klase. Najtipičniji primer su konstruktori koji uglavnom prvo pozivaju konstruktor osnovne klase pa tek onda vrše inicijalizaciju specifičnu za izvedenu klasu.

l l Postoje i metodi osnovne klase koje izvedena klasa ne može da preklopi.

l l Postoje i metodi osnovne klase koje izvedena klasa ne može da preklopi. Prvo, izvedena klasa ne može da preklopi statičke metode osnovne klase. Drugo, osnovna klasa može sama da odluči da li će da dopusti da izvedena klasa preklopi neki njen metod. Svi metodi osnovne klase koji u svojoj deklaraciji imaju specifikator final ne mogu biti preklopljeni od strane izvedene klase

l l I ne samo da osnovna klasa može da odluči da li se

l l I ne samo da osnovna klasa može da odluči da li se njeni metodi mogu preklapati ili ne već klasa može da odluči da li će neka klasa uopšte moći da bude izvedena iz nje. Ukoliko, naime, u deklaraciji klase stoji specifikator final tada se ta klasa ne može subklasirati, tj. iz nje se ne mogu izvoditi druge klase.

l l l Odluka da neka klasa bude finalna se donosi uglavnom iz dva

l l l Odluka da neka klasa bude finalna se donosi uglavnom iz dva razloga. Prvi razlog je čisto dizajnerski, kada dizajner klase smatra da njegova klasa ne treba da ima izvedene klase, drugi je bezbednosni. Na primer, klasa String iz java. lang paketa je finalna klasa iz ovog drugog razloga