Professional Documents
Culture Documents
Ovo Je Prica Koju Vrlo Rado Pricam PDF
Ovo Je Prica Koju Vrlo Rado Pricam PDF
Ovo Je Prica Koju Vrlo Rado Pricam PDF
to je pria o OOP-u
jedni ga hvale, drugi ale, trei kau: E, moj brale!
UPUTSTVO ZA POETNIKE
(one koji na asovima nisu bili, ili jesu al' k'o da nisu)
verzija 1.2
14. jun 2009.
Marija Milanovi
Predgovor
Tekst je zamiljen kao sredstvo za to bre osposobljavanje
studenta za adekvatno praenje nastave (npr. kad ja na
asu kaem: Dobro, to je bila klasa Sfera, a sad emo pisati klasu Duz,
pa poto je svaka du odreena svojim dvema krajnjim takama, prvo nam
treba klasa Tacka, posle 5 minuta svi dobiju po plusi za
radioaktivnost na asu jer su umeli da napiu klasu Tacka )
Ovo nikako nije zamena za pohaanje vebi, niti za slajdove
sa moje web-stranice!
Ako ste razumeli o emu se radi, da ponemo...
Polazne pretpostavke
1. Seli ste da uite kod kue za predstojei kolokvijum
2. Raunar imate, i ukljuen je
while ( nije ispunjena pretpostavka 2. )
;
3. Instalirali ste JDK i prekopirali Eclipse na hard disk
Ako niste, moete skinuti neophodne fajlove sa web-strane
www.matf.bg.ac.yu/~biljana (link OOP) ili ih prekopirati sa
Desktop-a nastavnikog raunara koji se nalazi u sali 718.
4. Znate da pokrenete Eclipse, napravite projekat, u njemu
paket, a u njemu klasu (ako ne, naite uputstvo kako se to
radi u prezentaciji java2.ppt)
5. Veliko predznanje C-a nije potrebno.
Treba znati kontrolne strukture (if, for, while, do, switch) jer
u Javi imaju istu sintaksu, pa zato nije posveeno vreme
njihovom objanjavanju.
Objekti i klase
Osnovni pojam nam je objekat.
Objekat moe biti bilo ta: cipela, drvo, cvet, uenik,
student, osoba, ivotinja, pas, taka, du, sfera,...
Ali kad kaemo student, uvek mislimo na nekog konkretnog
studenta (znamo koje mu je ime, prezime, indeks, smer...).
Ili, ako kaemo cipela, znamo da li je muka ili enska, leva
ili desna, koji joj je broj, proizvoa, od kog materijala je
napravljena, koje je boje, koji joj je vlasnik, kada je
kupljena... Sve ove pobrojane stvari su neki atributi cipele
koji je opisuju.
Dalje, kad imamo neke objekte, onda uvek elimo da ti
objekti neto rade ili da mi neto sa njima radimo. Npr.
elimo da student ui, da poloi ispit, da se za vreme asa
ne loguje na facebook i slino. A cipela moe da se obuje,
izuje, oisti, moda moe i da se zavee pertla (ako ih cipela
ima)...
I na kraju, u Javi, objekat je uvek konkretan primerak neke
klase.
ta to praktino znai? To znai da moramo da imamo
definiciju klase da bismo mogli da pravimo objekte te klase.
U definiciji klase mi kaemo koje atribute e imati objekti
koje budemo pravili i ta emo moi sa njima da radimo.
Klasa nam doe neto kao ablon za objekte. Npr. klasa
Ucenik opisuje koje atribute ima svaki konkretan uenik i ta
on sve moe da radi. Svi objekti neke klase imae sve
atribute koji su navedeni u njenoj definiciji (samo e
vrednosti tih atributa biti specifine za svaki konkretan
objekat) i sa svim objektima klase emo moi da radimo sve
to u definiciji klase pie da moe sa njima da se radi. I nita
vie od toga.
Metod
-
je funkcija:
ima svoj povratni tip (int, double, void, String...),
ima svoje ime
a onda se unutar para zagradica ()
navodi lista parametara, svaki parametar je oblika
<tip><ime> a ako ih je vie, razdvajaju se zapetama.
Metod moe da bude i bez parametara, ali () se mora
navesti
- iza desne zagradice ) unutar para vitiastih zagrada
{} navodi se telo metoda (naredbe)
primer:
public static void main(){
System.out.println(Zdravo, svete!);
}
Podrazumevani konstruktor
Konstruktor se zove podrazumevani ako nema argumente.
Npr.
Sfera(){
/* kreira jedinicnu sferu sa centrom u koordinatnom
* pocetku
*/
radius=1;
brojac++;
/* x, y, z ce biti automatski inicijalizovani na 0,
* jer su numerickog tipa (double)
*/
}
Ako sami eksplicitno ne napiemo nijedan konstruktor,
kompajler e automatski generisati podrazumevani
konstruktor sa praznim telom:
Sfera()
{}
Kada napiemo bar jedan konstruktor, kompajler ne
generie podrazumevani sa praznim telom, pa ako nam je i
on potreban, moramo ga sami napisati. (To bi znailo da
neemo imati podrazumevani koji u telu ima neke naredbe)
(ova pria oko podrazumevanog konstruktora i toga da li ga
ima ili nema i zato e ga ovaj generisati ako nema nikakvog
konstruktora, postae mnogo jasnija kada bude bilo rei o
nasleivanju)
Unutar jednog konstruktora moemo pozvati neki drugi
konstruktor iste klase korienjem kljune rei this umesto
imena metoda, i to mora biti prva naredba u telu
konstruktora:
npr.
Sfera(double x, double y, double z){
this(); /* postavi nam radius na 1, i uveca brojac */
/* this za poziv konstruktora */
this.x=x; /* this za pristup istoimenom atributu */
this.y=y;
this.z=z;
}
Doputeno je parametre metoda nazvati istim imenima koja
su upotrebljena za neke od atributa klase ( parametri x, y i z
prethodnog konstruktora, a imamo i atribute x, y i z klase ).
Kada napiemo samo x, misli se na parametar x metoda, a
da bismo pristupili istoimenom atributu x, moramo da
koristimo kljunu re this: dakle, this.x je atribut x tekueg
objekta.
Definicija tog drugog konstruktora kojeg pozivamo pomou
kljune rei this moe se u definiciji klase nalaziti i ispod
definicije konstruktora u kome je taj poziv.
Kljuna re this za pristup atributima se moe koristiti samo
unutar nestatikih metoda i predstavlja referencu na tekui
objekat sa kojim taj nestatiki metod barata.
this u statikim metodima nema nikakvog smisla jer oni ne
barataju pojedinanim objektom, ve iskljuivo statikim
atributima, pa za njih nije jasno ta bi to bio tekui
objekat.
Referenca
ta je referenca?
U Javi ne postoji operator * (koji smo u C-u koristili da
pristupimo onome na ta pokazuje neki pokaziva)
Ali: promenljiva tipa neke klase i objekat te klase koji je u
vezi sa njom (mada promenljiva ne mora uvek da bude u
vezi sa nekim objektom) su dve sasvim razliite stvari.
Kada deklariemo promenljivu tako da bude tipa neke klase,
npr.
Sfera s;
mi time nismo napravili neki novi objekat s klase Sfera.
Nikakav objekat tu nije kreiran niti je bilo kakva memorija
izdvojena za smetanje objekta. Samo smo rekli da je s
promenljiva koja moe da uva referencu na objekat klase
Sfera. Izdvojeno je jedno malecno pare memorije koje je
dovoljno za uvanje reference (adrese) objekta.
Da bismo kreirali novi objekat klase, moramo da koristimo
kljunu re new koju prati poziv odgovarajueg
konstruktora, npr.
new Sfera();
I ta se desi nakon ovoga?
Izdvoji se memorija neophodna za smetanje objekta klase
Sfera tj. kreira se po jedan primerak svakog od nestatikih
atributa klase: x, y, z i radius; izvri se telo konstruktora da
bi se oni inicijalizovali (telo ovog konstruktora jo i uvea
onaj na statiki atribut broja) i rezultat je referenca na
tako dobijeni objekat.
Tu referencu moemo da sauvamo u promenljivoj tipa
Sfera koju smo prethodno deklarisali:
s=new Sfera();
Ovim smo uspostavili vezu izmeu promenljive s i upravo
kreiranog objekta klase Sfera. Sada se u promenljivoj s
nalazi referenca na taj objekat. Ako elimo da raskinemo tu
vezu, moemo da kaemo:
s=null;
sada promenljiva s nije u vezi ni sa jednim objektom (ne
pokazuje ni na ta)
Ili smo mogli da je poveemo sa nekim drugim objektom:
s=new Sfera(1,1,1,17);
(ovo moemo ako u klasi postoji konstruktor sa 4
argumenta)
Ako imamo i ovako neto:
Sfera t=new Sfera(0,0,0,5);
Pa kaemo:
s=t;
time smo ono to pie u t (a to je referenca na sferu sa
centrom u koordinatnom poetku i poluprenika 5) prepisali
u promenljivu s, pa sada imamo 2 promenljive (s i t) koje
obe referiu na isti objekat u memoriji. Ako nakon toga
koristei promenljivu s promenimo poluprenik objekta na
koji ona referie na 7, objekat na koji referiu i promenljiva
s i promenljiva t bie sfera sa centrom u koordinatnom
poetku i poluprenika 7.
Kopi-konstruktor
Kada elimo da napravimo novi objekat koji je kopija
nekog postojeeg, zvaemo tzv. kopi-konstruktor.
Kada kaemo kopija postojeeg objekta, mislimo da e taj
novi objekat u trenutku kreiranja imati vrednosti svih
nestatikih atributa jednake vrednostima odgovarajuih
nestatikih atributa objekta ija e kopija on biti.
Npr. ako imamo neku sferu sa centrom u taki (1,2,3) i
poluprenika 5, pa napravimo njenu kopiju koristei kopikonstruktor, dobiemo novu sferu koja e imati centar isto u
taki (1,2,3) i poluprenik e joj biti isto 5 kao u onoj
polaznoj.
Ali nova sfera i polazna sfera su dva nezavisna objekta. Ako
nakon kreiranja sfere-kopije, promenimo poluprenik
polazne sfere na 7 (bio je 5), poluprenik sfere-kopije nee
se promeniti (ostae i dalje 5).
Kopi-konstruktor uvek ima samo jedan argument i on je tipa
klase kojoj pripada.
Primer:
Sfera(Sfera s){
x=s.x;
y=s.y;
z=s.z;
radius=s.radius;
brojac++;
}
get*() metodi
Rekli smo ve da e nam atributi klasa uvek biti private i da
to znai da kod nijedne druge klase nee moi direktno da
pristupa njihovim vrednostima i da ih menja.
Ako elimo da dopustimo da kod neke druge klase moe da
proita vrednost naeg private atributa, napisaemo
odgovarajui public get*() metod koji slui samo da dohvati
vrednost tog atributa.
Ako se radi o nestatikom atributu, odgovarajui get*()
metod bie takoe nestatiki.
get*() metod za statiki atribut bie takoe statiki.
get*() metod nema argumente, a povratni tip mu je isti kao
tip atributa iju vrednost dohvata. U telu mora imati returnnaredbu kojom vraa vrednost atributa.
Primeri:
za nau klasu Sfera:
public double getX(){
return x;
}
public static int getBrojac(){
return brojac;
}
set*() metodi
Ako elimo da dopustimo da kod neke druge klase moe da
promeni vrednost naeg private atributa, napisaemo
odgovarajui public set*() metod koji slui samo da promeni
vrednost tog atributa na neku zadatu vrednost.
Ako se radi o nestatikom atributu, odgovarajui set*()
metod bie takoe nestatiki.
set*() metod za statiki atribut bie takoe statiki.
Povratni tip set*() metoda je void, i ima jedan argument iji
tip je isti kao tip atributa iju vrednost menja. U telu mora
imati naredbu dodele kojom se vrednost atributa postavlja
na zadatu.
Primeri:
za nau klasu Sfera:
public void setX(double x){
this.x=x;
}
/* ovaj nemamo u klasi Sfera
* jer nam nije bio potreban
*/
public static void setBrojac(int b){
brojac=b;
}
/* kod ovog metoda bi bilo malo problema ako bi se
* argument umesto b zvao brojac
* jer u statickom metodu ne moze se koristi kljucna
* rec this. Onda bismo statickom clanu brojac klase
* Sfera morali da se obratimo sa Sfera.brojac
* dok bi nam samo brojac bio istoimeni argument
* metoda
*/
Stringovi
sledi popis najee korienih metoda za rad sa objektima
klase String (paket java.lang Javine biblioteke)
1. Poreenje dva Stringa, metod equals:
String string1=prvi;
String string2=drugi;
string1.equals(string2); // false
string2=prvi;
string1.equals(string2); // true
string2=Prvi;
string1.equals(string2); // false
Metod equals pravi razliku izmeu velikih i malih slova.
2. Poreenje do na veliinu slova, metod equalsIgnoreCase:
String string1 = prvi;
String string2 = PrVi;
string1.equalsIgnoreCase(string2); // true
3. Metodi startsWith() i endsWith() proveravaju da li tekui
String poinje/zavrava se stringom koji je dat kao
argument metoda
String string1 = Ovo je string;
string1.startsWith(Ovo); // true
string1.endsWith(string); // true
4. Leksikografsko poreenje Stringova, metod compareTo()
vraa int: 0 ako su tekui i String argument jednaki,
<0 ako je tekui String leksikografski manji od
argumenta i >0 inae.
string1.compareTo(string2)
5. Odreivanje duine Stringa, metod length()
string1.length()
6. Karakter na traenoj poziciji u Stringu, metod charAt()
string1.charAt(0); // prvi karakter Stringa string1
indeksi (pozicije) kreu od 0
(moe izbaciti izuzetak tipa
StringIndexOutOfBoundsException)
7. Pretraga Stringova, metodi indexOf() i lastIndexOf()
pogledati prototipove u dokumentaciji, mogue je u
tekuem Stringu traiti prvu (indexOf()) i poslednju
(lastIndexOf()) pojavu datog karaktera ili Stringa; od
poetka, odnosno kraja Stringa, kao i od neke zadate
pozicije. Vraaju odgovarajui indeks ako je traenje uspelo,
a -1 inae. Upotreba je ilustrovana primerom sa vebi koji
broji pojavljivanje rei the i and u nekom tekstu.
8. Izdvajanje podstringa, metod substring()
2 verzije:
- od neke pozicije, pa do kraja Stringa
String mesto=Novi Sad;
String poslednjaRec=mesto.subString(5); // Sad
- zadavanjem indeksa prvog karaktera podstringa i
prvog karaktera iza poslednjeg karaktera
podstringa:
String deo=mesto.subString(1,4); // ovi
9. Odsecanje belina, metod trim()
odseca beline sa poetka i sa kraja Stringa
string1.trim();
}
Ovde se kae da je klasa Pas izvedena iz klase Zivotinja.
To dalje znai da e svaki objekat klase Pas, pored atributa
(i metoda) koji se nalaze u definiciji ove klase sadrati i sve
atribute (i metode) definisane u baznoj klasi Zivotinja.
Posebno je vano naglasiti da je prilikom kreiranja objekta
izvedene klase (Pas) neophodno izvriti inicijalizaciju i tih
atributa bazne klase (Zivotinja) koji su prisutni u objektu
izvedene klase.
this.datum=new Datum(datum);
POLIMORFIZAM
Polimorfizam obezbeuje da se poziv metoda ponaa
razliito u zavisnosti od tipa objekta na koji je primenjen.
Postoje 2 naina da se dobije polimorfno ponaanje metoda.
Jedan je pomou nasleivanja (tu opet ima 2 varijante), a
drugi pomou interfejsa.
INTERFEJSI
(samo najvanije) (gledati primer sa vebi)
sadre samo deklaracije metoda, bez njihove
implementacije.
Za metode se podrazumeva da su public i abstract i te
kljune rei se u definiciji interfejsa za njih ne navode.
Klasa moe implementirati jedan ili vei broj interfejsa.
Da bismo mogli da pravimo konkretne objekte klase koja
implementira neki interfejs, klasa mora sadrati
implementaciju svih metoda navedenih u definiciji interfejsa.
Inae, nasleuje od interfejsa bar jedan apstraktni metod,
pa je i sama apstraktna.
Mogue je deklarisati promenljivu tipa interfejsa, a u njoj se
moe uvati referenca na objekat proizvoljne klase koja
implementira taj interfejs.
interfejsi i polimorfizam
- u interfejsu se navedu deklaracije polimorfnih metoda
- sve klase za koje hoemo da koriste polimorfizam
napiemo tako da implementiraju taj interfejs
- deklariemo promenljivu tipa interfejsa u kojoj uvamo
reference na objekte tipa tih klasa
- i polimorfizam funkcionie
UGNJEDENE KLASE
to su klase ija se definicija nalazi unutar definicije neke
druge klase
ugnjedene klase mogu biti statike i nestatike
ono gde mi koristimo ugnjedene klase jeste za oslukivanje
dogaaja kada piemo programe sa grafikim korisnikim
interfejsom i te klase su po pravilu nestatike pa sada
priamo samo o njima
unutar nestatikog metoda spoljanje klase objekat
nestatike ugnjedene klase (npr. ControlHandler) moe se
kreirati pozivom njenog konstruktora na uobiajeni nain,
npr.
ControlHandler ch=new ControlHandler();
(statiki metod spoljanje klase ne moe kreirati objekte
nestatike ugnjedene klase, ali ba nas briga, nama to kod
oslukivaa dogaaja i ne treba)
nestatika ugnjedena klasa ne moe sadrati statike
lanove
nestatika ugnjedena klasa ima direktan pristup svim
lanovima (i statikim i nestatikim) spoljanje klase (moe
im pristupati samo navoenjem njihovog imena).
GENERIKI TIPOVI
(ne morate proraivati, koristiemo postojee iz Javine
biblioteke)
Enumeracije
Enumeracija je konaan skup imenovanih konstanti (tipa
int koje po default-u imaju redom vrednosti 0,1,2,...)
(Boja.java i Vrednost.java primera DeljenjeKarata)
- Atribut klase moe biti tipa enumeracije (klasa Karta)
- String reprezentacija konstante enumeracije je ime
koje smo pridruili toj konstanti
- metodom compareTo() moemo utvrditi odnos dve
konstante enumeracije
- Boja.values() vraa kolekciju koja sadri sve
konstante enumeracije Boja, pa moemo jednom
collection-based for petljom proi kroz sve te
konstante i obraditi ih na neki nain (to koristimo u
konstruktoru pila karata kako bismo generisali karte
svih boja i svih vrednosti)
javax.swing
itd.
int getRGB()
vraa vrednost tipa int koja je kombinacija komponenata
boje
Cursor myCursor=Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
primer:
import java.awt.Color;
import java.awt.Cursor;
...
prozor.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR);
prozor.getContentPane().setBackground(Color.PINK);
FONT
Font myFont=new Font(Serif, Font.ITALIC, 12);
prvi argument: ime fonta (logiko ili fiziko,
preporuka:
logiko koristiti.
Opcije: Serif, Dialog, DialogInput, Monospaced, SansSerif)
drugi: stil (ITALIC, PLAIN, BOLD,
moe i Font.ITALIC+Font.BOLD)
trei: veliina (broj piksela)
getStyle()
getSize()
isPlain()
isBold() isItalic()
SKETCHER-prvi primer
- definisanje prozora kao objekta nae klase izvedene
iz JFrame
APLETI
Java-programi koji se izvravaju u kontekstu web-browsera. To namee ozbiljna ogranienja na ono to oni smeju da
rade.
...
aplet ne moe imati pristup fajlovima na lokalnom
raunaru
...
potklasa klase JApplet
public void init();
smatrajte: to je main() za aplikaciju, to je init() za aplet
u smislu: ono to biste u aplikaciji stavili u main(), to kod
apleta stavite u init().
OBRADA DOGAAJA
dogaaj je kada npr. korisnik klikne na dugme ili pritisne
neku tipku tastature...
mi elimo da isprogramiramo kod koji e se izvravati kada
se desi neki dogaaj
koristiemo mehanizam tzv. oslukivaa dogaaja
uvek postoji objekat koji je izvor dogaaja (u naem
primeru to je dugme)
kada se desi dogaaj, generie se objekat koji predstavlja
taj dogaaj (kada se radi o kliku na dugme, taj dogaaj je
tipa ActionEvent)
taj objekat se prosleuje objektu koji e odreagovati na
dogaaj (to je objekat koji se zove oslukiva dogaaja)
Objekat koji predstavlja izvor dogaaja i objekat koji
predstavlja oslukiva dogaaja nad tim izvorom na neki
nain se moraju dovesti u vezu, tj. mora se staviti do znanja
koji je objekat oslukiva zainteresovan da oslukuje
dogaaje sa tim izvorom. To se ini pozivom metoda
addActionListener() za objekat izvor dogaaja, a kao
argument metoda prosleuje se referenca na objekat
oslukiva.
Oslukiva dogaaja moe biti objekat proizvoljne klase koja
implementira odgovarajui listener-interfejs ( u sluaju klika
na dugme, taj interfejs je ActionListener. U ovom
interfejsu deklarisan je samo jedan metod i to je:
public void actionPerformed(ActionEvent e); ) U
implementaciji metoda listener-interfejsa treba staviti onaj
kod koji elimo da se izvrava kada se desi dogaaj.
(listener interfejsi)
(adapterske klase)
LOTO-primeri
LotoDetalji:
statiki inicijalizacioni blok (inicijalizacija statikog niza)
atribut klase: niz dugmadi (dakle, niz komponenti)
zgodno kada imamo vei broj komponenti koje istovetno
izgledaju i ponaaju se na isti nain!
metod getNumbers() primer metoda koji vraa niz!!!
uta dugmad primer komponenti koje same oslukuju
sopstvene dogaaje
kontrolna dugmad jedna klasa oslukivaa za oba
dugmeta, ali pravi se poseban objekat oslukiva za svako
dugme, svakom dugmetu je pridruen jedinstveni
identifikator - meni lino ovaj nain nije neto naroito
prirastao za srce
LotoAlternativa1
sve isto, samo se razlikuje kako je realizovana obrada
dogaaja za kontrolnu dugmad:
pomou metoda getSource() koji vraa referencu na
objekat koji je izvor dogaaja.
Sada se pravi jedan objekat koji e biti oslukiva za oba
kontrolna dugmeta.
Da bismo utvrdili koje je od dva dugmeta izvor dogaaja,
reference na njih moraju biti dostupne metodu
actionPerformed() u klasi oslukivaa, pa te reference
proglaavamo atributima klase apleta.
RadioDugmad
primer korienja radio dugmadi
SkraivanjeRazlomka
tekstualna polja
onemoguavanje unosa u tekstualno polje