You are on page 1of 22

Objektno

orijentirano
programiranje
4. Svojstva OOP (apstrakcija, nasljeđivanje..)
Apstrakcija (1)
• Modeliranje objekata tako da se koriste samo bitne
komponente stvarnog objekta

• Npr. Modeliramo studenta


o Ime
o Prezime
o Datum rođenja
o Visina ?
o Težina ?
Apstrakcija (2)
Apstrakcija (3)

• Primjer inicijalizacije objekta


Enkapsulacija - učahurivanje
• Klasa skriva neke atribute i neka ponašanja od ostalih razreda.

• učahurivanjem se postiže slaba povezanost objekata (engl.


loose coupling)

• slabom povezanošću objekti postaju neovisniji i interne


promjene jednog objekta ne utječu na rad drugog
Enkapsulacija Studenta (1)
• broj ocjena i polje ocjena su implementacijski detalj i njih
treba sakriti od javnosti postavljanjem modifikatora private

• ime, prezime i jmbag su podaci koji trebaju biti dostupni


vanjskom klijentu i za čitanje i za pisanje

• uobičajeno je varijable postaviti da su privatne, a za dohvat i


postavljanje njihovi vrijednosti napisati posebne metode - tzv.
getteri i setteri
Enkapsulacija Studenta (2)
Enkapsulacija Studenta (3)
Nasljeđivanje
• Klasa može biti izvedena iz druge klase, nasljeđujući članske
varijable i metode osnovne (bazne) klase
• podklasa, klasa dijete, izvedena klasa
o specijalizacija - omogućuje stvaranje podklase koja predstavlja specijalnu verziju klase
(npr. dodavanje novih elemenata)

• nadklasa, klasa roditelj, bazna klasa, osnovna klasa


o generalizacija - omogućuje stvaranje nadklase koji objedinjuje strukturu i ponašanje
zajedničko za nekoliko izvedenih klasa

• U Javi sve klase osim klase Object imaju jednu direktnu klasu
o Ako to nije neki eksplicitno navedeni razred, onda je to razred Object
Zašto nasljeđivanje?
• Omogućuje hijerarhijsku organizaciju klasa.

• Želimo li napraviti novu klasu, a već postoji klasa koja


uključuje nešto što trebamo (kod, članske varijable, metode…)
nasljeđivanjem koristimo već postojeće (u novoj izvedenoj
klasi)

• Podklasa nasljeđuje sve članove (članske varijable, metode i


ugniježđene klase) svoje nadklase.
Modifikatori vidiljivosti - podsjetnik
• Ne može pristupiti članovima nadklase koji su označeni s
private.
o može javnim i onima koji su označeni s protected.
o podsjetnik: članovi bez modifikatora dostupni su ako su razredi u istom paketu

• Konstruktori nisu članovi pa se ne nasljeđuju ali se iz podklase


poziva konstruktor nad klase (eksplicitno ili implicitno)
Definicija nasljeđivanja
• Za nasljeđivanje se koristi ključna riječ extends
• Npr: public class ImePodKlase extends ImeNadKlase{}

• Hrana, piće i odjeća su artikli (klasa Artikl) i imaju šifru, naziv


i cijenu, ali svaki od njih ima nešto specifično baš za tu vrstu
artikla npr:
o Hrana (klasa Hrana) ima rok trajanja i masu
o Piće (klasa Piće) ima volumen
o Odjeća (klasa Odjeća) ima veličinu
o naslijedimo postojeću funkcionalnost klase Artikl
• npr. izračun cijene
o dodajemo funkcionalnost specifičnu za pojedinu klasu
Redoslijed pozivanja konstruktora (1)
public class Artikl{
public Artikl() {
System.out.println(“Artikl constructor");
} ...
}

public class Hrana extends Artikl{


public Hrana () {
// ovdje prevoditelj dodaje super();
System.out.println(“Hrana constructor");
} ...
}
Redoslijed pozivanja konstruktora (2)
• Prilikom stvaranja novog objekta klase Hrana prvo se mora
inicijalizirati dio koji je naslijeđen iz bazne klase(tj. klase
Artikl)
super() & this()
• super() poziva konstruktor baznog razreda
o treba razlikovati od this() koji poziva neki drugi konstruktor istog razreda

• prva naredba u konstruktoru bazne klase je:


o Eksplicitno - pozvati konstruktor istog (this) ili baznog razreda (super)
o Implicitno - super() koji je ugradio prevoditelj

• ne napišemo li konstruktor za klasu Hrana, tada će se


automatski pokušati stvoriti default konstruktor u kojem bi
implicitno bila dodana naredba super() za poziv praznog
baznog konstruktora
Nadjačavanje metoda (1)
• Nasljeđivanjem razreda Artikl, klase Hrana, Piće, … naslijedili
su i metode getCijena(), getTipArtikla()
o Svaka klasa ima svoju verziju getTipArtikla() u kojoj ispisuje o kojoj vrsti artikla se radi.

• Metoda u izvedenoj klasi može imati isto ime, argumente i


povratni tip čime nadjačava (eng. override) metodu iz baznog
razreda

• iznad metode izvedenog razreda koja nadjačava metodu


baznog razreda stavlja oznaka @Override
Nadjačavanje metoda (2)
public class Hrana extends Artikl {
...
@Override
public String getTipArtikla() { return “Hrana"; }

@Override
public double getCijena() { return 65.90; }

}
Zabrana nasljeđivanja
• Označavanjem metode ili klase s final onemogućava se njeno
nadjačavanje
• Ukoliko takvu metodu ili klasu pokušamo naslijediti
prevoditelj će se pobuniti
Polimorfizam (1)
• Nadklasa sadrži metode zajedničke svim izvedenim klasama u
hijerarhiji, ostavljajući mogućnost da pojedina izvedena klasa
nadjača metodu novom implementacijom.

• Osnovne tipove (prilikom pozivanja metode) može se bilo


gdje zamijeniti izvedenim tipovima.
o Npr. metodi koja prima objekt tipa Artikl, možemo proslijediti objekt tipa Hrana ili Piće,
jer su i hrana i piće artikli.
Polimorfizam (2)
Artikl[] tArtikli = new Artikl[3];
tArtikli[0] = new Piće("23", "Coca cola", 10, 2);
tArtikli[1] = new Hrana("777", “Hambuerger", 2.5, 0)
tArtikli[2] = new Odjeća("045", “Hlače", 350, 54);
Polimorfizam (2)
• Iako je u trećem elementu polja objekt tipa Odjeća, nije
moguće napisati:
System.out.println(tArtikli[2].getVelicina());
• jer prevoditelj ne zna da je u tArtikli[2] objekt tipa Odjeća pa
javlja grešku kod prevođenja.
• npr. moguće je
System.out.println(((Odjeća)items[2]).getSize());
• ali korištenje nad elementom polja koji nije Odjeća nije
moguće te će u izvođenju program puknuti:
System.out.println(((Odjeća)items[0]).getSize());
• Sljedeće predavanje :
5. Apstraktne klase i sučelja

• Info: hrvoje.radovan@aspira.hr

You might also like