Professional Documents
Culture Documents
Java 75 88 PDF
Java 75 88 PDF
6
Objektno orijentirano
programiranje
75
76
Klasa i objekt
Motiv za objektno-orijentirano programiranje naveli smo u prolom naslovu, sama ideja
objektno-orijentiranog programiranja potekla je iz naeg, realnog svijeta. Okrenemo se oko sebe
vidjet emo neke objekte, npr. automobile, avione, zgrade, kue, motocikle, televizore,... Prilikom
programiranja nerijetko emo u svojim programima koristiti upravo njih ili neke druge
imaginarne objekte, kao to su trokut, krug, jednadba, broj,...
Kaemo li npr. automobil, avion ili trokut, mislimo na itavu klasu automobila, aviona ili trokuta,
tj. mislimo na sve automobile, avione ili trokute. Meutim kaemo li npr. crveni A3, izbor e biti
ve malo smanjen, znat emo da su to samo crveni automobili marke Audi tip A3. Znamo li npr.
jo i registarsku oznaku znat emo tono koji je to automobil, a ako radimo u policiji, znat emo
sve i o vlasniku automobila, jainu motora, godinu proizvodnje,... Nakon to znamo sve te
detalje, vie ne govorimo o itavoj klasi automobila ve o konkretnom automobilu tj. o objektu
automobil.
Upravo tako je i u programiranju. Klasa e biti svojevrstan predloak za objekt, ona sadri
openita svojstva. Nakon to neku klasu detaljno opiemo ona postaje objekt odnosno instanca.
Instanca je samo drugi naziv za objekt. Dakle objekt odnosno instanca su konkretizacija
klase. Takva konkretizacija klase, tj. definiranje osnovnih svojstava klase nazivamo kreiranje
(instanciranje) objekta.
Primjer 6 1:
Neka osnovna svojstva automobila bila bi: marka, tip, snaga, maksimalna brzina, snaga, boja, broj
asije, registracijska oznaka. Ukoliko ne znamo sva navedena svojstva ili bar veinu njih,
govorimo o klasi automobil. Meutim ako kaemo to je Mazda, 121, snaga je 38 kw, maksimalna
brzina je 180 km/h plave je boje, klasu smo uvelike smanjili. Znamo li jo i broj asije ili
registracijsku oznaku znat emo tono o kojem se automobilu na ulici radi i tada govorimo o tom
automobilu kao objektu.
Osnovna svojstva trokuta bila bi duljine stranica i mjere kutova. Kaemo li trokut mislim na bilo
koji trokut koji postoji i u tom sluaju je trokut klasa. Meutim, kaemo li trokut ije su duljine
stranica 3, 4 i 5 cm, znamo tono o kojem se trokutu radi i znamo sve o njemu te govorimo o
objektu trokut ije su stranice 3, 4 i 5 cm.
Do sada smo rekli da klase openito imaju neka svojstva. Kod automobila su to bili marka, tip,...
Osim svojstava, nad klasama je mogue izvravati odreene radnje. Neke radnje kod automobila
bi bile: upali motor, ubaci u prvu brzinu dodaj gas, pritisni spojku,... Slino je i u programiranju,
to znai da e klase moi imati neka svojstva i neke radnje koje e se nad klasama moi
izvravati tzv. metode.
Svojstva e u stvari biti neke globalne varijable, dok e metode biti funkcije (metode) definirane
unutar neke klase. Openito emo svojstva i metode zvati elementima klase.
Openito je cilj klase da njenim svojstvima i metodama moemo pristupati iz drugih klasa. Npr.
definiramo li klasu koja e izmeu ostalih sadravati metodu koja e provjeravati je li neki broj
prost, tada bismo htjeli toj metodi pristupati iz drugih klasa. Openito, da bismo svojstvu ili
metodi neke klase mogli pristupati iz druge klase, one trebaju biti deklarirane public (javne).
Osim public, klasa moe imati i elemente (svojstva ili metode) koje e biti samo pomone za
definiciju public metoda i ne trebaju se moi pozivati u drugim klasama. Za takve emo metode
rei da su private. Npr. u klasi u kojoj se nalazi metoda koja provjerava je li neki broj prost, moe
postojati metoda koja e brojati koliko neki broj ima djelitelja, ta metoda moe biti pomona za
metodu koja provjerava je li neki broj prost, no nju ne moramo moi pozivati iz drugih klasa,
stoga ona moe biti private metoda.
77
Sljedei vaan pojam kada govorimo o klasama je konstruktor klase. Konstruktor klase je
metoda unutar klase, koja ima isto ime kao klasa a ne vraa nikakav tip. Konstruktor se izvrava
prilikom kreiranja objekta. On ne vraa nikakvu vrijednost, a namjena mu je inicijaliziranje
svojstava objekta, tj. postavljanje svojstava na neku poetnu vrijednost. Jedna klasa moe imati
jedan ili vie konstruktora. Ve smo rekli da konstruktor ima isto ima kao klasa. Sama po sebi se
nameu pitanje, koja je namjena vie konstruktora? Kako je mogue da dvije ili vie metoda imaju
isto ime? Kako e klasa znati koju metodu treba izvriti? U stvari se radi o tome da ako klasa ima
dva ista konstruktora, onda oni moraju imati razliiti broj parametara. Ve smo rekli da je
namjena konstruktora inicijalizacija svojstava objekta. Mi objekt moemo kreirati bez da znamo
vrijednosti svih svojstava, u tom sluaju e se svojstva postaviti na neke inicijalne vrijednosti. U
tom sluaju emo vrijednosti svojstava definirati kada ih saznamo. Npr. ako imamo klasu auto,
nije nuno da prilikom kreiranja objekta tipa auto znamo sva njegova svojstva. U tom sluaju
emo svojstva inicijalizirati na neke poetne vrijednosti, npr. za maksimalna brzina e biti 100
km/h ako drugaije nije reeno,...
Ukoliko prilikom kreiranja objekta znamo vrijednosti svih svojstava klase, moemo kreirati objekt
s tim svojstvima.
Upravo je to namjena vie konstruktora. U prvom sluaju emo pozvati konstruktor bez
parametara, koji e svojstva inicijalizirati na neku poetnu vrijednost, najee 0 ako se radi o
numerikim vrijednostima odnosno prazan string ako se radi o tekstualnim vrijednostima, to
definira sam programer klase. U drugom sluaju emo pozvati konstruktor sa parametrima, koji
e vrijednosti svojstava postaviti na vrijednosti koje smo proslijedili preko parametara.
Openito je sluaj da klasa moe imati dvije ili vie metode koje se jednako zovu. U tom sluaju
one moraju imati razliiti broj parametara ili parametri moraju biti razliitog tipa, a za takve
metode kaemo da su preoptereene (overloadane) metode.
Nakon to smo se upoznali s pojmom klase i svim vanijim pojmovima koji dolaze s klasom,
vrijeme je da nauimo kako kreirati klasu.
Klasu u Javi emo openito kreirati na sljedei nain:
public class ime_klase
{
svojstva_i_metode;
}
Primjer 6 2:
Definirajmo klasu Trokut, ija e svojstva biti duljine stranica trokuta (a, b i c) a metode e biti
Opseg() i Povrsina() koje e vraati opseg i povrinu trokuta.
Rjeenje:
Ovdje emo oito imati tri svojstva (duljine stranica a, b i c), koja e biti public svojstva jer im
trebamo moi pristupiti iz drugih klasa. Nadalje emo imati dvije isto tako public metode Opseg
() i Povrsina () za raunanje opsega i povrine trokuta. Osim toga imat emo jednu private
metodu Poluopseg () koja e vraati poluopseg trokuta, a koja nam je potrebna za raunanje
povrine trokuta Heronovom formulom: P = s (s a ) (s b ) (s c ) , pri emu je s poluopseg:
a+b+c
(
). Ovdje je logino imati najmanje dva konstruktora:
2
prvi konstruktor bez parametara, koji e vrijednosti parametara a, b i c postaviti na 0. Drugi
konstruktor e imati tri parametra i inicijalizirati svojstva a, b i c na vrijednosti parametara. Ovdje
78
pisali kao
public Trokut(int a, int b, int c)
79
dolo bi do problema jer se svojstva klase i parametri metode zovu jednako. U tim sluajevima bi
definicija ove metode trebala imati oblik:
public Trokut(int a, int b, int c)
{
this.a = a;
this.b = b;
this.c = c;
}
u ovom sluaju znai da je u nastavku navedeno svojstvo ili metoda klase. Dakle,
interpretacija ovoga bi bila svojstvu a klase u kojoj se nalazim (Trokut) pridrui vrijednost
parametra a i tu ne bi bilo nikakvih problema. this moemo pisati openito ispred elemenata
klase, no ako nemamo ovakvog mijeanja parametara metoda s elemenata klase, to nije potrebno.
this
80
Na ovaj nain smo u stvari samo najavili da emo koristiti objekt ime_objekta, koji e biti tipa
ime_klase. Taj objekt jo zapravo ne postoji. S takvim objektom ne moemo jo nita raditi. Da
bismo mogli neto raditi nad tim objektom (npr. izvravati metode koje smo definirali u
pripadnoj klasi) moramo ga instancirati, tj. zaista ga stvoriti. Objekt emo instancirati na sljedei
nain:
ime_objekta = new ime_klase ([parametri]);
Prisjetimo se, kada smo govorili o klasama, rekli smo da klasa moe imati jedan ili vie
konstruktora i to smo nazivali preoptereenje konstruktora, preoptereeni konstruktori su se
razlikovali po broju parametara, odnosnu tipu parametara. Prilikom instanciranja klase, mi u
stvari izvravamo odreeni konstruktor i to onaj iji broj i tip parametara odgovaraju broju i tipu
parametara koje smo naveli prilikom instanciranja klase.
esto emo posljednje dvije naredbe ujediniti te emo istovremeno deklarirati i kreirati objekt. To
emo napraviti sljedeom naredbom:
ime_klase ime_objekta = new ime_klase ([parametri]);
Primjer 6 3:
Kolike e biti duljine stranica trokuta nakon sljedeih naredbi:
a) Trokut t = new Trokut ();
b) Trokut t = new Trokut (3, 4, 5);
c) Trokut t = new Trokut (2);
ako je Trokut klasa koju smo kreirali u primjeru 4 2.
Rjeenje:
Oito smo u svakom od primjera kreiranjem objekta t koji je tipa Trokut pozivali drugi
konstruktor klase Trokut. Stoga e duljine stranica biti:
a) a = 0, b = 0, c = 0; u ovom sluaju se izvrava prvi konstruktor (bez parametara), koji duljine
stranica postavlja na 0.
81
Primjer 6 4:
Kreirajmo objekt t koji e biti instanca klase Trokut koju smo kreirali u primjeru 4 2, pri emu e
duljine stranica biti postavljene na 3, 4 i 5, a zatim u varijablu p spremimo povrinu tog trokuta.
Rjeenje:
Najprije kreirajmo objekt t, koji e biti instanca klase Trokut i ije e duljine stranica biti 3, 4 i 5.
Prvi nain na koji moemo ovo rijeiti je da duljine stranica proslijedimo konstruktoru odmah
prilikom kreiranja objekta:
Trokut t = new Trokut (3, 4, 5);
Isto ovo mogli smo napraviti tako da kreiramo objekt t iz klase Trokut, ali ovaj puta bez
parametara. U tom e sluaju vrijednosti svojstava a, b i c biti postavljene na 0, a zatim
postavimo vrijednosti svojstava na vrijednosti 3, 4 i 5, to bi izgledalo ovako:
Trokut t = new Trokut ();
t.a = 3;
t.b = 4;
t.c = 5;
82
objekt
t
Openito nad objektima nije mogue izvravati standardne operacije npr. +, -, ==,... Razmislimo
li malo, to uistinu ima smisla. to bi znailo t + j ako su t i j dvije instance klase Trokut? to bi
znailo zbrojiti dva trokuta?
Operator pridruivanja (=) nad objektima je mogue pozivati, samo on ne radi uvijek ono to
bismo moda oekivali. Pretpostavimo da smo kreirali dvije instance klase Trokut, t i j. Kao na
sljedeoj slici:
To znai da smo samo promijenili referencu i sada t i j pokazuju na isti objekt. Izvravanjem
izraza: t.a = 4
svojstvo a (duljina stranice a) objekta j e takoer imati vrijednost 4.
83
Nasljeivanje klasa
Nasljeivanje je vrlo est pojam u objektno orijentiranom programiranju. Kao i kod samog
objektno orijentiranog programiranja, osnovna ideja nasljeivanja je izbjei viestruko pisanje
istih dijelova koda. Ideja je vrlo jednostavna: imamo jednu osnovnu klasu s osnovnim svojstvima
i metodama koje ju opisuju, a onda po potrebi kreiramo nove klase koje ju "nadopunjuju" s
nekim dodatnim svojstvima i metodama. Za takve klase koje "nadopunjuju" osnovnu klasu rei
emo da ju nasljeuju.
Ilustrirajmo nasljeivanje na jednom jednostavnom primjeru:
pretpostavimo da elimo organizirati svoju kolekciju DVD-a i elimo napraviti program koji e
nam to omoguiti. Oito emo imati dvije vrste DVD-a: s filmovima i s glazbom. Dakle kreirat
emo dvije klase s pripadnim svojstvima i metodama:
84
Film
naslov
velicina
velicina
SVOJSTVA
naslov
komentar
izvodac
komentar
trajanje
brojPjesama
reziser
dodajNaslov ()
dodajNaslov ()
vratiNaslov ()
vratiNaslov ()
dodajKomentar ()
dodajKomentar ()
vratiKomentar ()
vratiKomentar ()
METODE
METODE
SVOJSTVA
Glazba
vratiVelicinu ()
dodajIzvodaca ()
vratiVelicinu ()
dodajTrajanje ()
vratiIzvodaca ()
vratiTrajanje ()
dodajBrojPjesama ()
dodajRezisera ()
vratiBrojPjesama ()
vratiRezisera ()
Kao to moemo primijetiti, neka svojstva i metode se nalaze u obje klase i stoga i moramo ih
dva puta definirati.
Problem moemo rijeiti tako da elemente koji se pojavljuju u obje klase definiramo u jednoj
posebnoj klasi DVD:
SVOJSTVA
DVD
naslov
velicina
komentar
METODE
dodajNaslov ()
vratiNaslov ()
dodajKomentar ()
vratiKomentar ()
vratiVelicinu ()
Sad kada imamo definiranu klasu DVD, moemo kreirati klase Film i Glazba koje nasljeuju klasu
DVD. Nasljeivanjem klase DVD klase Film i Glazba automatski nasljeuju i sva svojstva i
metode klase DVD. Dakle sva ta svojstva i metode ne trebamo jo jednom definirati.
Openito pretpostavimo da imamo neku klasu A, koja ima svoja svojstva i metode. Klasu A
moe naslijediti klasa B, koja e u tom sluaju imati sva svojstva i metode kao i klasa A, ali moe
imati i jo neka svoja dodatna svojstva i metode. U tom sluaju je A nadklasa klase B, dok emo
za B rei da je podklasa od A.
Kreiranjem instance klase B moi emo pozivati sve koje smo definirali u klasi B, ali i one
definirane u klasi A, dok emo kreiranjem instance klase A moi pozivati samo elemente klase A.
Podklasa tako takoer moe biti nadklasa nekoj drugoj klasi i na taj nain je mogue izgraditi
hijerarhiju klasa.
klasa A
klasa B
klasa C
Kod ovakve hijerarhije moe se dogoditi da je metoda s istim imenom kreirana u dvije klase koje
su na razliitoj razini u hijerarhiji. Npr. pretpostavimo da je u klasi A definirana metoda test () i
metoda s istim imenom je definirana i u klasi B, koja nasljeuje klasu A.
klasa A
...
public int test()
{
...
}
...
klasa B
...
public int test()
{
...
}
...
Kako klasa B nasljeuje klasu A ona nasljeuje i njenu metodu test (), a isto tako ona ima i svoju
metodu test (). Kreiramo instancu klase B te pozovemo metodu test (), nije sasvim jasno koja
metoda test () e se izvriti.
U ovakvim sluajevima izvrit e se metoda test () koja je definirana u klasi B i to se zove
prekoraenje (override) metoda.
Openito smo mogli imati klasu C, koja nasljeuje klasu B (klasa C nema metodu test ()).
Pozivanjem metode test () nad instancom klase C izvrit e se metoda test () iz klase B. Dakle,
pravilo je takvo da se izvrava metoda iz prve nadklase.
86
Primjer 6 5:
Kreirajmo klasu Cetverokut, ija e svojstva biti duljine stranica (a, b, c, d) etverokuta, dok e
jedina metoda biti Opseg (), koja e vraati opseg etverokuta. Nadalje kreirajmo klasu
Pravokutnik koja nasljeuje klasu Cetverokut te ima jo metode Povrsina (), koja rauna
povrinu pravokutnika i Dijagonala (), koja vraa duljinu dijagonale pravokutnika.
Rjeenje:
public class Cetverokut
{
public int a, b, c, d;
public Cetverokut()
{
a = b = c = d = 0;
}
public Cetverokut (int a, int b, int c, int d)
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
public int Opseg ()
{
return a + b + c + d;
}
}
public class Pravokutnik extends Cetverokut
{
public Pravokutnik ()
{
a = b = c = d = 0;
}
public Pravokutnik (int a, int b)
{
this.a = a;
this.b = b;
this.c = a;
this.d = b;
}
public int Povrsina ()
{
return a * b;
}
public double Dijagonala ()
{
return Math.sqrt (a * a + b * b);
}
}
87
Napomena:
Svaka klasa moe nasljeivati samo jednu klasu, tj. klasa moe imati samo jednu nadklasu. S druge
strane neku klasu moe nasljeivati bilo koja klasa, tj. klasa moe biti podklasa.
88