190 likes | 403 Views
Objektno orijentisano programiranje vežbe – čas 06. Biljana Stojanović. Interfejsi. 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.
E N D
Objektno orijentisano programiranjevežbe – čas 06 Biljana Stojanović
Interfejsi • 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. Biljana Stojanović
Interfejsi • Formalna korist interfejsa je da se definiše eksterna forma 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, mora se koristiti ključna reč public kada ih definišemo u odgovarajućoj klasi (atribut pristupa ne sme biti manje restriktivan). Biljana Stojanović
Interfejsi • 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. Biljana Stojanović
Interfejsi • 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. Biljana Stojanović
Upotreba interfejsa • Interfejs koji deklariše metode, definiše skup operacija, čime se postiže da objekti različitih klasa 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 referiše na objekat svakog od klasnih tipova koji implementiraju taj interfejs. To znači da se promenljiva može iskoristiti za polimorfan poziv metoda deklarisanih u interfejsu. Biljana Stojanović
Upotreba interfejsa - nastavak • Parametar metoda može biti interfejsnog tipa. To znači da metodu kao argument može biti predata referenca na objekat proizvoljnog tipa koji implementira dati interfejs. Biljana Stojanović
Kastovanje objekata • Možemo vršiti kastovanje objekata u drugi klasni tip, ali samo ukoliko su ove klase u istoj hijerarhiji izvedenih klasa. Spaniel a = new Spaniel(“Endi”); Zivotinja a1 = (Zivotinja) a; // Može da se piše Zivotinja a1 = a; Kada se promenljivoj natklase dodeljuje referenca na objekat potklase, ne mora da se navodi kastovanje, kompajler to sam odradi. Biljana Stojanović
Kastovanje objekata - nastavak • Kada se radi kastovanje u potklasni tip, to mora eksplicitno da se navede, pri čemu objekat mora biti legitimna instanca klase u koju vršimo kastovanje. Pas a2 = (Pas)a1; • Razlozi za kastovanje: • Kada izvršavamo metode polimorfno • Da prenesemo objekte nekoliko mogućih klasa metodu Biljana Stojanović
Kastovanje objekata - nastavak Patka patka = newPatka(“Donald", “Pekinska"); Zivotinjaljubimac = patka; ljubimac.lezeJaja();// Promenljiva ljubimac referiše na objekat klase Patka, ali i pored toga ova naredba dovodi do greške. Razlog je što metod lezeJaja() ne postoji u klasi Zivotinja. Ispravno je napisati sledeće: ((Patka)ljubimac).lezeJaja(); Biljana Stojanović
Identifikacija objekata • Operator instanceof if(kucniLjubimac instanceof Pas) ... • Proverava da li je moguće izvršiti kastovanje objekta referisanog levim operandom u tip sa desne strane, tj. rezultat je true ako je objekat istog tipa kao i desni operand ili bilo kog od podtipova. Biljana Stojanović
Kopiranje objekata • Ranije je rečeno da protected metod clone() nasleđen iz klase Object kreira novi objekat koji predstavlja kopiju postojećeg objekta. • Da bi kloniranje bilo moguće, neophodno je da klasa nad čijim se objektom primenjuje metod clone() implementira interfejs Cloneable. public class Pas implements Cloneable { … } • Kada su promenljive članice originalnog objekta klasnog tipa, tj. referišu na objekte klase, tada se samo kopiraju reference! Biljana Stojanović
Primer – paket clone • Ako dodamo klasu Buva koja nasleđuje klasu Zivotinja i definišemo je tako da implementira interfejs Cloneable, onda i bazna klasa Zivotinja treba da implementira ovaj interfejs. • Metod clone() u klasi Buva kreira novi objekat ove klase, pri čemu se vrši kopiranje referenci ime i vrsta, tj. ne kreiraju se dva nova objekta klase String, već se samo kreiraju dve reference na postojeće objekte ove klase. U metodu clone() poziva se metod clone() natklase (klase Zivotinja) kako bi se iskopirala vrednost članice vrsta. Biljana Stojanović
Primer – paket clone (nastavak) • Dodajemo klasu PasLjubimac koja sadrži objekat klase Buva. • Ako kloniramo objekat klase PasLjubimac, kreirana kopija sadrži referencu na isti objekat klase Buva. Iz tog razloga, ako se promeni ime buve iz kopije objekta klase PasLjubimac, promeniće se ime buve i u originalnom objektu ove klase. Biljana Stojanović
Kopiranje objekata - nastavak • Metod clone() treba implementirati na način koji nam odgovara. • Alterantiva za metod clone() su copy-konstruktori. • U klasi PasLjubimac metod clone() se može implementirati na sledeći način: public Object clone() throws CloneNotSuppotedException { PasLjubimac ljubimac = (PasLjubimac)super.clone(); ljubimac.ljubimcevaBuva = (Buva)ljubimcevaBuva.clone(); return ljubimac; } Biljana Stojanović
Ukratko o izuzecima • Izuzetak u Javi je objekat koji se kreira kada dođe do abnormalne situacije u programu. • Ovaj objekat sadrži polje koje čuva informaciju o prirodi problema. • Za izuzetak kažemo da je bačen. • Izuzetak je objekat neke potklase standardne klase Throwable – ovo važi i za standardne izuzetke i za izuzetke koje korisnik definiše. • Potklase Error i Exception klase Throwable pokrivaju sve standardne izuzetke. Biljana Stojanović
Ukratko o izuzecima - nastavak • Da bi se naglasilo da neki metod izbacuje izuzetak odgovarajućeg tipa, deklaraciji metoda se dodaje klauzula throws. dobule mojMetod() throws lista_izuzetaka koje metod izbacuje { … } • Obrada izuzetaka se sastoji iz 3 bloka: • try blok – označava deo koda gde se može javiti izuzetak • catch blok – obuhvata kod koji je namenjen obradi izuzetka određenog tipa koji može biti bačen u odgovarajućem try bloku. Argument catch bloka je izuzetak odgovarajućeg tipa i ovaj blok se navodi odmah iza try bloka. • finally blok – uvek se izvršava pre nego se metod završi, bez obzira da li je izuzetak izbačen u try bloku. Biljana Stojanović
Ukratko o izuzecima - nastavak • Kada se izbaci izuzetak, kontrola se prebacuje na prvu naredbu u odgovarajućem catch bloku. • Try i catch blok su povezani, ne smeju se odvajati nekim drugim kodom. • Ako try blok može da izbaci više različitih vrsta izuzetaka, možemo staviti za svaki tip izuzetka po jedan catch blok za obradu. try { … } catch(ArithmeticException e) {… } catch(IndexOutOfBoundsException e) { … } • Izuzetak se hvata prvim catch blokom koji ima odgovarajući tip izuzetka kao argument. Biljana Stojanović