81
Java: Uvod Copyright 2003-2005 Igor Tartalja Mart 2005 1/2 Uvod u jezik Java Materijali za kurs su pripremljeni na osnovu literature: Schildt, H., Java™ 2: The Complete Reference, The McGraw-Hill Companies, 2001 Arnold, K., Gosling, J., The Java™ Programming Language, Addison-Wesley Publishing Company, Inc., 1996 razni izvori sa Interneta Motivacija Prenosivost programa sa jedne na drugu platformu je osnovni motiv Jezici kakvi su C i C++ nisu uspeli da obezbede platformsku nezavisnost Prvobitni povod za razvoj Jave – SURJUDPLUDQMH DSDUDWD ]D GRPDüLQVWYR Proboj Interneta i njegovih servisa (npr. WWW) – dodatni motiv koji se tek kasnije pojavio Interesantno: i mikrotalasnim rernama i univerzumu Interneta su potrebni prenosivi programi Istorijat Jezik je koncipirao tim firme Sun Microsystems, Inc. 1991. godine J.Gosling, P.Naughton, C.Warth, E.Frank, M.Sheridan Razvoj prve radne verzije trajao je 18 meseci Prvobitno ime jezika Oak, a tek od 1995 ime je promenjeno u Java 2G JRGLQH IRNXV SURMHNWD VH SUHPHãWD VD NXüQH HOHNWURQLNH QD ::: 3URãLUHQMH WLPD NRML MH XVDYUãLR SURWRWLS L XREOLþLR Javu 1995: B.Joy, A.v.Hoff, J.Payne, F.Yellin, T.Lindholm Trenutno aktuelna verzija je Java 2, verzija 1.5.0 (odnosno 5.0) Ranije verzije: 1.0, 1.1, 1.2, 1.3, 1.4.0, 1.4.1, 1.4.2 Razvojno okruženje: Sun Microsystems J2SE (Java 2 Standard Edition) 5.0 J2SE obuhvata JRE (Java Runtime Environment) i JDK (Java Development Kit) Mehanizam Osnova za platformsku nezavisnost – interpretativan kod 3UHYRÿHQMHP L]YRUQRJ -DYD SURJUDPD GRELMD VH LQWHUSUHWDWLYQL bajtkod (bytecodes) Interpreter za bajtkod – Java virtuelna mašina (JVM) Bajtkod je "mašinski jezik" za JVM JVM je standardizovana – MHGDQ EDMWNRG üH VH LGHQWLþQR LQWHUSUHWLUDWL QD SURL]YRO jnoj JVM Implementacija JVM zavisi od konkretne platforme, ali interfejs ostaje isti Interpretiranje bajtkoda je efikasno, ali ipak slabijih performansi od izvršenja EXE programa Rešenje za bolje performanse su JIT (Just In Time) prevodioci za bajtkod deo po deo koda se prevodi u toku njegovog interpretiranja

Java Etf Bg Predavanja

Embed Size (px)

Citation preview

  • Java: Uvod Copyright 2003-2005 Igor Tartalja Mart 2005

    1/2

    Uvod u jezik JavaMaterijali za kurs su pripremljeni na osnovu literature:

    Schildt, H., Java 2: The Complete Reference, The McGraw-Hill Companies, 2001 Arnold, K., Gosling, J., The Java Programming Language, Addison-Wesley Publishing Company, Inc., 1996 razni izvori sa Interneta

    Motivacija Prenosivost programa sa jedne na drugu platformu je osnovni motiv Jezici kakvi su C i C++ nisu uspeli da obezbede platformsku nezavisnost Prvobitni povod za razvoj Jave ????????????????????????????????????? Proboj Interneta i njegovih servisa (npr. WWW) dodatni motiv koji se tek kasnije pojavio Interesantno: i mikrotalasnim rernama i univerzumu Interneta su potrebni prenosivi programi

    Istorijat Jezik je koncipirao tim firme Sun Microsystems, Inc. 1991. godine

    J.Gosling, P.Naughton, C.Warth, E.Frank, M.Sheridan Razvoj prve radne verzije trajao je 18 meseci Prvobitno ime jezika Oak, a tek od 1995 ime je promenjeno u Java ????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????Javu 1995:

    B.Joy, A.v.Hoff, J.Payne, F.Yellin, T.Lindholm Trenutno aktuelna verzija je Java 2, verzija 1.5.0 (odnosno 5.0) Ranije verzije: 1.0, 1.1, 1.2, 1.3, 1.4.0, 1.4.1, 1.4.2 Razvojno okruenje: Sun Microsystems J2SE (Java 2 Standard Edition) 5.0 J2SE obuhvata JRE (Java Runtime Environment) i JDK (Java Development Kit)

    Mehanizam Osnova za platformsku nezavisnost interpretativan kod ?????????????????????????????????????????????????????????????bajtkod (bytecodes) Interpreter za bajtkod Java virtuelna maina (JVM) Bajtkod je "mainski jezik" za JVM JVM je standardizovana ?????????????????????????????????????????????????????????jnoj JVM Implementacija JVM zavisi od konkretne platforme, ali interfejs ostaje isti Interpretiranje bajtkoda je efikasno, ali ipak slabijih performansi od izvrenja EXE programa Reenje za bolje performanse su JIT (Just In Time) prevodioci za bajtkod

    deo po deo koda se prevodi u toku njegovog interpretiranja

  • Java: Uvod Copyright 2003-2005 Igor Tartalja Mart 2005

    2/2

    Aplikacije i apleti Koncepcija programa na Javi razdvaja dve kategorije: aplikacije i aplete ????????????????????????????????????????

    ????????????????????????????????????? ????????????????????????????????????????????????????????????????????????

    Apleti su (uglavnom mali) programi koji se: distribuiraju preko Interneta, odnosno WWW servisa, kao delovi HTML stranica ?????????????????????????????browser programa)

    Koncepti objektna-orijentisanost ???????????????????????????????????????????????????????????????? jednostavnost ????????????????????????????????????????????????????????????????????? prenosivost postie se interpretacijom bajtkoda sigurnost JVM prua zatitu od virusa koji bi se prenosili kroz izvrni kod (firewall) robusnost ??????????????????????????????????????????????????????????????????????????? efiksanost JIT prevodioci konkurentnost ?????????????????????????????????????????????????????????????? distribuiranost ?????????????????????????????????????? komponentizacija Java Beans i Enterprise Java Beans

    Alati za razvoj Sun Microsystems:

    alati iz komandne linije: J2SE (Std. Edition), J2EE (Enterprise Edition) integrisano okruenje (IDE): Java Studio (ranije ONE Studio, jo ranije Forte)

    Microsoft: Visual Studio .NET Visual J# (ranije Visual Studio 6.0 Visual J++) Borland: J-Builder Symantec: Visual Cafe Tek-Tools: Kawa NetBeans IDE (Open Source, sponzorstvo Sun Microsystems) Xinox Software: JCreator RealJ (ranije FreeJava) BlueJ

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    1/9

    Pregled jezika Java

    Materijali su pripremljeni na osnovu literature:

    Arnold, K., Gosling, J., The Java Programming Language, Addison-Wesley Publishing Company, Inc., 1996

    Program na jeziku Java Programi na Javi su sastavljeni od klasa. Klasa u osnovi ?????????????????????????

    polja (fields) ?????????????????????????????????????????????????????????????????????????? metode (methods) kolekcije naredbi koje rade nad poljima

    Polja slue za reprezentaciju stanja objekta, odnosno klase Metode definiu ponaanje objekta, odnosno klase

    Primer programa Verzija programa Pozdrav (Hello World) na jeziku Java:

    class Pozdrav{public static void main(String[] args){

    System.out.println("Zdravo!");}

    }

    main specijalni metod koji se izvrava kada se pokrene klasa kao aplikacija

    Primitivni tipovi podataka boolean - vrednosti true ili false char - 16-bitni karakter iz Unicode skupa byte - 8-bit integer (signed) short - 16-bit integer (signed) int - 32-bit integer (signed) long - 64-bit integer (signed) flaot - 32-bit floating point (IEEE 754-1985) double - 64-bit floating point (IEEE 754-1985) Stroga provera tipova, ali postoje implicitne konverzije Za svaki primitivan tip postoji i klasa-omota???????????????????????.

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    2/9

    Konstante Konstante su vrednosti koje se ne menjaju za vreme izvrenja programa Primeri: true, 7, 3.14, 'a', '\n', "Zdravo" Imenovane konstante se kreiraju deklarisanjem polja kao static i final Primer: static final double pi=3.14; ???????????????????????????????????????????????unutar klase Primer:

    class BojeKarata{final static int PIK = 2;final static int KARO = 3;final static int HERC = 4;final static int TREF = 5;

    };

    Pristup: BojeKarata.HERC, BojeKarata.TREF, itd.

    Unicode skup znakova Tradicionalni jezici koriste ASCII skup znakova Program na jeziku Java se moe pisati sa Unicode skupom Unicode je internacionalni standard za skup znakova Unicode kodovi koriste 16 bita da predstave znake Prethodni primer sa konstantom pi se moe pisati:

    static final double pi = 3.14; Kod na Javi pis??????????????????-bit) skupa se translira u Unicode pre procesiranja

    Operatori ???????????????????????????

    postfiksni: [] . (params) expr++ expr--unarni prefiksni: ++expr --expr +expr -expr ~ !kreiranje i kast: new (type)exprmultiplikativni: * / %aditivni: + -?????????? > >>>relacioni: < > >= >= >= &= ^= |=

    Svi binarni osim dodela su levo-asocijativni

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    3/9

    Komentari Prevodilac ih ignorie Tri stila:

    // komentar u liniji protee se do kraja linije /* */ komentar koji moe obuhvatati vie linija /** */ dokumentacioni komentar

    Dokumentacioni komentari su namnjeni opisu deklaracija koje im slede javadoc alat ekstrahuje ove komentare i generie HTML dokumentaciju

    Tok kontrole Instrukcije se zavravaju ; Jednostavne instrukcije izrazi Sekvence instruckija blokovi u zagradama {} ??????????????????????????????????????????????????????????????????

    selekcije: if-else i switch iteracije: while, do-while i for (sa continue i break naradbama)

    goto instrukcija ne postoji labele slu??????????????????????????????????????break

    Klase i objekti Objekti na Javi imaju tip; taj tip je klasa objekta Primer klase ????????????

    class Tacka{ public double x,y; }Klasa ima dva polja i ne sadri metode.

    ???????????????????????????????????????????????????????????? Deklaracija public?????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????

    Kreiranje objekata ???????????????????????????????????????????????????????????????????new Primer:

    Tacka centar = new Tacka();centar.x=0.0; centar.y=0.0;

    Kreirani objekti se alociraju na heap-u Objektima se pristupa preko referenci Promenljiva tipa neke klase sadri referencu na objekat ili null Polja objekta su promenljive instance; postoji po jedna kopija polja u svakom objektu

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    4/9

    ????????????????????????????ve klase ??????????????????????????????????????????????????????????????????????????????????????????? Primer: za dodelu jedinstvenih serijskih brojeva objektima ??????????????????????????? ????????????static ukazuje na promenljivu klase Primer (unutar klase Tacka):

    public static Tacka koordPocetak=new Tacka();

    Postoji samo jedan objekat Tacka.koordPocetak sa vrednostima x i y jednakim 0 Objekat System.out??????????????????????????PrintStream) u klasi System

    ???????????????????garbage collector) ????????ene objekte na Javi automatski unitava ????????????????? ?????????????????????????????????????????????????????????????? Kada neki objekat nema vie reference na njega on se moe ukloniti sa heap-a Stvarno uklanjanje moe biti odloeno ??????????????????????????????????

    Metodi i parametri Metodi pristupaju implementacionim detaljima koji su sakriveni od drugih objekata Potpis je ime metoda, broj i tipovi parametara metoda Primer (u klasi Tacka): public void inicijalizuj(){x=0;y=0;}

    Metod inicijalizuj nema parametre i nema rezultat ?????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????primalac poruke (receiver) ??????????????????????????????????????????????????????????????????????????????sti Primer- Euklidovo rastojanje:

    public double rastojanje(Tacka t){double dx, dy; dx=x-t.x; dy=y-t.y;return Math.sqrt(dx*dx+dy*dy); // Math klasa sad??????????????????

    }double d=centar.rastojanje(koordPocetak);

    Referenca this Ponekad je primaocu poruke potrebna njegova vlastita referenca Implicitno, vlastita referenca this je na raspolaganju metodima this?????????????????????????? ????????????????????????

    kao parametar metoda koji zahteva referencu objekta koji ga poziva za eksplicitno imenovan??????????????????

    Primer: public void pomeri(double x, double y){

    this.x=x; this.y=y;}

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    5/9

    ?????????????????????????

    ??????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????im objektima ??????????????????????????????????static ?????????????????????????????????????????????????????????????????????????????????????? Metod Math.sqrt?????????????????????????Math ??????????????????????????????????????????????-?????????????????????

    ali moe ako mu se oni proslede preko parametra

    Nizovi Niz je kolekcija objekata istog tipa Nizovski objekti imaju polje length koje daje informaciju o broju elemenata niza ???????????????????????????????0 i length-1 Izuzetak IndexOutOfBoundsException ukazuje da je indeks izaao iz opsega Primer:

    class pil{??????????????????????????????

    ????????????????????????????????????????

    public void print(){for(int i=0; i

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    6/9

    ??????????????????????????????

    Jedna od glavnih dobiti OO programiranja je proirenje ponaanja??????????????se Nova (proirena, izvedena, podklasa) klasa ????????? sva polja i metode originalne klase Originalna klasa se naziva superklasom ili osnovnom klasom Izvedena klasa moe da redefinie???????????????????? ??????????????????????????????????????????????????e proslediti objekat izvedene klase Polimorfizam ??????????????????????????????????????????????????????-) oblika(-morph) Primer:class Piksel extends Tacka{

    Boja boja;public void inicijalizuj(){super.inicijalizuj(); boja=null;}

    }

    Piksel proiruje: podatke dodavanjem polja boja ponaanje redefinisanjem metoda inicijalizuj

    Objekti Piksel???????????????????????????????????????????????Tacka (polimorfizam) ?????????????????????????????????????????????????????????????????????????????????????????

    Referenca super referenca super????????????????????????????????????? referenca this??????????????????????????????????????? super.inicijalizuj() poziva metod osnovne klase (kao da je pozvan za objekt

    osnovne klase) Metod se poziva na osnovu stvarnog tipa objekta, a ne tipa reference Primer:

    Tacka p=new Piksel();p.inicijalizuj(); // poziva se inicijalizuj() klase Piksel

    super.inicijalizuj() unutar nekog metoda klase Piksel???????????inicijalizuj() metod klase Tacka

    Klasa Object Klase koje ne proiruju eksplicitno druge klase, implicitno proiruju klasu Object Object je klasa koja se nalazi u korenu hijerarhije klasa Object???????????????????????????????????????????????????????????????????????????????????

    Object o = new Piksel();????????????????????

    Legalno je oref???????????????????????????????????Piksel i na String objekte

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    7/9

    Interfejsi Ponekad je potrebno definisati metode koje objekat mora da podri Implementacija metoda je irelevantna, bitan je njihov potpis Primer: metodi koji rade podjednako dobro sa

    ????????????????????????? he-tabelom vrednosti

    Interfejs je nalik klasi, ali sadri samo deklaracije metoda Interfejs deklarie koji metodi su podrani klasom koja implementira taj interfejs ???????????????????????????????????????????????????????????????? metodima Interfejs je tip, tako da se mogu definisati reference tipa nekog interfejsa ??????????????????????????????????????????????????????????????????????????????????????? Primer:

    interface Pretrazivac{ /** Vraca vrednost pridruenu imenu ili null, ako nema te vrednosti */ Object nadji(String ime);}

    Kod koji koristi reference na objekat Pretrazivac: void obradiVrednosti(String[] imena, Pretrazivac tabela){

    for (int i=0;i

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    8/9

    Izuzeci Dodatni kod za detekciju i oporavak od greke zamagljuje normalan tok izvravanja Podrka Jave za obradu greaka su provereni izuzeci (checked exceptions) Metod koji detektuje neku izuzetnu situaciju "baca" (throws) izuzetak (exception) Izuzetak moe biti ???????????caught) u kodu koji prethodi na steku poziva Poseban kod za obradu greke moe izvriti oporavak od nje i produiti sa izvrenjem

    Objekti izuzetaka Izuzetak u Javi je objekat Klase izuzetaka se izvode iz klase Throwable???????????????????????????????Object Klasa Throwable sadri string polje koje se moe koristiti za opis izuzetka Svi novi izuzeci treba da se izvode iz klase Exception koja je izvedena iz Throwable Opta paradigma za obradu izuzetaka: try-catch-finally sekvenca:

    prvo pokuaj (try) da uradi neto ako to neto baci (throw) izuzetak, uhvati ga (catch) ?????????finally), obavi zavrne aktivnosti bez obzira da li se pojavio izuzetak

    ?????????????????????????????????????????????????????????????????default handler) Podrazumevana rutina prijavljuje greku i prekida nit kontrole u kojoj se greka javila Primer:class GreskaSrednjeVrednosti extends Exception{}class Usluge{ public double srednjaVrednost(double[]vals,int i,int j) throws GreskaSrednjeVrednosti { try { return(vals[i]+vals[j])/2; } catch(IndexOutOfBoundsException e) { throw new GreskaSrednjeVrednosti(); } } }

    Standardni izuzetak (indeks probija granice niza) se transformie u spe?????????????????

    Provereni izuzeci Metod moe baciti samo izuzetak koji je eksplicitno deklarisao u klauzuli throws Sutina je da prevodilac moe da proveri da li metod baca samo izuzetke koje je deklarisao ????????????????????????????????????????????????????????????????????????????? Samo RunTimeException i Error ???????????????????????????????????????????? Ovi izuzeci se nazivaju neproverenim (unchecked) izuzecima

  • Java: Pregled Copyright 2000-2005 Igor Tartalja Maj 2005

    9/9

    Paketi ?????????????????????????????????????????????????? Problem sa imenima globalnih funkcija postaje verovatniji sa kratkim imenima, npr. put Klase kapsuliraju polja i metode, pa se problem konflikta imena prenosi na imena klasa Jedno tradicionalno reenje je dodavanje prefiksa koji reprezentuje paket ???????????????????????????????????????n pojmu prostora imena u C++) Paket sadri skup tipova i podpaketa

    ??????????????????????????????

    Paketi se imenuju i mogu se uvoziti (import) tipovi iz paketa ???????????????????????????????????????????????????????????????????? Kada je potrebno koristiti neki deo nekog paketa moe se:

    koristiti njegovo potpuno imeclass Datum1{ public static void main(String[] args){

    java.util.Date danas=new java.util.Date(); System.out.println(danas); }}

    uvesti (import) ceo ili deo paketaimport java.util.Date;class Datum2{ public static void main(String[] args){ Date danas = new Date(); System.out.println(danas); }}

    Konvencija imenovanja paketa Problem kolizije imena i dalje postoji: 2 paketa mogu imati isto ime Problem moe biti reen konvencijom: za ime treba koristiti obrnut Internet domen Primer: ime paketa yu.ac.bg.etf.X u etf.bg.ac.yu domenu Moe se izvriti uvoz dela ili celog paketa: import java.util.*

    Deklarisanje paketa Klase na Javi su uvek u paketu (u podrazumevanom neimenovanom, ako nije naglaeno) ??????????????????????????????????????????????????????????????

    package yu.ac.bg.etf.igre;class Karte { ... }

    Klase koje se piu za neku biblioteku treba da budu pisane u imenovanom paketu

    Niti (threads) ???????????????????????????? konkurentno izvravanje programskih niti Mogu se kreirati aplikacije sa vie niti programske kontrole Dva pristupa:

    proiriti klasu Thread i napisati redefinisani metod run() implementirati interfejs Runnable

    Sinhronizacija za konkurentni pristup podacima objekta ili klase: brave kao kod monitora

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    1/8

    Klase i objekti

    Klase Klasa je osnovna jedinica programiranja na jeziku Java Klase sadre:

    ????????????????????????????????? ???????????????????????????????????? mehanizme za stvaranje objekata na osnovu definicije (konstruktore)

    Polja ??????????????????ataka objekta definiu stanje objekta

    Metodi sadre izvrni kod (na njima je fokus obrade) definiu ponaanje objekta

    Ugovor OOP striktno razdvaja pojmove:

    ta se radi kako se radi

    "ta" je opisano ugovorom - skupom: ????????????????????????????????????uje ime metoda, broj i tipove argumenata) javno raspoloivih podataka (to treba izbegavati) pridruenom semantikom

    ????????????????????????????implementacijom metoda i privatnih podataka

    Primer jednostavne klase Klasa NebeskoTelo?????????????????????????telima:

    class NebeskoTelo {public long id;public String ime;public NebeskoTelo kruziOko; public static long sledeciID = 0;

    }

    Definicija klase kreira naziv tipa (NebeskoTelo) ?????????????????????????????????????????????????????????NebeskoTelo merkur; Gornja definicija ne kreira objekat Referenca je inicijalno null

    Polja Promenljive u klasama se nazivaju poljima Primeri: id, ime, kruziOko, sledeciID Dve vrste polja:

    ne-??????????????????????????????????id, ime, kruziOko) ????????????????li promenljive klase: jedno po klasi (sledeciID)

    Svaki objekat ima svoju vlastitu kopiju ne-???????????????? ????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    2/8

    Kontrola pristupa ??????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????

    public: ?????????????????????????????????????????????????????????????????????????? protected: ?????????????????????????????????????????????u kodu celog paketa package: ???????????????????????????????????????????????????????????????????????? private: ?????????????????????????????????????????????????

    ??????????????????????????????????????????

    Kreiranje objekata Primer modela solarnog sistema: NebeskoTelo sunce=new NebeskoTelo(); sunce.id = NebeskoTelo.sledeciID++; sunce.ime = "Sunce"; sunce.kruziOko = null;

    NebeskoTelo zemlja=new NebeskoTelo();zemlja.id = NebeskoTelo.sledeciID++;zemlja.ime = "Zemlja"; zemlja.kruziOko = sunce;

    Operator new?????????????????????????????????????????? Tip objekta i parametri treba da budu specificirani Ako nema dovoljno prostora javlja se izuzetak OutOfMemoryError

    Konstruktori Inicijalna vrednost polja se moe navesti u deklaraciji Ako se vrednost ne pridrui e????????????????????????0, 0.0, /u0000, false ili null ???????????????????????????????????????????????????????????????????????????? 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

    Primer: poboljana verzija klase NebeskoTelo:class NebeskoTelo {

    public long id;public String ime = "";public NebeskoTelo kurziOko = null;private static long sledeciID = 0;NebsekoTelo() {id = sledeciID++;}

    }NebeskoTelo sunce = new NebeskoTelo(); // id == 0sunce.ime = "Sunce";NebeskoTelo zemlja = new NebeskoTelo();// id == 1zemlja.ime = "Zemlja"; zemlja.kruziOko = sunce;

    Primer drugog konstruktora koji ima parametreNebeskoTelo(String imeTela, NebeskoTelo centar){

    this(); //eksplicitan poziv prvog konstruktora ime = imeTela; kruziOko = centar;}

    Kompletna inicijalizacija se obavlja konstrukcijom:NebeskoTelo sunce = new NebeskoTelo ("Sunce",null);NebeskoTelo zemlja = new NebeskoTelo ("Zemlja", sunce);

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    3/8

    ???????????????????????

    No-public ????????????????????? da kreira objekte package pravo pristupa spre??????????????????????????? protected pravo pristupa doputa i izvedenim klasama da kreiraju objekte

    No-arg konstruktor bez argumenata Default - no-arg konstruktor koji ne radi nita

    ?????????????????????????ne postoji drugi konstruktor public ako je klasa javna, odnosno nije javni ako klasa nije javna

    Metodi Sadre kod koji manipulie stanjem objekta ??????????????????????????????????????????????????????????.:

    referenca.metod(parametri) Promenljiv broj parametara podran od verzije 5.0 Svaki parametar ima specificiran tip Povratni tip se deklarie ispred imena metoda ???????????????????????????????????? tip "rezultata" je void

    Metod toString Ako klasa ima metod toString()on se poziva kada se objekat koristi u konkatenciji Primer (u klasi NebeskoTelo) :

    public String toString(){ String opis = id + " (" + ime + ")"; if (kruziOko != null) opis+=" centar rotacije: " + kruziOko; return opis;

    }System.out.println("Telo " + sunce);System.out.println("Telo " + zemlja);

    Telo 0 (Sunce) Telo 1 (Zemlja) centar rotacije: 0 (Sunce)

    Parametri Svi paramet????????????????????????????????????????????

    (vrednosti u metodu su kopije stvarnih parametara) 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);}

    pre: jedan=1 funkcija: pola=0.5 posle: jedan=1

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    4/8

    Prenos po referenci Referenca na objekat se prenosi po vrednosti, tako se sam objekat prenosi po referenci

    public static void main(String[] argumenti){ NebeskoTelo venera = new NebeskoTelo("Venera", null); System.out.println("pre: "+venera); drugoIme(venera); System.out.println("posle: "+venera);} public static void drugoIme(NebeskoTelo telo){ telo.ime = "Zvezda Danica";??????????????????????????????

    }

    pre: 0 (Venera) posle: 0 (Zvezda Danica)

    ??????????????????????????????????????????

    Da bi se osigurao read-only pristup polju, ono treba da bude sakriveno ??????????????????????????????????????????????????????????????????

    class NebeskoTelo{private long id; // sada "private"...public long citajId(){ return id; }

    }

    ???????????????????????????????????NebeskoTelo modifikuje polje id Pristupni (accessor) metodi reguliu pristup internim podacima Loa praksa je da polja imaju javni pristup

    this Specijalna referenca na objekat kojem se upravo pristupa Moe se koristiti unutar ne-????????????????? ??????????????????????????????????????????bjekat kao parametar drugim metodima:

    lista.dodaj(this)

    Implicitan this??????????????????????????????class Ime { String s; Ime(){ s="" } // isto to i: this.s=""}

    Referenca this se moe koristiti za pristup zaklonjenim ?????????? class Ime {

    String s; Ime(String s){ this.s=s; }}

    Polje s je zaklonjeno parametrom s??????????????????????????????this.s Zaklanjanje identifikatora je dobra praksa samo u konstruktorima i aksesorima super za pristup zaklonjenim poljima i pozivanje redefinisanih metoda superklase

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    5/8

    Preklapanje imena metoda Potpis metoda ime sa brojem i tipovima parametara Preklapanje imena (name overloading):

    ???????????????????????????????????????????????????????????????????????????????????gumenata Primer:

    public NebeskoTelo orbitira() {return kruziOko;}public void orbitira(NebeskoTelo centar) { kruziOko = centar;}

    ??????????????

    ??????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????

    ???????????????????????????????????????????? ??????????????????????????????????????????

    Primer: class Vrednost{

    public static double prva = 10.0; private double druga; public void init() {druga=prva;}???????????????????????????????????????????????????

    ?????????????????????????????????

    ?????????????????????????????????????????????????????????? Primer:

    class ProstiBrojevi{ public static int[] prviProstiBrojevi=new int[100]; static { prviProstiBrojevi[0]=2; for (int i=1; i< prviProstiBrojevi.length; i++)

    prviProstiBrojevi[i]=sledeciProstBroj(); }

    // ... }

    ????????????????????????????????????????-udesno i odozgo-nanie

    ?????????????????????????????????????????

    Problem: ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    ????????????????????????????????????????????????????????????????????ada se X prevodi) Ponaanje:

    ?????????????????????????????????????????????????????????????? pre nego to se izvri metod klase Y, inicijalizatori Y se izvravaju kada inicijalizator Y pozove metod X ovaj se izvri (iako nije zavrena inicijalizacija) zavravaju se inicijalizatori klase Y izvrava se pozvani metod klase Y ??????????????????????????????????????????????

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    6/8

    Primer:class A{

    static {?????????????????????????????????????????????????????????

    B.metod();??????????????????????????????????????? bloka A zavrava");

    }

    static void metod(){ System.out.println("A.metod"); }}

    class B{static {

    ?????????????????????????????????????????????????????????

    A.metod();???????????????????????????????????????????????????????????

    }

    static void metod(){ System.out.println("B.metod"); }}

    class T{public static void main(String[] args){

    A a = new A(); }

    }

    Izlaz:???????????????????????????????????

    ??????????????????????????????????

    A.metod????????????????????????????????????

    B.metodIzvren?????????????????????????????

    Inicijalizatori i izuzeci ?????????????????????????????????????????????????????????????????????????????????????????? Inicijalizatori ne smeju pozivati metode koji deklariu da mogu bacati izuzetke ???????????????????????????tode koje bacaju izuzetke, samo ako sam moe da ih hvata

    ???????????????

    ???????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????? Ne postoji this referenca (nema sp???????????????????????????????????? Izvan klase ???????????????????????????????????????????????????.:

    prostBroj = ProstiBrojevi.sledeciProstBroj();n = ProstiBrojevi.prviProstiBrojevi.length;

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    7/8

    ????????????????????????????????????

    Java eliminie pot???????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????? Da bi se prostor oslobodio potrebno je da nema referenci na objekat:

    ????????????????????????????? ni u jednoj promenljivoj bilo kog?????????????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    Ako se jedan objekat referie iz objekata koji se vie ne referiu moe se i taj izbaciti

    Sakup???????????? ?????????????????????????????

    je potrebno jo prostora ????????????????????????????????????????????out of memory

    ?????????????????????????????????????????????????????????????????????????? Treba projektovati sisteme koji nisu previe produktivni u kreiranju objekata ??????????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????

    finalize Klasa moe implementirati finalize metod koji se izvrava samo jednom:

    pre nego to se prostor oslobodi kada se virtuelna maina zaustavlja

    Deklaracija: 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

    Izuzeci i finalize Telo finalize moe koristiti try/catch da obradi izuzetke metoda koje on pozove ??????????????????????????????????????????????????????????????finalize se ignoriu

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    8/8

    Izlaz iz aplikacije i finalize Kada se izlazi iz aplikacije - finalize metodi svih postoje??????????????????????????? ??????????????????????????????????????????????finalize metodi izvre Na primer: ako se program zavrava zbog nedostatka memorije (out of memory)

    Oivljavanje objekata Metod finalize moe??????????????????????????????????????????????????????????????

    ??????????????????????????????????????????????????????? ?????????????????????????????????? Umesto oivljavanja objekta treba ga klonirati ???????????????????????????????????????????????????? Metod finalize?????????????????????????????????????????? Ako je finalize ???????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????

    main ????????????????????????????????????????????????????likaciju Sistem locira i izvrava metod main iz te klase 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 ??????????????????main je specificiran imenom klase pri pokretanju programa Preporuka: svaka klasa treba da ima main metod za potrebe testiranja Primer (ispisuje parametre main):

    class Eho { public static void main(String[] argumenti) { for (int i=0; i

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    1/2

    Paketi

    O paketima Paketi sadre klase, interfejse i podpakete Paketi su korisni iz nekoliko razloga:

    ??????????????????????????????????????????????????? ???????????????????????????????????????????????????????????? ??????????????????????????????????????????u

    Deklaracija paketa ????????????????????????????????????????????????????????????????X sadri deklaraciju:

    package X; Deklaracija paketa treba da bude prva linija u datoteci U datoteci se moe pojaviti samo jedna deklaracija paketa

    Uvoz paketa Postoje d???????????????????????????????????????????????????????????

    pisati puno ime tipa navode?i . izvriti uvoz dela ili celog paketa pa koristiti jednostavno ime tipa

    Primeri:X.A a; //A je klasa definisana u paketu Ximport X.*; //uvozi se sve iz paketa Ximport X.A; //uvozi se samo tip A iz paketa XA a;

    Smatra se da paket uvozi sebe implicitno

    Konflikti imena Mehanizam paketa i uvoenja daje kontrolu nad potencijalnim konfliktima imena Ako dva paketa (X and Y) sadre isto ime A, programer koji koristi oba paketa moe:

    ?????????????????????????????????????????????????X.A,Y.A) da uveze X.A i zatim koristi A za X.A, a potpuno ime za Y.A da uradi obrnuto da uveze Y.A

    Imenovanje paketa Ime paketa mora biti jedinstveno ????????????????????????????????????????????????????????????????PUT, GET) ????????????????????????????????????????????????????????????????

    ?????????????????????????????????????????????????????????????????????????????????????????????? za pakete koji se koriste irom sveta, sugestija je: koristiti Internet domen inverznim redom

    Primer: package YU.ac.bg.etf.X Neka razvojna okruenja zahtevaju:

    da celokupan kod paketa bude u istom katalogu da se ime kataloga koristi za ime paketa

  • Java: Klase i objekti Copyright 2000-2005 Igor Tartalja Maj 2005

    2/2

    Pristup paketu Klase i interfejsi u paketu mogu imati jedno od dva prava pristupa: paketsko i javno Tipovi koji nisu javni imaju paketsku oblast vaenja

    raspoloivi su za drugi kod u istom paketu ???????????????????????????????????????????????????????????

    ?????????????????????????????????????????pristupa Klase u paketu su prijateljske (friendly, trusted) Podrazumevano pravo pristupa za neki identifikator je paketsko, ????????????????????????????????????????????????????????

    Hijerarhija paketa Tipovi deklarisani u izvornoj datoteci bez deklaracije paketa idu u "neimenovani paket" Paket treba da sadri samo koherentan skup tipova: povezanih klasa i interfejsa ????????????????????????????????????????? Primer: java.lang, lang???????????????java paket ???????????????????????????????????????????????????ristupa Oblast vaenja imena iz paketa se ne protee ???????????????????

    Primer paketa Datoteke X.java i Y.java pripadaju istom paketu P

    FILE X.java:------------package P;public class X{

    int x=10;public int xpub=20;protected int xprot=30;private int xpriv=40;

    }

    FILE Y.java:------------package P;public class Y extends X{

    int y=100;public int ypub=200;protected int yprot=300;private int ypriv=400;public void printY(){ System.out.println("printY:"); System.out.println(x); System.out.println(xpub); System.out.println(xprot);

    // System.out.println(xpriv);}

    }

    FILE Z.java:---------------import P.*;

    class Z extends X{ public static void main( String[] args){

    X xo = new X();Y yo = new Y();

    // System.out.println(xo.x);// System.out.println(yo.y);

    System.out.println(xo.xpub);System.out.println(yo.ypub);System.out.println(xo.xprot);

    // System.out.println(yo.yprot);// System.out.println(xo.xpriv);// System.out.println(yo.ypriv);

    yo.printY();}

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    1/9

    ??????????????????????????????

    Proirivanje klasa Ugovor klase ????????????????????????????????????????????????????????????????????? ?????????????????????????????????????? ?????????????????????????????????????????? Razumna je promena implementacije ugovora superklase

    Primer Klasa Stek koja se proiruje da bi se dobila klasa PrioritiraniStek:class Stek {

    protected int sp=0;protected Object[] niz;public Stek(int velicina){

    niz=new Object[velicina];}public void resetuj(){sp=0;}public void stavi(Object o){

    niz[sp++]=o;}public Object uzmi(){

    return niz[--sp];}

    }public class PrioritiraniStek

    extends Stek{private static final int

    MIN_PRIORITET=0;private int[] prioriteti;public PrioritiraniStek(int velicina){

    super(velicina);prioriteti=new int[velicina];

    }public void stavi(Object o){

    super.stavi(o);prioriteti[sp-1]=MIN_PRIORITET;

    }

    public void stavi(Object o, int p){super.stavi(o);prioriteti[sp-1]=p;

    }public Object uzmi(){

    int maxPri=maxPrioritet();Object o1,o2;int p1,p2,spp=--sp;o1=niz[spp];p1=prioriteti[spp];while (p1!=maxPri && --spp>=0){

    o2=niz[spp]; p2=prioriteti[spp];niz[spp]=o1; prioriteti[spp]=p1;o1=o2;p1=p2;

    }return o1;

    }private int maxPrioritet(){

    int maxPri=MIN_PRIORITET;for(int i=0; imaxPri) maxPri=prioriteti[i];return maxPri;

    }}

    Korena klasa Object Koren cele hijerarhije klasa predstavlja klasa Object Klase koje ne koriste extends klauzulu implicitno proiruju klasu Object Promenljive tipa Object???????????????????????????????????????

    ??????????????????????????????????????????? ??????????????????????????????????????????????wrapping classes), npr. Integer, Boolean

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    2/9

    protected ????????????????????????????????????????????????????????????????????????je su:

    tipa te izvedene klase ili tipa neke klase izvedene iz te izvedene klase

    Kod u klasi D1 moe da pristupi x direktrno, t.j. preko reference this preko referenci D1 ili DD1 ne i preko referenci D2 ili B

    ?????????????????????????????????????? pristupitipreko bilo koje izvedene klase (npr. preko D2)

    ?????????????????????????????????u celom kodu unutar paketa

    Konstruktori Izvedena klasa mora da pozove jedan od konstruktora svoje superklase ???????????????????????????????????????????????????olja

    Eksplicitan poziv konstruktoru superklase: super() ako se eksplicitno koristi super() to mora biti prva naredba u novom konstruktoru ako se ne koristi no-arg????????????????????????????????????????????????? ako superklasa nema no-arg konstruktor obavezan eksplicitan poziv konstruktora

    this()????????????????????????????????????????? Ako postoji, this() mora biti prva naredba u konstruktoru ?????????????????????????????????????????????????????????????????????????this(...)

    Podrazumevani konstruktor Podrazumevani konstruktor je bez argumenata sa telom koje ima samo poziv super() ??????????????????????????????????????????????????????????????????????????????????????? Podrazumevani konstruktor izvedene klase poziva no-arg konstruktor superklase Ako osnovna klasa nema no-arg konstruktor, izvedena klasa mora definisati konstruktor Podrazumevani konstruktor u klasi A je ekvivalentan

    public class A extends B{ public A(){ super(); } }

    Konstruktor je javni, ako je klasa javna: npr. A je javna, pa je i konstruktor

    Redosled konstrukcije objekata Kada se kreira objekat, njegova polja se postave na podrazumevane vrednosti po tipu:

    nula (????????????\u0000 (char), false (boolean), null (reference) Konstruktor se poziva tek nakon inicijalizacije podrazumevanim vrednostima Konstruktor ima 3 faze:

    (1) poziv konstruktora superklase ??????????????????????????????????????????????????????????? (3) izvravanje tela konstruktora

    B: protected int x;

    D2D1

    DD1

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    3/9

    Primer redosleda

    class X{ protected int xMaska = 0x00ff; protected int celaMaska; public X(){celaMaska = xMaska;} public int maska(int orig) {return(orig & celaMaska);}}class Y extends X{ protected int yMaska = 0xff00; public Y(){celaMaska |= yMaska;}}Y y=new Y();

    Korak Akcija xMaska yMaska celaMaska0 Polja podrazumevane vr. 0 0 01 Y() pokrenut 0 0 02 X() pokrenut 0 0 03 X inicijalizacija polja 0x00ff 0 04 X() izvren 0x00ff 0 0x00ff5 Y inicijalizacija polja 0x00ff 0xff00 0x00ff6 Y() izvren 0x00ff 0xff00 0xffff

    Ako se pozove metod za vreme konstrukcije ???????????????????????????????????????? neka polja objekta mogu jo uvek biti neinicijalizovana

    Ako bi konstruktor X() pozvao maska vrilo bi se maskiranje sa 0x00ff, a ne sa 0xffff Metodi koji se pozivaju za vreme konstrukcije moraju biti projektovani paljivo

    Redefinisanje metoda (overriding) Preklapanje imena (overloading) vie metoda ima isto ime

    obavezna je razlika u potpisima metoda Redefinisanje metoda (overriding) zamena implementacije metoda iz superklase

    ??????????????????????????????????????????????? ??????????????????????????????????????????? Referenca super se moe koristiti da pristupi originalnim metodama superklase Klauzula throws????????????????????????throws klauzule datog metoda superklase

    metod izvedene klase moe da suzi listu throws klauzule

    Pravo pristupa redefinisanim metodama Redefinisane metode imaju svoje vlastite specifikatore (modifikatore, kvalifikatore) ???????????????????????????????????????????????????????????????????????????????????? protected metod moe biti redefinisan kao protected ili public, ali ne i private ??????????????????????????????????????????????????????????

    restrikcija bi se zaobila konverzijom tipa u supertip sa irim pravom pristupa

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    4/9

    Sakrivanje polja Polja ne mogu da budu redefinisana, ali mogu da budu sakrivena Ako se u izvedenoj klasi deklarie polje sa istim imenom kao u superklasi => 2 polja Referenca na superklasu (super) se mora koristiti da se pristupi polju superklase

    Polimorfizam Kada se pozove metod objekta stvarni tip objekta (ne reference) odre?????

    koja se implementacija metoda koristi (polimorfno ponaanje) Kada se pristupa polju koristi se deklarisani tip reference (nepolimorfno ponaanje)class B{ public String s="B"; public void p(){ System.out.println("B.p(): " + s); }}class D extends B{ public String s = "D"; public void p(){ System.out.println("D.p(): " + s); } public static void main(String[] arg){ D d = new D(); B b = d; b.p(); d.p(); System.out.println("B.s: " + b.s); System.out.println("D.s: " + d.s); }}D.p(): DD.p(): DB.s = BD.s = D

    Referenca super Na raspolaganju u ??????????????????????????????????? super???????????????????????????????????????????????????????????????????????????? Poziv super.method koristi implementaciju metoda superklase Poziv metoda preko super???????????????????????????????????????????????

    izbor ????????????????????????????????????????????????????????????????????????????????? Primer:class B{ protected String m(){ return "B"; } }class D extends B{ protected String m(){ return "D"; } void p(){ B bref = (B)this; ????????????????????????????; System.out.printl("this.m() = " + this.m()); System.out.printl("bref.m() = " + bref.m()); System.out.printl("super.m() = " + super.m()); }}this.m() = D ????????????????????????????????????bref.m() = D ??????????????????????????????jekat, kao i super)super.m() = B (Jer pristup preko super nije polimorfan)

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    5/9

    Kompatibilnost tipova Java je strogo tipiziran jezik

    ????????????????????????????????????????????????????????????????????????? Tip izraza mora biti kompatibilan tipu promenljive kojoj se izraz dodeljuje i to:

    ????????????????????????????????????????????????????????????????????????????????????? Tip reference koja je rezultat izraza mora biti

    tip promenljive kojoj se dodeljuje njegov podtip literal null (kompatibilan sa svim tipovima referenci)

    Konverzija Nadtipovi su manje posebni oni su "iri" i nalaze se "vie" u hijerarhiji Podtipovi su vie posebni oni su "ui" i nalaze se "nie" u hijerarhiji Konverzija proirivanja: podtip se se konvertuje u nadtip automatski Konverzija suavanja: nadtip se se konvertuje u podtip mora eksplicitno (cast) Primer: (u metodi izvedene klase D iz klase B) B b = (B)this; // moe i: B b = this; D d = (D)b; // obavezan cast

    Konverzija proirivanja (navie, nagore) bezbedna konverzija Konverzija suavanja (nanie, nadole) nije bezbedna, treba biti oprezan ?????????????????????????????????????????????????????????????????????? javlja greku ???????????????????????????????????????????????????????????????????????????

    radi se provera u????????????????????????????????????????????ClassCastException

    Operator provere tipa Operator instanceof slui za proveru da li je izraz kompatibilan za dodelu datom tipu Izraz je levi operand, a ime tipa je desni operand, npr:

    if (b instanceof D) d=(D)b;

    Primer: public static void sortiraj (Lista l){

    if (l instanceof SortiranaLista) return;// sortiranje liste

    }

    Ovaj operator ne treba "zloupotrebljavati" ????????????????????????????????????????????????????????????????????????????????

    nije dobro da se ispituje tip, a onda na osnovu rezultata testa u grani if ili switch??????????????????????????????????????????

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    6/9

    Finalne metode i klase ???????????????????????final ne dozvoljava izvedenim klasama da ga redefiniu ???????????????????????????na kao finalna: final class F{//...} Finalna klasa se ne moe proirivati (te su joj i sve metode automatski finalne) Razlozi da se metod proglasi finalnim:

    ??????????????????????????????????????????????????????????????????????????????? optimizacija: nema ???????????????????????????????????????????????????????????????????????

    U pogledu optimizacije, private kao i static metode su ekvivalentne sa final(na private?????????????????????????????????????????????

    Apstraktne metode i klase Apstraktan metod meto??????????implementacija biti definisana tek u izvedenoj klasi Klasa sa barem jednim apstraktnim metodom je apstraktna Ne mogu se kreirati objekti apstraktne klase ?????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????? Apstrakcija je korisna kada neko ponaanje ima smisla samo za pojedine podtipove Ako je potrebno da svi metodi budu apstraktni, verovatno je potreban interfejs (ne klasa) Primer:abstract class Testiranje { abstract void test(); public long izvrsi(int n){ long start = System.currentTimeMillis(); for (int i = 0; i < n; i++) test(); return (System.currentTimeMillis() - start); }}class TestiranjePraznogMetoda extends Testiranje { void test() {} public static void main(String[] argumenti) { int n = Integer.parseInt(argumenti[0]); long vreme = new TestiranjePraznogMetoda().izvrsi(n); System.out.println(n+" poziva metoda za "+vreme+" ms"); }}

    Klasa Object Sve klase se izvode (implicitno) iz klase Object????????????????????????????

    ?????????????????????????????????== se koristi za proveru jednakosti referenci) public boolean equals(Object obj)

    podrazumevano proverava da li je obj==this (podrazumevano o.equals(o)==true) kloniranje objekta (novi objekat preuzima stanje onog koji se klonira)

    protected Object clone()throws CloneNotSupportedException

    dohvatanje Class objekta koji opisuje tip (klasu, interfejs, niz) datog objekta public final Class getClass()

    finalizacija objekta za vreme sakuplj????????????protected void finalize() throws Throwable

    konverzija u Stringpublic String toString()

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    7/9

    Kloniranje objekata Metod clone() vra???????????????????????????????????????????????????????????????????????? ??????????????????????????????????????? Kla??????????????????????????????????????????????????????????????????????Cloneable Metod Object.clone() obavlja jednostavno kloniranje kopiranjem svih polja originala CloneNotSupportedException se koristi da signalizuje da clone() metod nije uspeo Kloniranjem se izbegava pozivanje konstruktora

    Kreiranje klona Koraci:

    Object.clone() proverava da li objekat za koji je metod pozvan implementira Cloneable ako ne implementira, baca se izuzetak CloneNotSupportedException ??????????????????????????????????????????ao i originalni objekat i kopiraju se polja kada se Object.clone() ??????????????????????????????????????

    ?????????????????????????????????????????????????????????????????????????????????public class MojaKlasa extends DrugaKlasa implements Cloneable { public Object clone()throws CloneNotSupportedException{

    return super.clone()}}// Sva polja MojaKlasa ce biti kopirana pomocu Object.clone() u novi objekat

    Kloniranje polja koja sadre reference Problem:

    public class CelobrojniStek implements Cloneable{ // bez implementiranja private int[] bafer; // Cloneable private int vrh; // bice bacen izuzetak public CelobrojniStek(int kapacitet) { bafer = new int[kapacitet]; vrh = -1; } public void stavi(int v){ bafer[++vrh] = v; } public int uzmi(){ return bafer[vrh--]; }

    }CelobrojniStek prvi = new CelobrojniStek(2);prvi.stavi(2);prvi.stavi(9);try{CelobrojniStek drugi = (CelobrojniStek)prvi.clone()} catch(CloneNotSupportedException i){};// oba prvi.bafer i drugi.bafer reference ukazuju na istu lokaciju

    Reenje problema:// redefinisanje clone() metode da se postigne kopiranje nizapublic Object clone(){ try { CelobrojniStek noviStek = (CelobrojniStek)super.clone(); noviStek.bafer = (int[])bafer.clone(); return noviStek; } catch(CloneNotSupportedException i) { // nece se dogoditi

    throw new InternalError(i.toString()); } }

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    8/9

    Naklonosti klase prema klonovima 4 nivoa naklonosti prema klonovima:

    klasa podrava kloniranje: klasa implementira Cloneable i deklarie svoj javni clone() metod koji ne baca izuzetke

    klasa uslovno podrava kloniranje: klasa implementira Cloneable, ali doputa svom clone() metodu da prosledi izuzetak dobijen od drugih objekat?????????????????????????????

    klasa doputa samo podklasi da podri kloniranje: klasa ne implementira Cloneable????????????????????????? clone() metod koji klonira njena polja korektno (ako Object.clone() ne zadovoljava)

    klasa zabranjuje kloniranje: klasa ne implementira Cloneable??????????????clone() method koji uvek baca izuzetak

    ???????????????????????

    ?????????????????????????????????????????????????????????????IsA relacija) Relacija IsA ????????????????????????HasA relacije U relaciji HasA jedan ob??????????????????????????????????????????????? Primeri:

    Piksel IsA?????????????????????????????????????????? Krug HasA???????????????????

    ?????????????????????????????????????????????????????? Promena loeg inicijalnog izbora moe biti teka

    Primer problemati?????????????? ??????????????????????????????????????????????????????????????????????????????class Tacka2D{ protected double x=0., y=0.; Tacka2D(){} Tacka2D(double x, double y){ this.x=x; this.y=y; } Tacka2D(Tacka2D p){ this(p.x,p.y); } public double rastojanje(Tacka2D p){ double dx=x-p.x, dy=y-p.y; return Math.sqrt(dx*dx+dy*dy); } public String toString(){ return "("+x+","+y+")"; }}

    class Tacka3D extends Tacka2D{ private double z=0.; Tacka3D(){} Tacka3D(double x, double y, double z){ super(x,y); this.z=z; } Tacka3D(Tacka3D p){ this(p.x,p.y,p.z); } public double rastojanje(Tacka3D p){ // preklapanje imena, nije redefinisanje double d2D=super.rastojanje(p), dz=z-p.z; return Math.sqrt(d2D*d2D+dz*dz);

    } public String toString(){ return "("+x+","+y+","+z+")"; }

  • ????????????????????? Copyright 2000-2005 Igor Tartalja Maj 2005

    9/9

    }

  • Java: Interfejsi Copyright 2000-2005 Igor Tartalja Maj 2005

    1/4

    Interfejsi

    Uvod ???????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????

    oboje definiu tipove ??????????????????????????????????????????

    ????????????????????????????????????????? kombinacija ugovora i implementacije ?????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????

    Primer definicije interfejsa Sve klase koje treba da realizuju bafer treba da implementiraju interfejs Bafer:interface IBafer{

    void resetuj();void stavi(Object o);Object uzmi();

    }

    Primer implementiranja interfejsaabstract class Bafer implements IBafer {

    protected int p=0;protected Object[] niz;public Bafer(int velicina){ niz = new Object[velicina]; }public void resetuj(){ p=0; }abstract public void stavi(Object o); // moe i bez deklaracija stavi i uzmiabstract public Object uzmi();

    }

    Metode i polja interfejsa Svaka klasa koja implementira interfejs mora:

    da implementira sve njegove metode ili da bude deklarisana kao apstraktna

    Metode interfejsa su uvek (implicitno) apstraktne i javne ??????????????????????????????????????? ????????????????????????????????????????????????static & final) ????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????????????????????????snosti:

    interface Glasnost{int NEMO = 0; int TIHO = 1; int NORMALNO = 2; int GLASNO = 3;void postaviGlasnost(int nivo);int procitajGlasnost();

    }

    Imenovane konstante se mogu proslediti metodi postaviGlasnost

  • Java: Interfejsi Copyright 2000-2005 Igor Tartalja Maj 2005

    2/4

    Proirivanje implementacije interfejsa Primer:// date implementacije LIFObafer i FIFObafer ne vode racuna o prekoracenjuclass LIFObafer extends Bafer {

    public LIFObafer(int velicina){ super(velicina); }public void stavi(Object o) { niz[p++]=o; }public Object uzmi(){ return niz[--p]; }

    }class FIFObafer extends Bafer {

    private int k=0;private int max;public FIFObafer(int velicina){ super(velicina); max=velicina; }public void resetuj(){ super.resetuj(); k=0; }public void stavi(Object o) { niz[k]=o; k=(k+1)%max; }public Object uzmi(){ Object t=niz[p]; p=(p+1)%max; return t; }

    }

    ????????????????????????????????????

    Definicije interfejsa uvode nova imena tipova Referenca na objekat koji implementira interfejs se moe dodeliti referenci tipa tog interfejsa Primer:class FIFO_LIFO {

    public static void test(IBafer b){//public static void test(Bafer b){ // ekvivalentno

    for (int i = 0; i

  • Java: Interfejsi Copyright 2000-2005 Igor Tartalja Maj 2005

    3/4

    ???????????????????????????????????

    ??????????????????????????????????????????????ti: jednostruko ???????????????????????????????????????????? viestruko klasa moe imati dve ili vie neposrednih roditeljskih klasa

    ???????????????????????????????????????????????????????????????????? ???????????????????????????????????????

    u strukturi "diamond" : ?????????????????????????f) ???????????????z.f (Z z;)? da li postoje dve kopije ili samo jedna?

    ??????????????????????????????????????????????????????????????????????????????

    ??????????????????????????????

    ???????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????? ????????????????????????????????????????? ????????????????????????????????????????????????????? Supertipovi neke klase su:

    klase koje su proirene i interfejsi koji su implementirani

    Proirivanje interfejsa Interfejsi se mogu proirivati, a jedan moe da proiruje vie drugih:

    interface I extends BI1, BI2{ double i_method();

    }

    Sve metode i konstante baznih interfejsa su deo novog interfejsa ??????????????????????????????????

    klasa koja proiruje neku klasu i implementira neki interfejs klasa koja implementira vie interfejsa

    ???????????????????????????????????????????????????????????????????

    interface W{}interface X extends W{}class Y implements W{}class Z extends Y implements X{}

    interface W{}interface X extends W{}interface Y extends W{}class Z implements X,Y{}

    XW

    ZY

    XW

    ZY

    XW

    Z

    Y

  • Java: Interfejsi Copyright 2000-2005 Igor Tartalja Maj 2005

    4/4

    Relacija sa klasom Object Interfejsi nemaju neki jedinstveni koreni interfejs (kao to klase imaju klasu Object) Reference na objekte klasa koje implementiraju neki interfejs

    se mogu dodeliti referencama na tip Object Primer: ako je W interfejs

    void a(W wRef){ Object obj = wRef; ...}

    Izraz tipa nekog interfejsa se moe proslediti metodi sa parametrom tipa Object Primer:

    void b(Object o){ /*...*/ } ... W w; /*...*/ x.b(w)

    Konflikti imena metoda ??????????????????????????????????????????????????????????????????????????????????????

    met??????????????????????????????????????????????=> dve metode preklopljenih imena

    ?????????????????????????????????????????????????????=> jedna metoda sa istim potpisom i povratnim tipom

    metode se razlikuju jedino u povratnom tipu => ne mogu se implementirati oba interfejsa

    metode se razlikuju samo u throws klauzuli=> jedna metoda koja zadovoljava obe throws klauzule

    ??????????throws klauzule Metod moe da baca manje izuzetaka nego to je deklarisano u supertipu Primer:

    interface X { void setup() throws SomeException; }interface Y { void setup(); }class Z implements X,Y {

    public void setup() {/*...*/}}

    Z daje jednu implementaciju metode setup koja zadovoljava i X.setup i Y.setup

    Konflikti imena konstanti Moe se dogoditi da dva implementirana interfejsa sadre konstante istog imena Za takve konstante treba koristiti imena sa kvalifikatorima Primer:

    interfejsi PreferansSpil i RemiSpil sadre konstante VELICINA????????????????????? klasa MultiSpil implementira oba interfejsa u klasi MultiSpil moraju se koristiti imena PreferansSpil.VELICINA, RemiSpil.VELICINA samo VELICINA je dvosmisleno

  • Java: Ugnedeni tipovi Copyright 2000-2005 Igor Tartalja Mart 2005

    1/5

    Ugnedeni tipovi

    Ugnedene klase i interfejsi ?????????????????????????????????????????????????????????????? takav tip se naziva ugnedenim Primer: class ObuhvatajucaKlasa{ class UgnezdjenaKlasa { . . . } } Ugneden tip treba definisati kad on ima smis??????????????????????????????????????? Primer: klasa TextCursor moe biti ugnedena u klasu Text Ugnedena klasa moe da:

    proiruje proizvoljnu klasu, implementira proizvoljan interfejs, bude osnova za proirivanje, se deklarie kao final ili kao abstract

    ??????????????????????????????????????????????????????????????????????????????????????.

    Prava pristupa ??????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????nedena klasa ima specijalnu privilegiju:

    ?????????????????????????????????????????????????????????????????????????????????????

    ????????????????????????????????????????????????????????????????private ???????????????????????????????????????????????????????? klase koje su izvan??????????????????? ugnedena klasa je unutar??????????????????????????????????????????????????????????

    Za tipove ugnedene u klasu, specifikatori public, protected, private ?????????????????????????????????????????????????????????????????????????????????????????????

    Tipovi ugnedeni u interfejse su uvek javni Obuhvataju????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????

    ???????????????????????????

    Kao i drugi????????????????????????????????????????????????????????static ???????????????????????????????????????????static nested class) ??????????????????????????????????????????????????????????inner class) Primer:

    class ObuhvatajucaKlasa{ . . . static class StatickaUgnedjenaKlasa { . . . } class UnutranjaKlasa { . . . } }

    ?????????????????????????? slue samo kao mehanizam strukturiranja tipova

    Unutranje klase ???????????????????????????????????????????????????????????????????????????????

  • Java: Ugnedeni tipovi Copyright 2000-2005 Igor Tartalja Mart 2005

    2/5

    ?????????ugnedeni tipovi ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    ??????????????????????????????????????????????????????????????static nije potreban ??????????????????????????????????????????????????????static nije potreban

    Unutranje klase ????????????????????????????????????????????????????????????????????????????????nje ???????????????????????????????????????????????????

    izuzev fin?????????????????????????????????????????????????????????? Objekat unutranje klase je uvek u vezi sa jednim objektom spoljanje klase Objekat spoljanje klase moe da bude u vezi sa vie objekata unutranje klase

    Primerpublic class RacunUbanci {

    private long broj; private long stanje;private Akcija poslednjaAkcija;public class Akcija{

    private String akcija; private long iznos;Akcija(String akcija, long iznos){

    this.akcija=akcija; this.iznos=iznos;}public String toString(){return broj + ": " + akcija + " " + iznos;}

    }public void uplata (long iznos){

    stanje+=iznos; poslednjaAkcija=new Akcija("uplata", iznos);}public void isplata(long iznos){

    stanje-=iznos; poslednjaAkcija=new Akcija("isplata", iznos);}public void prenos(RacunUbanci drugi,long iznos){

    drugi.isplata(iznos);uplata(iznos);poslednjaAkcija=this.new Akcija("prenos", iznos);drugi.poslednjaAkcija=drugi.new Akcija("prenos", iznos);

    }}

    Relacije Termin "ugnedena??????????????????????????????????????????????se

    kod jedne klase se pojavljuje unutar koda druge klase ???????????????????????????????????????????????????????????????????????????????????????

    ?????????????????????????????????????????????????????????????????????????????????

    Definicija unutranje klase: ?????????????????????????????????????????????????? ????????????????????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????

    ???????????????????????????????????????????????????nje klase se uspostavlja: this.new Akcija("prenos", iznos); // moe i bez eksplicitnog this

  • Java: Ugnedeni tipovi Copyright 2000-2005 Igor Tartalja Mart 2005

    3/5

    ?????????????????????????????

    Unutranja klasa moe da pristupi bez kvalifikovanja polju ili metodu spoljanje Spoljanja klasa moe da pristupi polju ili metodu unutranje samo preko kvalifikacije Postoji uzajamno poverenje ????????????????????????????????????????????????? Pri kreiranju objekta unutranje klase uspostavlja se referenca prema objektu spoljanje Referenca na spoljanji objekat se ponaa kao sekundarni this

    ???????????????????????????????????????????????????????????????????????????????????????

    ??????????????????broj u metodi toString() puna kvalifikacija bi bila ?????????????????????

    ??????????????????????????????????????????

    Unutranje klase se mo???????????????????????????????????????????????????????? Objekat izvedene unutranje klase mora da je u vezi sa objektom

    originalne spoljanje klase ili njene potklase

    Prirodno reenje kada se proirena unutranja klasa nalazi u okviru proirene spoljanje Primer:class Spoljna { class Unutrasnja{}}class IzvedenaSpoljna extends Spoljna { class IzvedenaUnutrasnja extends Unutrasnja {} Unutrasnja u = new IzvedenaUnutrasnja();}

    referenca u se inicijalizuje kada se kreira objekat IzvedenaSpoljna pri konstrukciji objekta IzvedenaUnutrasnja poziva se super() konstruktor konstruktor za Unutrasnja zahteva objekat Spoljna, koji je tipa IzvedenaSpoljna

    Eksplicitna referenca na objekat spoljne klase je potrebna ako: ?????????????????????????????????????????????????????????????????? potklasa unutranje klase nije i sama unutranja klasa

    Primer:class Samostalna extends Spoljna.Unutrasnja { Samostalna(Spoljna s){s.super();}}

    s.super() poziva konstruktor Unutrasnja i???????????????????????????????????????????

    Lokalne klase Lokalna klasa se definie unutar proizvoljnog programskog bloka

    ????????????????????????????????????????????????????????????????? ??????????????????????????????????????????? Lokalne klase su nepris????????????????????????????????????????? Instance lokalne klase su normalni objekti

    ????????????????????????????????????????????????????????????????????? Lokalna klasa ima pristup final lokalnim varijablama ili final argumentima metoda

  • Java: Ugnedeni tipovi Copyright 2000-2005 Igor Tartalja Mart 2005

    4/5

    Primer lokalne klasepackage java.util;public interface Iterator{ boolean hasNext(); Object next() throws NoSuchElementException; ...}

    public static Iterator obilazak(final Object[] objekti){ class Iter implements Iterator{ private int p = 0; //pozicija u nizu objekti

    public boolean hasNext(){return (p=objekti.length) throw new NoSuchElementException(); return objekti[p++]; } } return new Iter();}

    Klasa Iter je lokalna klasa, klijenti metoda obilazak() nisu svesni tipa Iter Mogu??????????????????????????Iter, jer je to podtip tipa Iterator, ???????????????????????????????????????????????????????? Iterator

    Anonimne lokalne klase Ako ime lokalne klase nije potrebno moe se deklarisati anonimna klasa Anonimna klasa proiruje drugu klasu ili implementira neki interfejs Anonimna klasa se definie u izrazu new, kao deo naredbe Ime supertipa (osnovne klase ili interfejsa) se koristi za anonimnu klasu Anonimna klasa ne moe da ima eksplicitne klauzule extends i implements

    Primer anonimne klasepublic static Iterator obilazak(final Object[] objekti){ return new Iterator{ private int p = 0; //pozicija u nizu objekti

    public boolean hasNext(){return (p=objekti.length) throw new NoSuchElementException(); return objekti[p++]; } }}

  • Java: Ugnedeni tipovi Copyright 2000-2005 Igor Tartalja Mart 2005

    5/5

    Konstruktor anonimne klase Anonimna klasa ne moe imati konstruktor, jer konstruktor nosi ime klase koje ne postoji Ako je potreban konstruktor superklase, iza imena apstraktne klase se dodaju argumenti: Primer: Atribut ime = new Atribut("Ime"){/*...*/}

    poziva se super("Ime"), odnosno konstruktor klase Atribut sa argumentom tipa String Kada anonimna klasa implementira ineterfejs, onda se poziva samo konstruktor klase Object

  • Java: Izuzeci Copyright 2000-2005 Igor Tartalja Maj 2005

    1/3

    Izuzeci

    Uvod ????????????????????????????????????????????????????????????????????????????? Kada se metod nekog objekta pozove on moe:

    da otkrije probleme internog stanja objekta (nekonzistentne vrednosti promenljivih) da otkrije greke na resursima ili podacima kojima manipulie (npr. u fajlu ili mrenoj adresi) ????????????????????????????????????????????????????????????????????????????????????

    ?????????????????????????????????????????????????????? ????????????????????????????????????????????? ??????????ezamagljivanjem osnovnog toka kontrole proverom greaka)

    ??????????????????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????????????????????????????????????

    Ugovor i implementacija Izuzeci koje metod moe da signalizira su deo ugovora tog metoda Listu izuzetaka koje metod moe da signalizira moe da:

    vidi programer proveri prevodilac

    Izuzetak se: baca kada se otkrije izuzetna situacija hvata u kontekstu u kojem se mogao dogoditi (npr. u bloku iz kojeg je pozvan metod)

    Kreiranje tipova izuzetaka Izuzeci u Javi su objekti Svi tipovi izuzetaka moraju da budu izvedeni iz klase Throwable ili njenih podklasa Klasa Throwable sadri string koji se koristi da opie izuzetak Izuzeci u Javi su primarno provereni izuzeci (checked exceptions):

    prevodilac proverava da li metod baca samo one izuzetke koje je deklarisao Standardni izuzeci izvedeni iz klasa RuntimeException i Error su neprovereni Klasa Exception se izvodi iz Throwable i opisuje proverene izuzetke Svi izuzeci koje programer kreira treba da se izvode iz klase Exception ??????????????????????????????????????????????

    Primer Reprezentuje uslov "pokuaj smetanja elementa u pun bafer"

    class BaferPun extends Exception { BaferPun(String s){super(s);} // s sadri string koji opisuje objekat

    // cije smestanje nije uspelo; // moze se dohvatiti sa getMessage()

    }

  • Java: Izuzeci Copyright 2000-2005 Igor Tartalja Maj 2005

    2/3

    Razlozi za kreiranje Razlozi za kreiranje novog tipa izuzetka su:

    dodavanje informacija o podacima koji su doveli do pojave greke (uz string opisa) ???????????????????????????????????????????????????? (izuzeci se hvataju prema njihovom tipu)

    throw Izuzeci se bacaju throw naredbom Parametar naredbe je objekat izuzetka Primer izuzetaka u klasi Stek:

    public void stavi(Object o) throws BaferPun{ if (sp>=velicina) throw new BaferPun(o.toString());niz[sp++]=o;

    }

    Klauzula throws Kada pozivaju metod, programeri treba da znaju za izuzetke koje metod baca,

    kao to treba da znaju njegovo normalno ponaanje U klauzuli throws se navodi lista zarezima odvojenih tipova izuzetaka Legalno je baciti izuzetke koji su izvedeni iz izuzetaka navedenih u throws klauzuli

    ?????????????????????????????????????????????????????????????????????????????? Bacanje nedeklarisanog tipa izuzetka je pogreno:

    ????????????????????????throw??????????????????????????????????????

    ????????????????????????????????????????????????

    Inicijalizator ne sme da baca izuzetak (ne dozvoljava prevodilac) Konstruktor sme da baca izuzetak ??????????????????????????????????? ali nema ko da uhvati Reenje za inicijalizaciju polja: konstruktor unutar njega se moe obraditi izuzetak ??????????????????????????????????????????????????? unutar njega se moe obraditi izuzetak

    Obrada izuzetaka Java je striktna u forsiranju proverenih izuzetaka Ako se pozove metod koji navodi izuzetak u njegovoj throws klauzuli ??????????????

    uhvatiti i obraditi izuzetak uhvatiti izuzetak i mapirati ga u neki drugi izuzetak bacanjem tog drugog izuzetka deklarisati izuzetak u vlastitoj throws??????????????????????????????????????????????????????????

    try, catch i finally Izuzeci se deavaju u try blokovima, a hvataju se u catch blokovima: try blok catch (TipIzuzetka1 identifikator) blokObradeIzuzetka1 catch (TipIzuzetka2 identifikator) blokObradeIzuzetka2 ... finally zavrsniBlok

  • Java: Izuzeci Copyright 2000-2005 Igor Tartalja Maj 2005

    3/3

    try i catch Telo try naredbe se izvrava dok se ne baci izuzetak ili se blok ne zavri uspeno Ako se baci izuzetak catch klauzul?????????????????????????????????????????????????

    ??????????????????????????????????????? ???????????????????????????????????????

    ???????????????????????????????catch izuzetak se propagira spoljanjem nivou try ????????????????????????????????????????catch ???????????????????????????????????? Ako se u try bloku ne desi izuzetak, blok se uspeno zavri Ako se u try bloku desi izuzetak, kontrola se nepovratno prenosi u catch blok Kada se catch blok zavri kontrola se prenosi iza try bloka (u finally, ako postoji)

    Primerpublic static void main(String [] arg){

    Stek s= new Stek(10);try{ for (int i = 0; i

  • Generi???????????????????????????????????????????

    l Isti algoritam je ?esto potrebno izvravati nad razli?itim tipovima podatakal Primeri:

    maksimum od dva podatka (cela, realna, znakovna, kompleksna,...) kruni bafer ili stek

    l Bez generi?kog mehanizma trebalo bi pisati po jednu funkciju ili klasu za svaki od tipova podataka:char max(char i,char j) {return i>j?i:j;}int max(int i,int j} {return i>j?i:j;}float max(float i,float j} {return i>j?i:j;}

    abloni u jeziku C++l C++ omogu??????????????????????????template) za funkcije,

    gde je tip podatka argument ablonal Na osnovu ablona se mogu automatski generisati

    konkretne funkcije za konkretan tip podatakal abloni mogu da se prave i za klasel ???????????????????????????????????????????????????????

    l Mehanizam generika je ???????? ????????????????????????????????????????????????????????????????

    l Odvojeno prevo?enje ablona nema smisla ??????????????????????????????????????????????????????????????????

    l Mana ablona: poto su u *.h datotekama korsnik vidi celu implementaciju algoritama, a ne samo interfejs

    Definisanje ablonal Sintaksni dijagram definicije generi?ke funkcije i klase:

    Funkcija deklaracija (prototip) ili definicija funkcije Klasa definicija klase Formalni argumenti ablona se niu ?????? < i > - mogu predstavljati tipove ili konstante Identifikator tipa moe da se koristi unutar ablona na svim mestima ?????????????????????????????????????????

    Identifikator konstante ??????????????????????????????????????????moe da se koristi na mestima konstanti

    Oznaka tipa ?????????????????????????????????????????????????????????????????????????????????????????????????????

    l ?????????????????????????????????????????????????????????????????????????

    na objekat ili funkciju sa spoljanjim povezivanjem

    identifikatortipaclass

    templateidentifikator

    konstante

    ,

    funkcija

    klasa

    typename

  • Primer definisanja//sablon funkcije:

    template T max(T a, T b){return a>b?a:b;} //sablon deklaracije (prototipa) funkcije:

    template void sort(T a[], int n); //sablon definicije funkcije:

    template void sort(T a[], int n){/*...*/};//sablon klase

    template class Vekt{ int duz; T niz[k];public: Vekt(); T& operator[](int i) const{return niz[i];}};template Vekt::Vekt(){

    duz=k; for(int i=0;i

  • Primer generisanja funkcijachar *max(char *cp1,char *cp2){ // definicija obicne funkcije

    return strcmp(cp1,cp2)>=0?cp1:cp2; // da se spreci poredjenje pok.}void main() { int i1=1, i2=2; float f=0.5;

    char c1='a', c2='b'; char *a="alfa", *b="beta";int i=max(i1,i2); // generise se int max(int,int)

    // ili: int i=max(i1,i2);char c=max(c1,c2); // generise se char max(char,char)int g=max(i1,c1); // ! GRESKA

    // moze: int g=max(i1,c1);float max(float,float); // zahtev za generisanje

    // ili: template float max (float,float);float g=max(i1,f); // poziva se float max(float,float) char *v=max(a,b); // poziva se char* max(char*,char*)char *w=max(a,b); // poziva se gen. f-ja koja poredi pok.

    }

    Generisanje klasal Konkretna klasa se generi????????????????????????????????????????????????

    u kojoj se koristi identifikator te klasel ????????????????????????????????????????????????????????

    l Oznaka tipa generisane klase treba da sadri: identifikator generike klase i ????????????????????????????????????????????????????????????????? iza identifikatora

    l Stvarni argument moe biti: oznaka tipa zamenjuje formalni argument koji je identifikator tipa

    l oznaka tipa moe biti standardni tip, ime ??????????????????????????????????????? konstantni izraz zamenjuje formalni argument koji je identifikator konstante

    l ako izraz sadri operator > ovaj se mora pisati u zagradama (>)

    Primeri generisanja klasaVekt niz1; Vekt niz2;typedef Vekt VektorStr; //gen. na zahtev

    class A{int i;};Vekt a; //GRESKA: niz[i++]=0 implicira numericki ili pokazivacki tip

    Podrazumevane vrednostil Argumenti ablona mogu da imaju podrazumevane vrednosti (PV)l Nekoliko poslednjih argumenata ablonske klase moe da ima PV

    ???????????????????????????????

    l ablonske funkcije ne mogu imati PV argumenata ablonal Dovoljno je navesti PV samo u deklaraciji/definiciji ablonske klase

    nije potrebno ponovo u definicijama metoda klasel Ako je formalni argument tip:

    PV moe da bude: primitivan tip, ne-????????????????????????????????????????????????????????????????

    l Ako je formalni argument konstanta: PV moe da bude konstantni celobrojni izraz

  • Primer podrazumevanih vrednostitemplate class Niz{/**/}Niz n1; Niz n2; Niz n3;

    l Raniji formalni argumenti mogu da se koriste za odre?ivanje ??????????????????????????????????????template class A{/**/}

    Specijalizacijal Ponekad je za neke specifi???????????????????????????????????????????????????????????????????????????????????????????

    l Specijalizacija (f-je, klase): definisanje posebnog ablona za neke posebne kombinacije argumenata prethodno

    definisanog (opteg) ablonal ????????????????????????????????

    deklaracija:templateclass GSklasa;

    definicija:templateclass GSklasa{/**/}

    GSklasa ???????????????????????????????? argumenti svi ili samo neki formalni argumenti opteg ablona

    l ne mogu imati podrazumevane vrednosti parametri specijalizovani argumenti opteg ablona

    Vrste i uslovi specijalizacijel Specijalizacija moe da bude:

    ??????????????????????????????????????????????????????????????

    l tada moe da se generie vie klasa iz specijalizovanog ablona potpuna: specijalizovani ablon nema ni jedan argument

    l tada na osnovu ablona moe da se generie samo jedna klasal ???????????????????????????

    ?????????????????????????????????????????????????????????????????

    l Specijalizac???????????????????????????????????? samo ako jo nije generisana ni jedna klasa na osnovu opteg ablona sa istim parametrima

    Primer specijalizacijetemplate class Vekt; // opsta gen. klasatemplate class Vekt; // spec 1template class Vekt; // spec 2template class Vekt; // spec 3template class Vekt; // spec 4Vekt n1; // koristi se 1Vekt n2; // koristi se 2Vekt n3; // koristi se 3Vekt n4; // koristi se 4

    l Pri generisanju se navodi onoliko elemenata koliko ima opti ablonl Prevodilac bira:

    najvie specijalizovani ablon (sa najmanje argumenata) odnosno opti (ako ni jedan specijalizovani ne odgovara) ako postoji vie podjednako specijalizovanih ablona koji odgovaraju - greka

  • ????????????????????????????-jal ?????????????????????????????????????????????????????????????

    deklaracija:templatetip GSfunkcija(...);

    definicija:templatetip GSfunkcija(...){/**/}

    l ?????????????????????????) mogu da se izostave ako se na osnovu tipova argumenata funkcije

    mogu odrediti vrednosti (tipovi) argumenata ablonal Primer:

    templatechar* max(char*a,char*b); // ili:templatechar* max (char*a,char*b);char* m=max("alfa", "beta");char* n=max("alfa", "beta");

    ????????????????????????????????????????????????????????????????????????-je max

    ????????????????

    l ???????????????????????????????????

    ????????????????????????????????????????????????

    l ???????????????????????????????????????????????????????????

    l ?????????????????ne mogu da budu virtuelnel ????????????????????????????????????

    l ???????????????????????????????????

    l ??????????????????????????????

    ako su u izrazima posle operatora :: . i -> i ako se iza imena metode navode argumenti ablona ???????????????????????????????????????????template (neki prevodioci ne trae)

    ????????????????????????? (1)l Generi???????????????????????????????????????????????

    class A{double x;

    public:template A(const T&t):x(t){}template void m(const T& t);

    };template void A::m(const T&t){x=t;}void f1(){ A a1(5); // A::A(const int&) A a2(1.2); // A::A(const float&) A a3('q'); // A::A(const char&) a1.template m(1.2); // A::m(const int&) a1.template m(3.4);// A::m(const char&) a1.m(3.4); // A::m(const float&)}

  • ????????????????????????? (2)l Generi??a metoda generi?ke klase

    template class B T t;public:

    template void m(const U&);};template template void B::m(const U& u){t=u;}void f2(){ B b1; B b2; b1.m(55); // B::m(const int&) b2.m(55); // B::m(const int&) b2.template m(55); // B::m(const char&)}

    ??????????????????????????

    l ???????????????????????????????????????

    ???????????????????????????????????????????????

    ???????????????????????????????????

    oznaka klase mora da sadri i argumente ablonal Primer:

    template class C{public: template class D;};template template class C::D{public: void m (const U&);};template template void C::D::m(const U& u){}void f3(){ C c; C::D d; d.m(true); // C::D::m(char)}

  • Java: Niti Copyright 2000-2005 Igor Tartalja Maj 2005

    1/11

    Niti

    Uvod Nit kontrole (thread) sekvenca koraka koji se izvravaju sukcesivno ??????????????????????????????????????????? samo jedna nit kontrole Multithreading ?????????????????????????????????????????????????????????????????????????? Nezavisne niti koje rade nad potpuno disjunktnim skupovima podataka su retke ???????????????????????????????????????????????????????????????????????????????????????? Rezultat efekta neizvesnosti trke (race hazard) moe biti neispravno stanje nekog objekta Reenje problema neizvesnosti trke je u sinhronizaciji niti

    Kreiranje, pokretanje i zavravanje niti Niti su definisane klasom Thread u standardnoj biblioteci Aktivan objekat (sadri vlastitu nit kontrole) se kreira: Thread worker=new Thread(); Nakon kreiranja niti ona se moe:

    konfigurisati (postavljanjem prioriteta, imena,...) pokrenuti (pozivom start metode)

    Metod start aktivira novu nit kontrole (nit postaje spremna), a zatim se zavrava ?????????????????????????????????????run metod aktivne niti Standardni metod Thread.run() ne radi nita Metod run????????????????????????????????????????????????????????????????????Thread Kada se run metod niti zavri, nit zavrava izvrenje Zastareli metodi:

    zaustavljanje stop(), suspendovanje suspend(), reaktiviranje resume() N??????????????????????????????????????????sleep() ??????????????????????????????????????????????????????????????????????????????????

    class PingPong extends Thread { public String rec; int vreme; PingPong(String rec, int vreme){ this.rec=rec; this.vreme=vreme; } public void run(){ try{ for(;;){System.out.print(rec+" "); sleep(vreme);} } catch(InterruptedException e){ return; } public static void main (String[] argumenti) { new PingPong("ping", 33).start(); // 1/30s new PingPong("PONG",100).start(); // 1/10s }}

    Metod run ne moe da baca izuzetke poto Thread.run ne deklarie ni jedan izuzetak Metod sleep moe da baci InterruptedException

  • Java: Niti Copyright 2000-2005 Igor Tartalja Maj 2005

    2/11

    ???????????????????????????? implementacija interfejsa Runnable Interfejs Runnable je apstrakcija koncepta objekta koji izvrava neki kod dok je aktivan Ovaj interfejs deklarie samo jedan metod: run Klasa Thread implementira Runnable Problem: kada se izvodi iz klase Thread ne moe se izvoditi i iz neke druge Problem reava drugi pristup:

    projektovati klasu koja implementira interfejs Runnable kreirati objekat te klase proslediti objekat konstruktoru klase Thread

    Primer: class RunPingPong implements Runnable{ public String rec; int vreme; PingPong(String rec, int vreme){this.rec=rec; this.vreme=vreme;} public void run(){try{for(;;){System.out.print(rec+" "); sleep(vreme);} } catch(InterruptedException e){ return; }} public static void main (String[] argumenti) { Runnable ping = new RunPingPong("ping", 33); Runnable pong = new RunPingPong("PONG", 100); new Thread(ping).start(); new Thread(pong).start(); }}

    Neki metodi klase Thread Nit moe imati ime, koje se postavlja:

    kao String parametar konstruktora ili kao parametar metoda setName()

    Ime niti se moe dohvatiti metodom getName() Provera da li je nit aktivna (da li nije zavrila izvrenje) isAlive() ????????????????????????????????????????????????????????Thread.currentThread()

    Neizvesnost trke (Race Hazard) ?????????????????????????????????????????????????????????????????????????postaje nelegalno Neizvesnost lei u get-modify-set sekvenci ?????????????????????????????????????????????????????????????????????????????????

    ??????????????????????????????????????????????????????????????????????????????????

    a1=a.getBalance();

    a1+=deposit;

    a.setBalance(a1);

    a.setBalance(a2);

    a2+=deposit;

    a2=a.getBalance();

  • Java: Niti Copyright 2000-2005 Igor Tartalja Maj 2005

    3/11

    Sinhronizacija Reenje neizvesnosti trke u Javi se postie sinhronizacijom zasnovanom na bravi (lock) ??????????????????????????????????????????????????????????????????????????????????? ?????????????????????????? samo ta nit moe da pristupa objektu Ako jedna nit pozove synchronized metod objekta ??????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????????????????????????????????? Obrada ugnedenih poziva: ???????????????????????????????????????????????????????????????? Primer: klasa Account je napisana da ivi u okruenju vie niti

    class Account { private double balance; public Account(double initialDeposit){ balance = initialDeposit; } public synchronized double getBalance() { return balance; } public synchronized void deposit(double amount) { balance += amount; } }

    Konstruktor ne treba da bude sinhronizovan razlog: on se izvrava u jednoj niti dok objekat jo ne postoji pa druga nit ne moe pristupiti

    Dodatni razlog protiv javnih podataka: kroz metode se moe upravljati sinhronizacijom

    ????????????????????????????????????????????????????

    ????????????????????????????????????????????????????????????????? Dve niti ne mogu da izvravaju sinhro-?????????????????????????????????????????????? Brava klase nema nikakav efekat na objekte te klase

    jedna nit moe izvravati sinhro-?????????????????????????????????????????-????????????????

    ?????????????????????????????

    Kada se redefinie metod u izvedenoj klasi: osobina synchronized ??????????????????? ?????????????????????????????????????????????????????????????????????????????????????????????

    ??????????????????????????????????????????????????????????????????????????????????? Ako novi nesinhronizovani metod koristi super.m()?????????????????????????????????????????????????????m() superklase

    Sinhronizovane naredbe ???????????????????????????????????????????????????????????????????????????? Opti oblik: synchronized (expression) statement [statement ??????????????? ???????????????????????????????????????????????????????????????????expression Kada se dobije brava, sinhronizovana naredba se izvrava kao da je sinhronizovani metod ????????????????????????????????????????????????????????????????????????:

    public static void abs(int [] values) { synchronized (values) { for (int i=0; i

  • Java: Niti Copyright 2000-2005 Igor Tartalja Maj 2005

    4/11

    ??????????????????????????

    Problem: elimo da u multiprocesnom okruenju koristimo klasu

    koja j??????????????????????????????????????????????????????????????????????????

    Dva reenja: ??????????????????????????????????????????????????????????????????????????????????????????super koristiti sinhro naredbu za pristup objektu

    Prvo reenje je bolje jer ne dozvoljava da se zaboravi sinhronizacija naredbe za pristup

    wait i notify ??????????????????????????????? Metod wait????????????????????????????????????????????????? Metod notify?????????????????????????????????????????????? Metodi wait i notify su definisani u klasi Object?????????????????????????????? ?????????????????????????????????????????????

    synchronized void cekanjeNaUslov() { while (!uslov) wait(); /* neto to treba raditi kada je uslov true */}

    Sa druge strane, notify?????????????????????metoda koji menjaju uslov:synchronized void promeniUslov() {????????????????????????????????????????????????????????????

    notify(); }

    U wait i notify?????????????????????????????????????????????????????????????????? Petlja while(!condition) wait(); treba da se izvrava u sinhronizovanoj metodi wait???????????????????????????????????????????????????