Predavanje Java

You might also like

You are on page 1of 69

Uvod

Uvod u programiranje 1 Java Uvod

ta je program Kako napisati pravilno program za raunar Prednosti i mane korienja Jave Kako program napisan u Javi promeniti u formu koju svaki raunar razume Primer Java koda i komentari

SI1P1 2004

1/15

SI1P1 2004

2/15

Pisanje programa i spremanje hrane

Pisanje programa i spremanje hrane

SI1P1 2004

3/15

SI1P1 2004

4/15

ta predstavlja raunarski program

Kompajliranje

Da bi raunar mogao da izvri odreene zadatke (na primer odtampa ocene koje student dobije na ispitu), moraju mmu se zadati instrukcije za obavljanje zadatka Skup instrukcija koje vode raunar da izvri odreeni zadatak ine raunarski program Mi piemo program (skup instrukcija) u programskim jezicima kao to su C, Pascal ili Java Koristimo ove programske jezike jer su razumljivi oveku Ali kako raunar razume instrukcije koje mu zadajemo?
SI1P1 2004 5/15

Raunari ne razumeju programe napisane u programskim jezicima kao to su Pascal i Java Programi se moraju prvo kompajlirati ili prevesti u mainski kod koji raunar moe da izvrava Program i postupak pomou koga se kod programskog jezika prevodi u mainski kod naziva se kompajler i kompajliranje Razliite platforme, ili hardver sa operativnim sistemom zahtevaju razliit mainski kod, programi se moraju odvojeno kompajlirati za razliite platforme

SI1P1 2004

6/15

Kompajliranje

Java kompajliranje
Java kompajler stvara bytecode, a ne mainski kod Bytecode se konvertuje u mainski kod pomou Java interpretera Tako se moe pokrenuti bytecode na bilo kom raunaru koji ima instaliran Java interpreter

SI1P1 2004

7/15

SI1P1 2004

8/15

Pokretanje programa

Pokretanje programa

Ulazni podaci (inputs)


Mogu se dobiti iz mnogih izvora, kao to je korisnik, fajlovi, ili drugi programi Mogu biti u razliitim formama, kao to je tekst, slika ili zvuk

Izlazni podaci (outputs)


Takoe mogu biti u razliitim formama, kao to su brojevi, slike, zvukovi, ili komande drugim programima

SI1P1 2004

9/15

SI1P1 2004

10/15

Izvravanje programa

Primer

elite da napiete program koji sabira dva broja ta predstavlja ulazne podatke za va program?
dva broja

ta va program radi?
sabira dva broja

ta je izlaz vaeg programa program?


zbir dva broja

SI1P1 2004

11/15

SI1P1 2004

12/15

Kompajliranje i izvravanje programa u Javi

Prednosti korienja Jave

Kada se jednom kompajlira Java program, tada se bytecode moe izvravati na bilo kojoj maini koja ima Java interpreter Zato to se ne mora rekompajlirati prgram za svaku mainu, Java je platformski neutralna Java je bezbedna. Drugim reima, Java i kompajler tite raunar od estih programerskih greaka i opasnih operacija Java standardizuje mnoge korisne operacije kao to je upravljanje mrenim konekcijama i obezbeuje grafiki korisniki interfejs

SI1P1 2004

13/15

SI1P1 2004

14/15

Mane korienja Jave

Primer

Izvravanje bytecode pomou interpretera je sporije nego izvravanje mainskog koda, koji je specifian za svaku posebnu platformu. Korienje specifinih mogunosti pojedine platforme (Windows taskbar) je teko pomou Java jezika jer je platformski neutralan. Da bi sse pokrenuo Java program na vie maina, mora se instalirati Java interpreter na svakoj od njih

/* HelloWorld klasa prikazuje Hello, World! na ekranu */ public class HelloWorld { public static void main(String[] args) { // Prikaz Hello, World! System.out.println("Hello, World!"); } }

SI1P1 2004

15/15

SI1P1 2004

16/15

Komentari

Pregled lekcije

Komentari se koriste da opiu napisani kod i da se bolje razume smisao. Java kompajler ga ignorie. Komentari se dobijaju korienjem //, to definie komentar do kraja linije /* */, to definie komentar za sve to se nalazi izmeu, ukljuujui vie linija Primeri dve vrste komentara: /* HelloWorld klasa prikazuje Hello, World! na ekranu */ // Prints Hello, World!
SI1P1 2004 17/15

ta je program Kako napisati pravilno program za raunar Prednosti i mane korienja Jave Kako program napisan u Javi promeniti u formu koju svaki raunar razume Primer Java koda i komentari

SI1P1 2004

18/15

Uvod

ta su promenljive
Tipovi promenljivih Imena promenljivih Dodele vrednosti

Uvod u programiranje 1 Java Promenljive i osnovni tipovi podataka

Primitivni tipovi podataka Ostali tipovi podataka (String)

SI1P1 2004

19/15

SI1P1 2004

20/15

Promenljive

Promenljive

U matematikoj algebri, promenljive su simboli koji predstavljaju odreene vrednosti u formulama Na primer promenljiva x u sledeoj formuli f(x)=x*2+2 Moe predstavljati bilo koju numeriku vrednost Slino, promenljive u raunarskim programimasu simboli koji predstavljaju odreene podatke

Promenljive se mogu predstaviti kao prazne kutije u koje se mogu smestiti odreene vrednosti Na kutiju se moe nalepiti nalepnica sa imenom, na primer KutijaX i koristiti vie puta Takoe mogu se obavljati odreene operacije, bez obzira na sadraj same kutije:
Pomeri KutijuX na policu A Postavi predmet Z u KutijuX Otvori KutijuX Ukloni sadraj iy KutijeX

SI1P1 2004

21/15

SI1P1 2004

22/15

Promenljive i Java

Tipovi promenljivih u Javi

Promenljive u Javi imaju svoj tip. Tip promenljive definie koja vrsta vrednosti se moe zapamtiti u okviru promenljive Analogija sa kutijom tip promenljive je veliina ili oblik prazne kutije U formuli

f(x)=x*2+2
Promenljiva x je broj. Ako je x simbol koji predstavlja re Singidunum, formula nema smisla.

SI1P1 2004

23/15

SI1P1 2004

Celobrojni tipovi: int: veina brojeva se predstavlja pomou ovog tipa long: veliki brojevi, u oblasti istraivanja, finansija, raunara. short: mali brojevi, ne mnogo korisno. byte: veoma mali brojevi Floating Point (Decimalni) tipovi: float: Single-precision decimalni brojevi double: Double-precision decimalni brojevi Ostali tipovi: String: tekstualni tip. boolean: tano ili netano (true ili false) char: Alfanumeriki karakteri

24/15

Deklaracija promenljivih u Javi

Dodela vrednosti promenljivih u Javi


Dodela vrednosti promenljivih se obavlja koristei sledeu sintaksu: ime = vrednost; Na primer: x = 100; pozdrav=Zdravo; Nelegalno je dodeliti promenljivoj vrednost pogrenog tipa: x = Zdravo; x = 1.2; pozdrav = 123; U okviru jednog koraka moe se promenljiva deklarisati i dodeliti joj se vrednost int x =100; String pozdrav=Zdravo;
26/15

Promenljive se kreiraju tako to se deklarie njihov tip i ime na sledei nain: tip ime; Deklarisanje celobrojne promenljive sa imenom x: int x; Deklarisanje stringa sa imenom pozdrav: String pozdrav; U prethodnim primerima promenljive nisu dodeljene vrednosti, ve su samo formirane prazne kutije

SI1P1 2004

25/15

SI1P1 2004

Imenovanje promenljivih u Javi

Imenovanje promenljivih u Javi

Imena promenljivih (identifikatori) mogu biti proizvoljne duine, ali moraju poeti sa: slovo (a z), znak dolar ($), ili, donjom crtom ( _ ). Imena promenljivih ne mogu sadravati specijalne operacione simbole kao to su +, -, *, /, &, %, ^, ... Korienje rezervisanih rei Jave je takoe nelegalno. Na primer class, static, int, ...

Java je case-sensitive razlikuju se mala i velika slova. Bosko nije isto kao bosko, odnosno BOSKO. Treba birati imena promenljivih koja su informativna. Dobar izbor: int studentIspitOcena; Lo izbor: int tempvar3931; Preporuka je da imena promenljivih poinju malim slovom i da svaka re unutar imena poinje sa velikim: studentIspitOcena.

SI1P1 2004

27/15

SI1P1 2004

28/15

Imenovanje promenljivih u Javi

Celobrojni tip

Koja imena su validna? 1.$amount 2.6tally 3.my*Name 4.salary 5._score 6.first Name 7.total# 8.short

Postoje etiri osnovna celobrojna tipa podataka: byte, short, int, long. Svaki tip ima maksimalnu vrednost, baziranu na njihovoj binarnoj reprezentaciji: Bytes: 8-bits, 128 Short: 16-bits, 215 32,000 Int: 32-bits, 231 2 billion Long: 32-bits, 263 veoma veliko Integer Overflows: ta se deava ako se pokua smestiti vea vrednost u tip podataka?

SI1P1 2004

29/15

SI1P1 2004

30/15

String tip

Racionalni tip

String nije primitivan tip podataka. Oni nasleuju klasu Object, diskutovae se kasnije. String je niz karaktera izmeu apostrofa i na primerneki tekst. Stringovi mogu koristiti specijalan operator + koji kreira novi String: String pozdrav= Zd+ ravo; String josJedanPozdrav= pozdrav+ !;

SI1P1 2004 31/15

Inicijalizuju decimalnu vrednost broja: double y = 1.23; double w = -3.21e-10; // -3.21x10-10 Koristi se d da bi se vrednost prikazala kao decimalna: double y = 1d/3; // y = .333333333 double z = 1/3; // z = 0.0 Zato? Float se moe definisati kao i double, ali treba dodati i f: float z = 1.23f; Double je precizniji nego Floats, ali izvravanje operacija due traje
32/15

SI1P1 2004

Logiki tip

Karakter

Boolean (logiki tip) je tip podataka koji se koristi u situacijama kada postoje dve opcije tano ili netano (true ili false). Vrednosti true i false su case sensitive. Ne prihvata se True ili TRUE. Ovaj tip podataka se koristi za testiranje osobina podataka i za kontrole toka Primer: boolean daLiCitati = true; boolean fileOpen = false;

Karakter je tip podataka koji se koristi da bi se predstavio pojedinaan karakter, kao to je slovo, broj, odreeni znak ili neki drugi simbol. Karakteri su pojedinani simboli smeteni izmeu jednostrukih navodnika Ne treba ih izjednaavati sa String-ovima. Primer: char prvoSlovoImena = 'e' ; char pitanje = '?' ;

SI1P1 2004

33/15

SI1P1 2004

34/15

Pitanja
Koje tipove podataka treba koristiti za sledee informacije?: 1. Broj stanovnika Srbije 2. Broj stanovnika na Zemlji 3. i 4. Status dokumenta (otvoren/zatvoren) 5. Ime 6. Prvo slovo imena 7. $ 237.66 int long double boolean String char SI1P1 2004 double

Iskazi

Iskazi su komande koje dovode do odreenih dogaaja Svi iskazi moraju se zavravati sa ; Deklarisanje promenljiv je jedan iskaz Dodeljivanje vrednosti promenljivoj je jedan iskaz Poziv metoda ili funkcije su iskazi: System.out.println(Hello, World); U narednim lekcijama emo uiti kako da se kontrolie izvravanje iskaza

35/15

SI1P1 2004

36/15

Rezervisane rei

Tipovi podataka

SI1P1 2004

37/15

SI1P1 2004

38/15

Tipovi podataka

Uvod u programiranje 1 Java Operatori

SI1P1 2004

39/15

SI1P1 2004

40/15

10

Uvod

ta su operatori

ta su operatori Aritmetiki operatori, kao to su +, Operator dodele vrednosti Inkrement/Dekrement operatori, ++ Relacionalni operatori Kondicionalni operatori

Operatori su specijalni simboli koji se koriste za: -matematike funkcije -iskaze dodele vrednosti -logika uporeivanja Primeri upotrebe operatora: 3+5 // korienje + operatora 14 + 5 4 * (5 3) // korienje +, -, * operatora Izrazi su kombinacija promenljivih, konstanti i operatora i definiu odreenu vrednost

SI1P1 2004

41/15

SI1P1 2004

42/15

Grupe operatora

Aritmetiki operatori

Postoji 5 razliitih groupa operatora:


Aritmetiki operatori, Operator dodele vrednosti Inkrement/Dekrement operatori Relacionalni operatori Kondicionalni operatori

U nastavku predavanja svaka grupa e se razmatrati detaljno

Java ima 6 osnovnih aritmetikih operatora: + sabiranje - oduzimanje * mnoenje / deljenje % modul (ostatka) ^ eksponent Prioritet ili izvravanje operacija koje se nalaze u okviru izraza moe se definisati u akronimu PEMDAS.

SI1P1 2004

43/15

SI1P1 2004

44/15

11

Proritet izvravanja operacija

Proritet izvravanja operacija

Proritet izvravanja operacija(PEMDAS) 1.Parentheses - zagrade 2.Exponents - eksponenti 3.Multiplication and Division from left to right mnoenje i deljenje posmtrano sa leve strane ka desnoj 4.Addition and Subtraction from left to right sabiranje i oduzimanje posmtrano sa leve strane ka desnoj

Primer: 10 + 15 / 5; Rezultat se razlikuje u zavisnosti od toga da li se prvo izvrava sabiranje ili deljenje (10 + 15) / 5 = 5 10 + (15 / 5) = 13 Ako ne postoje zagrade Java e izvriti drugi sluaj Trebalo bi koristiti uvek zagrade da bi se izbegla konfuzija

SI1P1 2004

45/15

SI1P1 2004

46/15

Celobrojno deljenje
U prethodnom primeru rezultat deljenja (10 + 15) / 5 je bio celobrojan (5). Ali ta se deava ako hocmo da izvrimo operaciju 63 / 35? U zavisnosti od tipa podatka u kome su smeteni brojevi, dobijamo razliite rezultate. int i= 63; int j= 35; System.out.println(i/ j); Izlaz: 1 double x= 63; double y= 35; System.out.println(x/ y); Izlaz: 1.8 Rezultat celobrojnog deljenja je samo ceodeo dobijenog rezultata!

Operator dodele vrednosti

Osnovni operator dodele (=) dodeljuje vrednost ex promenljivoj var var= expr; Java dozvoljava da se kombinuju aritmetiki i operator dodele u jedinstven operator Primeri: x= x+ 5; je isto to i x+= 5; y= y* 7; je isto to i y*= 7;

SI1P1 2004

47/15

SI1P1 2004

48/15

12

Inkrement/dekrement

Inkrement/dekrement

SI1P1 2004

++ se zove inkrement operator. Koristi se da bi se poveala vrednost promenljive za 1. Na primer: i= i+ 1; Moe se napisati i kao: ++i; ili i++; -- se zove dekrement operator. Koristi se da bi se smanjila vrednost promenljive za 1. i= i-1; Moe se napisati i kao : --i; ili i--;


49/15

Inkrement / dekrement operator ima dve forme : -Prefix forma ++i; --i; -Postfix forma i++; i--; Prefix forma prvo doda/oduzme 1 od promenljive i tek onda nastavi sa ostalim operatorima u izrazu Primer: int numOranges= 5; int numApples= 10; int numFruit; numFruit= ++numOranges+ numApples; numFruit je dobio vrednost 16 numOranges je dobio vrednost 6
50/15

SI1P1 2004

Inkrement/dekrement

Relacionalni operatori

Postfix forma i++, i -- prvo izvri ceo izraz, pa onda povea/smanji vrednost promenljive Primer: int numOranges= 5; int numApples= 10; int numFruit; numFruit= numOranges++ + numApples; numFruit je dobio vrednost 15 numOranges je dobio vrednost 6

Relacionalni operatori uporeuju dve vrednosti Dobijeni rezultat je logikog tipa (true ili false) u zavisnosti od relacije operanada

SI1P1 2004

51/15

SI1P1 2004

52/15

13

Primer relacionalnih operatora

Kondicionalni operatori

int x= 3; int y= 5; boolean result; 1) result= (x> y); U ovom sluaju vrednost promenljive result je false zato to 3 nije vee od 5 2) result= (15 == x*y); U ovom sluaju vrednost promenljive result je true zato to proizvod 3 i 5 jeste jednak 15 3) result= (x != x*y); U ovom sluaju vrednost promenljive result je true zato to proizvod 3 i 5 jeste razliit od 3
53/15

Kondicional operatori se jo nazivaju i boolean (logiki) operatori, jer koriste samo izraze koje imaju vrednosti true ili false.

SI1P1 2004

SI1P1 2004

54/15

Tabela istinitosti

Primer

boolean x= true; boolean y= false; boolean result; 1. result= (x&& y); U ovom sluaju vrednost promenljive result je false 2. = ((x|| y) && x);


SI1P1 2004 55/15

(x|| y) je true (true && x) je true U ovom sluaju vrednost promenljive result je true
56/15

SI1P1 2004

14

Korienje && i ||
Java izvrava skraeno izraunavanje: to znai da pri izraunavanju && i || izraza sa leve ka desnoj strani, im se pronae rezultat prestaje se sa daljim izraunavanjem. Primer: (a && (b++ > 3)) (x || y) Java e izraunati a pre (b++ > 3) x pre y

Korienje && i ||
(a && (b++ > 3)); ta se deava ako je a false? Java nee ni izraunavati izraz (b++ > 3), ako je levi operand false, jer je rezultat automatski false. To dovodi do toga da se vrednost b nee inkrementirati (x || y); ta se deava ako je x true? Slino, nee se izraunati vrednost desnog operanda, jer je rezultat sigurno true.

SI1P1 2004

57/15

SI1P1 2004

58/15

Primer

Operatori

1) Kolika je vrednost promenljive number? int number= 5 * 3 3 / 6 9 * 3; 2) Kolika je vrednost promenljive result? int x= 8; int y= 2; boolean result= (15 == x * y); 3) Kolika je vrednost promenljive result? boolean x= 7; boolean result = (x< 8) && (x> 4); 4) Kolika je vrednost promenljive numCars? int numBlueCars= 5; int numGreenCars= 10; intnumCars= numGreenCars+++ numBlueCars+ ++numGreeenCars;
SI1P1 2004 59/15

Sve o Java operatorima

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/ opsummary.html

SI1P1 2004

60/15

15

Izrazi

Rezervisane rei

Izrazi su komande koje dovode do odreenih dogaaja Svi izrazi moraju se zavravati sa ; Deklarisanje promenljiv je jedan izraz Dodeljivanje vrednosti promenljivoj je jedan izraz Poziv metoda ili funkcije su izrazi: System.out.println(Hello, World); U narednim lekcijama emo uiti kako da se kontrolie izvravanje izraza

SI1P1 2004

61/15

SI1P1 2004

62/15

Tipovi podataka

Tipovi podataka

SI1P1 2004

63/15

SI1P1 2004

64/15

16

Uvod

Uvod u programiranje 1 Java Kontrole toka

ta su kontrolne strukture Tipovi kontrolnih struktura: Blok Izrazi odluivanja Petlje

SI1P1 2004

65/15

SI1P1 2004

66/15

ta su kontrolne strukture

if struktura

Bez kontrolnih struktura, raunar bi izvravao instrukcije iz programa korak-po-korak Kontrolne strukture omoguavaju promenu: redosled po kome e se instrukcije izvravati koje instrukcije e se izvravati kontrola toka samog programa Kontrolne strukture ukljuuju: blokovske izraze (sve to se nalazi unutar velikih zagrada) izraze odluivanja petlje
67/15

SI1P1 2004

SI1P1 2004

if klauzula doprinosi uslovnom izvravanju programa if (expression) { statement; } next_statement; Izraz expression mora biti logikog tipa i njegova vrednost mora biti true ili false Ako je vrednost izraza expression true, izvravaju se izrazi statement, pa nakon njih next_statement Ako je vrednost izraza expression false, izrazi statement se nee izvriti i program e nastaviti sa izvravanjem next_statement

68/15

17

if struktura

if-else struktura
Osnovna if struktura se moe proiriti dodavanjem else uslova, da bi se definisalo ta se deava ukoliko uslov nije ispunjen if (expression) { statement1; } else{ statement2; } next_statement; Ponovo izraz expression mora biti logikog tipa i njegova vrednost mora biti true ili false Ako je vrednost izraza expression true, izvravaju se izrazi statement1, pa nakon njih next_statement. Ako je vrednost izraza expression false, izvravaju se izrazi SI1P1 2004 statement2, pa nakon njih next_statement.

SI1P1 2004

69/15

70/15

if-else struktura

Ugnjeeni if-else

Mogue je kombinovati vie if-else izraza jedan unutar drugog i nataj nain dobiti viestruke upite if (grade == 'A') System.out.println(Pera je dobio A."); else if (grade == 'B') System.out.println("Pera je dobio B."); else if (grade == 'C') System.out.println("Pera je dobio C."); else System.out.println("Pera je dobio F.");

SI1P1 2004

71/15

SI1P1 2004

72/15

18

switch struktura
switch struktura je drugi nain da se testira vie vrednosti jednog izraza Vrednost izraza expression mora biti tipa char,byte,short ili int, ali ne moe biti long,float, String ili double. switch (expression) { case value1: statement1; case value2: statement2; default: default_statement; } Napomena: Svaki izraz nakon true sluaja e se izvriti
73/15

switch struktura

SI1P1 2004

SI1P1 2004

74/15

switch struktura
break; izraz definie raunaru izlazak iz switch strukture switch (expression) { case value1: statement1; break; case value2: statement2; break; default: default_statement; break; }
SI1P1 2004 75/15

switch struktura

SI1P1 2004

76/15

19

switch struktura

Petlje

Petlje dozvoljavaju izvravanje izraza ili bloka vie izraza nekoliko puta Postoje tri tipa petlji u Javi: for petlje while petlje do-while petlje (nee se razmatrati u okviru ovog kursa)

SI1P1 2004

77/15

SI1P1 2004

78/15

for petlja

for petlja

for (inicijalizacija; uslov; inkrement){ //izrazi } Kontrola for petlje je definisana u okviru prve zagrade i sastoji se iz tri dela 1.Prvi deo, inicijalizacija, postavlja poetne uslove petlje i izvrava se pre samog starta petlje 2. Petlja se izvrava sve dok je uslov true i ponavlja se izvravanje izraza 3. Trei deo kontrolnih informacija je inkrement,koji se koristi za promenu brojaa petlje. Ovaj postupak se izvrava na kraju svake iteracije petlje.

SI1P1 2004

79/15

SI1P1 2004

80/15

20

for petlja
for(int div = 0; div<1000; div++) { if(div% 12 == 0){ System.out.println(div+je deljivo sa 12"); } } U okviru izvravanja ovog primera e se prikazati svaki broj od 0 do 999 koji je deljiv sa 12.

for petlja

SI1P1 2004

81/15

SI1P1 2004

Ako se u uslovu inicijalizacije i inkrementa pojavljuje vie od jedne promenljive, tada su ove promenljive odvojene zarezom. for (i=0,j=0; i*j<1000; i++,j+=2) { System.out.println(i+"*"+j+"="+i*j); } Ne mora se popuniti svaki deo kontrole petlje, ali mora postojati dva puta simbol ; for (int i=0; i<100; ) { sum+=i; i++; }

82/15

while petlja

while petlja

while (expression){ statement } while petlja se izvrava sve dok logiki izraz expression ima vrednost true. Kada expression postane false, izvravanje se nastavlja sa prvom instrukcijom iza petlje Izraz se proverava na poetku petlje, pa ako inicijalno ima vrednost false, telo petlja se nee izvriti nijednom.

SI1P1 2004

83/15

SI1P1 2004

84/15

21

while petlja

Korienje break naredbe


U prethodnim primerima je naredba break koriena u okviru switch strukture. U petljama,ova naredba se moe koristiti da bi se izalo iz trenutne petlje int index = 0; while (index <= 10){ index++; if (index==3) break; System.out.println(Indeks je + index); } Indeks je 1 Indeks je 2

SI1P1 2004

85/15

SI1P1 2004

86/15

Petlja unuta petlje

Pitanja 1

Mogue je unutar bilo koje vrste petlje ubaciti bilo koju vrstu petlje

U okviru programa realizuje se i opcija za podizanje para sa rauna. Kako treba koristiti if strukturu da bi se korektno izvrila data opcija. If struktura se koristi da bi se proverilo da li je iznos koji se podie manji ili jednak trenutnom iznosu u banci.

SI1P1 2004

87/15

SI1P1 2004

88/15

22

Pitanja 2

Pitanja 3

Kako se moe implementirati funkcija AbsoluteValue, funkcija koja kao rezultat vraa pozitivnu vrednost unetog broja Bolje je koristiti if strukturu nego switch.

ta je rezultat izvravanja sledee petlje? for (int i=100; i>=0; i--) { System.out.println(i); }

Brojevi od 100 do 0.

SI1P1 2004

89/15

SI1P1 2004

90/15

ta su nizovi

Uvod u programiranje 1 Java Nizovi nain organizovanja podataka

Niz je serija odeljaka koji slue za smetanje podataka. To je u stvari blok promenljivih. U Javi, nizovi mogu da obuhvate samo jedan tip podataka. Na primer niz moe obuhvatiti samo lanove koji su celobrojni borjevi ili samo lanove koji su stringovi

SI1P1 2004

91/15

SI1P1 2004

92/15

23

Nizovi

Deklarisanje nizova

Nizove definie tip, ime i veliina. Niz od tri celobrojne veliine koji se zove prices:

Deklaracija nizova je slina deklaraciji obinih promenljivih, samo to se koriste srednje zagrade [ ]. tipPodataka[] imeNiza; int[] prices; String[] people; Na drugi nain deklarisanje je mogue: tipPodataka imeNiza[]; int prices[];

Niz od tri string veliine koji se zove people

Pojedinana vrednost u okviru niza je element niza. Pozicija svakog elementa u okviru niza je njegov indeks.
93/15

SI1P1 2004

SI1P1 2004

94/15

Rezervisanje prostora

Indeksi

Za razliku od obinih promenljivih pri korienju nizova, potrebno je rezervisati eljenimemorijski prostor. (U jeziku C postoji naredba malloc()) Koristi se kljuna re new da bi se rezervisala memorija: imeNiza = new tipPodataka[veliina]; prices = new int[3]; people = new String[4]; Prvi primer rezervie prostor za niz celih brojeva veliine 20, a drugi primer niz Stringova veliine 10. Moe se kombinovati deklaracija sa rezervisanjem int[] prices=new int[3];

SI1P1 2004

95/15

SI1P1 2004

Pojedinanom elementu niza se pristupa pomou njegovog indeksa. U Javi indeksi kreu od broja 0 i poslednji ima indeks n-1, gde je n veliina niza. Na primer niz prices ima veliinu 3, i njegovi elementi imaju indekse 0, 1, i 2. uvati se Array out of Bounds greaka. imeNiza[indeks] Sa elementima niza se moe postpuati kao sa obinim promenljivima prices[0] = 6; prices[1] = 80; prices[2] = 10;

96/15

24

Korienje nizova

Inicijalizacija nizova

Elementima niza Stringova se pristupa na identian nain: String[] people; people = new String[4]; people[0] = Lana; people[1] = Pera; people[2] = Mika; people[3] = Maja;

Mogu se definisati i svi elementi niza, pri njegovom deklarisanju. Tada se koristi velika zagrada da bi se odvojili elementi niza od ostatka koda i zarez da bi se odvojili pojedinani elementi. String[] people= {Lana,Pera, Mika, Maja}; int[] prices = {6, 80, 10}; Svi elemnti niza i ovom sluaju moraju biti istog tipa.

SI1P1 2004

97/15

SI1P1 2004

98/15

Korieni pojmovi

Pitanja

Rezervisanje prostora kreiranje prznaog memorijskog prostora, u koji e se smestiti niz. Inicializacija Popunjavanje rezervisanog prostora za niz sa inicijalnim vrednostima. Element pojedinani lan niza. Indeks pozicija elementa u okviru niza. Veliina ili duina niza - Broj elemenata niza.

Koje od sledeih naredbi ne kreiraju niz

SI1P1 2004

99/15

SI1P1 2004

100/15

25

Duina niza
Svaki niz ima svoju osobinu kojoj se moe pristupiti po imenu length Pristup ovoj osobini se odvija na sledei nain: imeNiza.length; String[] people = {Lana,Pera, Mika, Maja}; int numPeople = people.length; Vrednost promenljive numPeople je 4. Nizovi su uvek iste duine. Njihova duina se ne moe menjati od trenutka kada su kreirani.

Primer

Primer koda: String[] names = {Lana,Pera, Mika, Maja}; for(int i=0; i<names.length; i++) System.out.println(names[i]+!"); Rezultat: Lana! Pera! Mika! Maja!

SI1P1 2004

101/15

SI1P1 2004

102/15

Primer 2

Primer 3

Koji je sadraj niza c nakon izvravanja datog programskog segmenta? int [] a = {1, 2, 3, 4, 5}; int [] b = {11, 12, 13}; int [] c = new int[4]; for (int j = 0; j < 3; j++) { c[j] = a[j] + b[j]; }

SI1P1 2004

103/15

SI1P1 2004

104/15

26

Primer sortiranja 1
public class BubbleSort { public static void main(String[] args) { int[] test = {52,654,15,994,2,35,12,5,7,9}; for (int j = 1; j < test.length; j++) { for (int i = 1; i < test.length; i++) { if (test[i - 1] > test[i]) { final int tmp = test[i - 1]; test[i - 1] = test[i]; test[i] = tmp; } } } for (int i=0; i<test.length; i++) { System.out.println(test[i]); } } }
SI1P1 2004 105/15

Primer sortiranja 2
public class BubbleSort { public static void main(String[] args) { int[] test = {52,654,15,994,2,35,12,5,7,9}; boolean sortirano = false; while (!sortirano){ sortirano = true; for (int i = 1; i < test.length; i++) { if (test[i - 1] > test[i]) { final int tmp = test[i - 1]; test[i - 1] = test[i]; test[i] = tmp; sortirano = false; } } } for (int i=0; i<test.length; i++) { System.out.println(test[i]); } } SI1P1 } 2004

106/15

Dvodimenzionalni nizovi

Dvodimenzionalni nizovi

Nizovi koji su do sada razmatrani mogu se posmatrati kao jedan red vrednosti Dvodimenzionalni niz se moe posmatrati kao mrea (ili matrica) vrednosti. Svakom elementu dvodimenzionalnog niza se moe pristupiti pomou dva indeksa: redni broj reda i redni broj kolone. Dvodimenzionalni niz je u sutini niz iji je svaki element novi niz

Primer: Karta zemljita je podeljena na mreu 20 x 55 razliitih imanja. U svakom polju treba upisati povrinu odreenog imanja. Prvo je potrebno deklarisati dvodimenzionalni niz: double[][] heights; heights= new double[20][55]; Ovaj dvodimenzionalni niz ima 20 redova i 55 kolona Da bi se pristupilo pojedinanom imanju koje se nalazi u 11-om redu i 23-oj koloni: heights[11][23]
108/15

SI1P1 2004

107/15

SI1P1 2004

27

Viedimenzionalni nizovi

Podnizovi mogu biti razliitih duina: int[][] a = new int[3][]; int[] b = {1,2,3}; int[] c = {4,5,6,7}; int[] d = {8}; a[0]= b; a[1] = c; a[2] = d; Mogu se definisati i viedimenzionalni nizovi: int[][][][] a; // 4-D niz

Uvod u programiranje 1 Java Metodi

SI1P1 2004

109/15

SI1P1 2004

110/15

Sadraj lekcije

Koncept metoda

ta je metod Zato koristimo metode Kako da deklariemo metode etiri dela metoda Kako pozvati metod Svrha metoda main Neki primeri metoda

Metodi se jo nazivaju i funkcije ili procedure. Metod je nain da se odreeni broj koraka integrie u poseban deo koda i na taj nain posebno poziva i obrauje. Kada bi sve mogli da se koriste metodi? izraunavanje kvadratne formule, prikaz na ekranu, ...

SI1P1 2004

111/15

SI1P1 2004

112/15

28

Koncept metoda

Izraunavanje kvadratnog korena

Metodi mogu da prihvate ulazne podatke u formi

argumenata

Nakon toga mogu da izvre odreene operacije sa argumentima Na kraju mogu da vrate vrednost koju su dobili kao rezultat izraunavanja, t.j. da generiu izlaz

Kvadratni koren je dobar primer upotrebe metoda. Metod koji slui za dobijanje kvadratnog korena prihvata broj kao argument i kao rezultat vraa kvadratni koren od tog broja.

SI1P1 2004

113/15

SI1P1 2004

114/15

Izraunavanje kvadratnog korena

Deklarisanje metoda

Izraunavanje kvadratnog korena obuhvata i vie meukoraka izmeu operacija prihvatanja ulaznog podatka i generisanja izlaza. Kada se koristi ovaj metod, korisnika ne interesuju pojedinani koraci. Jedino to mu je potrebno je da se dobije korektan rezultat. Skrivanje internog rada metoda od korisnika, ali obezbeivanje korektnog rezultata se naziva jo i

Metod ima 4 dela: tip rezultata, ime, argumente, i telo metoda Tip, ime i argumenti, zajedno, se jo nazivaju i potpis metoda

apstrakcija

SI1P1 2004

115/15

SI1P1 2004

116/15

29

Tip rezultata metoda

Generisanje rezultata

Tip rezultata metoda moe biti bilo kog tipa podataka. Tip metoda se odreuje na osnovu tipa podataka koji se generie kao izlaz. Metod moe i da ne vraa rezultat, u kom sluaju se deklarie kao tipa void.

U okviru metoda se koristi naredba return da bi se definisao rezultat izvravanja operacije metoda. Njegova forma je: return vrednost_izvravanja; Tip promenljive vrednost_izvravanja mora da bude istog tipa kao i tip samog metoda: double sqrt(int num) { double answer; // Izrauna se vrednost kvadratnog korena num // i rezultat smesti u promenljivu answer return answer; }
118/15

SI1P1 2004

117/15

SI1P1 2004

Generisanje rezultata

void metod

Metod se zavrava odmah nakon izvravanja naredbe return Zato je u veini sluajeva return naredba poslednja naredba u okviru metoda Metod moe imati i vie return naredbi. int absoluteValue(int num){ if (num < 0) return num; else return num; }

Metod tipa void ima return naredbu bez definisane specifine vrednosti return; Na prvi pogled se ini da je ovaj pristup beskoristan, ali se u praksi void esto koristi. Dobar primer je metod kada je potrebno samo neto prikazati na ekranu. Kao se u okviru metoda tipa void ne navede naredba return, podrazumeva se da se ona izvrava na kraju metoda

SI1P1 2004

119/15

SI1P1 2004

120/15

30

Argumenti metoda

Argumenti metoda

Metodi mogu dobijati ulazne podatke u formi argumenata. Argumenti se koriste kao promenljive u okviru tela metoda. Kao promenljive, i argumentima se mora specificirati tip. Argumenti se definiu unutar zagrada koje se nalaze iza imena metoda.

double podeli(double a, double b) { double odgovor; odgovor = a / b; return odgovor; }

Vie argumenata metoda se odvajaju zarezom: double pow(double x, double y) Argumenti mogu biti razliitog tipa int indexOf(String str, int fromIndex) Telo metoda je blok specificiran sa velikim zagradama, { }. U okviru tela metoda se definiu akcije metoda. Argumenti metoda se mogu koristiti bilo gde u okviru metoda. Svi metodi moraju imati velike zagrade bez obzira da li se telo metoda sastoji od jedne naredbe ili ak od nijedne.
122/15

SI1P1 2004

121/15

SI1P1 2004

Poziv metoda

main metod

Da bi se pozvao odreeni metod, potrebno je specificirati ime metoda, iza koga treba navesti listu argumenata odvojenih zarezom i u okviru zagrada pow(2, 10); //rauna 2 na 10 Ako metod nema argumenata, treba navesti ime metoda sa praznim zagradama: size(); Neki metodi mogu sadrati re static pre tipa metoda: static double divide(double a, double b) { return a / b; }

Do sada smo koristili jedino metod main Ovaj metod je taka odakle uvek poinje izvravanje Java programa main metod je static i ima strog format koji se mora potovati: public static void main(String[] args) { ... }

SI1P1 2004

123/15

SI1P1 2004

124/15

31

main metod

Primer

class SayHi{ public static void main(String[] args) { System.out.println("Hi, " + args[0]); } } Ako se otkuca java Program arg1 arg2 argN u okviru komandne linije, sve nakon imena klase se automatski uitava u niz pod imenom args: java SayHi Bosko U ovom primeru lan args[0] e sadravati String Bosko", i izlaz proma e biti "Hi, Bosko"
SI1P1 2004 125/15

ta nije u redu u sledeem delu programa static double addSometimes(num1, num2){ double sum; if (num1 < num2){ sum = num1 + num2; String completed = completed; return completed; } }

SI1P1 2004

126/15

Primer

Primer

class Greetings { public static void main(String args[]) { String greeting = ""; for (int i=0; i < args.length; i++) { greeting += "Jambo " + args[i] + "! "; } System.out.println(greeting); } } Nakon kompaliranja i pokretanja java Greetings Lana Pera Maja izlaz e biti "Jambo Lana! Jambo Pera! Jambo Maja!"
127/15

class Max { public static void main(String args[]) { if (args.length == 0) return; int max = Integer.parseInt(args[0]); for (int i=1; i < args.length; i++) { if (Integer.parseInt(args[i]) > max) { max = Integer.parseInt(args[i]); } } System.out.println(max); } } java Max 3 2 9 2 4 dobija se izlaz 9
128/15

SI1P1 2004

SI1P1 2004

32

Najvaniji pojmovi

Metod je odvojeni deo koda koji moemo pozivati i izvravati vie puta, a napisan je samo jednom Metodi u Javi imaju 4 dela: tip podatka koji vraaju, ime, argumente, telo. Tip podatka koji se vraa i argumenti mogu biti primitivni tip podataka (na primer int) ili sloeni (na primer Object) main je specijalni Java metod koji Java interpreter trai kada eli da pokrene class fajl main ima strog format: public static void main(String args[])

Uvod u programiranje 1 Java Objekti i klase

SI1P1 2004

129/15

SI1P1 2004

130/15

Do sada smo nauili

ta moe biti problem

Tipove podataka: int, double, boolean, String Promenljive: Pamte vrednost odreenog tipa. Nizovi: Pamte vie vrednost odreenog tipa. Kontrolne strukture: If-then, For petlje ... Metodi: Delovi koda kojima moemo proslediti argumente i izvriti ih. Da li je to sve to nam je potrebno?

Neki podaci se pamte zajedno. String[] imena int[] ocene Metodi poinju da se komplikuju. Metodi mogu vratiti rezultat samo jednog tipa. Programeri ne ele da razmiljaju o svim neprikazanim tipovima.

SI1P1 2004

131/15

SI1P1 2004

132/15

33

Apstrakcija

ta je objekat

Objekti su alati za primenu apstrakcije. Pokuavamo apstraktovati odreene detalje da bi se suoili sa kompleksnim problemima. Apstrakcija je fundamentalni koncept u raunarskim naukama. Problem je i da se ne primenjuje suvie apstrakcije. Umee je znati oje detalje treba sakriti, a koje treba prikazati.

Objekat ima dva dela: Stanje: Osobine objekta. Ponaanje: Stvari koje objekat moe da uradi. Primer automobila: Stanje: Boja, vrsta motora, automatik Ponaanje: koiti, ubrzati, svirati, voziti u odreenom smeru Primer oovek: Stanje: Teina, visina, pol, godite Ponaanje: Jesti, spavati, vebati, uiti

SI1P1 2004

133/15

SI1P1 2004

134/15

ta je objekat

Zato koristiti objekte

Modularnost: Jednom kada se objekat definie, moe se koristiti u proizvoljnom broju aplikacija. Sakrivanje informacija: programere ne zanima kako objekat funkcionie, ve samo njegov interfejs. Primer: Razliiti automobili mogu koristiti iste delove. Ne zanima vas kako motor funkcionie, sve dok moete da vozite automobil.

SI1P1 2004

135/15

SI1P1 2004

136/15

34

Klase

Klase

Klasa je uzorak ili kalup pomou koga se stvara objekat Svaka klasa moe sadrati: - lanove podataka (osobine/karakteristike objekta/klase) - Metode (definiu ponaanje objekata dobijenoh od klase) - Konstruktore (specijalne metode)

Osnovna anatomija klase public class imeKlase{ lanove podataka Konstruktori Metodi }

SI1P1 2004

137/15

SI1P1 2004

138/15

Prva klasa: prekidacZaSvetlo

Klase

class prekidacZaSvetlo{ boolean upaljeno = true; } Re class govori okruenju da elimo da definiemo novi tip Object-a. Klase su definicije stanja i ponaanja. Objekti su instance klasa. Sve u okviru Jave je objekat i ima svoju klasu.

SI1P1 2004

139/15

SI1P1 2004

140/15

35

Prva klasa: prekidacZaSvetlo


class prekidacZaSvetlo{ boolean upaljeno = true; } Koje stanje prekidacZaSvetlo moe imati? Stanje se pamti u okviru polja, ovde je to upaljeno Poljima se prilazi na sledei nain: imePromenljive.imePolja Kasnije e biti rei o drugim vrstama polja Koje ponaanje prekidacZaSvetlo moe imati?

Definisanje ponaanja

class prekidacZaSvetlo{ boolean upaljeno = true; void pritisni() { this.upaljeno = !this.upaljeno ; } } Re this se odnosi na pojedinani objekat Pomou this.upaljeno se pristupa polju upaljeno. Koje ponaanje prekidacZaSvetlo sada moe imati?

SI1P1 2004

141/15

SI1P1 2004

142/15

Korienje objekata

Konstruktori

public static void main(String[] args) { prekidacZaSvetlo s = new prekidacZaSvetlo(); System.out.println(s.upaljeno); s.pritisni(); System.out.println(s.upaljeno); } Pomou new se kreira novi objekat. Iza new mora se navesti konstruktor. Metodi se pozivaju na sledei nain: imePromenljive.imeMetoda(argumenti) ta se dobija kao izlaz ovog programa?
143/15

Konstruktori povezuju objekte sa podacima koji su im potrebni da bi se inicijalizovali Objekti imaju default konstruktor koji nema nijedan argument, kao prekidacZaSvetlo(). Mogu se definisati sopstveni konstruktori koji mogu imati proizvoljan broj argumenata. Konstruktori nemaju tip povratka i moraju imati isto ime kao klasa: ImeKlase(definisanje argumenata) { telo konstruktora }
SI1P1 2004 144/15

SI1P1 2004

36

Konstruktori

Konstruktori

class prekidacZaSvetlo { boolean upaljeno ; void pritisni() { this.upaljeno = !this.upaljeno ; } prekidacZaSvetlo (boolean pocetnoStanje) { this.upaljeno = pocetnoStanje; } } Konstruktor prekidacZaSvetlo() vie ne postoji. Kako se sada pravi instanca objekta?
145/15

prekidacZaSvetlo() { prekidacZaSvetlo(true) ; } prekidacZaSvetlo (boolean pocetnoStanje) { this.upaljeno = pocetnoStanje; } } Moe se definisati vie konstruktora. Konstruktori se mogu meusobno pozivati.

SI1P1 2004

SI1P1 2004

146/15

prekidacZaSvetlo

prekidacZaSvetlo - druga verzija

class prekidacZaSvetlo{ boolean upaljeno = true; boolean daLiJeUpaljeno() { return upaljeno; } void pritisni() { upaljeno = !upaljeno; } }

class prekidacZaSvetlo{ int upaljeno = 1; boolean daLiJeUpaljeno() { return upaljeno == 1; } void pritisni() { upaljeno = 1 - upaljeno; } }

SI1P1 2004

147/15

SI1P1 2004

148/15

37

Apstrakcija

Problem apstrakcije

Obe prethodne verzije se imaju isto ponaanje. Klasu prekidacZaSvetlo treba tretirati kao apstrakciju: ne interesuje nas unutranjikod, ve samo njeno ponaanje Interni kod = implementacija Spoljanje ponaanje = interfejs Pisanje koda i poboljanje implementacije se moe ovbavljati sve dok je interfejs isti Sve dok je korisnjenje objekta date klase isto, ne zanima nas kako je dobijeno dato ponaanje. U velikim projektima, gde ima vie timova, programera jedino zanima njegov deo koda (na primer Microsoft, Google, Goldman Sachs, Morgan Stanley i finansijske kompanije)
149/15

Korisnik klase prekidacZaSvetlo koji pristupa logikoj promenljivoj upaljeno, grei ako se ova promenljiva promeni u celobrojnu class PrimerGreske{ public static void main(String[] args) { prekidacZaSvetlo ls= new prekidacZaSvetlo (); if (ls.upaljeno) // greska! System.out.println("upaljeno!"); else System.out.println(Nije upaljeno!"); } }
150/15

SI1P1 2004

SI1P1 2004

public i private pristupi

Poboljana verzija klase prekidacZaSvetlo


class prekidacZaSvetlo{ private boolean upaljeno = true; public boolean daLiJeUpaljeno() { return upaljeno; } void pritisni() { upaljeno = !upaljeno; } }

Ako se polja ili metodi oznae kao private, tada im druge klase ne mogu pristupiti Ako se polja ili metodi oznae kao public, tada im bilo koja druga klasa moe pristupiti Ako se ne specificira posebno da li je polje ili metod public ili private, tada se podrazumeva da je public.

SI1P1 2004

151/15

SI1P1 2004

152/15

38

Novi problemi
U prethodnom primeru polje upaljeno je definisano kao private class prekidacZaSvetlo{ private boolean upaljeno = true; Ako se iz druge klase pristupa ovom polju desie se greka pri kompajliranju if (ls.upaljeno) // greska

Promenljive i objekti
Postoje dve vrste podataka u Javi: promenljive i objekti Promenljive: byte, short, int, long, double, float, boolean, char == proverava da li dve promenljive imaju istu vrednost Objekti: definisani u okviru Java klasa == proverava da li su dva objekta isti objekat

SI1P1 2004

153/15

SI1P1 2004

154/15

Reference
Pomou new se uvek stvara nova jedinstvena instanca klase Kada se instanca povee sa odreenom promenljivom, tada promenljiva sadri referencu ili vezu sa datim objektom Covek g = new Covek(Lana", 3); Covek h = new Covek(Lana", 3); U ovom primeru g i h predstavljaju reference na dva razliita objekta koji u ovom trenutku imaju identina stanja

Reference
g != h se dobija, jer g i h predstavljaju reference na razliite objekte Covek g = new Covek(Lana", 3); Covek h = new Covek(Lana", 3);

Lana 3
SI1P1 2004 155/15 SI1P1 2004

Lana 3
156/15

39

Reference
maja1 == maja2 se dobija, jer maja1 i maja2 predstavljaju referencu na isti objekat Covek maja1 = new Covek(Maja", 34); Covek maja1 = maja2;

Pitanja
Da li je (a == b)? int a = 7; int b = 7; Odgovor: Da Da li je (g == h)? Person g = new Person(Mwangi", 21); Person h = new Person(Mwangi", 21); Odgovor: Ne

maja1

maja2

Maja 34
SI1P1 2004 157/15 SI1P1 2004 158/15

Pitanja
true ili false? Person g = new Person(James", 22); Person h = new Person("James", 22); Person lucy1 = new Person(Lucy", 19); Person lucy2 = lucy1; a) g == h b) g.getAge() == h.getAge() c) lucy1 == lucy2 d) lucy1.getAge() == lucy2.getAge();

Primer BankAccount
class BankAccount{ double balance; String name; BankAccount(String name, doubleopenBalance){ this.name = name; this.balance = openBalance; } double deposit(double amount) { balance += amount; return balance; } boolean withdraw(double amount) { if (amount < balance){ balance -= amount; return true; } else return false; } SI1P1 } 2004

SI1P1 2004

159/15

160/15

40

Java API

Sve informacije o ugraenim Java klasama i njihovim metodama se mogu dobiti pomou Java Application Programming Interface (API) Ova dokumentacija je osnov za realizaciju bilo koje sloene Java aplikacije

Uvod u programiranje 1 Java Static & Final

SI1P1 2004

161/15

SI1P1 2004

162/15

Primer
public class MyMath{ public double PI = 3.14159; public double square (double x) { return x * x; } public static void main(String[ ] args) { MyMath m = new MyMath(); System.out.println("m: value of PI is " + m.PI); System.out.println("m: square of 5 is " + m.square(5)); MyMath n = new MyMath(); System.out.println("n: value of PI is " + n.PI); System.out.println("n: square of 5 is " + n.square(5)); } }
SI1P1 2004 163/15

Analiza

SI1P1 2004

U prethodnom primeru, da bi se dobio kvadrat broja 5 potrebno je kreirati instancu klase MyMath: MyMath m = new MyMath(); Tada se poziva metod square() sa argumentom 5: m.square(5); Rezultat poziva metoda square() sa instancama m i n je isti: m: value of PI is 3.14159 m: square of 5 is 25 n: value of PI is 3.14159 n: square of 5 is 25 Metod square() se ponaa isto bez obzira koja ga instanca poziva

164/15

41

Analiza

MyMath - ponovo
public class MyMath{ // add keyword "static" to field declaration public static double PI = 3.14159; // add keyword "static" to method declaration public static double square (double x) { return x * x; } // main method is always declared "static" public static void main( String[ ] args) { // MyMath m = new MyMath(); // MyMath n = new MyMath(); -No longer need this line! // Now invoke square() method on the MyMathclass System.out.println("Valueof PI is " + MyMath.PI); System.out.println("Squareof 5 is" + MyMath.square(5)); } } 166/15 SI1P1 2004

Vrednost promenljive PI = 3.14159 je ista za sve instance klase MyMath. Zato je potrebno smestiti vrednost PI nezavisno za svaku instancu klase MyMath? Da li je mogue smestiti jednu vrednost promenljive PI za celu klasu MyMath?

SI1P1 2004

165/15

static PI

final

U prethodnom primeru je dodata re static kod deklaracije konstante PI: public staticdouble PI = 3.14159; Na taj nain je definisano da postoji samojedna vrednost promenljive PI za sve instance klase MyMathclass PI je sada podatak koji pripada klasi

Promenljiva PI je deklarisana sa public static double PI = 3.14159; I na ovaj nain je mogue promeniti njenu vrednost: MyMath.PI= 999999999; Da bi se definisala kao konstanta potrebno je koristiti re final: public static final double PI = 3.14159; Kada se jednom promenljiva deklarie kao final, njena vrednost se ne moe menjati!

SI1P1 2004

167/15

SI1P1 2004

168/15

42

final

MyMath nova verzija


public class MyMath{ // add keyword finalto field declaration public static finaldouble PI = 3.14159; public static double square (double x) { return x * x; } public static void main( String[ ] args) { System.out.println("Valueof PI is " + MyMath.PI); System.out.println("Squareof 5: " + MyMath.square(5)); } }
SI1P1 2004 170/15

Jo jedan primer upotrebe final public static final Point ORIGIN =new Point(0,0); Time smo zabranili promenu vrednosti promenljive na sledei nain: MyMath.ORIGIN= new Point(3, 4); ALI! I dalje se mogu pozivati metodi koji na nenki nain mogu promeniti stanje promenljive ORIGIN: MyMath.ORIGIN.setX(4);

SI1P1 2004

169/15

static metod
U primeru je dodata re "static" i pred deklaracije metoda square(): public static double square(doublex) { return x * x; } Sada je metod square() podeljen izmeu svih instanci ove klase postoji samo jedan square metod za celu klasu, ne jedan za svaku instancu

static metod
Statiki metodi ne vre operacije da specifinim instancama njihovih klasa Ovi metodi imaju pristup samo statikim poljima i metodama klase Ne mogu pristupiti nijednom elemntu koji je nestatiki Metodi klase" je bolja definicija Suprotni termin je metodi instance"

SI1P1 2004

171/15

SI1P1 2004

172/15

43

Math klasa
Detaljniji pregled klase Math u okviru Javinog API Ne moe se kreirati instanca klase Math, ona slui za smetanje korisnih static metoda Svi metodi i polja su static: Math.sqrt(16) Math.PI Math.abs(-3)

Primeri static polja


Konstante koje se koriste u okviru klasa (uobiajeno je da su deklarisane pomou final) Potrebna je samo jedna po klasi, nije potrebna po jedna u svakom objektu Sledea deklaracija: public static final double TEMP_CONVERT= 1.8; Ako se ova deklaracija promenljive TEMP_CONVERT nalazi u okviru klase Temperature, moe se koristiti na sledei nain: double t = Temperature.TEMP_CONVERT * temp; Tradicionalno (C, C++) konstante se piu velikim slovima, PI , TEMP_CONVERT, ...
174/15

173/15

SI1P1 2004

SI1P1 2004

Primeri static metoda


Za metode koji koriste samo argumente i na taj nain ne koriste instance public static double pow(double b, double p) // Math class, Za metode kojima trebaju samo static podaci Takoe, koristi se i kod main metoda kod klase pomou koje se startuje program U trenutku startovanja programa ne postoji objekti koje bi main metod mogao da koristi

Pitanja
Da li sledei podaci treba da budu static ili nestatic? Podatak koji definie brzinu svetlosti getName() metod u okviru klase Person zbir() metod koji kao rezultat vraa zbir dva svoja argumenta Podatak koji definie irinu u okviru Rectangle klase static non static non
176/15

SI1P1 2004

175/15

SI1P1 2004

44

Pristup i organizacija

Uvod u programiranje 1 Java Organizacija Organizacija podataka i kontrola pristupa

Na raunaru postoji hiljade fajlova. Na Internetu postoji vie miliona sajtova. Projekat moe imati hiljade klasa. Kako pronai odreenu klasu, fajl ili sajt? Kako organizujemo rad u sluaju istih ili slinih imena? Kako se moe ograniiti pristup privatnim podacima?

SI1P1 2004

177/15

SI1P1 2004

178/15

U ovoj lekciji

Oblast vaenja

Oblast vaenja: Odakle moemo pristupiti pojedinanim podacima. Kako se koriste Java paketi. Kako se kreiraju Java paketi.

Oblast vaenja promenljive, polja, metode ili klase je deo programa iz koga se moe pristupiti ovim elementima. Promenljivama se moe pristupiti iz bloka u okviru koga su deklarisane. Block se oznaava pomou { i }. Lokalne promenljive: Promenljive koje su definisane samo u trenutnom bloku. Pristup polju, metama i klasama je definisana pomou njihovih specifikatora.

SI1P1 2004

179/15

SI1P1 2004

180/15

45

Anonimne promenljive

Primer oblasti vaenja promenljive

Anonimne promenljive se deifiniu i inicijalizuju, ali se nikada ne deklariu. U jezicima C i C++ anonimne promenljive se tretiraju kao greka, u Javi ne. Ove promenljive nemaju ime i ne mogu se pozivati pa nemaju oblast vaenja. Primeri: System.out.println(Hello); (new String(Hello)) (new int[] {1,2,3,4}) (Poslednji primer sadri elemente koji e se razmatrati kasnije)
SI1P1 2004

181/15

SI1P1 2004

0 void foo(int x) { 1 int y = 3; 2 if (y > 0) { 3 int z= 4; 4 if (z> 0) { 5 int w= 0; 6 { 7 int v = 1; 8 } // end block 9 } // end if (z>0) 10 } // end if (y>0) 11 } // end Iz kojih linija koda se moe pristupiti promenljivama v, w, x, y, i z?

182/15

Primer oblasti vaenja metoda


class TestScope { int x = 0; void foo(int z) { int y = 20; x = 10; int z = 30; // Error }// end foo() void print() { System.out.println(x); foo(x); System.out.println(x); /* Next line error */ System.out.println(y); }// end print() }// end TestScope x je definisano za celu klasu y je definisano u okviru metoda f(int). SI1P1 2004 z je ve definisan u f(int) jer je argument metoda.

Primer oblasti vaenja polja


class Scope{ int x = 3; void foo(int y) { System.out.println(x); int x = 2; System.out.println(x); System.out.println(this.x); System.out.println(y); } public static void main(String[] args) { int x = 1; (new Scope()).foo(x); // AnonymousObject } } SI1P1 2004 ta je rezultat izvravanja programa?

183/15

184/15

46

Primer oblasti vaenja i petlje

Pitanje
class TestScope { int x = 0; void foo() { int y = 20; x = 10; }// end foo void print() { int y = 0; System.out.println(x); foo(); System.out.println(x); System.out.println(y); }// end print() }// end Class TestScope ta se dobija na izlazu kao rezultat izvravanja programa? 0 10 SI1P1 2004 0

int sigma(int n) { for (int i = 0; i<n; i++) { int sum += i; } return sum; } Metod sigma bi trebalo da generie rezultat koji je jednak Zato se javlja greka pri kompajliranju?

SI1P1 2004

185/15

186/15

Pitanje 2
class TestScope { int x = 0; int y = 0; void foo() { int y; y = 20; x = 10; } void print() { System.out.println(x); foo(); System.out.println(x); System.out.println(y); } } ta se sada dobija na izlazu kao rezultat izvravanja programa? 0 10 0
187/15

Pitanje 3
class TestScope { int x = 0; int y = 0; void foo() { y = 20; x = 10; } void print() { System.out.println(x); foo(); System.out.println(x); System.out.println(y); } } ta se sada dobija na izlazu kao rezultat izvravanja programa? 0 10 SI1P1 2004 20

SI1P1 2004

188/15

47

Imenovanje promenljivih u velikim projektima

Hijerarhijska organizacija
Imena su organizovana u hijerarhijski raspored. Bill Gates: Porodica: Gates, lan: Bill. rti.etf.bg.ac.yu 254-020-5555555: Kenya (254), Nairobi (020), Broj 5555555 java.lang.String: String je klasa, u okviru lang paketa, koji se nalazi u okviru osnovnog java paketa.

Veliki projekti mogu imati na hiljade klasa. Moete saraivati i deliti klase sa ljudima koji se nalaze irom sveta. Kako da budete sigurni da se ime vae klase nee poklopiti sa nekim imenom neke druge? Moete koristiti dugaka jedinstvena imena.. UtilityClassForPreparingTaxReturnsByAnthonyGfrom WestlandsNairobiKenya Ovakav nain je teak za pamenje i korienje.

SI1P1 2004

189/15

SI1P1 2004

190/15

Definicija paketa
Potrebno je organizovati klase u skupove ili delove programa koji se nazivaju paketi. Na ovaj nain se smanjuje problem konflikta imena i prepoznavanja funkcionalnosti, na primer java.util. Moe se ograniiti pristup na nivou paketa. Pripadnost klase paketu se definie sa: package imePaketa; class imeKlase{ /* Telo klase */ }

Paketi
Deklaracija paketa mora biti prva linija u fajlu koja nije komentar. Prva klasa definisan au okviru fajla mora da ima isto ime kao i ime fajla. Samo prva klasa moe biti tipa public. javac i java e traiti navedene poddirektorijume ili JAR (Java Archive) fajlove za navedeni kod: putanja \mypkg\util za paket mypkg.util (na Windows operativnom sistemu) putanja /mypkg/util/arrays za paket mypkg.util.arrays (na Unix operativnom sistemu)

SI1P1 2004

191/15

SI1P1 2004

192/15

48

Korienje paketa
Mogu se korisno definisati imena: java.util.Date d = new java.util.Date(); Ili specifirati klase koje se ele koristiti: import java.util.Date; import java.util.ArrayList; Mogu se koristiti sve klase iz paketa: import java.util.*; Paketi mogu imati pod-pakete: import java.util.logging.*; Default korieni paket: import java.lang.*;
193/15

Specifikatori pristupa
Polja, metode, konstruktori i klase koje su definisane kao public omoguavaju pristup iz bilo koje klase bilo kog paketa. Polja, metode, konstruktori i klase koje su definisane kao protected omoguavaju pristup samo klasama koje ih nasleuju. Polja, metode, konstruktori i klase koje su definisane sa paketnim pristupom omoguavaju pristup iz bilo koje klase istog paketa. Ovakav pristup se podrazumeva. Polja, metode i konstruktori koji su definisani kao private omoguavaju pristup samo kodi iz klase u kojoj se pojavljuju.
194/15

SI1P1 2004

SI1P1 2004

Nivoi kontrole pristupa

Primer
package examples; class Person { String name; //Telo klase ce se dopuniti: // Dodavanjem polja za rodjendan // Dodavanjem metoda za definisanje rodjendana // Dodavanjem metoda za citanje rodjendana }

SI1P1 2004

195/15

SI1P1 2004

196/15

49

Primer
package examples; class Person { String name; java.util.Date birthDay; void setBirthday(java.util.Date d) { this.birthDay = d; } java.util.Date getBirthday() { return this.birthDay; } }

Primer
package examples; import java.util.Date; class Person { String name; Date birthDay; void setBirthday(Date d) { this.birthDay = d; } Date getBirthday() { return this.birthDay; } }
197/15 SI1P1 2004 198/15

SI1P1 2004

Primer
package examples; import java.util.Date; import java.util.ArrayList; class Person { String name; ArrayList friends; Date birthDay; void setBirthday(Date d) { this.birthDay = d; } Date getBirthday() { return this.birthDay; } }
SI1P1 2004 199/15

Primer
package examples; import java.util.*; class Person { String name; ArrayList friends; Date birthDay; void setBirthday(Date d) { this.birthDay = d; } Date getBirthday() { return this.birthDay; } }
SI1P1 2004 200/15

50

Pojam nasleivanja

Uvod u programiranje 1 Java Nasleivanje

U stvarnom svetu: Mi nasleujemo svoje gene od roditelja. Nasleujemo gene i od drugih predaka. Moemo imati razliite oi, teinu, visinu . . . Ali i dalje veliki broj osobina nasleujemo od naih roditelja. U svetu softvera: Nasleivanje kod objekata je mnogo bolje definisano! Objekti koji nasleuju neke druge objekte, od njih nasleuju i stanja (polja) i ponaanje (metode).
201/15 SI1P1 2004 202/15

SI1P1 2004

Klasa Masai
public class Masai{ private String name; private int cows; public Masai(String n, int c) { name = n; cows = c; } public String getName() { return name; } public int getCows() { return cows; } public void speak() { System.out.println(Masai"); } }
SI1P1 2004 203/15

Klasa Kikuyu
public class Kikuyu { private String name; private int money; public Kikuyu(String n, int m) { name = n; money = m; } public String getName() { return name; } public int getMoney() { return money; } public void speak() { System.out.println(Kikuyu"); } }
SI1P1 2004 204/15

51

Problem: dupliranje koda

Primer

SI1P1 2004

Prethodne dve klase imaju isto polje name i isti metod getName Klase esto imaju veliki broj zajednikh polja i metoda Dobijeni rezultat: dupliranje koda! Koristei nasleivanje mogue je napisati novu klasu koja nasleuje neku ve postojeu Postojea klasa ije osobine nasleuju naziva se klasa roditelj" ili superklasa Nova klasa koja nasleuje superklasu naziva se klasa potomak" ili subklasa Rezultat: Velika uteda koda!

205/15

SI1P1 2004

206/15

Kenyan superklasa public class Kenyan { private String name; public Kenyan(Stringn) { name = n; } public String getName() { return name; } }
SI1P1 2004 207/15

Masai podklasa
public class Masai extends Kenyan{ private int cows; public Masai(String n, int c) { super(n); // poziv Kenyan konstruktor cows = c; } public int getCows() { return cows; } public void speak() { System.out.println(Masai"); } }
SI1P1 2004 208/15

52

Kikuyu podklasa
public class Kikuyu extends Kenyan{ private int money; public Kikuyu(String n, int m) { super(n); // poziv money = m;

Pitanje

Kenyan konstruktor

} public int getMoney() { return money; } public void speak() { System.out.println(Kikuyu"); } }


SI1P1 2004 209/15

ta se dobija na izlazu? Masaid = new Masai(Johnson" 23); Kikuyu c = new Kikuyu(Sheila", 2200); System.out.println(d.getName() + " has " + d.getCows() + " cows"); System.out.println(c.getName() + " has " + c.getMoney() + " shillings"); Johnson has 23 cows Sheila has 2200 shillings
SI1P1 2004 210/15

Pravila nasleivanja

Konstruktor podklase

Koristi se slubena re extends da bi se naznailo koja klasa nasleuje koju klasu Podklasa nasleuje sva polja i sve metode superklase Koristi se slubena re super u okviru konstruktora podklasem da bi se pozvao kontruktor superklase

Prva stvar koju konstruktor podklase mora da uradi je da pozove konstruktor superklase Na ovaj nain se delovi koji pripadaju super klasi konstruiu pre delova koji su deo same podklase Ako se ne pozove konstruktor superklase pomou naredbe super i superklasa ima konstruktor bez argumenata, tada e se taj konstuktor pozati implicitno.
SI1P1 2004 212/15

SI1P1 2004

211/15

53

Primer
Ako je data klasa Food: public class Food { private boolean raw; public Food() { raw = true; } } I podklasa Beef: public class Beef extends Food { private double weight; public Beef(double w ) { weight = w } } 2004 SI1P1 Je ekvivalentno sa: public class Beef extends Food { private double weight; public Beef(double w) { super(); weight = w } }

Pitanje
public class A { public A() { System.out.println("I'm A"); } } public class B extends A { public B() { System.out.println("I'mB"); } } public class C extends B { public C() { System.out.println("I'mC"); } } ta e se pojaviti na ekranu nakon sledee naredbe? C x = new C(); I'm A I'm B I'm C
213/15 SI1P1 2004 214/15

Preklapanje metoda
Podklasa moe preklopiti odgovarajui metod svoje superklase

Poziv metoda superklase


Kada se preklopi odreeni metod, mogue je pozvati kopiju tog metoda superklase koristei naredbu super.metod()

ta se dobija na izlazu nakon izvravanja sledeih naredbi? ThermUS thermometer = new ThermUS(100); System.out.println(thermometer.getTemp()); 212
SI1P1 2004 215/15 SI1P1 2004 216/15

54

Koje se linije nee kompajlirati

Konverzija tipova

SI1P1 2004

217/15

SI1P1 2004

218/15

Primer
Kompanija ima listu Zaposlenih. Potrebno je napraviti stranicu za plaanje z asvakog zaposlenog. Na stranici se prikazuju opti podaci (ime, odeljenje, koliina plaanja, ) za sve zaposlene. Razliiti tipoi zaposenih menader, inenjerm sotverski inenjer Postoji stara verzija klase Employee ali je potrebno doti veoma razliite podatke i metode za menadere i inenjere. Neka je neko ukljuio staru Employee klasu u ssem. U okviroe klase postoji metod printData() za svaog zaposlenog i ovaj metod samo prikazuje ime zaposlnog. Potrebno je ovo promeniti, tako da se prikazuju i informacije o plaanju

Primer

SI1P1 2004

219/15

SI1P1 2004

220/15

55

Primer
class Employee { // Data private String firstName, lastName; // Constructor public Employee(String fName, String lName) {firstName= fName; lastName= lName;} // Method public void printData() {System.out.println(firstName+ " " + lastName);} }

Primer

SI1P1 2004

221/15

SI1P1 2004

222/15

Primer
class Engineer extends Employee { private double wage; private double hoursWorked; public Engineer(String fName, String lName, double rate, double hours){ super(fName, lName); wage = rate; hoursWorked= hours; } public double getPay() { return wage * hoursWorked;} public void printData() { super.printData(); // PRINT NAME System.out.println("Weeklypay: $" + getPay(); }}

Primer

SI1P1 2004

223/15

SI1P1 2004

class Manager extends Employee { private double salary; public Manager(String fName, String lName, double sal){ super(fName, lName); salary = sal; } public double getPay() { return salary; } public void printData() {super.printData(); System.out.println("Monthly salary: $" + salary);}}

224/15

56

Primer

Primer

class SalesManager extends Manager { private double bonus; // Bonus Possible as commission. // A SalesManagergets a constant salary of $1250.0 public SalesManager(StringfName, String lName, double b) { super(fName, lName, 1250.0); bonus = b; } public double getPay() {return 1250.0; } public void printData() {super.printData(); System.out.println("BonusPay: $" + bonus; } }
SI1P1 2004 225/15 SI1P1 2004 226/15

Primer

Klasa Object

SI1P1 2004

public class PayRoll{ public static void main(String[] args) { fred= new Engineer("Fred", "Smith", 12.0, 8.0); Manager ann= new Manager("Ann", "Brown", 1500.0); SalesManager mary= new SalesManager("Mary", "Kate", 2000.0); employees = new Employee[3]; employees[0]= fred; employees[1]= ann; employees[2]= mary; for (int i=0; i < 3; i++) employees[i].printData(); } }

Sve Javine klase implicitno nasleuju klasu java.lang.Object Tako da svaka klasa koja se napie automatski ima neke metode koji pripadaju klasi Object, kao o su equals, hashCode, i toString. Neki od ovih metoda e se obraivati u kasnijim lekcijama

227/15

SI1P1 2004

228/15

57

U ovoj lekciji

Uvod u programiranje 1 Java Obrada gre greaka pomou izuzetaka

ta predstavlja izuzetak Uobiajena terminologija Zato koristiti izuzetke Kako se deava izuzetak Kako se obrauje izuzetak O izuzecima koji se moraju obraditi i o onima koji se ne moraju Primeri Java izuzetaka Kako napisati svoj sopstveni izuzetak
229/15 SI1P1 2004 230/15

SI1P1 2004

ta predstavlja izuzetak?

Terminologija

Izuzetak je dogaaj koji se dogodio tokom izvravanja programa i moe da prouzrokuje prekid normalnog toka izvravanja instrukcija Mogui razlozi izuzetaka: Pristup elementu izvan granica niza Pokuaj upisa u read-only dokument Pokuaj itanja nakon kraja dokumenta Slanje nelegalnih argumenata nekom metodu Nelegalne aritmetike operacije (n.p. deljenje sa 0) Otkaz hardverskih resursa

Kada se izuzetak (exception) dogodi koristi se izraz da je baen izuzetak (throw) Kada se izvre odreene operacije sa izuzetkom kae se da je izuzetak obraen (handled) Deo koda pomou koga se izvre odreene operacije sa izuzetkom naziva se obrada izuzetaka (exception handler)

SI1P1 2004

231/15

SI1P1 2004

232/15

58

Zato koristiti izuzetke

Poruke kod izuzetaka

Pomou kompajliranja ne mogu se odrediti sve greke Na ovaj nain se odvaja kod za obradu izuzetaka od ostalog, regularnog koda
Jasnoa i razumljivost koda (debagovanje, timski rad, ...) Obrada izuzetaka se izvrava samo na jednom mestu

Odvojeni su delovi koda za prepoznavanje greke, izvetavanje i obradu Mogu se grupisati i odvojiti razliiti tipovi greaka Mogu se obraditi greke koje prouzrokuju veoma specifine izuzetke

public class ArrayExceptionExample{ public static void main(String args[]) { String[] names = {Bilha", Robert"}; System.out.println(names[2]); } } Naredba println u navedenom kodu e dovesti do greke i sledee poruke pri obradi datog izuzetka: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at ArrayExceptionExample.main(ArrayExceptionExample.j ava:4)
SI1P1 2004 234/15

SI1P1 2004

233/15

Poruke kod izuzetaka

Primeri

Poruke od izuzetaka imaju sledei format:

[exception class]: [additional description of exception] at [class].[method]([file]:[linenumber])

SI1P1 2004

235/15

SI1P1 2004

Poruka kod izuzetka u primeru sa nizovima java.lang.ArrayIndexOutOfBoundsException: 2 at ArrayExceptionExample.main(ArrayExceptionExample.j ava:4) Koja je klasa izuzetka? java.lang.ArrayIndexOutOfBoundsException Kom indeksu niza se pristupa, a on je izvan granica? 2 Koji metod generie izuzetak? ArrayExceptionExample.main Koji fajl sadri ovaj metod? ArrayExceptionExample.java Koja linija fajla generie izuzetak? 4

236/15

59

Generisanje izuzetaka

Obrada izuzetaka

Svi metodi mogu koriste naredbu throw da bi prihvatili izuzetak if (student.equals(null)) throw new NullPointerException(); Naredba throw zahteva poseban argument: throwable objekat Ova vrsta objekata je instanca bilo koje podklase Throwable klase Ova klasa obuhvata sve tipove greaka i izuzetaka U okviru opisa API mogu se pronai i opisi svih throwable objekata
237/15

Moe se koristiti try-catch blok da bi se obradio izuzetak koji se desio try{ // kod u okviru koga moe da se desi izuzetak } catch([Tip izuzetka] e) { // ta da se izvri ako se desio izuzetak }

SI1P1 2004

SI1P1 2004

238/15

Obrada vie izuzetaka istovremeno

finally blok
Moe se koristiti opcioni finally blok na kraju try-catch bloka finally blok obezbeuje mehanizam da regulie sve to se deilo u okviru try bloka Moe se iskoristiti za zatvranje fajla ili oslobaanja nekog drugog resursa Try-Catch-Finally Blok

Vie moguih izuzetaka se moe istovremeno obraditi pomou vie sukcesivnih catch blokova try{ // kod u okviru koga moe da se desi vie izuzetaka } catch (IOException e) { // obrada IOException } catch (ClassNotFoundException e2) { // obrada ClassNotFoundException }
239/15

try{ // kod u okviru koga moe da se desi izuzetak } catch([Type of Exception] e) { // ta da se izvri ako se desio izuzetak } finally{ // naredbe u okviru bloka e se uvek izvriti // bez obzira ta e se dogoditi u okviru bloka }
SI1P1 2004 240/15

SI1P1 2004

60

Izuzeci koji se ne mogu proveravati

Izuzeci koji se mogu proveriti


Izuzeci koji se mogu proveriti (checked exceptions) ili non-runtime exceptions su izuzeci koji se mogu desiti izvan Java runtime sistema Na primer izuzeci koji se mogu desiti tokom ulazno/izlaznih operacija su non-runtime izuzeci Kompajler proverava da li su non-runtime izuzeci obraeni (ili specificirani korienjem throws naredbe)

Izuzeci koji se ne mogu proveravati (unchecked exceptions) ili runtime izuzeci se pojavljuju u okviru Java runtime sistema Primeri ovih izuzetaka Aritmetike operacije (deljenje sa nulom) pointer exceptions (pokuaj da se pristupi lanu objekta pomou null reference) Izuzeci sa indeksima (pokuaj da se pristupi elementu niza sa indeksom koji je preveliki ili premali) Metod koji ne sadri catch ili specificira da moe da generie unchecked exceptions, takoe moe u nekim sluajevima ih generisati
241/15

SI1P1 2004

SI1P1 2004

242/15

Obrada izuzetaka koji se mogu proveriti


Svaki metod mora obraditi izuzetak koji se moe proveriti ili specificirati da takav izuzetak postoji (korienjem throws naredbe) void readFile(Stringfilename) { try { FileReaderreader = new FileReader("myfile.txt"); // read from file . . . } catch (FileNotFoundExceptione) { System.out.println("filewas not found"); } } ILI void readFile(Stringfilename) throws FileNotFoundException{ FileReaderreader = new FileReader("myfile.txt"); // read from file . . . } SI1P1 2004

Hijerarhija klasa

243/15

SI1P1 2004

244/15

61

Nasleivanje i izuzeci
Metod moe specificirati manje izuzetaka, ali ne vie od metoda koji nasleuje public class MyClass { public void doSomething() throws IOException, SQLException { // do something here } } public class MySubclass extends MyClass { public void doSomething() throws IOException { // do something here } }

Pisanje sopstvenih izuzetaka


Postoje najmanje 2 tipa konstruktora izuzetaka: Default konstruktor: bez argumenata NullPointerExceptione = new NullPointerException(); Konstruktor koji ima detaljnu poruku: postoji jedan String argument IllegalArgumentExceptione e = new IllegalArgumentException(Broj mora biti pozitivan");

SI1P1 2004

245/15

SI1P1 2004

246/15

Pisanje sopstvenih izuzetaka


Sopstveni izuzeci moraju biti podklase klase Exception i moraju imati najmanje dva standardna konstruktora public class MyCheckedException extends IOException{ public MyCheckedException() {} public MyCheckedException(String m){ super(m);} } public class MyUncheckedException extends RuntimeException{ public MyUncheckedException() {} public MyUncheckedException(String m) {super(m);} }
SI1P1 2004 247/15

Checked ili Unchecked?


Ako korisnik oekuje da se izuzetak pojavi, trebalo bi da bude tipa checked Ako korisnik ne moe da preduzme nita da bi se oporavio od datog izuzetka, trebalo bi da bude unchecked tipa

SI1P1 2004

248/15

62

Sadraj lekcije
Izuzeci naruavaju normalno izvravanje instrukcija u okviru programa Izuzeci se obrauju pomou try-catch ili try-catchfinally bloka Metod specificira postojanje izuzetka pomou throw naredbe Metod koji nema catch deo ili ne specificira da postoji unchecked izuzetak, moe da ga generie Svaki metod mora obraditi checked izuzetke ili specificirati da postoje Ako se pie spostveni izuzetak, on mora biti podklasa klase Exception i imati najmanje dva standardna konstruktora
249/15 SI1P1 2004

Uvod u programiranje 1 Java UlazUlaz-izlaz

SI1P1 2004

250/15

U ovoj lekciji

Osnove ulaz/izlaz

Lekcija je podeljena u dva glavna dela: I Ulaz/Izlaz: Ulaz ili Izlaz, i Byte ili Character nizovi Najvanije Stream klase i njihova upotreba Primeri itanja iz i upisa u tekstualni fajl Primeri prihvatanja teksta sa tastature Upotreba bafera II Uvod u postupak parsiranja: Delimiteri StringTokenizer

I/O = Input/Output ulaz/izlaz komunikacija izmeu raunarskog programa i spoljanjih izvora informacija Ukljuuje: - itanje ulaznih podataka iz izvora Upis rezultata u krajnje odredite itanje i upis su specifirani pomou 4 abstraktne klase:
Reader Writer InputStream OutputStream

SI1P1 2004

251/15

SI1P1 2004

252/15

63

Java I/O Streams

Input i Output Stream

Java programi komuniciraju sa spoljanjim svetom pomou Streams Streams se koriste za itanje i upis podataka I/O Streams su jednodirekcioni Ulazni (Input) stream se koristi za ulazne podatke u program Izlazni (output) stream se koristi za podatke koji predstavljaju rezultat izvravanja programa Izvor i odredite podataka mogu biti: fajlovi, mrene konekcije, drugi programi, ...

Objekat pomou koga moemo proitati ulazne podatke je Input Stream

Objekat pomou koga moemo prikazati izlazne podatke je Output Stream


254/15

SI1P1 2004

253/15

SI1P1 2004

Byte i Character

Najvanije Stream klase

Byte Streams se koristi da bi se itali i upisivali podaci koji su u binarnom formatu (1 ili 0) Na primer slike, zvuk, ... Character Streams se koristi da bi se itali i upisivali podaci koji su u tekstualnom formatu (karakteri)

Na primer tekstualni fajlovi, web stranice, unos korisnika pomou tastature, ...

FileInputStream

itanje podataka u binarnom formatu iz fajlova


FileOutputStream

Upis podataka u binarnom formatu u fajlove


FileReader

itanje tekstualnih podataka iz fajlova


FileWriter

Upis tekstualnih podataka u fajlove

SI1P1 2004

255/15

SI1P1 2004

256/15

64

Rad sa Stream klasama

Java I/O klase

1. Otvaranje streama instanciranjem novog stream objekta 2. Rad sa informacijama pomou read/write, read/write u okviru metoda Stream klasa 3. Zatvaranje streama pozivom close() metoda datog objekta

Paket java.io sadri klase koje s ekoriste za itanje/upis podataka iz/u fajlove Da bi se itali/upisivali podaci, moraju se intancirati podklase jedne od sledee 4 abstraktne superklase:

SI1P1 2004

257/15

SI1P1 2004

258/15

Upotreba Reader klase

itanje iz tekstualnog fajla

Klasa Reader se koristi za itanje karaktera ulaznog streama Ova klasa sari metode za itanje pojedinanog karaktera i niza karaktera, na primer int read() Klasa Reader je apstraktna, tako da se mora instancirati u podklasi koja mora preklopiti ove metode

SI1P1 2004

259/15

SI1P1 2004

260/15

65

BufferedReader klasa
BufferedReader je podklasa klase Reader Skuplja (buffers) karakter stream iz FileReader i sadri metod readLine() za efikasno itanje ulazne linije karaktera FileReader fr = new FileReader("myFile.txt"); BufferedReader br= new BufferedReader(fr); Merod readLine() kao rezultat vraa vrednost null ako nema vie linija za itanje

Upotreba BufferedReader klase

SI1P1 2004

261/15

SI1P1 2004

262/15

Klasa Writer

Upis u tekstualni fajl

Klasa Writer je apstraktna klasa koja se koristi upis karakter stream-ova Ova klasa sadri metode za upis pojedinanog karaktera i stringova Na primer void write(int c) BufferedWriter (podklasa klase Writer) sadri metode za efikasni upis Metodom newLine() se upisuje prazna linija, a metodom write(String n) se upisuju konkretni podaci Kada se zavri eljena operacija potrebno je zatvoriti Write pomou metoda close()
263/15 SI1P1 2004 264/15

SI1P1 2004

66

Kopiranje fajlova

Prihvatanje podataka sa tastature


Unos podataka sa tastature u formi Streama se oznaava kao "standardni" unos, ali za itanje unetih podataka potrebno je koristiti objekat klase Reader InputStream se koristi kao prelazna klasa, koja uzima podatke iz Streama i konvertuje ih u tip Reader Da bi se itali karakteri pomou InputStream, potrebno ih je podeliti u okviru InputStreamReader Da bi se itala linija po linija, potrebno je podeliti InputStreamReader sa BufferedReader

SI1P1 2004

265/15

SI1P1 2004

266/15

Prihvatanje podataka sa tastature

Zakljuak
Potrebno je prouiti hijerarhiju klasa InputStream i OutputStream, kao i Reader i Writer u okviru Java dokumentacije da bi se uoile sve postojee podklase i metodi koji se mogu koristiti Treba koristiti Java API!!!

SI1P1 2004

267/15

SI1P1 2004

268/15

67

Parsiranje

Delimiteri
Kada su podaci smeteni u tekstualnom formatu, delimiter karakteri se koriste da bi se odvojili delovi (tokens) podataka Na primer pojedinana imena u listi su odvojena pomou delimitera '#': Lana#Pera#Maja#Mika Ista lista sa delimiterom novom linijom: Lana Pera Maja Mika Ostali delimiteri koji se koriste su | ili : ili tab
270/15

U okviru programa podaci se obino konvertuju u tekstualni format pre nego to se upiu u fajlove Kasnije je potrebno upisane podatke iz tekstualnih fajlova konvertovati u originalne podatke Proces dekodovanje teksta u podatke se jo naziva i parsiranje

SI1P1 2004 269/15

SI1P1 2004

StringTokenizer
Kada se pokuava proitati nova ulazna linija, kao rezultat se dobija jedan, u optem sluaju dugaki string. Potrebno je pronai delimitere u okviru tog stringa i odvojiti svaki pojedinani deo informacije (tokens) Da bi se obavila ova operacija koristi se klasa StringTokenizer u okviru paketa java.util

StringTokenizer
Kada se formira tokenizer objekat, potrebno je specificirati koji se karakteri koriste kao delimiteri u konkretnom sluaju Default konstruktori pretpostavljaju da su \t\n\r delimiteri StringTokenizerr = new StringTokenizer(line); Drugi konstruktori prihvataju kao argument String koji moe definisati proizvoljan niz karaktera kao delimiter

SI1P1 2004

271/15

SI1P1 2004

String line = myFile.readline(); StringTokenizert = new StringTokenizer(line, #); StringTokenizers = new StringTokenizer(line, ,\&\|);

272/15

68

StringTokenizer
Korisni StringTokenizer metoda: Metod nextToken() u formi stringa kao rezultat vraa sledei podatak izmeu delimitera u okviru teksta Metod hasMoreTokens() u formi boolean vraa rezultat true ako se u tekstu nalazi jo tokena

StringTokenizer

SI1P1 2004

273/15

SI1P1 2004

274/15

Parsiranje brojeva
esto je potrebno parsirati brojeve smetene kao tekst u okviru Java promenljivih Klase koje sadre statike metode za razne konverzije su int Integer.parseInt(Strings) double Double.parseDouble(Strings) Potrebno je obraditi izuzetak NumberFormatException ako se specificirani String ne moe konvertovati u okviru promenljive

SI1P1 2004

275/15

69

You might also like