You are on page 1of 17

VEŽBE 02 – OSNOVNI KONCEPTI OOP

// klasa kao struktura

//kompletna klasa
class Auto {
// polja
private int godiste;
private string boja;

class Auto {
// polja
public int godiste;
public String boja;
public String ostecenje;

protected String ostecenje;
// konstruktori
public Auto(){…}
public Auto(int g, int b, int o){…}
// metode
public void start(){…}
public int ubrzanje(){…}
public void stop(){…}
};

};

Osnovni koncepti OOP
 Apstrakcija
 Enkapsulacija
 Nasleđivanje
 Polimorfizam

Apstrakcija




Postupak kojim se unutrašnja složenost objekta skriva od spoljnjeg sveta.
Postupak kreiranja jednostavne reprezentacije nečeg komplikovanog.
Postoje dve strane svakog objekta:
o ono što radi: što je obično poznato
o način na koji radi: koji je obično nepoznat
Zavisi od perspektive korisnika
Iterativni proces: da bi se pronašao najbolji i najtačniji opis objekta, kao rešenje za dati
problem, obično je potrebno proći nekoliko koraka.

Na primer: napraviti aplikaciju koja će se koristiti u bibliotekama
-

Šta su elementi knjige?
Iz perspektive bibliotekarke:
naslov, autor, isbn broj, kategorija kojoj knjiga pripada.
Njena perspektiva je određena njenim poslom.

-

Iz perspektive grafičkog urednika:
vrsta koričenja, tematika knjige (zbog dizajna omota)

1

Konkretan objekat bi bio npr: Opel Astra. bele boje. Obrazovanje klase = sistematsko uređivanje informacije u smislenu celinu.) i zajedničke atribute (imaju volan. ubrzati. motor.. Samo internim metodama objekata je omogućeno da pristupe tim stanjima. a zatim modeliranje tih klasa u programskom jeziku. Npr. Softverska tehnika kojom se povezuju podaci i metode (radnje) koje se odnose na te podatke u jednu celinu.Klasifikacija • • Koren reči klasifikacija je klasa. Svi automobili imaju slična ponašanja (njima se može upravljati. registarskih tablica: BG 123. dok svaki objekat omogućava spoljnim korisnicima da pristupe i koriste njegove javne metode. Skrivanje informacija Smanjuje složenost sistema Dva bitna aspekta učaurenja:  objedinjavanje podataka i funkcija u jedinstven entitet (klasa)  kontrola mogućnosti pristupa članovima entiteta (modifikatori pristupa) 2 . mogu se zaustaviti. • Pisanje progama u OOP: klasifikovanje različitih koncepata svojstvenih nekom problemu i njegovom rešenju.. Reč Automobil se koristi za sve objekte koji dele ta zajednička ponašanja i atribute..). Enkapsulacija (učaurenje) • • • • • • Osnovni koncept na kome počiva objektna orijentisanost. Podrazumeva da korisnici nekog objekta ne mogu menjati unutrašnja stanja i metode objekata.

polja. //metode public double povrsina() { return 3. konstruktori. } } 3 . class Krug { //polja private double poluprecnik. članove tipova Članove tipova Sve Opis Vidljivo svuda. Apstrakcija (uopštavanje) konkretnih objekata. abstract  Telo klase mogu činiti: metode. članove tipova Tipove. Definisanje klase: [modifikator] class naziv_klase [extends osnovna_klasa] {telo_klase} Modifikator Public Private Protected Primenljivo na Tipove. čak i izvan sklopa Vidljivo samo u kodu koji pripada istom tipu Vidljivo samo u kodu koji pripada istom ili izvedenom tipu Vidljivo svima u istom paketu  Modifikatori mogu biti: new.14 * poluprecnik * poluprecnik.Klasa    Tip podataka koji sadrži podatke i funkcije (metode).

Z=0 } 4 .Polja i Set i Get metode    Privatnim poljima je potrebno omogućiti pristup van klase pomoću Set i Get metoda Te medote treba da imaju određeni modyfikator pristupa i obično je public za kreirane atribute u Eclipse razvojnom okruzenju dobijaju se automatski opicjom Source->Generate getters and setters public class Koordinata { private double x. private double z. } public void setZ(double z) { this. } public double getY() { return y.x = x.println(k). Y=0. public double getX() { return x. private double y. } public void setY(double y) { this. } } ToString metoda  Opisuje predstavljanje objekta prilikom ispisa na standardnom izlazu  Defineše se unutar klase kao javna metoda članica @Override public String toString() { // OPIS ATRIBUTA KLASE return ("X= "+x+".y = y. } public class Glavna { public static void main(String[] args) { // kreira se objekat pozivom podrazumevanog konstruktora Koordinata k = new Koordinata(). } public void setX(double x) { this. } public double getZ() { return z. Z= "+z). Y= "+y+". } //BEZ toString(): Koordinata@a90653 //SA toString(): X= 0. //kada se redefinise toString() //moguce je na ispis poslati celu koordinatu System.z = z.out.

System. } public void smanjiTon() { --jacinaTona.println(t). ukljucuje televizor) • iskljuci.out. toString. } public void setJacinaTona(int jt) { this. • ukljuci. iskljucuje televizor) • daLiJeUkljucen. Diskutovati o pravima pristupa.ukljuci().pojacajTon(). vraca vrednost atributa ukljucen • vratiJacinuTona.ZADATAK 1: Napraviti klasu Televizor da ima: Atribute • jacinaTona.out. } public void ukljuci() { ukljucen = true. pojacava ton televizora za jedan.println(t). t. } public int getJacinaTona() { return jacinaTona. 0) • ukljucen. Početna vrednost za jačinu tona je 0 (smatra se da je ton isključen tj. koja vraca trenutnu vrednost jacine tona • toString. public void pojacajTon() { ++jacinaTona.println(t). private boolean ukljucen. System. iskljuci. public class Televizor{ private int jacinaTona. koja postavlja vrednost atributa ukljucen na false (tj. Početna vrednost za atribut ukljucen je false (televizor ugašen). } public class Glavna { static void main(String[] args) { Televizor t = new Televizor(). Metode • pojacajTon. } public void iskljuci() { ukljucen = false. postavlja vrednost atributa ukljucen na true (tj. //TV je ukljucen: False //Jacina tona je: 0 t.out. } } VEZBA: korigovati klasu Televizor da ne može da se radi sa isključenim televizorom. } public Boolean daLiJeUkljucen(){ return ukljucen. • smanjiTon. i da nikada jačina tona ne sme biti van opsega [0-50] 5 . //TV je ukljucen: True //Jacina tona je: 13 } } @Override public String toString() { return ("\nTV je ukljucen: " + ukljucen+ "\nJacina tona je: "+ jacinaTona). Dodeliti atributu jacinaTona vrednost. //TV je ukljucen: True //Jacina tona je: 0 t. System. ispisuje na ekranu trenutne vrednosti oba atributa uz odgovarajucu poruku Napraviti klasu Glavna koja u main metodi kreira jedan objekat klase Televizor i poziva njegove metode: pojacajTon. smanjuje ton televizora za jedan.setJacinaTona(12).jacinaTona = jt.

t. } public int getJacinaTona(){ return jacinaTona.println(t). private boolean ukljucen.package rs. } public void smanjiTon(){ if(jacinaTona>0 && ukljucen) jacinaTona--. public class Glavna { public static void main(String[] args) { Televizor t = new Televizor(). System.smanjiTon().println(t).out.smanjiTon(). jacinaTona = 5.out. t. } public void ukjuci(){ if (!ukljucen){ ukljucen = true. } package rs.smanjiTon().println(t). } } @Override public String toString() { // TODO Auto-generated method stub return "TON : "+jacinaTona+" : "+ukljucen. System. } } public void iskljuci(){ if(ukljucen){ ukljucen = false.out. t. } } public boolean daLiJeUkljucen(){ return ukljucen.ukjuci(). jacinaTona = 0. t.println(t). System. public class Televizor { private int jacinaTona. System. public void pojacajTon(){ if(jacinaTona<50 && ukljucen) jacinaTona++. 6 .out.

smanjiTon(). t.out.smanjiTon(). t.out.System. System.smanjiTon().smanjiTon().out.out.out. t. System. t.println(t). t.println(t. t.smanjiTon(). } } TON : TON : TON : TON : TON : TON : TON : TON : TON : TON : TON : TON : TON : false TON : 0 5 4 3 2 1 0 0 0 0 1 0 0 : : : : : : : : : : : : : false true true true true true true true true true true true false 0 : false 7 .out.daLiJeUkljucen()). System.iskljuci(). System.out.out. System. System.smanjiTon().println(t).out.println(t). System. t.println(t).pojacajTon().out.println(t). System.println(t).smanjiTon().println(t).println(t). System. System. t.println(t).println(t).out. t.

Ima isto ime kao i klasa. Za jednu klasu može se definisati više konstruktora ( lista parametara svakog od njih mora biti jedinstvena. //public Student(){} /* default konstruktor.KONSTRUKTOR          Metoda klase koja se izvršava kada se kreira objekat određene klase. ili po broju ili po tipu parametara . Broj indeksa: null } } 8 . kompajler neće generisati podrazumevani konstruktor. private String brojIndeksa. } } public class Glavna { public static void main(String[] args) { // kreira se objekat pozivom podrazumevanog konstruktora Student student = new Student(). Ako se u klasi deklariše bar jedan konstruktor. U konstruktoru bi trebalo da se rade samo jednostavne inicijalizacije Konstruktor može primiti jedan ili više parametara koji se koriste za inicijalizaciju polja. //kada se redefinise toString() //moguce je na ispis poslati celog studenta System. Može biti : podrazumevani ili parametarizovani Poziva se od strane new operatora. //BEZ toString(): Student@a90653 //SA toString(): Ime: null. podrazumeva se da postoji (automatski se generise) ukoliko nije eksplicitno naveden konstruktor*/ // redefinisanje toString() metode komandom @Override @Override public String toString() { // TODO Auto-generated method stub return ("Ime: "+ime+".println(student). odmah nakon alokacije memorije za novi objekat.out. nema povratnu vrednost (ni void) i obično inicijalizuje elemente novog objekta. Sva polja koja nisu inicijalizovana u korisnički definisanom konstruktoru zadržavaju svoju podrazumevanu inicijalizaciju.različiti potpis) PRIMER: Podrazumevani (default) konstruktor public class Student { private String ime. Broj indeksa: "+brojIndeksa).

"2/2000")."123/2000"). // greška: nije moguće prisupiti // privatnom polju ime klase Student } } // prethodnom primeru dodati set I get metode kojima ce se omoguciti // promena polja ime VEŽBA: ZA ZADATAK 1 URADITI SLEDEĆE AKO JE MOGUĆE  dodati podrazumevani konstruktor koji kreira isključen televizor sa jačinom tona 0  parametarizovani konstruktor za sve parameter  parametarizovani konstruktor za parameter jacinaTona  parametarizovani konstruktor za parameter ukljucen 9 . /* greska.PRIMER: Reimplementacija podrazumevanog konstruktora kao i primer za parametarizovani //podrazumevani konstruktor class Student { private String ime. private String brojIndeksa.ime = "Mika". brojIndeksa = bi. public Student() { brojIndeksa = "0000/2012". } } class Program { static void Main(String[] args) { Student s = new Student(). ispravno je pozvati ukoliko u klasi postoji eksplicitno naveden podrazumevajuci konstruktor ili ne postoji ni jedan*/ Student s1 = new Student("Pera". } } public Student(String i. //parametarizovani konstruktor class Student { private String ime. student1. private String brojIndeksa. } } class Program { public static void Main(String[] args) { Student s = new Student(). } } PRIMER: promena vrednosti atributa kreirane instance klase class Program { public static void Main(string[] args) { // deklaracija objekta Student student1 = new Student("Pera".String bi) { ime = i.

out. public String getIme() { return ime. } } 10 .ime = ime. public class Osoba { private String ime.gr = gr. Napravi klasu Osoba sa atributima ime. sam godiste").println(o). } public void setIme(String ime) { this.prezime = prezime. } public int getGodinaRodjenja() { return gr.setGodinaRodjenja(1990). Kreirati Instancu klase Osoba i iskoristiti ugrađenu metodu toString(). private int gr.setPrezime("Milanovic").setIme("Milan"). } public void setGodinaRodjenja(int gr) { this. o. } public String getPrezime() { return prezime. } public class Glavna { public static void main(String[] args) { // KREIRANJE INSTANCE KLASE OSOBA PODRAZUMEVANIM KONSTRUKTOROM Osoba o = new Osoba(). } } //toString METODA @Override public String toString() { return("Pozdrav svima!!!\n Ja sam "+ime+" "+prezime+" i "+gr+". } public void setPrezime(String prezime) { this. System. private String prezime. o. o.prezime i godina rodjenja.ZADATAK 2.

3).povrsina()). Pravougaonik p3 = new Pravougaonik(). else System.println("Veca je p1: "+p1.ZADATAK 3. } if(p1. cena. Pravougaonik p2 = new Pravougaonik(15. // GRESKA ??? if(p1. godište.out. public class Pravougaonik { private float sirina. Napisati program za izračunavanje površine i obima pravougaonika korišćenjem klase pravougaonik. pogotovu u konstruktorima.obim()).  Metodama: bool proveriVozilo: proverava da li prosleđeni auto ima 1000 puta veću cenu od vozačkog iskustva i ako ima nema pravo da ga vozi. // PARAMETARIZOVANI KONSTRUKTOR public Pravougaonik(float sirina.out.println("Veci je o2: "+p2. godište. private float visina.  Metodama: bool proveriVozaca: proverava da li prosleđeni vozač ima više od 10 godina vozačkog iskustva da bi mogao da ga vozi Napraviti klasu Vozac sa :  atributima: Ime. 11 .obim()) System. else System. } public float povrsina(){ return sirina*visina.sirina = sirina. float visina) { // UVEK PRVA KOMANDA U KONSTRUKTORU // DETAJNIJE U NASLEDJIVANJIMA super(). ukazujući na atribut ili metodu ove (this) klase.POZIV Pravougaonik p1 = new Pravougaonik(10.obim()).povrsina()). } public float obim(){ return 2*(sirina+visina). this. } } public class Glavna { public static void main(String[] args) { // PARAMETARIZOVANI KONSTRUKTOR . this.println("Veca je p2: "+p2.println("Veci je o1: "+p1. vozackoIskustvo.povrsina()>p2.povrsina()) System.out.out. //sirina ove klase jednaka je prosledjenoj sirini VEŽBA: Napraviti klasu Auto sa :  atributima: marka. } NAPOMENA: Ugrađeni pokazivač this olakšava rad unutar klase. u suprotnom ima pravo U glavnom delu programa demonstrirati kreiranje instanci obe klase i testirati pozive kreiranih metoda.visina = visina. 4).sirina = sirina.obim()>p2. Nema zabune koje je koja sirina !!! this.

y2) U glavnom delu programa (main) :  Kreirati dve Tacke p(1. y1) -. double) sa ispisom u konzoli (PARAMETARIZOVANI TACKA)  Public parametarizovani konstruktor (Tacka) sa ispisom u konzoli (KOPIJA TACKA)  Public void metodu pomeraj(double. kraj :Tacka  Public parametarizovani konstruktor (Tacka. Tacka) sa ispisom u konzoli (PARAMETARIZOVANI DUZ)  Public parametarizovani konstruktor (Duz) sa ispisom u konzoli (KOPIJA DUZ)  Public double metodu duzina(): računa dužinu duži kao rastojanje između početne i krajnje tačke  Public String toString (): ispisuje duž u sledećem formatu (x1.ZADATAK 4: Definisati klasu Tacka da ima:  Private Polja: x. da li se pomerila i Duž ?  Kreirati d2 instancu klase duž preko dve kreirane tačke p. y) Definisati klasu Duz da ima:  Private polja: poc. double): pomera tačku za prosleđene vrednosti  Public double metodu rastojanje(Tacka): računa rastojanje do prosleđene Tačke  Public String toString(): ispisuje tačku u sledećem formatu (x.(x2. y (koordinate centra kruga) : double  Public podrazemevani konstruktor  Public parametarizovani konstruktor (double. q(10.q  Ispisati pomoću toString kreiranu instancu klase Duz  Pomeriti tačku p  Ispisati pomoću toString tacku p  Ispisati pomoću toString d1 instancu klase Duz.10) preko parametarizovanih konstruktora  Ispisati ih preko toString metode  Kreirati d1 instancu klase Duz preko dve kreirane tačke p.1). q  Ispisati pomoću toString d2 instancu klase Duz  Kreirati d3 instancu klase duž preko duži d2  Ispisati pomoću toString d3 instancu klase Duz  KAKO CE IZGLEDATI ISPIS U KONZOLI PO POKRETANJU PROGRAMA 12 .

} public String toString() { return poc +"--"+kraj.y=y.out. da se ne bi mogla menjati prosledjena Duz public Duz(final Duz d) { this(d. da se ne bi mogla menjati prosledjena Tacka public Tacka(final Tacka s) { this(s.rastojanje(kraj). private Tacka kraj. } // final. } // final. System.REŠENJE: public class Tacka { private double x.kraj). da se ne bi mogla menjati prosledjena Tacka public double rastojanje(final Tacka t) { return Math.poc. // poziv konstruktora klase Tacka System.out.pow(t. } public String toString() { return "("+x+". d.x. this. } } 13 . double y) { this.y-y. public Tacka(double x.pow(t. public Duz(Tacka p. } public double duzina() { return poc.out. y+=y_pom.x=x. private double y. "+y+")". pomeranje tacke pomera i duz kraj=new Tacka(k).println("KOPIJA DUZ").x-x. // poc = p. } } public class Duz { private Tacka poc. // poziv konstruktora klase Duz System.y).2)). // ovako je duz nezavisna od tacke } // final.sqrt(Math.2)+Math. } public void pomeraj(double x_pom.println("KOPIJA TACKA").println("PARAMETARIZOVANI TACKA"). double y_pom) { x+=x_pom.s. Tacka k) { poc=new Tacka(p).

p. Duz d2 = new Duz(p.out. System. Tacka q = new Tacka(10.10).out. System.println("Q "+ q).println("P "+ p).println("D1 nakon pomeraja P "+ d1).1). System.out.out.pomeraj(2.out.q).public class Glavna { public static void main(String[] args) { Tacka p = new Tacka(1. 2).out. Duz d1 = new Duz(p.println("D "+ d1). Duz d3 = new Duz(d2).out. } } 14 .println("P nakon pomeraja "+ p). System.println("D3 "+ d3). System. System.q). System.println("D2 "+ d2).

0)--(10. PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI DUZ D2 (3.1).0. 5.0. 3.q).0)--(10.0) P nakon pomeraja (3. PARAMETARIZOVANI TACKA Q (10.0. 10./** REZULTAT ISPISA U KONZOLI // Tacka p=new Tacka(1. 2. 10. 3. 4. 10.0.0) //Tacka q=new Tacka(10.0.0) */ ZAKLJUČAK: Kada klasa ima neko polje koje je instanca druge klase prilikom pozivanja konstruktora se pozivaju odgovarajući konstruktori polja klasa.10).0.q). 1.0) // Duz d2= new Duz(p.0.0) // Duz d3= new Duz(d2). PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI DUZ Redosled: : : : : : kreira kopira kreira kopira kreira tacku q tacku q tacku p tacku p duz d1 5 poziva 4 koji poziva 3: kreira se tacka p u duži d1 5 poziva 2 koji poziva 1: kreira se tacka q u duži d1 15 . 10.0. 3. PARAMETARIZOVANI TACKA P (1. Zato pri kreiranju duži d1 preko dve tacke (p.0) // Duz d1= new Duz(p.q) imamo ovakav redosled: 1. 1. PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI DUZ D (1. 3.0. PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI TACKA KOPIJA TACKA PARAMETARIZOVANI DUZ KOPIJA DUZ D3 (3.0) D nakon pomeraja P (1. 10.0)--(10.0.0)--(10. 1.0.

Linija l = new Linija(2).dodajTacku(t). l. = new Tacka(1. y2)] = duzina U glavnom delu programa:    Kreirati 3 tacke Kreirati jednu liniju od 2 tacke Dodavati jednu po jednu tacku u liniju i ispisivati podatke o liniji REŠENJE: public class Linija { private Tacka niz[]. 6). broj tacaka u liniji  Public parametarizovani konstruktor (int n) : kreira liniju od n tacaka  Public metodu dodajTacku(Tacka t): dodaje tacku u liniju ako ima mesta  Public metodu duzina(): vraća dužinu linije na osnovu rastojanja među tačkama  Public String toString (): ispisuje liniju u sledećem formatu [(x1.rastojanje(niz[i+1]). } @Override public String toString() { String ispis="[ ". i++) ispis += niz[i]+" ". } } public static Tacka t Tacka a Tacka c void main(String[] args) { = new Tacka(0. } } public double duzinaLinije(){ double duzina = 0. }else{ System. i<br-1. } return duzina.ZADATAK 5: Koristeći klasu Tacka iz prethodnog zadatka uraditi sledeće: Definisati klasu Linija da ima:  Private polje: niz: Tacka[]  Private polje br: int. br = 0. y1) (x2.out. } public void dodajTacku(Tacka t){ if (niz. = new Tacka(2. return ispis+"] = "+duzinaLinije(). 2).println("Niz je pun !!!").length > br){ niz[br++] = new Tacka(t). 16 . if (br > 1){ for (int i=0. i++) duzina += niz[i]. 0). private int br. for (int i=0. i<br. public Linija(int n){ niz = new Tacka[n].

out.23606797749979 Niz je pun !!! 17 .0 [ (0. 0.0. } // ISPIS U KONZOLI [ (0.println(l).dodajTacku(c).0. l.out. System.0) (1. 2.dodajTacku(a).System.0. l.0) ] = 2.println(l). 0.0) ] = 0.