objektno orijentisano programiranje - · pdf filestatiČki i dinamiČki tip objektnih...
TRANSCRIPT
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
4 /17
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
- Napraviti jedan CD i jedan Video i staviti ih u bazu. Izlistati sadržaj baze u obe verzije (dome-v1 i dome-v2)
STATIČKI I DINAMIČKI TIP OBJEKTNIH PROMENLJIVIH
- 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
Car c1 = new Car(); // tip c1 je Car
Vehicle v1 = new Car(); // v1 – polimorfna
// sta je tip v1?
DoME V2 – PROBLEM SA PRINT METODOM
6 /17
- Šta se dešava ako print() metod iz klase Itemprebacimo u klase CD i Video?
- 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)
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
DoME V2 – PROBLEM SA PRINT METODOM
7 /17
- Šta se dešava ako print() metod iz klase Itemprebacimo 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
- 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)
public void list(){
for(Item item : items) {
item.print();
System.out.println();
}
}
PREPISIVANJE METODA SUPERKLASE
8 /17
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);
}
}
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);
}
}
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)
- Metoda iz potklase koja je prepisana ima prednost pri pozivu nad objektima te klase
9 /17
Item i = new Item(...);
i.print(); // poziva se print() metoda iz Item klase
CD cd = new CD(...);
cd.print(); // poziva se print() metoda iz CD klase
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
11/17
public void list(){
for(Item item : items){
item.print();
}
}
polimorfna metoda
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
12/17
public void list(){
for(Item item : items){
item.print();
}
}
polimorfna metoda
polimorfna promenljiva
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:
- 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
public class CD extends Item{
...
public void print(){
super.print();
System.out.println(" " + artist);
System.out.println(" tracks: " + numberOfTracks);
}
}
poziv prepisanog metoda superklase
UTVRĐIVANJE DINAMIČKOG TIPA POLIMORFNE PROMENLJIVE
- Ukoliko želimo da utvrdimo dinamički tip polimorfne promenljive, koristimo službenu reč instanceof:
14/17
for( Item item : items ){
if(item instanceof CD){
...
}
}
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
- 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
protected String getTitle(){ return title; }
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
16/17
Modifikator Klasa Potklasa Svet
public + + +
protected + + –
private + – –
METOD toString() 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:
- Kada klasa prepiše toString(), njeni objekti mogu biti direktni argumenti zaSystem.out.println():
17/17
public class Osoba{
...
// moguca tekst reprezentacija objekata klase Osoba
public String toString(){
return "ime: " + ime + "\n prezime: " + prezime;
}
}
Osoba pera = new Osoba(...);
...
System.out.println(pera);