If you can't read please download the document
Upload
hoangkhue
View
226
Download
4
Embed Size (px)
Citation preview
OBJEKTNO ORIJENTISANO
PROGRAMIRANJE VEBE Staa Vujii Stankovi
OSNOVNI POJMOVI.
PODSEANJE.
Objekat integralna celina podataka i
procedura za rad sa njima.
OOP programska paradigma zasnovana na
skupu objekata koji dejstvuju meusobno. Glavne
obrade se zasnivaju na manipulisanju objektima.
2
OSNOVNI POJMOVI.
PODSEANJE.
Klasa Skup objekata sa zajednikim
svojstvima. Npr. prevozno sredstvo je klasa.
Potklasa klasa koja nasleuje sve osobine
roditeljske klase (nadklase) i ima dodatnu
specijalizaciju. Npr. automobil ima sve
karakteristike klase prevozno sredstvo, ali ima i
svoje dodatne karakteristike npr. 4 toka...
3
OSNOVNI POJMOVI.
PODSEANJE.
Instanca konkretan objekat iz klase.
Instancne promenljive ili atributi klase parametri koji definiu objekat neke klase. Mogu biti osnovni tipovi podataka ili objekti neke druge klase.
Npr. automobil:
boja: bela, crvena, crna,...
proizvoa: Honda, Opel, BMW, ...
model: limuzina, sportski, karavan...
4
OSNOVNI POJMOVI.
PODSEANJE.
Primer: class Krug { klasa Krug
int x, y;
float r;
}
Krug k = new Krug(10,20,5); instanca klase Krug
x, y i r su instancne promenljive koje u instanci k
imaju redom vrednosti 10, 20 i 5.
5
OSNOVNI POJMOVI.
PODSEANJE.
Klasa pored kolekcije podataka specifikuje i ta
sve moe da se radi sa objektima te klase.
Definie listu moguih operacija nad objektima
klase. To se postie blokom programskog koda
koji se naziva metoda.
Na primer:
Startuj motor
Zaustavi auto
Ubrzaj...
6
KLASE U JAVI
Klasa se moe shvatiti i kao novi tip.
Definicija klase se koristi da se kreiraju objekti tog klasnog tipa, tj. da se kreiraju objekti koji sadre sve komponente koje su specifikovane u klasi.
7
KLASE U JAVI
Definicija klase u sebi sadri:
atribute ovo su promenljive koje obino razlikuju jedan objekat klase od drugog
metode one definiu operacije koje moemo da radimo za datu klasu odreuju ta moemo da radimo nad objektima klase ili sa objektima klase. Obino se izvravaju nad atributima klase.
8
ATRIBUTI U DEFINICIJI KLASE
Kada kreiramo objekat, on e sadrati sve
atribute koji se nalaze u definiciji klase.
Atributi klase mogu da budu primitivnog tipa ili
mogu da referiu na objekte proizvoljnog klasnog
tipa, ukljuujui i onaj koji definiemo.
9
ATRIBUTI U DEFINICIJI KLASE
Postoje 2 vrste atributa:
Statiki ili klasni atribut on je zajedniki za sve objekte klase. Postoji samo jedna kopija tog atributa bez obzira na to koliko objekata te klase je kreirano i ta kopija postoji ak i kada nije kreiran nijedan objekat te klase. Deklariu se kljunom reju static.
Nestatiki atribut ili instancna promenljiva - svaki objekat klase poseduje svoju sopstvenu kopiju atributa. Ovakvi atributi daju objektima individualnost, tj. razlikuju ih meusobno. 10
STATIKI ATRIBUTI
Statiki atributi obino opisuju neko svojstvo koje je zajedniko za sve objekte te klase.
Jo jedna primena statikih atributa je za uvanje vrednosti koje su zajednike svim objektima te klase.
Npr: ako elimo da brojimo koliko je objekata neke klase kreirano u programu, najbolje reenje je da se za to iskoristi statika promenljiva, zato to ona moe da se koristi i kada nijedan objekat klase nije kreiran.
11
STATIKI ATRIBUTI
12
METODI U DEFINICIJI KLASE
Analogno atributima, postoje dve vrste metoda:
Statike ili klasne metode
mogu da se izvravaju i kada ne postoji nijedan
objekat klase. Deklariu se kljunom reju static.
Nestatike ili instancne metode
mogu da se izvravaju samo u odnosu na objekat.
13
STATIKI METODI
Poto statiki metodi mogu da se izvravaju i kada ne postoje objekti, oni ne mogu da referiu na instancne promenljive, jer u suprotnom moe da doe do toga da se operie nad promenljivim koje ne postoje. U tom sluaju, kd se nee prevesti, dobie se poruka o greci.
14
STATIKI METODI MAIN()
Metod main() je, kao to smo videli ranije,
uvek deklarisan kao statiki. Pre nego to
neka aplikacija pone da se izvrava, ne
postoji ni jedan objekat.
Da bismo startovali izvravanje,
neophodan nam je metod koji moe da se
izvri ak i kada nema objekata, dakle,
statiki metod. 15
STATIKI METODI
Pored main() metoda, verovatno najea
situacija kada koristimo statike metode je kada
se klasa koristi kao kontejner za gomilu korisnih
metoda
Na primer, matematike funkcije
implementirane kao klasne metode u
standardnoj klasi Math ove metode nemaju
nikakve veze sa objektima, ve samo operiu nad
primitivnim tipovima, a sadre i neke klasne
promenljive koje su zapravo korisne matematike
konstante pi, e, itd. 16
NESTATIKI METODI
Napomena!
Iako se nestatike metode vezuju za objekat, u memoriji postoji samo jedna kopija svake instancne metode koju dele svi objekti odgovarajue klase, jer bilo bi jako skupo da se za svaki novi objekat kreira i nova kopija instancne metode. Poseban mehanizam omoguava da svaki put kada se pozove metod, njegov kd se izvrava na nain specifian za konkretan objekat.
17
PRISTUP STATIKIM LANOVIMA KLASE
Obino promenljivim i metodama koje su
definisane u klasi pristupamo izvan nje.
Statikom lanu klase pristupamo koristei
ime klase.ime lanice
Double koren = Math.sqrt(Math.PI);
18
PRISTUP STATIKIM LANOVIMA KLASE
Statikom lanu se moe pristupiti i preko
promenljive koja referie na konkretan objekat
klase.
referenca na objekat.ime lanice
Ovo je mogue jer svaki objekat uvek ima pristup
svim statikim lanovima klase.
19
PRISTUP NESTATIKIM LANOVIMA KLASE
Instancnim promenljivim i metodima se pristupa
referenca na objekat.ime lanice:
Double povrsinaKupe = kupa.povrsina();
20
KLASE U JAVI
Za definisanje klase koristimo kljunu re class koju prati ime klase i u okviru vitiastih zagrada detalji definicije.
class ImeKlase {
// lanovi ( atributi i metodi )
}
Po konvenciji, imena klasa u Javi poinju velikim slovima.
21
DEFINISANJE KLASE
Za atribute, kako statike tako i nestatike,
se u definiciji klase mogu postaviti inicijalne
vrednosti.
Ukoliko se ne navede inicijalna vrednost,
prilikom kreiranja objekta bie pridruena
default vrednost i to:
0 za numerike tipove
'\u0000' za tip char
null za reference na objekte i reference na nizove 22
DEFINISANJE METODA
Metodi su zapravo funkcije i tako se i definiu.
Tip vrednosti koju metod vraa moe biti void,
proizvoljan tip ili klasa.
Lokalne promenljive se ne inicijalizuju automatski,
ve se mora eksplicitno izvriti njihova
inicijalizacija
(inae ne prolazi kompajliranje)!
23
PRENOENJE ARGUMENATA METODAMA
Metodama se argumenti prenose po vrednosti.
Dakle, za svaki argument koji se prenosi,
pravi se njegova kopija i kopija se prenosi metodu
preko imena parametra, a ne originalna
vrednost, pa tako ako je argument promenljiva
primitivnog tipa, funkcija ne moe promeniti
njenu vrednost.
24
25
PRENOENJE ARGUMENATA METODAMA
Iako se mehanizam prenoenja argumenata po
vrednosti primenjuje na sve tipove argumenata,
efekat za objekte se razlikuje od onog za
promenljive primitivnih tipova.
Objekat se moe promeniti jer promenljiva
klasnog tipa sadri referencu na objekat, a ne
sm objekat. Kada se takva promenljiva prenese
kao argument metoda, prenosi se kopija reference
na objekat, a ne kopija samog objekta.
26
FINAL PARAMETRI
Svaki parametar metoda moe se navesti i kao final
ime se spreava da funkcija promeni njegovu
vrednost, o emu e kompajler voditi rauna.
Poto se parametri prenose po vrednosti,
final ima smisla samo za parametre koji su
reference na objekte klasa.
Meutim, time se spreava promena reference na
objekat koja se prosleuje metodu,
a ne samog objekta. 27
DEFINISANJE STATIKIH METODA
Doda se kljuna re static ispred definicije
metoda.
Vano je zapamtiti da se unutar statikih
metoda ne mogu referisati nestatiki atributi,
jer se ovakvi metodi mogu pozivati i kada nije
kreiran nijedan objekat klase, u kom sluaju i
ne postoji nijedan nestatiki atribut.
28
PROMENLJIVA THIS
Svaki nestatiki metod ima promenljivu koja se
zove this koja predstavlja referencu na tekui
objekat za koji je metod pozvan.
Kompajler implicitno koristi this kada metod
referie nestatiki atribut klase.
Moemo i sami napisati this.atribut.
Nije dobra praksa na taj nain nepotrebno
optereivati kod. Meutim, postoje i situacije
kada je neophodno eksplicitno koristiti this. 29
PRIMER
Kada izvrimo naredbu:
double ballVolume = ball.volume();
gde je ball objekat odgovarajue klase,
this u metodu volume() referisae na objekat
ball, tako da e upravo instancna promenljiva
radius iz objekta ball biti iskoriena u
izraunavanju.
30
THIS I NESTATIKI METODI
Kako postoji samo jedna kopija nestatikog metoda u memoriji, bez obzira na to koliko objekata date klase postoji, promenljiva this omoguuje da ta jedna instanca metoda radi sa razliitim objektima klase.
Prilikom svakog poziva nestatikog metoda, promenljiva this se postavi da referie na objekat za koji je metod pozvan i onda se kd u metodu odnosi na lanove upravo tog objekta.
31
EKSPLICITNA UPOTREBA THIS-A
Imena promenljivih koje se deklariu unutar
metoda, lokalna su za taj metod.
Dozvoljeno je koristiti imena lokalnih promenljivih,
kao i imena parametara metoda koja su ista kao i
imena atributa.
U tom sluaju, neophodno je koristiti this za
referisanje lana klase unutar metoda.
Smo ime promenljive e se uvek odnositi na
lokalnu promenljivu metoda, ne na atribut klase. 32
PRIMER
void changeRadius( double radius ){
this.radius = radius;
}
this.radius se odnosi na atribut klase, a
radius na parametar metoda
33
INICIJALIZACIJA ATRIBUTA KLASE
I statiki i nestatiki atributi se mogu
inicijalizovati unutar definicije klase.
Neke stvari se ne mogu inicijalizovati jednim
izrazom, npr. veliki niz koji elimo inicijalizovati
vrednostima koje iziskuju neku vrstu
izraunavanja.
To je posao za inicijalizacioni blok.
34
KORIENJE INICIJALIZACIONIH
BLOKOVA
Inicijalizacioni blok je blok kda izmeu { i } koji se izvrava pri kreiranju objekta klase
Postoje dve vrste inicijalizacionih blokova:
Statiki blok za inicijalizaciju blok definisan kljunom reju static i izvrava se samo jednom kada se klasa uitava. On moe da inicijalizuje samo statike atribute klase.
Nestatiki blok za inicijalizaciju izvrava se za svaki objekat koji se kreira i stoga moe da inicijalizuje instancne promenljive u klasi.
Iako je mogue, normalno ne treba inicijalizovati statike atribute nestatikim inicijalizacionim blokom.
35
36
KONSTRUKTORI
Moemo imati vie inicijalizacionih blokova i
onda se oni izvravaju onim redom kojim su
navedeni u definiciji klase.
Iako su inicijalizacioni blokovi korisni,
za kreiranje objekata potrebni su nam i
konstruktori.
37
KONSTRUKTORI
Uvek kada kreiramo objekat neke klase poziva se
specijalna vrsta metoda, tzv. konstruktor.
Ukoliko ne definiemo nijedan konstruktor za
nau klasu, kompajler e obezbediti
podrazumevani konstruktor klase koji ne radi
nita.
38
KONSTRUKTORI
Primarna svrha konstruktora jeste da za
objekat koji se kreira izvri inicijalizaciju
nestatikih atributa.
Inicijalizacioni blokovi koji su eventualno
definisani u klasi uvek se izvravaju pre tela
konstruktora.
Konstruktor ima 2 specifine osobine:
nikada ne vraa vrednost ( ni void! )
uvek ima isto ime kao i klasa kojoj pripada
39
KONSTRUKTORI
Konstruktor moe imati proizvoljan broj
parametara, ukljuujui i 0 ( bez parametara ).
Podrazumevani konstruktor nema parametre.
40
PODRAZUMEVANI KONSTRUKTOR
ime_klase()
{ }
Podrazumevani konstruktor nema parametre i
ne radi nita.
Konstruktor se poziva kad god kreiramo
objekat.
Ukoliko sami napiemo bar jedan konstruktor,
kompajler ne pravi podrazumevani konstruktor.
Ako nam je i on potreban,
moramo ga eksplicitno definisati . 41
KREIRANJE OBJEKATA KLASE
Kada deklariemo promenljivu tipa neke klase,
ne poziva se konstruktor, jer se i ne kreira
objekat.
Npr.
Sfera ball; // Deklarisanje promenljive
Na ovom mestu kreira se promenljiva ball koja
moe da uva referencu na objekat tipa Sfera,
ako i kada kreiramo neki.
42
KREIRANJE OBJEKATA
Da bismo kreirali objekat klase moramo
koristiti kljunu re new za kojom sledi poziv
konstruktora.
Da inicijalizujemo ball referencom na objekat:
ball = new Sphere(10.0, 1.0, 1.0, 1.0);
Moe i sve u jednom redu:
Sphere ball = new Sphere(10.0, 1.0, 1.0, 1.0);
// deklarie se promenljiva ball i definie
// objekat na koji ona referie
43
KLASE U JAVI
44
IVOTNI VEK OBJEKATA
ivotni vek objekta odreen je promenljivom
koja uva referencu na njega,
pod pretpostavkom da postoji samo jedna takva.
Objekat na koji promenljiva referie umire na
kraju bloka u kome je deklarisana.
Ako postoji vie promenljivih koje referiu isti
objekat, objekat postoji sve dok postoji bar jedna
od tih promenljivih.
45
IVOTNI VEK OBJEKATA
Sa ball = null; resetujemo promenljivu tako da
vie ne pokazuje na objekat.
Ukoliko je to bila jedina promenljiva koja je
referisala na taj objekat, on e biti uniten.
Promenljiva ball, meutim, nastavlja da postoji i
moe se koristiti da referie na neki drugi objekat
iste klase.
46
GARBAGE COLLECTOR
Unitavanje mrtvih objekata vri tzv. Garbage Collector. To se u Javi deava automatski, ali ne znai da mrtvi objekti odmah nestaju iz memorije. To ni na koji nain ne utie direktno na na program. Moe da bude bitno jedino u situacijama kada su nai objekti ogromni ili kada odjednom kreiramo i osobaamo se velikog broja objekata. U tom sluaju moemo probati da zovemo statiki metod gc() klase System da bi Java VM izvrila garbage collection
System.gc();
Meutim, poziv gc-a moe i da pogora stvar i da uspori ceo taj proces.
47
PREKLAPANJE (OVERLOADING) METODA
Mogue je definisanje vie metoda klase sa istim
imenom i jedinstvenim skupom parametara.
To se naziva preklapanjem metoda.
Ime metoda, zajedno sa tipovima njegovih
parametara ini potpis metoda.
48
PREKLAPANJE (OVERLOADING) METODA
Potpis svakog metoda u klasi mora biti razliit
kako bi kompajler mogao u svakom trenutku da
odredi koji metod pozivamo.
Tip povratne vrednosti metoda nema uticaja na
potpis metoda.
49
PREKLAPANJE KONSTRUKTORA
Konstruktori se mogu preklapati,
kao i bilo koji drugi metod klase.
Kompajler odabira koji konstruktor e koristiti
na osnovu prosleenih argumenata.
Za potpis metoda bitan je broj i tip parametara,
a ne njihova imena.
50
POZIV KONSTRUKTORA IZ DRUGOG
KONSTRUKTORA
Jedan konstruktor klase moe da poziva
drugi konstruktor te klase u svojoj prvoj izvrnoj
naredbi. Time se esto moe utedeti na
ponovnom pisanju koda.
Za referisanje drugog konstruktora iste klase
koristi se this kao ime metoda praen
odgovarajuim argumentima izmeu zagrada.
51
ZADATAK 1. UCENIK.JAVA
package Ucenik;
class Ucenik {
String ime;
String skola;
int razred;
// Konstruktor sa argumentima
Ucenik(String ime_uc, String skola_uc, int razred_uc){
ime=ime_uc;
skola=skola_uc;
razred=razred_uc;
} 52
// Default konstruktor
/* Ucenik(){
ime="Novak Novicic";
skola="Vuk Stefanovic Karadzic";
razred=3;
} */
// Metod za ispis skole
void stampajSkolu(){
System.out.println("Ime skole je: "+skola);
} 53
// Metod za ispis imena ucenika
void stampajIme(){
System.out.println("Ime ucenika je:
"+ime);
}
}
54
TESTUCENIK.JAVA
package Ucenik;
class TestUcenik {
public static void main (String args []){
Ucenik prvi=new Ucenik("Milos Milosevic","Ivan Goran Kovacic",7);
prvi.stampajSkolu();
prvi.stampajIme();
System.out.println("Ucenik "+prvi.ime+" ide u "+prvi.razred +". razred skole "+ prvi.skola); 55
/* Ucenik drugi=new Ucenik();
System.out.println("Ucenik "+drugi.ime+" ide u "+drugi.razred +". razred skole "+ drugi.skola);
*/
}
}
56
ZADATAK 2.
Napisati u paketu Sfera klasu Sfera.java takvu da sadri:
Klasnu promenljivu PI sa fiksiranom vrednou.
Klasnu promenljivu koja broji objekte klase.
Instancne promenljive: poluprecnik i koordinate centra (xCentar, yCentar i zCentar).
Konstruktor jedinine sfere u koordinatnom poetku.
Konstruktor jedinine sfere u zadatoj taki.
Konstruktor sfere zadatog poluprenika u zadatoj taki.
Statiki metod koji vraa ukupan broj kreiranih objekata klase.
Instancni metod za raunanje zapremine lopte. 57
Napisati u paketu Sfera klasu TestSfere.java takvu da da sadri:
Ispis broja objekata koji su formirani (pozivom odgovarajueg metoda) pre nego to je formiran ijedan objekat.
Kreira objekte
sfera u koordinatnom poetku, poluprenika 4.0.
globus (12., 1.0, 1.0, 1.0)
bilijarska_lopta (10.0, 10.0, 0.0)
Jedinina sfera neparna u koordinatnom poetku
Ispis broja objekata koji su formirani.
tampa zapreminu svake od lopti.
58
ZADATAK 3.
Napisati u paketu Geometrija klasu
Tacka.java takvu da sadri:
Instancne promenljive, x i y koodrinata take.
Konstruktor na osnovu zadate x i y koordinate
take.
Konstruktor na osnovu zadatog objekta Tacka.
Metod za pomeranje Tacke po x i y osi za
x_pomeraj, y_pomeraj.
Metod za raunanje rastojanja do zadate take.
59
Napisati u paketu Geometrija klasu Duz.java
takvu da sadri:
Instancne promenljive, poetna i krajnja taka dui.
Konstruktor na osnovu zadate poetne i krajnje take
dui.
Konstruktor na osnovu zadate x i y koordinate poetne
take i x i y koordinate krajnje take.
Metod za raunanje duine dui.
Metod za odreivanje preseka dveju dui, zadatih
parametarski:
x=x_pocetak+(x_kraj-x_pocetak)*t
y=y_pocetak+(y_kraj-y_pocetak)*t 60
Napisati u paketu Geometrija klasu TestGeometrija.java takvu da sadri:
Kreiramo dve take (pocetak (0.0, 1.0) i kraj (5.0, 6.0)).
Kreiramo du ija su poetna i krajnja taka ba ove zadate take.
Kreiramo drugu du sa zadatim koordinatama poetne i krajnje take.
Ispisati koje dui su formirane.
Pomeramo taku kraj za (1.0, -5.0).
Ispisati novu du.
Metod presek se poziva za jedan objekat tipa Duz, a drugi objekat uzima kao argument. Izraunati presek. 61