You are on page 1of 12

Modul 2 Koncepti OO programiranja na primjeru Java aplikacije. Modul pokriva: Objekte i klase Intefejse Nasljeivanje Pakete Polimorfi am !

am !bstraktne klase "nutra#nje i anonimne klase Kolekcije $esto kori#tene design patterne: singleton% observer i c&ain of responsibilit' Objekti i klase Objekti u Javi% kao i u drugim programskim je icima% se mogu posmatrati kao modeli objekata i stvarnosti. Objekat karakteri#u stanje i pona#anje. (tanje opisuju instance varijable a pona#anje odreuju metode. Klase su nacrti po kojima mo)e da se i radi vi#e objekata. Klase mogu da sar)e tri tipa varijabli: varijable klase *eklarisane unutar klase% van svi& metoda% s static klju+nom rije+i. *ostupne svakom objektu koji se kreira i te klase. instance varijable *eklarisane van svi& metoda unutar klase. Ove varijable se instanciraju kada se kalsa u+itava i dostupne su unutar svake metode ili konstruktora unutar kalse. lokalne varijable *eklarisane unutar metoda% konstruktora ili drugi& blokova koda unutar klase. Instaciraju se po ivanjem metode koja i& sadr)i i uni#tavaju se kada metoda avr)i s radom. Konstruktori kalse Konstruktori su najva)niji dio svake Java klase i svaka Java klasa ima bar jedan konstruktor. !ko nijedan konstruktor nije deklarisan% Java kompajler koristi osnovni konstruktor. Klase mogu da imaju vi#e konstruktora. Osnovno pravilo a konstruktore je da moraju biti istog imena kao klasa u kojoj se nala e. Obi+no se deklari#u s public modifierom ali i druge opcije su validne kao u slu+aju kada klasa treba da ima samo jednu instancu% odnosno da se pona#a kao singleton.

package company.people; public class Request { // Varijabla klase static int requestNumber; // Instance varijable private int type; private String desription; /* * snovni konstruktor * !ostoji uvijek" be# ob#ira da li je neki drugi konstruktor deklarisan ili ne */ public Request$%{ requestNumber&&; ' // (onstruktor public Request$int type" String description%{ this.type ) type; this.desription ) description; requestNumber&&; ' // verride toString$% metode * verride public String toString$% { bject clase

//+okalna varijabla String desc ) ,Request -type), & type & ," desription), & desription & ,.,; ' // getteri i setteri public int get/ype$% { return type; ' public void set/ype$int type% { this.type ) type; ' public String get0esription$% { return desription; ' public void set0esription$String desription% { this.desription ) desription; ' public static int getRequest1umber$% { return requestNumber; ' ' return desc;

Interfejsi Interfejsi su skupovi abstraktni& metoda. Ove abstraktne metode su implementirane u klasi koja implemenitra odreeni intefejs. Intefejsi su dosta sli+ni klasama ali imaju nekoliko bitni& ra lika.

Osobina ,ksten ija fajla -roj metoda Klju+na rije+ Instancijacija Konstruktor Modifieri metoda Instance varijable .i#estruko nasljeivanje

Interfejs

Klasa .java proi voljan

interface Ne Ne sve abstract Ne *a

class *a *a proi voljno *a Ne

Interfejsi su implicitno abstraktni% abstrakt klju+na rije+ se i ostavalja prilikom nji&ove deklaracije. (ve metode unutar interfejsa su implicitno public.
package company.people; public interface Reponsible2anager { public abstract void register3orker$Responsible3orker 4orker%; public abstract void unRegister3orker$Responsible3orker 4orker%; public abstract void vacation5or6ll$int num 70ays%; public abstract void all8ome/o3ork$String date%; '

Implementacija interfejsa (vaka metoda koja je deklarisana u interfejsu i koja se implementira u klasi mora da ima isti potpis #to se ti+e tipa podataka koje motoda vra/a i modifiera koji su kori#teni a deklaraciju metode. !ko je klasa koja implementira interfejs abstraktna onda se metode interfejsa ne moraju implementirati. Klasa mo)e da implementira vi#e interfejsa odjednom. Klasa mo)e da naslijedi samo jendu klasu ali da implementira vi#e interfejsa. Intefejsi mogu nasljeivati interefejse.

Postoje i interfejsi be deklarisani& metoda. Oni se o na+avaju kao tagging interfesji i naj+e#/e slu)e a kreiranje ajedni+kog interfejsa a ostale interfejse i a pro#irivanje tipa klase koja i& implementira kro polimorfi am.

Nasljeivanje i polimorfizam Nasljeivanje je proces u kome jedan objekat preu ima ili naljeuje osobine drugog objekta. Ovo nasljeivanje je definisano klju+nim rije+ima extends i implements koje dovode dva objekta u I(0! ve u.
public class 9ivotinja{ ' public class Sisar extends 9ivotinja{ ' public class Reptil extends 9ivotinja{ ' public class !as extends Sisar{ '

9ivotinja je super klasa a Sisar klasu. 9ivotinja je super klasa a Reptil klasu. Sisar i Reptil su potklase 9ivotinja klase. !as je potklasa a Sisar i 9ivotinja klasu.

Na osnovu navedeni& relacije imamo sljede/e: Sisar je 1I(0!2 9ivotinja Reptil je 9ivotinja !as je Sisar 3 !as je 9ivotinja jer je Sisar 9ivotinja Nasljeivanje i interfejsi I(0! ve a meu objektima mo)e se posti/i i imlementacijom interfejsa.
public interface 9ivotinja { ' public class Sisar implements 9ivotinja{ ' public class !as extends Sisar{ '

Paketi (vi java source fajlovi su organi ovani u pakete tako da paket predstavlja logi+ku jedinicu unutar aplikacije. (truktura paketa odgovara strukturi foldera na fajl sistemu od koji& se sastoji aplikacija. (ve klase unutar jednog paketa su meusobno vidljive i dostupne. Klase koje se ne nala e u istom paketu mogu pristupiti jedna drugoj preko klju+ne rije+i import u aglavlju klase. Importovati se mo)e i +itav paket% be navoenja imena pojedina+ni& fajlova koriste/i nak asterisk 142 koji o na+ava bilo koje ime fajla.
// Import samo 0eveloper klase import company.people.0eveloper; // Import svega i# paketa people import company.people.*;

Abstraktne klase !bstraktne klase su nacrt a neki objekat koji je previ#e generalan da bi se mogao predstaviti konkretnom klasom. !bstraktne klase se deklari#u kao i obi+ne klase s tim da se koristi abstract klju+na rije+ i takve klase se ne mogu instancirati. !bstraktne klase idalje mogu imati konstruktore i sve ostale pojedinosti obi+ne klase. Naj+e#/e se koriste kao parent klase a grupu drugi& konkretni& klasa ali su previ#e abstraktne da se koriste same% kao konkretne klase. Potklase neke abstraktne klase poprimaju njene osobine i ostvaruju pristup metodama tako #to je naslijede. public abstract protected protected protected class 3orker { String name; String surname; String p:one1umber;

// 6bstraktna metoda koju sve konkretne c:ild klasemoraju implementirati public abstract String getResponsibilities$%; public String get1ame$% { return name; ' public void set1ame$String name% { this.name ) name; ' public String getSurname$% { return surname; ' public void setSurname$String surname% { this.surname ) surname; ' public String get!:one1umber$% { return p:one1umber; ' public void set!:one1umber$String p:one1umber% { this.p:one1umber ) p:one1umber; ' '

Implementacija 3orker klase preko 0eveloper klase


public class 0eveloper extends 3orker { private +anguage language; public 0eveloper$String dev1ame" String devSurname" String dev!:one1umber" +anguage language%{ // name" surname i p:one1umber su instance varijable 3orker super klase name ) dev1ame; surname ) devSurname; p:one1umber ) dev!:one1umber; this.language ) language; ' // Implementacija getResponsibilities$% abtraktne metode * verride public String getResponsibilities$% { return ,0oing dev su77,; ' public +anguage get+anguage$% { return language; ' public void set+anguage$+anguage language% { this.language ) language; ' * verride public String toString$% { return ,0eveloper -language), & language & ," name), & name & ," surname), & surname & ," p:one1umber), & p:one1umber & ,.,; ' '

Pravila: !ko neka klasa sadr)i abstraktnu metodu ta klasa mora biti deklarisana kao abstraktna. !ko abstraktnu klasu nasljeuje neka druga abstraktna klasa abstraktne metode ne moraju biti implementirane. Konkretne klase moraju implementirati sve abstraktne metode parent klase.

Unutra nje i anonimne klase "nutra#nje klase su klase definisane unutar neke druge klase i mogu imati iste modifiere kao i bilo koje varijable.
public class 0eveloper extends 3orker { private +anguage language; public 0eveloper$String dev1ame" String devSurname" String dev!:one1umber" +anguage language%{ name ) dev1ame; surname ) devSurname; p:one1umber ) dev!:one1umber; this.language ) language; '

* verride public String getResponsibilities$% { return ,0oing dev stu77,; ' public +anguage get+anguage$% { return language; ' public void set+anguage$+anguage language% { this.language ) language; ' * verride public String toString$% { return ,0eveloper -language), & language & ," name), & name & ," surname), & surname & ," p:one1umber), & p:one1umber & ,.,; ' // ;nutra<nja klasa public static class =eneric0eveloper{ private String name; private String surname; public =eneric0eveloper$String name" String surname%{ this.name ) name; this.surname ) surname; ' public String get1ame$% { return name; ' public void set1ame$String name% { this.name ) name; ' public String getSurname$% { return surname; ' public void setSurname$String surname% { this.surname ) surname; ' ' '

!nonimne klase su klase koje se deklari#u u i ra u. Koriste se ako takva klasa treba samo jednom i +ine kod preglednijim i kra/im. Pravila: !nonimne klase moraju uvijek nasljiediti super klasu ili implementirati interfejs. !nonimna klasa mora implemenitrati sve abstraktne metode super klase ili interfejsa. !nonimna klasa uvijek koristi konstruktor super klase pri kreiranju instance. Responsible3orker interfejs
public interface Responsible3orker { public abstract void takeVacation$int num 70ays%; public abstract void come/o3ork$String date%; '

!nonimna klasa koja implementira interfejs


public Responsible3orker getResponible3orker$%{ return new Responsible3orker$%{ String name ) ,R3>,; * verride public void takeVacation$int num 70ays% { ' * verride public void come/o3ork$String date% { ' public String get1ame$% { return name; ' public void set1ame$String name% { this.name ) name; ' ' ';

Kolekcije Kolekcije su jednostavno objekti koji sadr)e grupu drugi& objekata i predstavljaju i& kao jednu cjelinu. Kolekcije u javi su frame5ork koji sadr)i sljede/e: Interfejse !bstraktni tipovi podataka koji predstavljaju kolekcije i omogu/uju da se kolekcijama upravlja na sli+an na+in% be ob ira na konkretnu implementaciju% npr. 6ist% Map Implementacije Konkretne implementacije interfejsa% strukture podataka koje se mogu koristi na vi#e ra li+iti& mjesta u aplikaciji% npr !rra'6ist% 7as&Map Al!oritme Metode koje i vode neke operacije nad grupom objekata% tipa sortiranja i pretrage

Pregeld interfejsa i implementacija


Interfaces Set +ist @ueue 0eque 2ap ?as:2ap 6rray0eque /ree2ap +inked+ist +inked?as:2ap 7as& table Impl. ?as:Set 6rray+ist 8esi able arra' Impl. 9ree Implementations /reeSet +inked+ist 6inked list Implementations 7as& table : 6inked list Impl. +inked?as:Set

"esi!n patterni *esign patterni su #abloni a rje#avanje problema koji se +esto ponavljaju u programiranju. Oni% takoer% predstavljaju i skup najbolji& praksi u programiranju i ra voju softvera. #in!leton Koristi se u slu+ajevima kada je potrebna globalna dostupnost instance neke klase koja je ujedno i jedina instanca te klase.
public class Sta772anager implements { private static Sta772anager mStaffManager; protected Sta772anager$%{ +og.d$TAG" ,Sta772anager is 4orking...,%; ' public static Sta772anager get2anager$%{ if$mStaffManager )) null% mStaffManager ) new Sta772anager$%; ' ' return mStaffManager;

Observer pattern Obeserver pattern predstavlja one0to0man' ve u i meu objekata tako da% kada jedan objekat 1subject2% promijeni neko od svoji& svojstava svi ostali objekti koji prate tu promjenu budu obavje#teni automatski. Reponsible2anager interfejs kojeg /e implementirati objekat koji obavje#tava ostale objekte
public interface Reponsible2anager { public abstract void register3orker$Responsible3orker 4orker%; public abstract void unRegister3orker$Responsible3orker 4orker%; public abstract void vacation5or6ll$int num 70ays%; public abstract void all8ome/o3ork$String date%; '

Responsible3orker interfejs kojeg implementira objekat koji treba da bude obavije#ten


public interface Responsible3orker {

'

public abstract void takeVacation$int num 70ays%; public abstract void come/o3ork$String date%;

Implementacija Responsible2anager interfejsa u Sta772anager klasi


public class Sta772anager implements Reponsible2anager { public static final String TAG ) Sta772anager.class.getSimple1ame$%; private static Sta772anager mStaffManager; +istAResponsible3orkerB 4orkers; protected Sta772anager$%{ 4orkers ) new 6rray+istAResponsible3orkerB$%; +og.d$TAG" ,Sta772anager is 4orking...,%; ' public static Sta772anager get2anager$%{ if$mStaffManager )) null% mStaffManager ) new Sta772anager$%; ' * verride public void register3orker$Responsible3orker 4orker% { if$C4orkers.contains$4orker%%{ 4orkers.add$4orker%; +og.d$TAG" ,Registered 4orker ,&$3orker%4orker%; ' ' * verride public void unRegister3orker$Responsible3orker 4orker% { if$4orkers.contains$4orker%%{ 4orkers.remove$4orker%; +og.d$TAG" ,unregistered 4orker ,&$$3orker%4orker%.get1ame$%%; ' ' * verride public void vacation5or6ll$int num 70ays% { for$Responsible3orker 4orker D 4orkers% 4orker.takeVacation$num 70ays%; ' * verride public void all8ome/o3ork$String date% { for$Responsible3orker 4orker D 4orkers% 4orker.come/o3ork$date%; ' ' return mStaffManager;

Implementacija Responsible3orker interfejsa u Eava0eveloper klasi


public class Eava0eveloper extends 0eveloper implements Responsible3orker { private String tec:nology; public Eava0eveloper$String dev1ame" String devSurname" String dev!:one1umber" +anguage

language" String tec:nology% { super$dev1ame" devSurname" dev!:one1umber" language%; this.tec:nology ) tec:nology; ' * verride public String getResponsibilities$%{ return ,Eava developer programming in ,&get/ec:nology$%; ' public String get/ec:nology$% { return tec:nology; ' public void set/ec:nology$String tec:nology% { this.tec:nology ) tec:nology; ' * verride public void takeVacation$int num 70ays% { +og.d$TAG" get1ame$%&, $,&get+anguage$%&,% is going to vacations 7or ,&num 70ays%; ' * verride public void come/o3ork$String date% { +og.d$TAG" get1ame$%&, $,&get+anguage$%&,% comming to 4ork at ,&date%; ' ' Sta772anager.getManager$%.register3orker$this%;

$%ain of &esponibilit' pattern Ovaj pattern se koristi kada je potrebno sekvencijalno procesiranje poruka meu objektima tako da su objekti koji procesiraju poruke poredani po nekom prioritetu. Interfejs kojeg implementiraju klase koje su dio c&ain0a
public interface Request?andler { public abstract void setSuccessor$Request?andler :andler%; public abstract void :andleRequest$Request request%; '
public class 0eveloper extends 3orker implements Request?andler { private +anguage language; Request?andler successor?andler; public 0eveloper$String dev1ame" String devSurname" String dev!:one1umber" +anguage language%{ name ) dev1ame; surname ) devSurname; p:one1umber ) dev!:one1umber; this.language ) language; ' * verride public String getResponsibilities$% { return ,0oing dev su77,; ' public +anguage get+anguage$% { return language;

' public void set+anguage$+anguage language% { this.language ) language; ' * verride public String toString$% { return ,0eveloper -language), & language & ," name), & name & ," surname), & surname & ," p:one1umber), & p:one1umber & ,.,; ' * verride public void setSuccessor$Request?andler :andler% { successor?andler ) :andler; ' * verride public void :andleRequest$Request request% { if$request.get/ype$% )) Request./ype.JS_FIX FF this instanceof EavaScript0eveloper%{ +og.d$,0eveloper," ,request ,&request&, :andled by ,&get1ame$%&, ,&this.get8lass$%.getSimple1ame$%%; ' else if$request.get/ype$% )) Request./ype.JAVA_FIX FF this instanceof Eava0eveloper%{ +og.d$,0eveloper," ,request ,&request&, :andled by ,&get1ame$%&, ,&this.get8lass$%.getSimple1ame$%%; 'else { if$successor?andler C) null% successor?andler.:andleRequest$request%; ' ' '

Konstrukcija c&ain0a
public class 8ompany { public static final String TAG ) 8ompany.class.getSimple1ame$%; String name ) ,,; public 8ompany$String name%{ this.name ) name; +og.d$TAG" ,8ompany created,%; 0eveloper java0ev> ) new Eava0eveloper$,Eo:n>," ,0oe," ,GH>>IJKLH," +anguage.JAVA" ,6ndroid,%; 0eveloper js0ev> ) new EavaScript0eveloper$,ES dev M> name," ,ES dev M> surname," ,GHINOHLKJ," +anguage.JAVASCRIPT" ,6ngularES," true%; !roject2anager manager> ) new !roject2anager$,2ujo," ,2ujic," ,GHIJK>IJK," ,!aromlinska bb,%; 3orker ceo ) new 8P $,8P name," ,8P surname," ,GJJ >IJ >IK," >G%;

$$Request?andler%ceo%.setSuccessor$manager>%; manager>.setSuccessor$Sta772anager.getManager$%%; Sta772anager.getManager$%.setSuccessor$java0ev>%; java0ev>.setSuccessor$js0ev>%; ' public static void main$String-. args%{ new 8ompany$,?olo,%; ' ' $$Request?andler%ceo%.:andleRequest$new Request$Request./ype.JAVA_FIX" ,!opravi bug >N,%%;

You might also like