Upload
stefana
View
262
Download
0
Embed Size (px)
DESCRIPTION
Klase-programski jezik Java.
Citation preview
Objektno orijentisano programiranje 2
Klase i objekti
20.02.2013.Klase i objekti2
Klase
Klasa je osnovna jedinica programiranja na jeziku Java Klase sadre:
polja (atribute, podatke lanove) metode (operacije, funkcije lanice) mehanizme za stvaranje objekata (konstruktore) inicijalizacione blokove ugneene tipove
Polja ine strukturu podataka objekta definiu stanje objekta
Metodi sadre izvrni kod (na njima je fokus obrade) definiu ponaanje objekta
20.02.2013.Klase i objekti3
Ugovor i implementacija OOP striktno razdvaja pojmove:
ta se radi kako se radi
"ta" je opisano ugovorom - skupom: potpisa javnih metoda
potpis ukljuuje ime metoda, broj i tipove argumenata pridruenom semantikom
"Kako" je opisano odreenom implementacijom skupom: definicija metoda podataka koji nisu javni
Javni podaci su i deo implementacije, ali i ugovora to svakako treba izbegavati (osim konstanti)
20.02.2013.Klase i objekti4
Primer jednostavne klase Klasa NebeskoTelo uva podatke o nebeskim telima:
class NebeskoTelo {private static long sledeciID = 0;private long id=sledeciID++;private String ime="nepoznato";private NebeskoTelo kruziOko; public long citajId(){return id;}public NebeskoTelo(String ime){this.ime=ime;}public NebeskoTelo(String ime, NebeskoTelo centar){this(ime); kruziOko = centar;
}}
Definicija klase uvodi novi naziv tipa (NebeskoTelo)
20.02.2013.Klase i objekti5
Stvaranje objekata Referenca na objekat klase se definie na sledei nain:
NebeskoTelo merkur; Gornja definicija reference na objekat ne stvara objekat Primer dela modela solarnog sistema:
public static void main(String[] args){NebeskoTelo sunce=new NebeskoTelo("Sunce");NebeskoTelo zemlja=new NebeskoTelo("Zemlja", sunce);NebeskoTelo mesec=new NebeskoTelo("Mesec", zemlja);
} Operator new stvara objekat i vraa referencu na njega Tip objekta i parametri konstruktora treba da budu specificirani Objekat se nalazi u memoriji za dinamiku dodelu (heap) Ako nema dovoljno memorije javlja se izuzetak OutOfMemoryError
20.02.2013.Klase i objekti6
Metod toString
Metod toString() slui za konverziju proizvoljnog objekta u String toString() se poziva kada se objekat koristi u konkatenaciji sa nekom niskom I primitivni podaci u konkatenaciji sa niskom se automatski konvertuju u String Primer (u klasi NebeskoTelo) :
public String toString(){String opis = id + " (" + ime + ")";if (kruziOko != null) opis+= " centar rotacije: " + kruziOko;return opis;
}// u metodi main:System.out.println("Telo " + sunce);System.out.println("Telo " + zemlja);System.out.println("Telo " + mesec);
Izlaz:Telo 0 (Sunce)Telo 1 (Zemlja) centar rotacije: 0 (Sunce)Telo 2 (Mesec) centar rotacije: 1 (Zemlja) centar rotacije: 0 (Sunce)
20.02.2013.Klase i objekti7
Polja Promenljive u klasama se nazivaju poljima (atributima) Primeri: id, ime, kruziOko, sledeciID Polje se moe inicijalizovati u definiciji klase Dve vrste polja:
nestatika polja: jedno po objektu (id, ime, kruziOko) statika polja: jedno po klasi (sledeciID)
Svaki objekat ima svoju vlastitu kopiju nestatikog polja Svi objekti dele jednu kopiju statikog polja Statika polja se nazivaju i promenljive klase Statika polja se inicijalizuju im se klasa uita u memoriju Nestatika polja se inicijalizuju kad se stvori objekat
20.02.2013.Klase i objekti8
Kontrola pristupa
lanovi su pristupani u celom kodu klase u kojoj se nalaze Prava pristupa lanu iz drugih klasa se odreuju modifikatorom: private
lan je pristupaan samo u klasi gde je definisan (bez modifikatora pristupa, podrazumevano, paketsko pravo)
lan je pristupaan samo u kodu datog paketa protected
lan je pristupaan u izvedenim potklasama i u kodu celog paketa public
lan je pristupaan sa proizvoljnog mesta odakle se moe pristupiti Svako vie pravo ukljuuje prethodna prava
20.02.2013.Klase i objekti9
Metodi
Sadre kod koji manipulie stanjem objekta Pozivaju se preko referenci na objekte koristei operator .
referenca.metod(parametri) Svaki parametar ima specificiran tip Parametri ne mogu imati podrazumevane vrednosti Promenljiv broj parametara podran od verzije 5.0
void metod(Object ... arg); podrka za formatirani izlaz sa promenljivim brojem parametara:
System.out.printf(%s %3d, ime, godine); Povratni tip se deklarie ispred imena metoda
ako metod ne vraa nikakvu vrednost tip "rezultata" je void Svi parametri metoda se prenose iskljuivo po vrednosti
vrednosti parametara u telu metode su kopije stvarnih parametara Referenca se prenosi po vrednosti, a objekat po referenci
20.02.2013.Klase i objekti10
Primer prenosa po vrednosti
Primer:public static void main(String[] argumenti){
double jedan = 1.0;System.out.println("pre: jedan="+jedan);prepolovi(jedan);System.out.println("posle: jedan="+jedan);
}public static void prepolovi(double arg){
arg /= 2.0; System.out.println("funkcija: pola="+arg);}
Izlaz:pre: jedan=1funkcija: pola=0.5posle: jedan=1
20.02.2013.Klase i objekti11
Primer prenosa po referenci
Primer:public static void main(String[] argumenti){
NebeskoTelo venera = new NebeskoTelo("Venera", sunce);System.out.println("pre: "+venera);drugoIme(venera); System.out.println("posle: "+venera);
} public static void drugoIme(NebeskoTelo telo){
telo.ime = "Zvezda Danica";telo = null; // nema znaaja
} Izlaz:
pre: 1 (Venera) centar rotacije: 0 (Sunce)posle: 1 (Zvezda Danica) centar rotacije: 0 (Sunce)
20.02.2013.Klase i objekti12
Pristupni metodi i preklapanje imena Loa praksa je da polja imaju javni pristup
spreava promenu implementacije klase Pristupni (accessor) metodi reguliu pristup privatnim podacima Na primer, da bi se osigurao read-only pristup polju id, ono je privatno,
a odgovarajui metod citajId() ga samo ita nema naina da korisnik klase NebeskoTelo modifikuje polje id
Preklapanje imena (name overloading): 2 metoda mogu imati isto ime potrebno je da njihovi potpisi sadre razliit broj ili tipove argumenata
Primer dva pristupna metoda sa preklopljenim imenima:public NebeskoTelo orbitira() {return kruziOko;}public void orbitira(NebeskoTelo centar)
{ kruziOko = centar; }
20.02.2013.Klase i objekti13
Referenca this
Specijalna referenca na objekat kojem se upravo pristupa Moe se koristiti unutar nestatikih metoda Nain da se prosledi referenca na tekui objekat kao parametar drugim
metodima:lista.dodaj(this);
Implicitan this se dodaje na referencu lana:class Ime { String s;Ime(){ s="bezimeni; } // isto to: this.s="bezimeni"
} Referenca this se moe koristiti za pristup zaklonjenim lanovima:
public NebeskoTelo(String ime){this.ime=ime;} Zaklanjanje imena polja imenom argumenta
dobra praksa samo u konstruktorima i pristupnim metodima
20.02.2013.Klase i objekti14
Inicijalizacija objekta Inicijalna vrednost polja se moe navesti u definiciji klase
inicijalizator, izraz koji se izraunava primer:
public String ime="nepoznato"; Ako se vrednost ne pridrui eksplicitno, bie "nula":
0, +0.0f, +0.0, \u0000, false ili null Ako je potrebna netrivijalna operacija kreiranja
poetnog stanja objekta konstruktori Za jednostavnu inicijalizaciju bez argumenata
inicijalizacioni blokovi
20.02.2013.Klase i objekti15
Konstruktori
Konstruktori operacije za inicijalizaciju objekata imaju isto ime kao klasa koju inicijalizuju nula ili vie parametara (kao metodi) nemaju povratnu vrednost (za razliku od metoda)
Konstruktori se izvravaju nakon to se: poljima pridrue njihove podrazumevane vrednosti izvre eksplicitni inicijalizatori izvre inicijalizacioni blokovi
Specifini konstruktori Konstruktor bez argumenata (no-arg) za podrazumevanu inicijalizaciju Automatski ugraeni konstruktor bez argumenata i ne radi nita (prazno telo)
obezbeen samo ako ne postoji drugi konstruktor public ako je klasa javna, odnosno nije javni ako klasa nije javna
Sa ogranienim pravom pristupa ograniavaju ko moe da kreira objekte privatni, paketski i zatieni
20.02.2013.Klase i objekti16
Inicijalizacioni blokovi Blok za inicijalizaciju blok naredbi u telu klase Izvravaju se pre konstruktora, po redosledu navoenja
kao da su sastavni deo na poetku svakog konstruktora Moe da baci izuzetak samo ako su svi konstruktori
deklarisani da bacaju taj izuzetak Primer (u klasi NebeskoTelo): umesto u inicijalizatoru polja id
{ id = sledeciID++; } Blokovi se koriste za jednostavnu inicijalizaciju:
kada nisu potrebni argumenti i kada postoji razlog da se izbegne konstruktor bez argumenata
20.02.2013.Klase i objekti17
Statika polja Statiko polje (promenljiva klase) ima samo jednu pojavu po klasi Statiko polje je tano jedna promenljiva
bez obzira na broj (ak 0) objekata klase Statiko polje se inicijalizuje pre nego to se:
bilo koje statiko polje u toj klasi koristi bilo koji metod te klase pone izvravanje
Primer: class Inicijalizacija{public void init() {y=x;}private static double x = 10.0;private double y;...
} // x je definisano polje u trenutku korienja
20.02.2013.Klase i objekti18
Statiki metodi
Statiki metod moe obavljati opti zadatak za sve objekte klase Statiki metod moe direktno pristupati samo
statikim poljima statikim metodima klase
Nestatikim poljima i metodima moe pristupati samo indirektno korienjem reference na neki objekat ijem se polju/metodu pristupa
Ne postoji this referenca (nema specifinog objekta nad kojim se radi) Izvan klase statikom lanu se pristupa koristei ime klase i operator . U klasi ProstiBrojevi (naredni slajd) su definisani:
statiki metod: sledeciProstBroj() statiki niz: prviProstiBrojevi korienje izvan klase:
prostBroj = ProstiBrojevi.sledeciProstBroj();n = ProstiBrojevi.prviProstiBrojevi.length;
20.02.2013.Klase i objekti19
Statiki inicijalizacioni blokovi Slue za inicijalizaciju statikih polja ili drugih stanja Primer:
class ProstiBrojevi{ static int[] prviProstiBrojevi=new int[100];static sledeciProstBroj() {...}static {prviProstiBrojevi[0]=2;for (int i=1; i< prviProstiBrojevi.length; i++) prviProstiBrojevi[i]=sledeciProstBroj();
}// ...
} Redosled statike inicijalizacije: sleva-udesno i odozgo-nanie U toku izvrenja inicijalizatora statikih polja jo nije pripremljena obrada izuzetaka
inicijalizatori ne smeju pozivati metode koji deklariu da mogu bacati izuzetke Statiki blok moe zvati metode koji bacaju izuzetke, samo ako moe i da ih hvata
20.02.2013.Klase i objekti20
Problem cikline statike inicijalizacije Problem:
ako statiki inicijalizator u klasi A poziva statiki metod u klasi B, a statiki inicijalizator u klasi B poziva statiki metod u klasi A
ne moe se otkriti u vreme prevoenja B moe jo ne biti napisana kada se A prevodi
Ponaanje: inicijalizatori A se izvravaju do take poziva metoda klase B pre nego to se izvri metod klase B, inicijalizatori B se izvravaju kada inicijalizator B pozove metod klase A ovaj se izvri
(iako nije zavrena inicijalizacija klase A) zavravaju se inicijalizatori klase B izvrava se pozvani metod klase B konano, zavravaju se inicijalizatori klase A
20.02.2013.Klase i objekti21
Primer cikline statike inicijalizacijeclass A{
static {System.out.println("Izvrenje statikog bloka A poelo"); // (1)B.metod();System.out.println("Izvrenje statikog bloka A zavrava"); // (6)
}static void metod(){ System.out.println("A.metod"); } // (3)
}class B{
static {System.out.println("Izvrenje statikog bloka B poelo"); // (2)A.metod();System.out.println("Izvrenje statikog bloka B zavrava"); // (4)
}static void metod(){ System.out.println("B.metod"); } // (5)
}class T{ public static void main(String[] args){ A a = new A(); } }
20.02.2013.Klase i objekti22
Objekti na koje ne upuuju reference Java eliminie potrebu da se objekti unitavaju eksplicitno Kada ni jedna referenca ne upuuje na objekat,
prostor koji ovaj zauzima se moe osloboditi Da bi se prostor oslobodio potrebno je
da nema referenci na objekat: ni u jednom statikom podatku ni u jednoj promenljivoj bilo kog tekue izvravanog metoda ni u jednom polju ili elementu niza do kojeg bi se moglo stii
poevi od statikih podataka ili promenljivih izvravanih metoda Ako se jedan objekat referie iz objekata koji se vie ne referiu
moe se i taj izbaciti
20.02.2013.Klase i objekti23
Sakuplja ubreta Prostor se oslobaa ako je potrebno jo prostora
sakuplja ubreta eli da izbegne situaciju out of memory ubre se sakuplja bez akcija programera,
ali sakupljanje ubreta uzima vreme Treba projektovati sisteme koji nisu previe produktivni
u stvaranju objekata Sakuplja ubreta ne garantuje da e memorija
uvek biti raspoloiva za sve nove objekte Na ovaj nain Java reava probleme
viseih referenci i curenja memorije
Automatsko uklanjanje ubreta otkalnja potrebu za destruktorima destruktori u C++ prvenstveno slue za eksplicitnu razgradnju objekta
20.02.2013.Klase i objekti24
Metod finalize
Klasa moe implementirati finalize metod koji se izvrava samo jednom: pre nego to se prostor oslobodi kada se virtuelna maina zaustavlja
Definisan u klasi Object, potrebno ga je redefinisati:protected void finalize() throws Throwable {super.finalize(); // dobra praksa//...
} Primer:
public class ObradaFajla{private Stream fajl;public ObradaFajla(String ime){ fajl=new Stream(ime); } //...public void zatvori(){ if(fajl!=null){fajl.close();fajl=null;} }protected void finalize() throws Throwable { super.finalize(); zatvori(); }
} Metod zatvori() je napisan korektno i za viestruke pokuaje zatvaranja fajla
20.02.2013.Klase i objekti25
Izuzeci, izlaz iz aplikacije i finalize Izuzeci i finalize
telo finalize moe koristiti try/catchda obradi izuzetke metoda koje on pozove
sve neuhvaeni izuzeci koji su se pojavili za vreme izvrenja finalize se ignoriu
Izlaz iz aplikacije i finalize kada se izlazi iz aplikacije
finalize metodi svih postojeih objekata se izvravaju neke greke mogu spreiti da se svi finalize metodi izvre
na primer: ako se program zavrava zbog nedostatka memorije (out of memory)
20.02.2013.Klase i objekti26
Oivljavanje objekata Metod finalize moe da reanimira objekat
postavljajui ponovo referencu na njega na primer, dodajui tu referencu u neku statiku listu
Nije preporuljivo takvo ponaanje Umesto oivljavanja objekta treba ga klonirati
klon (novi objekat) preuzima stanje umirueg objekta Metod finalize se pokree tano jednom za svaki objekat Ako je finalize oiveo objekat,
nee se ponovo izvriti kad se objekat bude stvarno uklanjao To znai da objekat moe samo jednom biti reanimiran
20.02.2013.Klase i objekti27
Metod main
main mora biti public, static i void i imati jedan argument tipa String[] Aplikacija moe imati vie main metoda, svaka klasa moe imati jedan main metod Stvarno korieni main je specificiran imenom klase pri pokretanju programa Preporuka: svaka klasa treba da ima main metod za potrebe testiranja Primer (ispisuje parametre main unete preko komandne linije pri pokretanju):
class Eho {public static void main(String[] argumenti) {for(String a: argumenti) System.out.print(a+" ");System.out.println();
}}
Na sistemima sa komandnom linijom Eho se moe pozvati:java Eho se prikazuje
Rezultat e biti:se prikazuje