OBJEKTNO ORIJENTISANO PROGRAMIRANJE PREDAVANJE 12: NASLEĐIVANJE Miloš Kovačević Đorđe Nedeljković 1 /17
OSNOVNI KONCEPTI - Statički i dinamički tipovi podataka - Prepisivanje metoda superklase - Polimorfizam na nivou metode - Modifikator vidljivosti protected - tostring() metoda klase Object 2 /17
DoME PROJEKAT - NASTAVAK 3 /17
DoME V2 PROBLEM SA PRINT METODOM - Napraviti jedan CD i jedan Video i staviti ih u bazu. Izlistati sadržaj baze u obe verzije (dome-v1 i dome-v2) public class Database{ private ArrayList<Item> items; public Database(){ items = new ArrayList<Item>(); public void additem(item theitem){ items.add(theitem); public void list(){ for(item item : items) { item.print(); System.out.println(); metoda print() ne razlikuje CD i Video objekte, štampa samo zajednička polja iz klase Item 4 /17
STATIČKI I DINAMIČKI TIP OBJEKTNIH PROMENLJIVIH Car c1 = new Car(); // tip c1 je Car Vehicle v1 = new Car(); // v1 polimorfna // sta je tip v1? - Statički tip promenljive je deklarisan tip promenljive (levo do promenljive u prvom pojavljivanju) - Dinamički tip promenljive je tip objekta na koji promenljiva ukazuje - U gornjem primeru c1 ima isti statički i dinamički tip (Car), dok v1 ima statički tip Vehicle, a dinamički Car - Polimorfna promenljiva može imati različit statički i dinamički tip 5 /17
DoME V2 PROBLEM SA PRINT METODOM - Šta se dešava ako print() metod iz klase Item prebacimo u klase CD i Video? public void print(){ System.out.print("title: " + title + " (" + playingtime + " mins)"); if(gotit) { System.out.println("*"); else { System.out.println(); System.out.println(" " + comment); System.out.println("artist: " + artist); System.out.println("num. tracks: " + numberoftracks); dodato za CD polja - Prodiskutovati dva tipa grešaka koje prijavljuje prevodilac: 1. privatna polja superklase nisu dostupna potklasi (prilikom prevođenja CD) 2. Item klasa ne sadrži print() metod (prilikom prevođenja Database) 6 /17
DoME V2 PROBLEM SA PRINT METODOM - Šta se dešava ako print() metod iz klase Item prebacimo u klase CD i Video? - privatna polja superklase nisu dostupna potklasi (prilikom prevođenja CD) - Rešava se uvođenjem javnih metoda za pristup privatnim poljima u superklasi public void list(){ for(item item : items) { item.print(); System.out.println(); - Item klasa ne sadrži print() metod (prilikom prevođenja Database) - Prevodilac proverava statički tip za promenljivu item - Prilikom provere tipova prevodilac proverava statički, a ne dinamički tip (jer u vreme prevođenja se ne zna tip objekta na koji promenljiva pokazuje) 7 /17
PREPISIVANJE METODA SUPERKLASE public class Item{... public void print(){ System.out.print(title + " (" + playingtime + " mins)"); if(gotit){ System.out.println("*"); else { System.out.println(); System.out.println(" " + comment); public class CD extends Item{... public void print(){ System.out.println(" " + artist); System.out.println(" tracks: " + numberoftracks); public class Video extends Item{... public void print(){ System.out.println(" director: " + director); 8 /17
PREPISIVANJE METODA SUPERKLASE - Potklasa može da definiše metod koji ima isti potpis kao i metod superklase - Tada se razlikuje implementacija metoda u odnosu na metod superklase (metod potklase radi nešto drugo) Item i = new Item(...); i.print(); CD cd = new CD(...); cd.print(); // poziva se print() metoda iz Item klase // poziva se print() metoda iz CD klase - Metoda iz potklase koja je prepisana ima prednost pri pozivu nad objektima te klase 9 /17
DINAMIČKO PRONALAŽENJE ADEKVATNOG METODA - Otvoriti projekat dome-v3 iz chapter09 - Analizirati kod, kreirati jedan CD i jedan Video, ubaciti ih u bazu i potom izlistati njen sadržaj (diskutovati) - U vreme prevođenja proverava se statički tip, a u vreme izvršavanja proverava se dinamički tip 10/17
POLIMORFIZAM NA NIVOU METODE - Isti poziv metode može aktivirati različite metode u zavisnosti od dinamičkog tipa promenljive nad kojom je metod pozvan public void list(){ for(item item : items){ item.print(); polimorfna metoda 11/17
POLIMORFIZAM - REKAPITULACIJA - Polimorfizam mogućnost poprimanja više oblika - Objektne promenljive u Javi su polimorfne pokazuju na objekte deklarisane klase ili na izvedene klase - Isti poziv metode može aktivirati različite metode u zavisnosti od dinamičkog tipa promenljive nad kojom je metod pozvan public void list(){ for(item item : items){ item.print(); polimorfna promenljiva polimorfna metoda 12/17
POZIV PREPISANE METODE PREKO SUPER - Primećujemo da u verziji 3 opet imamo problem sa štampom (štampaju se samo polja klasa CD i Video) - Problem se prevazilazi upotrebnom službene reči super za poziv prepisane metode superklase: public class CD extends Item{ poziv prepisanog metoda superklase... public void print(){ super.print(); System.out.println(" " + artist); System.out.println(" tracks: " + numberoftracks); - Za razliku od poziva konstruktora superklase, poziv metode preko super može biti bilo gde unutar metode - Iako se preko super mogu pozivati i neprepisane javne metode iz superklase, takve metode su vidljive u potklasi i direktno (bez super) 13/17
UTVRĐIVANJE DINAMIČKOG TIPA POLIMORFNE PROMENLJIVE - Ukoliko želimo da utvrdimo dinamički tip polimorfne promenljive, koristimo službenu reč instanceof: for( Item item : items ){ if(item instanceof CD){... 14/17
MODIFIKATOR VIDLJIVOSTI PROTECTED - Ukoliko polje ili metod ima deklarisanu vidljivost protected, može mu se pristupiti (pozvati) iz objekata iste klase, kao i svih potklasa protected String gettitle(){ return title; - Modifikator protected omogućava prisniju vezu između objekata potklasa i superklase, što je i prirodno s obzirom da objekti potklasa imaju i svojstva superklase 15/17
ENKAPSULACIJA - REZIME - Enkapsulacija je osnovni princip objektnog orijentisanog programiranja koji podrazumeva sakrivanje detalja implementacije od spoljnog sveta - Realizuje se primenom modifikatora vidljivosti na nivou polja i metoda Modifikator Klasa Potklasa Svet public + + + protected + + private + 16/17
METODtoString() KLASE Object - Javna metoda tostring() vraća tekstualnu reprezentaciju objekta - Kako su sve klase nasleđene iz klase Object, sve nasleđuju ovaj metod - Ukoliko neka klasa ne prepiše implementaciju tostring() metode, onda podrazumevana metoda (iz klase Object) vraća tekst oblika ImeKlase@memorijskaAdresaObjektaUMemoriji, npr: CD@6acdd1 - Obično se ova metoda prepisuje, npr: public class Osoba{... // moguca tekst reprezentacija objekata klase Osoba public String tostring(){ return "ime: " + ime + "\n prezime: " + prezime; - Kada klasa prepiše tostring(), njeni objekti mogu biti direktni argumenti za System.out.println(): Osoba pera = new Osoba(...);... System.out.println(pera); 17/17