oop

26
SVEUČILIŠTE/UNIVERZITET „VITEZ“ U TRAVNIKU FAKULTET POSLOVNE INFORMATIKE OBJEKTNO ORJENTIRANO PROGRAMIRANJE SEMINARSKI RAD Student: Osmanagić Alen, indeks br: 0050-11/RIT Kolegij: Principi programiranja Profesor: Prof.dr Zoran Avramović Asistent: Mr.sc. Mahir Zajmović Akademska godina: 2011/2012

Upload: alen-osmanagic

Post on 23-Oct-2014

205 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: OOP

SVEUČILIŠTE/UNIVERZITET „VITEZ“ U TRAVNIKU

FAKULTET POSLOVNE INFORMATIKE

OBJEKTNO ORJENTIRANO PROGRAMIRANJE

SEMINARSKI RAD

Student: Osmanagić Alen, indeks br: 0050-11/RIT

Kolegij: Principi programiranja

Profesor: Prof.dr Zoran Avramović

Asistent: Mr.sc. Mahir Zajmović

Akademska godina: 2011/2012

Travnik, februar 2011

Page 2: OOP

SADRŽAJ:

1. UVOD.................................................................................................................................1

2. PRINCIPI OOP-a...................................................................................................................3

3. PROGRAMSKA POTPORA.....................................................................................................5

4. OOP I C++............................................................................................................................6

5. OOP I JAVA.......................................................................................................................11

5.1. Iskorištavanje klasa....................................................................................................11

5.2. Nasljeđivanje klasa.....................................................................................................11

5.3. Apstraktne klase.........................................................................................................13

5.4. Polimorfizam..............................................................................................................14

5.5. Sučelja........................................................................................................................15

5.6. Metoda nadjačavanja.................................................................................................16

6. ZAKLJUČAK.......................................................................................................................17

7. LITERATURA.......................................................................................................................18

1

Page 3: OOP

1. UVOD

Objektno orijentirano programiranje je pokušaj približavanja modela programa načinu ljudskog razmišljanja. Kod starog načina programiranja, programer je morao pronaći računalnu zadaću koju treba izvršiti da bi se riješilo neki problem. Programiranje se zatim sastojalo od pronalaženja niza naredbi koje bi izvršile taj zadatak. U osnovi objektno orijentiranog programiranja, umjesto zadaća nalazimo objekte - jedinice koje imaju svoje ponašanje, drže podatke i mogu međusobno djelovati. Programiranje se sastoji od oblikovanja skupa objekata koji na neki način opisuju problem koji treba riješiti. Softverski objekti u programu predstavljaju stvarne ili zamišljene jedinice u području problema. Na ovaj način razvoj programa trebao bi biti prirodniji i stoga lakši za postavljanje i razumijevanje. Stvaranje nekog programa uključuje:

Analizu potreba Tehnički opis Dizajn i Arhitekturu Kodiranje Prevođenje Isprobavanje Dokumentaciju Održavanje

2

Page 4: OOP

2. PRINCIPI OOP-a

Objektno orijentirano programiranje ili kraće OOP je jedan od mogućih pristupa programiranju računala. Za razliku od ostalih pristupa, u kojima je težište na akcijama koje se vrše na podatkovnim strukturama, ovdje je težište na projektiranju aplikacije kao skupa objekata koji izmjenjuju poruke.

1. Objekti. U OOP metafori osnovna jedinica je objekt, što je konkretna realizacija klase. U objektno orijentiranom svijetu izbjegava se korištenje globalnih varijabli, nego svaki objekt ima svoje varijable, koje još zovemo i podatkovni članovi klase. Isto tako nema više ni samostojećih funkcija, nego funkcije pripadaju klasi, bilo da vanjskom svijetu nešto kazuju o stanju objekta, ili mijenjaju stanje objekta, a zovemo ih funkcijski članovi klase ili metode. Osobe u programskom prostoru. Svaki objekat ima samo svoju informaciju (stanje) koje može biti dijeljeno između više instanci, što se u računarstvu zove reentrant. Tako npr. naš Mujo objekat bi imao

ime::"Mujo Tokić" spol::"Muški" godiste::"1962".2. Učahurivanje ili enkapsulacija objekata. Pošto ne postoje globalne varijable,

iz drugih dijelova koda nije moguć pristup varijablama klase nikako osim ugrađenim metodama za njihovo čitanje i pisanje (ukoliko smo ih deklarirali kao privatne, što je preporučeno). Na taj način se osigurava da objekt ne može doći u neko nepredviđeno stanje iz bilo kojeg razloga, npr. kad mu se pristupa istovremeno iz više dijelova koda (ako imamo višenitno programiranje) jer nužno je koristiti funkcijske članove objekta u koje se mogu ugraditi sigurnosni mehanizmi poput sinkronizacije. Dakle to je koncept po kojem je informacija u klasi zaštićena od direktnog pristupa i jedini način da se promjeni informacija je kroz utemeljene metode. Tako npr. ako napravimo metodu ideNaPosao(), kojom Mujo ide na posao biciklom, onda kad on kupi auto i ide autom na posao, ta promjena je skrivena unutar metode koja samo prikaže rezultat (tj. da je na putu na posao a ne čime ide).

3.  Apstrakcija - čest je slučaj da se neki objekti minimalno razlikuju, i zasebno definiranje svakog od njih je redundantno. Osim toga za samo efikasno projektiranje praktično je pojednostavljivanje konkretnog problema. Tu ulaze u igru apstraktne klase i sučelja.

4. Nasljeđivanje - kad već definiramo neki objekt, a zatreba nam neki sličan objekt koji je zapravo podskup početnog objekta, moguće je naslijediti početni objekt, čime štedimo vrijeme za programiranje (makar to bio copy-paste) i diskovni prostor.

3

Page 5: OOP

5. Višeobličje ili polimorfizam - kao što je preopterećivanje operatora zgodna stvar ponekad, tako preopterećivanje metoda zovemo polimorfizmom. Moguće je definirati nekoliko metoda istog imena, a svaka će kao parametre primati objekte različitih tipova.

Do neke granice, objektno orijentirano programiranje je samo promjena točke gledanja, u okvirima standardnog programiranja objekt se može promatrati kao skup varijabli i nekih potprograma za upravljanje tim varijablama. Zapravo, moguće je koristiti objektno orijentirano programiranje u bilo kojem programskom jeziku. Naravno postoji velika razlika između programskih jezika u kojima je objektno orijentirano programiranje moguće i onih koji ga uistinu aktivno podržavaju. Objektno orijentirani programski jezici poput Jave imaju niz mogućnosti koje ih čine različitim od standardnih programskih jezika. Ispravno razmišljanje je osnova za korištenje tih mogućnosti. Objekti su usko vezani uz klase. Potrebno je najprije razjasniti razlike između objekata i klasa. Klase, zapravo njihovi nestatički dijelovi opisuju objekte. Uobičajeno je reći da objekti pripadaju klasama. Sa programerskog gledišta natočnije bi bilo reći da se klase koriste za opisivanje objekata. Nestatički dijelovi klasa određuju koje će varijable i potprogrami biti sadržani u objektima. Ovo je ujedno i dio objašnjenja po čemu se objekti razlikuju od klasa: objekti se stvaraju i uništavaju tijekom izvođenja programa, a korištenjem jedne klase može biti stvoren neograničen broj objekata.

4

Page 6: OOP

3. PROGRAMSKA POTPORA

Navedeni su samo primjeri programskih jezika:

1. prevedeni (compiled) C++2. prevedeni u bajt-kod, izvršava se u virtualnom stroju Smalltalk Java VB .NET C#

3. interpretirani1

Python

1 Interpreter je računarski program koji pokreće ostale programe. Ovo je različito od kompajlera koji ne pokreće izvorni kod nego ga prevodi u drugi jezik (mašinski), obično onaj razumljiv računaru (binarni kod). Kako kompajleri prevodeći izvorni kod prave izvršne fajlove koji mogu raditi neovisno o programskom jeziku u kojem su napisani, interpreter je ugrađen u sistem programskog jezika i pri pokretanju prevodi liniju po liniju programskog koda tako da programeru ostavlja mogućnost ispravke u izvornom kodu ali samim tim i veže napisani programski kod za program u kojem je napisan. Nije moguće pokretanje programa bez interpretera.

5

Page 7: OOP

4. OOP I C++

Programski jezik C++ je programski jezik opće namjene i srednje razine s podrškom za objektno orijentirano programiranje. Prvotno je razvijan u Bell Labs (laboratoriju telekomunikacijske tvrtke Bell) pod rukovodstvom Bjarnea Stroustrupa tokom 1980-ih, i to kao proširenje programskom jeziku C pa mu je originalno ime bilo "C with classes" (engl. C s klasama). Zbog velike potražnje za objektno orijentiranim jezicima te izrazitim sposobnostima istih, specifikacija programskog jezika C++ ratificirana je 1998. kao standard ISO/IEC 14882. Godine 1980. Bjarne Stroustrup, danski računalni znanstvenik iz Bell Labsa, započeo je razvoj C++ jezika koji će formalno dobiti ovaj naziv krajem 1983. U listopadu 1985. godine prva komercijalna distribucija jezika predstavljena je javnosti u knjizi The C++

Programming Language čiji je autor spomenuti Bjarne Stroustrup. 2

Primjer klase koja se može koristiti za spremanje podataka o korisniku programa:

class KorisnikoviPodaci {

static String ime;

static int godine;

}

U programu koji koristi ovu klasu postoji samo jedan primjerak svih varijabli u klasi: KorisnikoviPodaci.ime i KorisnikoviPodaci.godine. Klasa KorisnikoviPodaci i podaci koje sadržava postoje samo dok se program izodi. Sličan primjer, s nestatičkim varijablama:

class PodaciIgraca {

String ime;

int godine;

}

U ovom slučaju nema varijabli PodaciIgraca.ime i PodaciIgraca.godine, jer ime i godine nisu statički članovi klase PodaciIgraca. Dakle, u klasi nema ništa osim mogućnosti stvaranja objekata. To su, zapravo, ogromne mogućnosti jer je broj objekata koji se mogu stvoriti neograničen, a svaki od tih objekata ima svoje varijable ime i godine. Program može pomoću ove klase spremati podatke o svim 2 http://hr.wikipedia.org/wiki/C%2B%2B

6

Page 8: OOP

igračima. Kad novi igrač uđe u igru, kreira se novi objekt PodaciIgraca koji predstavlja tog igrača i sadrži njegove podatke. Kad igrač napusti igru, objekt koji ga predstavlja može biti uništen. Ovakav sistem sa objektima se koristi za dinamičko opisivanje događanja u igri, što nije oguće uraditi pomoću statičkih varijabli.

Objekt koji pripada klasi naziva se instance te klase. Varijable koje taj objekt sadrži nazivaju se varijable instance. Potprogrami koje objekt sadrži nazivaju se metode instance. Na primjer, ako se gore definirana klasa PodaciIgraca koristi za kreiranje objekta, tada je taj objekt instanca klase PodaciIgraca, a ime i godine u tom su objektu varijable instance. Važno je zapamtiti da klasa objekta definira tip varijable instance; stvarni podaci sadržani su u pojedinom objektu, ne u klasi. Stoga, svaki objekt ima svoje podatke.

Aplet koji skrola poruku po web stranici može, npr., sadržavati metodu scroll(). Budući da je aplet objekt, ova metoda je metoda instance ovoga apleta. Izvorni kod metode je u klasi koja je korištenja za kreiranje apleta. Ipak ispravnije je reći da metoda instance pripada objektu a ne klasi. Nestatičke metode u klasi samo određuju koje će metode instance sadržavati objekti kreirani iz klase. scroll() metode u dva različita apleta rade istu stvar, tj. obje skrolaju poruke po ekranu. Stvarna razlika tih dviju metoda je u porukama koje skroliraju, one se mogu razlikovati. Dakle, metode određuju vrstu ponašanja objekata, ali to ponašanje se razlikuje između objekata po vrijednostima varijabli instance.

Očito je da su statički i nestatički dijelovi klase vrlo različite stvari i sa vrlo različitim namjenama. Mnogo klasa sadrži isključivo statičke ili nestatičke članove, iako je moguće miješanje statičkih i nestatičkih članova u jednoj klasi. Statičke varijable i potprogrami u klasama se zovu varijable klase, odnosno metode klase, jer pripadaju klasi a ne instancama te klase. Razmotrimo pojednostavljeni primjer klase Student koja može poslužiti za pohranu podataka o studentima:

class Student {

String name; // ime studenta

double test1, test2, test3; // ocjene na tri testa

double getAvarage() { // izračunava prosječnu ocjenu testova

return (test1 + test2 + test3) / 3;

}

} // kraj klase Student.

7

Page 9: OOP

Ni jedan od članova ove klase nije deklariran kao static, dakle smisao klase je samo stvaranje objekata. Ova definicija klase kaže da bilo koji objekt koji je instanca klase Student sadrži varijable instance ime, test1, test2, i test3, te da uključuje metodu instance getAvarage(). Imena i ocjene na testovima će imati različite vrijednosti u različitim objektima. Kad se pozove metoda getAvarage() za nekog određenog studenta, ona će izračunati srednju vrijednost njegovih ocjena na testovima. Dakle, različiti studenti imaju različite srednje ocjene, čime je pokazano da metode instance pripadaju određenom objektu, a ne klasi. U Javi, klasa je tip, slično primitivnim tipovima poput int ili boolean, pa se stoga ime klase može koristiti za određivanje vrste varijable pri deklaraciji, tipu formalnog parametra ili povratnom tipu funkcije. Deklaracija varijable std tipa Student ima oblik:

Student std;

Ipak, deklariranje varijable ne stvara objekt! Vrlo je važno istaknuti da u Javi nikakva varijabla ne može sadržavati objekt, varijabla može sadržavati samo poziv objekta. O objektima treba razmišljati kao da slobodno lebde negdje u memoriji računala. Zapravo, postoji dio memorije nazvan heap u koji se smještaju objekti. Umjesto da sadržava objekt, varijabla sadrži samo podatke neophodne za pronalaženje objekta u memoriji. Ta informacija zove se poziv (reference) ili pokazivač (pointer) na objekt. Zapravo, poziv na objekt je adresa memorijske lokacije u kojoj je spremljen objekt. Pri korištenju varijabli tipa klase računalo koristi poziv u varijabli za pronalaženje stvarnog objekta. Objekti se stvaraju korištenjem operatora new, koji stvara objekt i vraća poziv na objekt. Na primjer, ako je std varijabla tipa Student, izraz:

std = new Student();

bi stvorio novi objekt koji je instanca klase Student, i spremio bi poziv na taj objekt u varijablu std. Vrijednost varijable je poziv na objekt, ne sam objekt. Stoga nije točna izjava da je objekt vrijednost varijable std. Jednako tome nije istinita ni izjava da je objekt spremljen u varijabli std. Pravilna izjava bi bila: "varijabla std pokazuje na objekt". Recimo da varijabla std pokazuje na objekt koji pripada klasi Student. Taj objekt ima varijable instance ime, test1, test2, i test3. Ove varijable instance pozivaju se kao: std.ime, std.test1, std.test2, i std.test3.

Razmotrimo program koji uključuje sljedeći kod:

System.out.println("Dobar dan, " + std.ime

+ ". Tvoje ocjene na testu su:");

System.out.println(std.test1);

System.out.println(std.test2);

System.out.println(std.test3);

8

Page 10: OOP

Ovaj kod bi na izlazu dao ime i ocjene iz objekta na koji se std odnosi. Slično tome std može poslužiti za poziv metode instance getAvarage() iz objekta izrazom: std.getAvarage(). Izraz koji ispisuje srednju ocjenu bi izgledao ovako:

System.out.println( "Srednja ocjena je " + std.getAvarage() );

Općenito, varijablu std.name može se se koristiti bilo gdje gdje je dozvoljena varijabla tipa String (u izrazima, moguće joj je pridijeliti vrijednost, za pozivanje potprograma iz klase String). Moguće je da varijable poput std, kojima je tip određen klasom, ne ukazuju ni na jedan objekt. Kažemo da takve varijable sadržavaju null reference. Null reference u Javi može biti zapisan kao "null". Primjer pridjeljivanja null reference poziva varijabli std:

std = null;

Ako je vrijednost varijable null, nije dozvoljeno pozivanje varijabli ili metoda instance kroz tu varijablu, jer nema objekta, pa ni varijabli koje bi se moglo pozvati. U slučaju da se u programu pokuša pozvati null reference poput ovog, javlja se pogreška null pointer exception. Primjer niza naredbi koje rade s objektima:

Student std, std1, std2, std3; // deklariranje četiriju varijabli tipa Student

std = new Student(); // kreiranje novog objekta klase Student

// i spremanje poziva na njega u varijablu std

std1 = new Student(); // kreiranje drugog objekta

std2 = std1; // kopiranje vrijednosti poziva iz std1 u std2

std3 = null; // spremanje null reference u varijablu std3

std.name = "John Smith"; // postavlja vrijednost varijable instance

std1.name = "Mary Jones"; // postavlja vrijednost varijable instance

// ostale varijable instanci imaju početne vrijednosti nula Slika prikazuje varijable kao male kutijice s napisanim imenima varijabli. Objekti su prikazani kao kutije sa zaobljenim rubovima. Vrijednost varijable koja sadržava poziv na objekt prikazana je kao strelica prema objektu. Varijabla std3 s vrijednosti null ne pokazuje nigdje, a strelice iz std1 i std2 pokazuju na isti objekt. Ovo nas upućuje na važnu činjenicu: kad se vrijednost varijable jednog objekta pridijeli drugoj,kopira se samo poziv, objekt na koji se taj poziv odnosi se ne kopira.

9

Page 11: OOP

Nakon izvršenog pridjeljivanja "std2 = std1;", nije kreiran novi objekt, umjesto toga std2 pokazuje na isti objekt kao i std1. Tako se, na primjer, varijable std1.name i std2.name odnose na istu varijablu, varijablu instance u objektu na koji se odnose i std1 i std2. Jednakost i nejednakost objekata je moguće testirati korištenjem == i != operatora, ali je značenje tih operatora drugačije nego inače. Izrazom "if (std1 == std2)" ispituje se da li su vrijednosti u varijablama std1 istd2 jednake, ali te vrijednosti su pozivi na objekte, a ne sami objekti. Znači, ispituje se da li se std1 i std2 odnose na isti objekt, zapravo istu memorijsku lokaciju. Da bi se ispitala jednakost vrijednosti varijabli instance pojedinih objekata potrebno je koristiti izraze poput:

std1.test1 == std2.test1

std1.test2 == std2.test2

std1.test3 == std3.test1

std1.name.equals(std2.name)

Stringovi su objekti, i zbog toga varijable tipa String mogu sadržavati samo poziv na string, a ne i sam string. Osim toga, varijabla može sadržavati i null reference, dakle ne pokazivati ni na jedan string. Zbog ovoga ispitivanje jednakosti stringova korištenjem == operatora nije dobra ideja. Pretpostavimo da je pozdrav varijabla tipa String i da pokazuje na string "Zdravo". Kakav rezultat daje ispitivanje izraza pozdrav == "Zdravo"? Varijabla pozdrav i string "Zdravo" pokazuju na string koji sadržava znakove Z d r a v o, ali to ne znači da su to isti objekti, oni samo sadrže iste znakove. Izrazom pozdrav.equals("Zdravo") ispituje se da li pozdrav i "Zdravo" sadrže iste znakove, dok ispitivanje izrazapozdrav == "Zdravo" daje odgovor na pitanje da li su ti znakovi spremljeni na istoj memorijskoj lokaciji.

10

Page 12: OOP

5. OOP I JAVA

Java je objektno orijentirani programski jezik koji su razvili James Gosling, Patrick Naughton i drugi inženjeri u tvrtci Sun Microsystems. Razvoj je počeo 1991, kao dio projekta Green, a objavljen je u studenom 1995. Tvrtka Sun posjeduje trademark na ime Java, ali samo okruženje je moguće bez plaćanja skinuti sa Sunovih internet poslužitelja. Velika prednost u odnosu na većinu dotadašnjih programskih jezika je to što se programi pisani u Javi mogu izvoditi bez preinaka na svim operativnim sustavima za koje postoji JVM (Java Virtual Machine), dok je klasične programe pisane primjerice u C-u potrebno prilagođavati platformi(Operacijskom sustavu) na kojem se izvode. Time i bogatim skupom klasa za rad s mrežnim komunikacijama u jednom trenutku je Java bila najbolji izbor za široku lepezu mogućih aplikacija. Microsoft je stoga razvio svoj C# i .NET platformu kao odgovor na open source alternative. 3

5.1. Iskorištavanje klasaJava programeri nastoje pisati klase koje se mogu iskoristiti na nekim drugim

projektima. Taj pristup ubrzava razvijanje aplikacije, jer nije potrebno više puta pisati iste dijelove programskog koda, već koristiti postojeće klase koje dobro istestirane. Postoji niz open-source projekata koji nude gotove komponente koje je moguće koristiti u vlastitom programu (npr. komponente za iscrtavanje grafova, zapisivanje događaja unutar aplikacije u log datoteke).

5.2. Nasljeđivanje klasaNačin ponovnog iskorištavanja postojećih klasa pisanjem novih klasa koje

koriste sva svojstva postojećih klasa. Postojeća klasa se u tom slučaju naziva nadklasa (engl. superclass), a nova klasa koja nasljeđuje postojeću klasu naziva se podklasa (engl. subclass).Podklasa dodaje svoje varijable i metode koje joj pridodaju specifična svojstva. Svaka podklasa može postati nadklasa nekim novim klasama.Primjer 1 :package nasljedjivanje;public class Vozilo {private int brojPutnika;private float potrosnja;public Vozilo(int brojPutnika, float potrosnja) {this.brojPutnika = brojPutnika;this.potrosnja = potrosnja;}public int getBrojPutnika() {

3 http://hr.wikipedia.org/wiki/Java_(programski_jezik)

11

Page 13: OOP

return brojPutnika;}public void setBrojPutnika(int brojPutnika) {this.brojPutnika = brojPutnika;}Primjer 2:package nasljedjivanje;public class Automobil extends Vozilo {public static final String VRSTA_MOTORA_BENZINSKI = "VRSTA_MOTORA_BENZINSKI";public static final String VRSTA_MOTORA_DIZEL = "VRSTA_MOTORA_DIZEL";public static final String VRSTA_MOTORA_HIBRIDNI = "VRSTA_MOTORA_HIBRIDNI";private String vrstaMotora;private int brojVrata;public Automobil(String vrstaMotora, int brojVrata, int brojPutnika, floatpotrosnja) {super(brojPutnika, potrosnja);this.vrstaMotora = vrstaMotora;this.brojVrata = brojVrata;}public String getVrstaMotora() {return vrstaMotora;}public void setVrstaMotora(String vrstaMotora) {this.vrstaMotora = vrstaMotora;}

Primjer 3:package nasljedjivanje;public class Zrakoplov extends Vozilo {private float rasponKrila;private float sirinaTrupa;public Zrakoplov(int brojPutnika, float potrosnja,float rasponKrila, float sirinaTrupa) {super(brojPutnika, potrosnja);this.rasponKrila = rasponKrila;this.sirinaTrupa = sirinaTrupa;}public float getRasponKrila() {return rasponKrila;}

12

Page 14: OOP

public void setRasponKrila(float rasponKrila) {this.rasponKrila = rasponKrila;}

Ključna riječ „super“ služi za pozivanje metoda i dohvaćanje atributa iz nadklase Pomoću nje je moguće pozvati i konstruktor nadklase ako ne postoji podrazumijevani konstruktor nadklase, nužno je potrebno pozvati konstruktor nadklase iz konstruktora podklase uz pomoć ključne riječi super u slučaju da postoji podrazumijevani konstruktor nadklase, implicitno se poziva u konstruktoru podklase.

5.3. Apstraktne klase

U nekim slučajevima je potrebno napisati klasu iz koje nije predviđeno kreiranje objekata, već njeno korištenje u nasljeđivanju. Takve klase nazivaju se apstraktne klase. Apstraktne nadklase svojim podklasama pridodaju sva svojstva, međutim, kako bi postale konkretne klase iz kojih je moguće kreirati objekte, potrebno ih je „dovršiti“ u podklasama. Klase se proglašavaju apstraktnima s odgovarajućim atributom:

public abstract class MojaApstraktnaKlasa

Svaka apstraktna klasa može, ali ne mora imati jednu ili više apstraktnih metoda ako klasa ima barem jednu apstraktnu metodu, automatski mora biti apstraktna klasa. Apstraktne metode su metode koje u apstraktnoj klasi nemaju implementacije, već je predviđeno da se te metode implementiraju u podklasama koje nasljeđuju apstraktnu klasu. Konstruktori i statičke metode ne mogu biti apstraktni.

Primjer 4: public abstract int izracunaj();

package polimorfizam;public abstract class Instrument {public static final int VRSTA_INSTRUMENTA_PUHACKI = 1;public static final int VRSTA_INSTRUMENTA_UDARALJKE = 2;public static final int VRSTA_INSTRUMENTA_ZICANI = 3;public static final int VRSTA_INSTRUMENTA_ELEKTRONICKI = 4;public static final int VRSTA_INSTRUMENTA_KLAVIJATURE = 5;private int vrstaInstrumenta;public int getVrstaInstrumenta() {return vrstaInstrumenta;}public void setVrstaInstrumenta(int vrstaInstrumenta) {this.vrstaInstrumenta = vrstaInstrumenta;}public abstract void odsvirajNotu();}

13

Page 15: OOP

5.4. Polimorfizam

Polimorfizam omogućava „općenito programiranje“ umjesto „specifičnog programiranja“. Polimorfizam omogućava implementiranje sistema koji se mogu lako proširivati. Konkretno, omogućava da se objekti koji dijele zajedničku nadklasu u hijerarhiji klasa ponašaju kao da su objekti te nadklase.

Primjer 5: package polimorfizam;import java.util.Random;public class PolimorfizamTest {public static final int BROJ_INSTRUMENATA = 10;public static void main(String[] args) {Instrument[] instrumenti = newInstrument[BROJ_INSTRUMENATA];instrumenti = popuniPoljeRandomInstrumentima(instrumenti);for (int i = 0; i < BROJ_INSTRUMENATA; i++) {instrumenti[i].odsvirajNotu();}}

Primjer 6:private static Instrument[] popuniPoljeRandomInstrumentima(Instrument[] instrumenti) {Random random = new Random();for (int i = 0; i < BROJ_INSTRUMENATA; i++) {switch(random.nextInt(5)) {case 0 : instrumenti[i] = new Flauta();break;case 1 :instrumenti[i] = new Bubanj();break;case 2 :instrumenti[i] = new Gitara();break;case 3 :instrumenti[i] = new Klavir();break;case 4 :instrumenti[i] = new RitamMasina();break;default:instrumenti[i] = new RitamMasina();break;}}

14

Page 16: OOP

return instrumenti;}}

Iako polje instrumenti sadrži objekte tipa Instrument, u polju se nalaze objekti klasa koje su podklase klase Instrument. Kod poziva metode odsvirajNotu()tek u trenutku izvođenja je moguće utvrditi o kojem objektu se radi i tek onda je moguće odrediti koju točno metodu je potrebno pozvati. Dinamičkim povezivanjem se prema tipu objekta određuje se odgovarajuća metoda i ispisuje odgovarajuća poruka u konzolu.

5.5. Sučelja

Sadrže public metode koje ne sadrže implementaciju (tijelo metode). Predviđena su za implementaciju u drugim klasama. Svaka klasa može implementirati više od jednog sučeljaUnutar klase koja implementira neko sučelje potrebno je napisati tijelo svih metoda koje se nalaze unutar tog sučelja.

Primjer sučelja:

public class MojaKlasa implements MojeSuceljepackage polimorfizam;public interface Elektricno {public void ukljuci();public void iskljuci();}

Primjer implementacije sučelja:package polimorfizam;public class RitamMasina extends Instrument implements Elektricno {private boolean ukljuceno;public RitamMasina() {setVrstaInstrumenta(VRSTA_INSTRUMENTA_ELEKTRONICKI);ukljuceno = false;}@Overridepublic void odsvirajNotu() {if (ukljuceno == true) {System.out.println("Nota odsvirana ritam-mašinom!");}else {System.out.println("Ritam-mašina je isključena!");}}public void ukljuci() {ukljuceno = true;}public void iskljuci() {ukljuceno = false;}

15

Page 17: OOP

}

Klasa koja implementira sučelje mora koristiti ključnu riječ „implements“ nakon koje slijedi naziv sučelja. Osim toga mora unutar svog tijela implementirati sve metode sučelja, jer se u sučelju nalaze samo specifikacije metoda (slično prototipovima). Svaka klasa može implementirati više sučelja odjednom, za razliku od nasljeđivanja, jer može naslijediti samo jednu klasu. Sučelja mogu nasljeđivati i druga sučelja.

5.6. Metoda nadjačavanja

Nadjačavanje metoda (engl. Overriding methods) u podklasama obavlja se u slučajevima kad je potrebno promijeniti implementaciju neke metode u skladu s karakteristikama podklase. Metoda koja se nadjačava u podklasi mora imati identičan povratni tip, naziv i ulazne parametre kao i metoda u nadklasi koja se nadjačava.

Primjeri nadjačavanja metoda: toString() i clone()

package polimorfizam;

public class BasGitara extends Gitara {

public void odsvirajNotu() {

System.out.println("Nota odsvirana bas gitarom!");

}

}

16

Page 18: OOP

6. ZAKLJUČAK

U ovom seminarskom radu obradio sam temu objetno-orijentiranog programiranja. Sam razlog pojave OOP-a je potreba da se neke „prečice“ stvore u programiranju, da bi programerima bilo lakše. Programski jezici koji podržavaju OOP, su programski jezici višeg nivoa, stoga je bitno istaknuti da se ovakvim načinom programiranja otvaraju nove mogućnosti kako sam prikazao na primjerima. Na primjerima sam koristio dva od najpopularnijih jezika među programerima, dakle C++ i Javu. Stoga mogu zaključiti da je, programiranje jedan od najtežih poslova, jer je potrebno imati kreativnost, ideju, te naravno znati programirati. I sve je to popraćeno time što svaki programer mora redovno pratiti tijek razvoja programskih jezika u svijetu, da bi znao šta raditi i kako, te kako bi bio „u korak“ sa novim istraživanjima, mogućnostima i tehnologijom.

17

Page 19: OOP

7. LITERATURA

1. http://en.wikipedia.org/wiki/Java_(programming_language) (23.02.2012.)2. http://hr.wikipedia.org/wiki/Java_(programski_jezik) (23.02.2012.)3. http://hr.wikipedia.org/wiki/C%2B%2B (23.02.2012.)4. http://en.wikipedia.org/wiki/C%2B%2B (23.02.2012.)5. http://en.wikipedia.org/wiki/Object-oriented_programming (23.02.2012.)

18