69
1 © SI1P1 2004 1/15 Uvod Uvod u u programiranje programiranje 1 1 Java Java Uvod Uvod © SI1P1 2004 2/15 Uvod Šta je program Kako napisati pravilno program za računar Prednosti i mane korišćenja Jave Kako program napisan u Javi promeniti u formu koju svaki računar razume Primer Java koda i komentari © SI1P1 2004 3/15 Pisanje programa i spremanje hrane © SI1P1 2004 4/15 Pisanje programa i spremanje hrane

Predavanje Java

Embed Size (px)

Citation preview

Page 1: Predavanje Java

1

© SI1P1 – 2004 1/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaUvodUvod

© SI1P1 – 2004 2/15

Uvod

Šta je programKako napisati pravilno program za računarPrednosti i mane korišćenja JaveKako program napisan u Javi promeniti u formu koju svaki računar razumePrimer Java koda i komentari

© SI1P1 – 2004 3/15

Pisanje programa i spremanje hrane

© SI1P1 – 2004 4/15

Pisanje programa i spremanje hrane

Page 2: Predavanje Java

2

© SI1P1 – 2004 5/15

Šta predstavlja računarski program

Da bi računar mogao da izvrši određene zadatke (na primer odštampa ocene koje student dobije na ispitu), moraju mmu se zadati instrukcije za obavljanje zadatkaSkup instrukcija koje vode računar da izvrši određeni zadatak čine računarski programMi pišemo program (skup instrukcija) u programskim jezicima kao što su C, Pascal ili JavaKoristimo ove programske jezike jer su razumljivi čovekuAli kako računar razume instrukcije koje mu zadajemo?

© SI1P1 – 2004 6/15

Kompajliranje

Računari ne razumeju programe napisane u programskim jezicima kao što su Pascal i JavaProgrami se moraju prvo kompajlirati ili prevesti u mašinski kod koji računar može da izvršavaProgram i postupak pomoću koga se kod programskog jezika prevodi u mašinski kod naziva se kompajler i kompajliranjeRazličite platforme, ili hardver sa operativnim sistemom zahtevaju različit mašinski kod, programi se moraju odvojeno kompajlirati za različite platforme

© SI1P1 – 2004 7/15

Kompajliranje

© SI1P1 – 2004 8/15

Java kompajliranje

Java kompajler stvara bytecode, a ne mašinski kodBytecode se konvertuje u mašinski kod pomoću JavainterpreteraTako se može pokrenuti bytecode na bilo kom računaru koji ima instaliran Java interpreter

Page 3: Predavanje Java

3

© SI1P1 – 2004 9/15

Pokretanje programa

© SI1P1 – 2004 10/15

Pokretanje programa

Ulazni podaci (inputs)• Mogu se dobiti iz mnogih izvora, kao što je korisnik, fajlovi, ili drugi programi• Mogu biti u različitim formama, kao što je tekst, slika ili zvuk

Izlazni podaci (outputs)• Takođe mogu biti u različitim formama, kao što su brojevi, slike, zvukovi, ili

komande drugim programima

© SI1P1 – 2004 11/15

Izvršavanje programa

© SI1P1 – 2004 12/15

Primer

Želite da napišete program koji sabira dva brojaŠta predstavlja ulazne podatke za vaš program?• dva broja

Šta vaš program radi?• sabira dva broja

Šta je izlaz vašeg programa program?• zbir dva broja

Page 4: Predavanje Java

4

© SI1P1 – 2004 13/15

Kompajliranje i izvršavanje programa u Javi

© SI1P1 – 2004 14/15

Prednosti korišćenja Jave

Kada se jednom kompajlira Java program, tada se bytecode može izvršavati na bilo kojoj mašini koja ima Java interpreterZato što se ne mora rekompajlirati prgram za svaku mašinu, Java je platformski neutralnaJava je bezbedna. Drugim rečima, Java i kompajler štite računar od čestih programerskih grešaka i opasnih operacijaJava standardizuje mnoge korisne operacije kao što je upravljanje mrežnim konekcijama i obezbeđuje grafički korisnički interfejs

© SI1P1 – 2004 15/15

Mane korišćenja Jave

Izvršavanje bytecode pomoću interpretera je sporije nego izvršavanje mašinskog koda, koji je specifičan za svaku posebnu platformu.Korišćenje specifičnih mogućnosti pojedine platforme (Windows taskbar) je teško pomoću Javajezika jer je platformski neutralan.Da bi sse pokrenuo Java program na više mašina,mora se instalirati Java interpreter na svakoj od njih

© SI1P1 – 2004 16/15

Primer

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

Page 5: Predavanje Java

5

© SI1P1 – 2004 17/15

Komentari

Komentari se koriste da opišu napisani kod i da se bolje razume smisao. Java kompajler ga ignoriše.Komentari se dobijaju korišćenjem//, što definiše komentar do kraja linije/* */, što definiše komentar za sve što se nalazi između, uključujući više linijaPrimeri dve vrste komentara:

/* HelloWorld klasa prikazuje “Hello,World!” na ekranu */

// Prints “Hello, World!”© SI1P1 – 2004 18/15

Pregled lekcije

Šta je programKako napisati pravilno program za računarPrednosti i mane korišćenja JaveKako program napisan u Javi promeniti u formu koju svaki računar razumePrimer Java koda i komentari

© SI1P1 – 2004 19/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaPromenljivePromenljive i i osnovniosnovni tipovitipovi podatakapodataka

© SI1P1 – 2004 20/15

Uvod

Šta su promenljive• Tipovi promenljivih• Imena promenljivih• Dodele vrednosti

Primitivni tipovi podatakaOstali tipovi podataka (String)

Page 6: Predavanje Java

6

© SI1P1 – 2004 21/15

Promenljive

U matematičkoj algebri, promenljive su simboli koji predstavljaju određene vrednosti u formulama

Na primer promenljiva x u sledećoj formulif(x)=x*2+2

Može predstavljati bilo koju numeričku vrednostSlično, promenljive u računarskim programimasu simboli koji predstavljaju određene podatke

© SI1P1 – 2004 22/15

Promenljive

Promenljive se mogu predstaviti kao prazne kutije u koje se mogu smestiti određene vrednostiNa kutiju se može nalepiti nalepnica sa imenom, na primer “KutijaX” i koristiti više putaTakođe mogu se obavljati određene operacije, bez obzira na sadržaj same kutije:• “Pomeri KutijuX na policu A”• –“Postavi predmet Z u KutijuX ”• –“Otvori KutijuX”• –“Ukloni sadržaj iy KutijeX”

© SI1P1 – 2004 23/15

Promenljive i Java

Promenljive u Javi imaju svoj tip.Tip promenljive definiše koja vrsta vrednosti se može zapamtiti u okviru promenljiveAnalogija sa kutijom – tip promenljive je veličina ili oblik prazne kutijeU formuli

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

© SI1P1 – 2004 24/15

Tipovi promenljivih u Javi

Celobrojni tipovi:–int: većina brojeva se predstavlja pomoću ovog tipa–long: veliki brojevi, u oblasti istraživanja, finansija, računara. –short: mali brojevi, ne mnogo korisno.–byte: veoma mali brojeviFloating Point (Decimalni) tipovi:–float: Single-precision decimalni brojevi–double: Double-precision decimalni brojeviOstali tipovi:–String: tekstualni tip.–boolean: tačno ili netačno (true ili false)–char: Alfanumerički karakteri

Page 7: Predavanje Java

7

© SI1P1 – 2004 25/15

Deklaracija promenljivih u Javi

Promenljive se kreiraju tako što se deklariše njihov tip i ime na sledeći način:– 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 26/15

Dodela vrednosti promenljivih u Javi

Dodela vrednosti promenljivih se obavlja koristeći sledeću sintaksu:– ime = vrednost;Na primer:– x = 100;– pozdrav=“Zdravo”;Nelegalno je dodeliti promenljivoj vrednost pogrešnog tipa:– x = “Zdravo”;– x = 1.2;– pozdrav = 123;U okviru jednog koraka može se promenljiva deklarisati i dodeliti joj se vrednost– int x =100;– String pozdrav=“Zdravo”;

© SI1P1 – 2004 27/15

Imenovanje promenljivih u Javi

Imena promenljivih (identifikatori) mogu biti proizvoljne dužine, ali moraju početi sa:– slovo (a –z), –znak dolar ($),–ili, donjom crtom ( _ ).Imena promenljivih ne mogu sadržavati specijalne operacione simbole kao što su +, -, *, /, &, %, ^, ...Korišćenje rezervisanih reči Jave je takođenelegalno.Na primer “class”, “static”, “int”, ...

© SI1P1 – 2004 28/15

Imenovanje promenljivih u Javi

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 počinju malim slovom i da svaka reč unutar imena počinje sa velikim: “studentIspitOcena”.

Page 8: Predavanje Java

8

© SI1P1 – 2004 29/15

Imenovanje promenljivih u Javi

Koja imena su validna?

1.$amount2.6tally3.my*Name4.salary5._score6.first Name7.total#8.short

© SI1P1 – 2004 30/15

Celobrojni tip

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 velikoInteger Overflows: Šta se dešava ako se pokuša smestiti veća vrednost u tip podataka?

© SI1P1 – 2004 31/15

String tip

String nije primitivan tip podataka. Oni nasleđuju klasu Object, diskutovaće se kasnije.String je niz karaktera između apostrofa “ i “ naprimer“neki tekst”.

Stringovi mogu koristiti specijalan operator + kojikreira novi String:– String pozdrav= “Zd”+ “ravo”;–String josJedanPozdrav= pozdrav+ “!”;

© SI1P1 – 2004 32/15

Racionalni tip

Inicijalizuju decimalnu vrednost broja:– double y = 1.23;– double w = -3.21e-10; // -3.21x10-10Koristi se ‘d’ da bi se vrednost prikazala kao decimalna:– double y = 1d/3; // y = .333333333– double z = 1/3; // z = 0.0 … Zašto?Float se može definisati kao i double, ali treba dodati i ‘f’:– float z = 1.23f;Double je precizniji nego Floats, ali izvršavanje operacija duže traje

Page 9: Predavanje Java

9

© SI1P1 – 2004 33/15

Logički tip

Boolean (logički tip) je tip podataka koji se koristi u situacijama kada postoje dve opcije tačno ili netačno (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 tokaPrimer:– boolean daLiCitati = true;– boolean fileOpen = false;

© SI1P1 – 2004 34/15

Karakter

Karakter je tip podataka koji se koristi da bi se predstavio pojedinačan karakter, kao što je slovo, broj, određeni znak ili neki drugi simbol.Karakteri su pojedinačni simboli smešteni između jednostrukih navodnikaNe treba ih izjednačavati sa String-ovima.Primer:– char prvoSlovoImena = 'e' ;– char pitanje = '?' ;

© SI1P1 – 2004 35/15

Pitanja

Koje tipove podataka treba koristiti za sledeće informacije?:1. Broj stanovnika Srbije2. Broj stanovnika na Zemlji3. рi4. Status dokumenta (otvoren/zatvoren)5. Ime6. Prvo slovo imena7. $ 237.66intlongdoublebooleanStringchardouble © SI1P1 – 2004 36/15

Iskazi

Iskazi su komande koje dovode do određenih događajaSvi iskazi moraju se završavati sa “;”Deklarisanje promenljiv je jedan iskazDodeljivanje vrednosti promenljivoj je jedan iskazPoziv metoda ili funkcije su iskazi:– System.out.println(“Hello, World”);U narednim lekcijama ćemo učiti kako da se kontroliše izvršavanje iskaza

Page 10: Predavanje Java

10

© SI1P1 – 2004 37/15

Rezervisane reči

© SI1P1 – 2004 38/15

Tipovi podataka

© SI1P1 – 2004 39/15

Tipovi podataka

© SI1P1 – 2004 40/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaOperatoriOperatori

Page 11: Predavanje Java

11

© SI1P1 – 2004 41/15

Uvod

Šta su operatoriAritmetički operatori, kao što su +, -Operator dodele vrednostiInkrement/Dekrement operatori, ++Relacionalni operatoriKondicionalni operatori

© SI1P1 – 2004 42/15

Šta su operatori

Operatori su specijalni simboli koji se koriste za:-matematičke funkcije-iskaze dodele vrednosti-logička upoređivanjaPrimeri upotrebe operatora:3 + 5 // korišćenje + operatora14 + 5 –4 * (5 –3) // korišćenje +, -, *

operatoraIzrazi su kombinacija promenljivih, konstanti i operatora i definišu određenu vrednost

© SI1P1 – 2004 43/15

Grupe operatora

Postoji 5 različitih groupa operatora:• Aritmetički operatori, • Operator dodele vrednosti• Inkrement/Dekrement operatori• Relacionalni operatori• Kondicionalni operatori

U nastavku predavanja svaka grupa će se razmatrati detaljno

© SI1P1 – 2004 44/15

Aritmetički operatori

Java ima 6 osnovnih aritmetičkih operatora:+ sabiranje- oduzimanje* množenje/ deljenje% modul (ostatka)^ eksponentPrioritet ili izvršavanje operacija koje se nalaze u okviru izraza može se definisati u akronimuPEMDAS.

Page 12: Predavanje Java

12

© SI1P1 – 2004 45/15

Proritet izvršavanja operacija

Proritet izvršavanja operacija(PEMDAS)1.Parentheses - zagrade2.Exponents - eksponenti3.Multiplication and Division from left to right –množenje 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

© SI1P1 – 2004 46/15

Proritet izvršavanja operacija

Primer: 10 + 15 / 5;Rezultat se razlikuje u zavisnosti od toga da li se prvo izvršava sabiranje ili deljenje(10 + 15) / 5 = 510 + (15 / 5) = 13Ako ne postoje zagrade Java će izvršiti drugi slučajTrebalo bi koristiti uvek zagrade da bi se izbegla konfuzija

© SI1P1 – 2004 47/15

Celobrojno deljenje

U prethodnom primeru rezultat deljenja (10 + 15) / 5 je bio celobrojan (5).Ali šta se dečava ako hocmo da izvršimo operaciju 63 / 35?U zavisnosti od tipa podatka u kome su smešteni brojevi, dobijamo različite 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!

© SI1P1 – 2004 48/15

Operator dodele vrednosti

Osnovni operator dodele (=) dodeljuje vrednost ex promenljivoj varvar= expr;Java dozvoljava da se kombinuju aritmetičkii operator dodele u jedinstven operatorPrimeri:x= x+ 5; je isto što i x+= 5;y= y* 7; je isto što i y*= 7;

Page 13: Predavanje Java

13

© SI1P1 – 2004 49/15

Inkrement/dekrement

++ se zove inkrement operator. Koristi se da bi se povećala vrednost promenljive za 1.Na primer:i= i+ 1;

Može se napisati i kao:++i;

ili i++;-- se zove dekrement operator. Koristi se da bi se smanjila vrednost promenljive za 1.i= i-1;

Može se napisati i kao :--i;

ili i--; © SI1P1 – 2004 50/15

Inkrement/dekrement

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 izrazuPrimer:int numOranges= 5;int numApples= 10;int numFruit;numFruit= ++numOranges+ numApples;numFruit je dobio vrednost 16numOranges je dobio vrednost 6

© SI1P1 – 2004 51/15

Inkrement/dekrement

Postfix forma i++, i -- prvo izvrši ceo izraz, pa onda poveća/smanji vrednost promenljivePrimer:int numOranges= 5;int numApples= 10;int numFruit;numFruit= numOranges++ + numApples;numFruit je dobio vrednost 15numOranges je dobio vrednost 6

© SI1P1 – 2004 52/15

Relacionalni operatori

Relacionalni operatori upoređuju dve vrednostiDobijeni rezultat je logičkog tipa (true ili false) u zavisnosti od relacije operanada

Page 14: Predavanje Java

14

© SI1P1 – 2004 53/15

Primer relacionalnih operatora

int x= 3;int y= 5;boolean result;1) result= (x> y);U ovom slučaju vrednost promenljive result je falsezato što 3 nije veće od 52) result= (15 == x*y);U ovom slučaju vrednost promenljive result je truezato što proizvod 3 i 5 jeste jednak 153) result= (x != x*y);

• U ovom slučaju vrednost promenljive result je truezato što proizvod 3 i 5 jeste različit od 3

© SI1P1 – 2004 54/15

Kondicionalni operatori

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

© SI1P1 – 2004 55/15

Tabela istinitosti

© SI1P1 – 2004 56/15

Primer

boolean x= true;boolean y= false;boolean result;1. result= (x&& y);U ovom slučaju vrednost promenljive result je false

2. = ((x|| y) && x);

(x|| y) je true(true && x) je trueU ovom slučaju vrednost promenljive result je true

Page 15: Predavanje Java

15

© SI1P1 – 2004 57/15

Korišćenje && i ||

Java izvršava skraćeno izračunavanje: to znači da pri izračunavanju && i || izraza sa leve ka desnoj strani, čim se pronađe rezultat prestaje se sa daljim izračunavanjem.Primer:(a && (b++ > 3))(x || y)Java će izračunati a pre (b++ > 3)x pre y

© SI1P1 – 2004 58/15

Korišćenje && i ||

(a && (b++ > 3));Šta se dešava ako je a false?Java neće ni izračunavati izraz (b++ > 3), ako je levi operand false, jer je rezultat automatski false. To dovodi do toga da se vrednost b nećeinkrementirati(x || y);Šta se dešava ako je x true?Slično, neće se izračunati vrednost desnog operanda, jer je rezultat sigurno true.

© SI1P1 – 2004 59/15

Primer

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 60/15

Operatori

Sve o Java operatorimahttp://java.sun.com/docs/books/tutorial/java/nutsandbolts/opsummary.html

Page 16: Predavanje Java

16

© SI1P1 – 2004 61/15

Izrazi

Izrazi su komande koje dovode do određenih događajaSvi izrazi moraju se završavati sa “;”Deklarisanje promenljiv je jedan izrazDodeljivanje vrednosti promenljivoj je jedan izrazPoziv metoda ili funkcije su izrazi:– System.out.println(“Hello, World”);U narednim lekcijama ćemo učiti kako da se kontroliše izvršavanje izraza

© SI1P1 – 2004 62/15

Rezervisane reči

© SI1P1 – 2004 63/15

Tipovi podataka

© SI1P1 – 2004 64/15

Tipovi podataka

Page 17: Predavanje Java

17

© SI1P1 – 2004 65/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaKontroleKontrole tokatoka

© SI1P1 – 2004 66/15

Uvod

Šta su kontrolne struktureTipovi kontrolnih struktura:

– Blok– Izrazi odlučivanja– Petlje

© SI1P1 – 2004 67/15

Šta su kontrolne strukture

Bez kontrolnih struktura, računar bi izvršavao instrukcije iz programa korak-po-korakKontrolne strukture omogućavaju promenu:

– redosled po kome će se instrukcije izvršavati– koje instrukcije će se izvršavati– kontrola toka samog programa

Kontrolne strukture uključuju:–blokovske izraze (sve što se nalazi unutar

velikih zagrada)– izraze odlučivanja– petlje

© SI1P1 – 2004 68/15

if struktura

“if” klauzula doprinosi uslovnom izvršavanju programaif (expression) {statement;}next_statement;Izraz expression mora biti logičkog tipa i njegova vrednost mora biti true ili falseAko je vrednost izraza expression true, izvršavaju se izrazi statement, pa nakon njih next_statementAko je vrednost izraza expression false, izrazi statement se neće izvršiti i program će nastaviti sa izvršavanjem next_statement

Page 18: Predavanje Java

18

© SI1P1 – 2004 69/15

if struktura

© SI1P1 – 2004 70/15

if-else struktura

Osnovna “if” struktura se može proširiti dodavanjem “else”uslova, da bi se definisalo šta se dešava ukoliko uslov nije ispunjenif (expression) {

statement1;}else{

statement2;}

next_statement;Ponovo izraz expression mora biti logičkog tipa i njegova vrednost mora biti true ili falseAko je vrednost izraza expression true, izvršavaju se izrazi statement1, pa nakon njih next_statement.Ako je vrednost izraza expression false, izvršavaju se izrazi statement2, pa nakon njih next_statement.

© SI1P1 – 2004 71/15

if-else struktura

© SI1P1 – 2004 72/15

Ugnježđeni if-else

Moguće je kombinovati više if-else izraza jedan unutar drugog i nataj način dobiti višestruke 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.");

elseSystem.out.println("Pera je dobio F.");

Page 19: Predavanje Java

19

© SI1P1 – 2004 73/15

switch struktura

switch struktura je drugi način da se testira više vrednosti jednog izrazaVrednost izraza expression mora biti tipa char,byte,short ili int, ali ne može biti long,float, String ili double.

switch (expression) {case value1:

statement1;case value2:

statement2;default:

default_statement;}Napomena: Svaki izraz nakon true slučaja će se izvršiti

© SI1P1 – 2004 74/15

switch struktura

© SI1P1 – 2004 75/15

switch struktura

break; izraz definiše računaru izlazak iz switch strukture

switch (expression) {case value1:

statement1;break;

case value2:statement2;break;

default:default_statement;break;

}

© SI1P1 – 2004 76/15

switch struktura

Page 20: Predavanje Java

20

© SI1P1 – 2004 77/15

switch struktura

© SI1P1 – 2004 78/15

Petlje

Petlje dozvoljavaju izvršavanje izraza ili bloka više izraza nekoliko putaPostoje tri tipa petlji u Javi:for petljewhile petljedo-while petlje (neće se razmatrati u okviru ovog kursa)

© SI1P1 – 2004 79/15

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 početne uslove petlje i izvršava se pre samog starta petlje

2. Petlja se izvršava sve dok je uslov true i ponavlja se izvršavanje izraza

3. Treći deo kontrolnih informacija je inkrement,koji se koristi za promenu brojača petlje. Ovaj postupak se izvršava na kraju svake iteracije petlje.

© SI1P1 – 2004 80/15

for petlja

Page 21: Predavanje Java

21

© SI1P1 – 2004 81/15

for petlja

for(int div = 0; div<1000; div++) {if(div% 12 == 0){System.out.println(div+“je deljivo sa 12");}

}U okviru izvršavanja ovog primera će se prikazati svaki broj od 0 do 999 koji je deljiv sa 12.

© SI1P1 – 2004 82/15

for petlja

Ako se u uslovu inicijalizacije i inkrementapojavljuje više 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++;

}

© SI1P1 – 2004 83/15

while petlja

while (expression){statement

}

while petlja se izvršava sve dok logički izraz expression ima vrednost true. Kada expression postane false, izvršavanje se nastavlja sa prvom instrukcijom iza petljeIzraz se proverava na početku petlje, pa ako inicijalno ima vrednost false, telo petlja se neće izvršiti nijednom.

© SI1P1 – 2004 84/15

while petlja

Page 22: Predavanje Java

22

© SI1P1 – 2004 85/15

while petlja

© SI1P1 – 2004 86/15

Korišćenje break naredbe

U prethodnim primerima je naredba break korišćena u okviru switch strukture.U petljama,ova naredba se može koristiti da bi se izašlo iz trenutne petlje

int index = 0;while (index <= 10){

index++;if (index==3)break;System.out.println(“Indeks je “ + index);

}

Indeks je 1Indeks je 2

© SI1P1 – 2004 87/15

Petlja unuta petlje

Moguće je unutar bilo koje vrste petlje ubaciti bilo koju vrstu petlje

© SI1P1 – 2004 88/15

Pitanja 1

U okviru programa realizuje se i opcija za podizanje para sa računa. Kako treba koristiti if strukturu da bi se korektno izvršila data opcija.If struktura se koristi da bi se proverilo da li je iznos koji se podiže manji ili jednak trenutnom iznosu u banci.

Page 23: Predavanje Java

23

© SI1P1 – 2004 89/15

Pitanja 2

Kako se može implementirati funkcija AbsoluteValue, funkcija koja kao rezultat vraća pozitivnu vrednost unetog brojaBolje je koristiti if strukturu nego switch.

© SI1P1 – 2004 90/15

Pitanja 3

Šta je rezultat izvršavanja sledeće petlje?

for (int i=100; i>=0; i--) {System.out.println(i);

}

Brojevi od 100 do 0.

© SI1P1 – 2004 91/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaNizovi Nizovi –– nanaččin organizovanja podatakain organizovanja podataka

© SI1P1 – 2004 92/15

Šta su nizovi

Niz je serija odeljaka koji služe za smeštanje podataka.To je u stvari blok promenljivih.U Javi, nizovi mogu da obuhvate samo jedan tip podataka. Na primer niz može obuhvatiti samo članove koji su celobrojni borjevi ili samo članove koji su stringovi

Page 24: Predavanje Java

24

© SI1P1 – 2004 93/15

Nizovi

Nizove definiše tip, ime i veličina.Niz od tri celobrojne veličine koji se zove prices:

Niz od tri string veličine koji se zove people

Pojedinačna vrednost u okviru niza je element niza.Pozicija svakog elementa u okviru niza je njegovindeks.

© SI1P1 – 2004 94/15

Deklarisanje nizova

Deklaracija nizova je slična deklaraciji običnih promenljivih, samo što se koriste srednje zagrade [].– tipPodataka[] imeNiza;

– int[] prices;– String[] people;Na drugi način deklarisanje je moguće:

– tipPodataka imeNiza[];

– int prices[];

© SI1P1 – 2004 95/15

Rezervisanje prostora

Za razliku od običnih promenljivih pri korišćenju nizova, potrebno je rezervisati željenimemorijskiprostor. (U jeziku C postoji naredba malloc())Koristi se ključna reč new da bi se rezervisala memorija:– imeNiza = new tipPodataka[veličina];

– prices = new int[3];– people = new String[4];Prvi primer rezerviše prostor za niz celih brojeva veličine 20, a drugi primer niz Stringova veličine 10. Može se kombinovati deklaracija sa rezervisanjem– int[] prices=new int[3];

© SI1P1 – 2004 96/15

Indeksi

Pojedinačnom elementu niza se pristupa pomoću njegovog indeksa.U Javi indeksi kreću od broja 0 i poslednji ima indeks n-1, gde je n veličina niza.Na primer niz prices ima veličinu 3, i njegovi elementi imaju indekse 0, 1, i 2.Čuvati se “Array out of Bounds” grešaka.– imeNiza[indeks]Sa elementima niza se može postpuati kao sa običnim promenljivima– prices[0] = 6;– prices[1] = 80;– prices[2] = 10;

Page 25: Predavanje Java

25

© SI1P1 – 2004 97/15

Korišćenje nizova

Elementima niza Stringova se pristupa na identičan način:

–String[] people;people = new String[4];people[0] = ”Lana”; people[1] = ”Pera”;people[2] = ”Mika”;people[3] = ”Maja”;

© SI1P1 – 2004 98/15

Inicijalizacija nizova

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 pojedinačni elementi.

–String[] people= {“Lana”,“Pera”, “Mika”, “Maja”}; –int[] prices = {6, 80, 10};Svi elemnti niza i ovom slučaju moraju biti istog tipa.

© SI1P1 – 2004 99/15

Korišćeni pojmovi

Rezervisanje prostora – kreiranje prznaogmemorijskog prostora, u koji će se smestiti niz.Inicializacija – Popunjavanje rezervisanog prostora za niz sa inicijalnim vrednostima.Element – pojedinačni član niza.Indeks – pozicija elementa u okviru niza.Veličina ili dužina niza - Broj elemenata niza.

© SI1P1 – 2004 100/15

Pitanja

Koje od sledećih naredbi ne kreiraju niz

Page 26: Predavanje Java

26

© SI1P1 – 2004 101/15

Dužina niza

Svaki niz ima svoju osobinu kojoj se može pristupiti po imenu lengthPristup ovoj osobini se odvija na sledeći način:– imeNiza.length;

String[] people = {“Lana”,“Pera”, “Mika”, “Maja”}; int numPeople = people.length;Vrednost promenljive numPeople je 4. Nizovi su uvek iste dužine. Njihova dužina se ne može menjati od trenutka kada su kreirani.

© SI1P1 – 2004 102/15

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 103/15

Primer 2

© SI1P1 – 2004 104/15

Primer 3

Koji je sadržaj niza c nakon izvršavanja 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];}

Page 27: Predavanje Java

27

© SI1P1 – 2004 105/15

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 106/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 107/15

Dvodimenzionalni nizovi

Nizovi koji su do sada razmatrani mogu se posmatrati kao jedan red vrednostiDvodimenzionalni niz se može posmatrati kao mreža (ili matrica) vrednosti.Svakom elementu dvodimenzionalnog niza se može pristupiti pomoću dva indeksa: redni broj reda i redni broj kolone.Dvodimenzionalni niz je u suštini niz čiji je svaki element novi niz

© SI1P1 – 2004 108/15

Dvodimenzionalni nizovi

Primer: Karta zemljišta je podeljena na mrežu 20 x 55 različitih imanja. U svakom polju treba upisati površinu određenog imanja.Prvo je potrebno deklarisati dvodimenzionalni niz:

double[][] heights;heights= new double[20][55];

Ovaj dvodimenzionalni niz ima 20 redova i 55 kolonaDa bi se pristupilo pojedinačnom imanju koje se nalazi u 11-om redu i 23-oj koloni:

heights[11][23]

Page 28: Predavanje Java

28

© SI1P1 – 2004 109/15

Višedimenzionalni nizovi

Podnizovi mogu biti različitih dužina: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 višedimenzionalni nizovi:

int[][][][] a; // 4-D niz

© SI1P1 – 2004 110/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaMetodiMetodi

© SI1P1 – 2004 111/15

Sadržaj lekcije

Šta je metodZašto koristimo metodeKako da deklarišemo metodeČetiri dela metodaKako pozvati metodSvrha metoda mainNeki primeri metoda

© SI1P1 – 2004 112/15

Koncept metoda

Metodi se još nazivaju i funkcije ili procedure.Metod je način da se određeni broj koraka integriše u poseban deo koda i na taj način posebno poziva i obrađuje.Kada bi sve mogli da se koriste metodi?–izračunavanje kvadratne formule, prikaz na ekranu, ...

Page 29: Predavanje Java

29

© SI1P1 – 2004 113/15

Koncept metoda

Metodi mogu da prihvate ulazne podatke u formiargumenataNakon toga mogu da izvrše određene operacije saargumentimaNa kraju mogu da vrate vrednost koju su dobili kao rezultat izračunavanja, t.j. da generišu izlaz

© SI1P1 – 2004 114/15

Izračunavanje kvadratnog korena

Kvadratni koren je dobar primer upotrebe metoda.Metod koji služi za dobijanje kvadratnog korena prihvata broj kao argument i kao rezultat vraća kvadratni koren od tog broja.

© SI1P1 – 2004 115/15

Izračunavanje kvadratnog korena

Izračunavanje kvadratnog korena obuhvata i više međukoraka između operacija prihvatanja ulaznog podatka i generisanja izlaza.Kada se koristi ovaj metod, korisnika ne interesuju pojedinačni koraci. Jedino što mu je potrebno je da se dobije korektan rezultat.Skrivanje internog rada metoda od korisnika, ali obezbeđivanje korektnog rezultata se naziva još iapstrakcija

© SI1P1 – 2004 116/15

Deklarisanje metoda

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

Page 30: Predavanje Java

30

© SI1P1 – 2004 117/15

Tip rezultata metoda

Tip rezultata metoda može biti bilo kog tipa podataka.Tip metoda se određuje na osnovu tipa podataka koji se generiše kao izlaz.Metod može i da ne vraća rezultat, u kom slučaju se deklariše kao tipa void.

© SI1P1 – 2004 118/15

Generisanje rezultata

U okviru metoda se koristi naredba return da bi se definisao rezultat izvršavanja operacije metoda.Njegova forma je: – return vrednost_izvršavanja;Tip promenljive vrednost_izvršavanja mora da bude istog tipa kao i tip samog metoda:double sqrt(int num) {

double answer;// Izračuna se vrednost kvadratnog korena num// i rezultat smesti u promenljivu answerreturn answer;

}

© SI1P1 – 2004 119/15

Generisanje rezultata

Metod se završava odmah nakon izvršavanja naredbe return Zato je u većini slučajeva return naredba poslednja naredba u okviru metodaMetod može imati i više return naredbi.

int absoluteValue(int num){if (num < 0)

return –num;else

return num;}

© SI1P1 – 2004 120/15

void metod

Metod tipa void ima return naredbu bez definisane specifične vrednostireturn;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 nešto prikazati na ekranu.Kao se u okviru metoda tipa void ne navede naredba return, podrazumeva se da se ona izvršava na kraju metoda

Page 31: Predavanje Java

31

© SI1P1 – 2004 121/15

Argumenti metoda

Metodi mogu dobijati ulazne podatke u formiargumenata.Argumenti se koriste kao promenljive u okviru telametoda.Kao promenljive, i argumentima se mora specificirati tip.Argumenti se definišu unutar zagrada koje se nalaze iza imena metoda.

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

}© SI1P1 – 2004 122/15

Argumenti metoda

Više argumenata metoda se odvajaju zarezom:double pow(double x, double y)Argumenti mogu biti različitog tipaint indexOf(String str, int fromIndex)Telo metoda je blok specificiran sa velikim zagradama, { }. U okviru tela metoda se definišuakcije 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.

© SI1P1 – 2004 123/15

Poziv metoda

Da bi se pozvao određeni metod, potrebno je specificirati ime metoda, iza koga treba navesti listu argumenata odvojenih zarezom i u okviru zagrada

pow(2, 10); //računa 2 na 10

Ako metod nema argumenata, treba navesti imemetoda sa praznim zagradama:size();Neki metodi mogu sadržati reč static pre tipa metoda:static double divide(double a, double b) {return a / b;}

© SI1P1 – 2004 124/15

main metod

Do sada smo koristili jedino metod mainOvaj metod je tačka odakle uvek počinje izvršavanje Java programamain metod je static i ima strog format koji se mora poštovati:

public static void main(String[] args) {. . .}

Page 32: Predavanje Java

32

© SI1P1 – 2004 125/15

main metod

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 učitava u niz pod imenom args:java SayHi BoskoU ovom primeru član args[0] će sadržavati String “Bosko", i izlaz proma će biti "Hi, Bosko"

© SI1P1 – 2004 126/15

Primer

Šta nije u redu u sledećem delu programa

static double addSometimes(num1, num2){double sum;if (num1 < num2){

sum = num1 + num2;String completed = “completed”;return completed;

}}

© SI1P1 – 2004 127/15

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 pokretanjajava Greetings Lana Pera Majaizlaz će biti "Jambo Lana! Jambo Pera! JamboMaja!"

© SI1P1 – 2004 128/15

Primer

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

Page 33: Predavanje Java

33

© SI1P1 – 2004 129/15

Najvažniji pojmovi

Metod je odvojeni deo koda koji možemo pozivati i izvršavati više puta, a napisan je samo jednomMetodi u Javi imaju 4 dela: tip podatka koji vraćaju, ime, argumente, telo.Tip podatka koji se vraća i argumenti mogu biti primitivni tip podataka (na primer int) ili složeni (na primer Object)main je specijalni Java metod koji Java interpretertraži kada želi da pokrene class fajlmain ima strog format:public static void main(String args[])

© SI1P1 – 2004 130/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaObjekti i klaseObjekti i klase

© SI1P1 – 2004 131/15

Do sada smo naučili

Tipove podataka: int, double, boolean, StringPromenljive: Pamte vrednost određenog tipa.Nizovi: Pamte više vrednost određenog tipa.Kontrolne strukture: If-then, For petlje ...Metodi: Delovi koda kojima možemo proslediti argumente i izvršiti ih.Da li je to sve što nam je potrebno?

© SI1P1 – 2004 132/15

Šta može biti problem

Neki podaci se pamte zajedno.– String[] imena– int[] oceneMetodi počinju da se komplikuju.Metodi mogu vratiti rezultat samo jednog tipa.Programeri ne žele da razmišljaju o svim neprikazanim tipovima.

Page 34: Predavanje Java

34

© SI1P1 – 2004 133/15

Apstrakcija

Objekti su alati za primenu apstrakcije.Pokušavamo apstraktovati određene detalje da bi se suočili sa kompleksnim problemima.Apstrakcija je fundamentalni koncept u računarskim naukama.Problem je i da se ne primenjuje suviše apstrakcije.Umeće je znati oje detalje treba sakriti, a koje treba prikazati.

© SI1P1 – 2004 134/15

Šta je objekat

Objekat ima dva dela:– Stanje: Osobine objekta.– Ponašanje: Stvari koje objekat može da uradi.Primer automobila:– Stanje: Boja, vrsta motora, automatik– Ponašanje: kočiti, ubrzati, svirati, voziti u određenom smeruPrimer čoovek:– Stanje: Težina, visina, pol, godište– Ponašanje: Jesti, spavati, vežbati, učiti

© SI1P1 – 2004 135/15

Šta je objekat

© SI1P1 – 2004 136/15

Zašto koristiti objekte

Modularnost: Jednom kada se objekat definiše, može se koristiti u proizvoljnom broju aplikacija.Sakrivanje informacija: programere ne zanima kako objekat funkcioniše, već samo njegov interfejs.Primer:– Različiti automobili mogu koristiti iste delove.– Ne zanima vas kako motor funkcioniše, sve dok možete da vozite automobil.

Page 35: Predavanje Java

35

© SI1P1 – 2004 137/15

Klase

Klasa je uzorak ili kalup pomoću koga se stvara objekatSvaka klasa može sadržati:- Članove podataka (osobine/karakteristike objekta/klase)- Metode (definišu ponašanje objekata dobijenoh od klase)- Konstruktore (specijalne metode)

© SI1P1 – 2004 138/15

Klase

Osnovna anatomija klase

public class imeKlase{Članove podatakaKonstruktoriMetodi

}

© SI1P1 – 2004 139/15

Prva klasa: prekidacZaSvetlo

class prekidacZaSvetlo{boolean upaljeno = true;

}Reč class govori okruženju da želimo da definišemo novi tip Object-a.Klase su definicije stanja i ponašanja.Objekti su instance klasa.Sve u okviru Jave je objekat i ima svoju klasu.

© SI1P1 – 2004 140/15

Klase

Page 36: Predavanje Java

36

© SI1P1 – 2004 141/15

Prva klasa: prekidacZaSvetlo

class prekidacZaSvetlo{boolean upaljeno = true;

}Koje stanje prekidacZaSvetlo može imati?Stanje se pamti u okviru polja, ovde je to “upaljeno”Poljima se prilazi na sledeći način:– imePromenljive.imePoljaKasnije će biti reči o drugim vrstama poljaKoje ponašanje prekidacZaSvetlo može imati?

© SI1P1 – 2004 142/15

Definisanje ponašanja

class prekidacZaSvetlo{boolean upaljeno = true;void pritisni() {

this.upaljeno = !this.upaljeno ;}

}Reč this se odnosi na pojedinačni objekatPomoću this.upaljeno se pristupa polju upaljeno.Koje ponašanje prekidacZaSvetlo sada može imati?

© SI1P1 – 2004 143/15

Korišćenje objekata

public static void main(String[] args) {prekidacZaSvetlo s = new prekidacZaSvetlo();System.out.println(s.upaljeno);s.pritisni();System.out.println(s.upaljeno);

}Pomoću new se kreira novi objekat.Iza new mora se navesti konstruktor.Metodi se pozivaju na sledeći način:– imePromenljive.imeMetoda(argumenti)Šta se dobija kao izlaz ovog programa?

© SI1P1 – 2004 144/15

Konstruktori

Konstruktori povezuju objekte sa podacima koji su im potrebni da bi se inicijalizovaliObjekti 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}

Page 37: Predavanje Java

37

© SI1P1 – 2004 145/15

Konstruktori

class prekidacZaSvetlo {boolean upaljeno ; void pritisni() {

this.upaljeno = !this.upaljeno ;}prekidacZaSvetlo (boolean pocetnoStanje) {

this.upaljeno = pocetnoStanje;}

}Konstruktor prekidacZaSvetlo() više ne postoji. Kako se sada pravi instanca objekta?

© SI1P1 – 2004 146/15

Konstruktori

prekidacZaSvetlo() {prekidacZaSvetlo(true) ;

}prekidacZaSvetlo (boolean pocetnoStanje) {

this.upaljeno = pocetnoStanje;}

}Može se definisati više konstruktora.Konstruktori se mogu međusobno pozivati.

© SI1P1 – 2004 147/15

prekidacZaSvetlo

class prekidacZaSvetlo{boolean upaljeno = true;boolean daLiJeUpaljeno() {

return upaljeno;}void pritisni() {

upaljeno = !upaljeno;}}

© SI1P1 – 2004 148/15

prekidacZaSvetlo - druga verzija

class prekidacZaSvetlo{int upaljeno = 1;boolean daLiJeUpaljeno() {

return upaljeno == 1;}void pritisni() {upaljeno = 1 - upaljeno;}

}

Page 38: Predavanje Java

38

© SI1P1 – 2004 149/15

Apstrakcija

Obe prethodne verzije se imaju isto ponašanje.Klasu prekidacZaSvetlo treba tretirati kao apstrakciju: ne interesuje nas unutrašnjikod, većsamo njeno ponašanjeInterni kod = implementacijaSpoljašnje ponašanje = interfejsPisanje koda i poboljšanje implementacije se može ovbavljati sve dok je interfejs istiSve dok je korisšćnjenje objekta date klase isto, ne zanima nas kako je dobijeno dato ponašanje.U velikim projektima, gde ima više timova,programera jedino zanima njegov deo koda (na primer Microsoft, Google, Goldman Sachs, Morgan Stanley i finansijske kompanije)

© SI1P1 – 2004 150/15

Problem apstrakcije

Korisnik klase prekidacZaSvetlo koji pristupa logičkoj promenljivoj upaljeno, greši ako se ova promenljiva promeni u celobrojnuclass PrimerGreske{

public static void main(String[] args) {prekidacZaSvetlo ls= new prekidacZaSvetlo ();

if (ls.upaljeno) // greska!System.out.println("upaljeno!");

elseSystem.out.println(“Nije upaljeno!");

}}

© SI1P1 – 2004 151/15

public i private pristupi

Ako se polja ili metodi označe kao private, tada im druge klase ne mogu pristupitiAko se polja ili metodi označe kao public, tada im bilo koja druga klasa može pristupitiAko se ne specificira posebno da li je polje ili metod public ili private, tada se podrazumeva da je public.

© SI1P1 – 2004 152/15

Poboljšana verzija klase prekidacZaSvetlo

class prekidacZaSvetlo{private boolean upaljeno = true;public boolean daLiJeUpaljeno() {

return upaljeno;}void pritisni() {upaljeno = !upaljeno;}

}

Page 39: Predavanje Java

39

© SI1P1 – 2004 153/15

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 desiće se greška pri kompajliranju

if (ls.upaljeno) // greska

© SI1P1 – 2004 154/15

Promenljive i objekti

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

© SI1P1 – 2004 155/15

Reference

Pomoću new se uvek stvara nova jedinstvena instanca klaseKada se instanca poveže sa određenom promenljivom, tada promenljiva sadrži referencu ili vezu sa datim objektomCovek g = new Covek(“Lana", 3);Covek h = new Covek(“Lana", 3);U ovom primeru g i h predstavljaju reference na dva različita objekta koji u ovom trenutku imaju identična stanja

© SI1P1 – 2004 156/15

Reference

g != h se dobija, jer g i h predstavljaju reference na različite objekteCovek g = new Covek(“Lana", 3);Covek h = new Covek(“Lana", 3);

g h

Lana3

Lana3

Page 40: Predavanje Java

40

© SI1P1 – 2004 157/15

Reference

maja1 == maja2 se dobija, jer maja1 i maja2predstavljaju referencu na isti objekatCovek maja1 = new Covek(“Maja", 34);Covek maja1 = maja2;

maja1 maja2

Maja34

© SI1P1 – 2004 158/15

Pitanja

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

© SI1P1 – 2004 159/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 == hb) g.getAge() == h.getAge()c) lucy1 == lucy2d) lucy1.getAge() == lucy2.getAge();

© SI1P1 – 2004 160/15

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;}

}

Page 41: Predavanje Java

41

© SI1P1 – 2004 161/15

Java API

Sve informacije o ugrađenim Java klasama i njihovim metodama se mogu dobiti pomoćuJava Application Programming Interface (API)Ova dokumentacija je osnov za realizaciju bilo koje složene Java aplikacije

© SI1P1 – 2004 162/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaStatic & FinalStatic & Final

© SI1P1 – 2004 163/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 164/15

Analiza

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 in je isti:m: value of PI is 3.14159m: square of 5 is 25n: value of PI is 3.14159n: square of 5 is 25Metod square() se ponaša isto bez obzira koja ga instanca poziva

Page 42: Predavanje Java

42

© SI1P1 – 2004 165/15

Analiza

Vrednost promenljive PI = 3.14159 je ista za sveinstance klase MyMath.Zašto je potrebno smestiti vrednost PI nezavisno za svaku instancu klase MyMath? Da li je moguće smestiti jednu vrednost promenljivePI za celu klasu MyMath?

© SI1P1 – 2004 166/15

MyMath - ponovo

public class MyMath{// add keyword "static" to field declarationpublic static double PI = 3.14159;// add keyword "static" to method declarationpublic 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));}

}

© SI1P1 – 2004 167/15

static PI

U prethodnom primeru je dodata reč static kod deklaracije konstante PI:public staticdouble PI = 3.14159;Na taj način je definisano da postoji samojednavrednost promenljive PI za sve instance klaseMyMathclassPI je sada podatak koji pripada klasi

© SI1P1 – 2004 168/15

final

Promenljiva PI je deklarisana sapublic static double PI = 3.14159;I na ovaj način je moguće 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 deklariše kao final, njena vrednost se ne može menjati!

Page 43: Predavanje Java

43

© SI1P1 – 2004 169/15

final

Još jedan primer upotrebe finalpublic static final Point ORIGIN =new Point(0,0);Time smo zabranili promenu vrednosti promenljive na sledeći način:•MyMath.ORIGIN= new Point(3, 4);ALI! I dalje se mogu pozivati metodi koji na nenkinačin mogu promeniti stanje promenljive ORIGIN: MyMath.ORIGIN.setX(4);

© SI1P1 – 2004 170/15

MyMath nova verzija

public class MyMath{// add keyword finalto field declarationpublic 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 171/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 između svih instanci ove klase — postoji samo jedan squaremetod za celu klasu, ne jedan za svaku instancu

© SI1P1 – 2004 172/15

static metod

Statički metodi ne vrše operacije da specifičnim instancama njihovih klasaOvi metodi imaju pristup samo statičkim poljima i metodama klaseNe mogu pristupiti nijednom elemntu koji je ne-statički“Metodi klase" je bolja definicijaSuprotni termin je “metodi instance"

Page 44: Predavanje Java

44

© SI1P1 – 2004 173/15

Math klasa

Detaljniji pregled klase Math u okviru Javinog APINe može se kreirati instanca klase Math, ona služi za smeštanje korisnih static metodaSvi metodi i polja su static:Math.sqrt(16)Math.PIMath.abs(-3)

© SI1P1 – 2004 174/15

Primeri static polja

Konstante koje se koriste u okviru klasa (uobičajeno je da su deklarisane pomoću final)Potrebna je samo jedna po klasi, nije potrebna po jedna u svakom objektuSledeća deklaracija:public static final double TEMP_CONVERT= 1.8;Ako se ova deklaracija promenljive TEMP_CONVERT nalazi u okviru klase Temperature, može se koristiti na sledeći način:double t = Temperature.TEMP_CONVERT * temp;Tradicionalno (C, C++) konstante se pišu velikim slovima, PI , TEMP_CONVERT, ...

© SI1P1 – 2004 175/15

Primeri static metoda

Za metode koji koriste samo argumente i na taj način ne koriste instancepublic static double pow(double b, double p)// Math class,Za metode kojima trebaju samo static podaciTakođe, koristi se i kod main metoda kod klase pomoću koje se startuje programU trenutku startovanja programa ne postoji objekti koje bi main metod mogao da koristi

© SI1P1 – 2004 176/15

Pitanja

Da li sledeći podaci treba da budu static ili ne-static?Podatak koji definiše brzinu svetlostigetName() metod u okviru klase Personzbir() metod koji kao rezultat vraća zbir dva svoja argumentaPodatak koji definiše širinu u okviru Rectangle klasestaticnonstaticnon

Page 45: Predavanje Java

45

© SI1P1 – 2004 177/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaOrgaOrganizacijanizacija podataka i kontrola pristupapodataka i kontrola pristupa

© SI1P1 – 2004 178/15

Pristup i organizacija

Na računaru postoji hiljade fajlova.Na Internetu postoji više miliona sajtova.Projekat može imati hiljade klasa.Kako pronaći određenu klasu, fajl ili sajt?Kako organizujemo rad u slučaju istih ili sličnih imena?Kako se može ograničiti pristup privatnim podacima?

© SI1P1 – 2004 179/15

U ovoj lekciji

Oblast važenja: Odakle možemo pristupiti pojedinačnim podacima.Kako se koriste Java paketi.Kako se kreiraju Java paketi.

© SI1P1 – 2004 180/15

Oblast važenja

Oblast važenja promenljive, polja, metode ili klase je deo programa iz koga se može pristupiti ovim elementima.Promenljivama se može pristupiti iz bloka u okviru koga su deklarisane.Block se označava pomoću { i }.Lokalne promenljive: Promenljive koje su definisane samo u trenutnom bloku.Pristup polju, metama i klasama je definisana pomoću njihovih specifikatora.

Page 46: Predavanje Java

46

© SI1P1 – 2004 181/15

Anonimne promenljive

Anonimne promenljive se deifinišu i inicijalizuju, ali se nikada ne deklarišu.U jezicima C i C++ anonimne promenljive se tretiraju kao greška, u Javi ne.Ove promenljive nemaju ime i ne mogu se pozivati – pa nemaju oblast važenja.Primeri:– System.out.println(“Hello”);– (new String(“Hello”))– (new int[] {1,2,3,4})(Poslednji primer sadrži elemente koji će se razmatrati kasnije)

© SI1P1 – 2004 182/15

Primer oblasti važenja promenljive

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 block9 } // end if (z>0)10 } // end if (y>0)11 } // end

Iz kojih linija koda se može pristupiti promenljivama v, w, x, y, i z?

© SI1P1 – 2004 183/15

Primer oblasti važenja 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 TestScopex je definisano za celu klasuy je definisano u okviru metoda f(int).z je već definisan u f(int) jer je argument metoda. © SI1P1 – 2004 184/15

Primer oblasti važenja 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

}}Šta je rezultat izvršavanja programa?

Page 47: Predavanje Java

47

© SI1P1 – 2004 185/15

Primer oblasti važenja i petlje

int sigma(int n) {for (int i = 0; i<n; i++) {

int sum += i;}return sum;

}Metod sigma bi trebalo da generiše rezultat koji je jednak

Zašto se javlja greška pri kompajliranju?

© SI1P1 – 2004 186/15

Pitanje

class TestScope {int x = 0;void foo() {

int y = 20;x = 10;

}// end foovoid 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 izvršavanja programa?0100

© SI1P1 – 2004 187/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 izvršavanja programa?0100

© SI1P1 – 2004 188/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 izvršavanja programa?01020

Page 48: Predavanje Java

48

© SI1P1 – 2004 189/15

Imenovanje promenljivih u velikim projektima

Veliki projekti mogu imati na hiljade klasa.Možete sarađivati i deliti klase sa ljudima koji se nalaze širom sveta.Kako da budete sigurni da se ime vaše klase neće poklopiti sa nekim imenom neke druge?Možete koristiti dugačka jedinstvena imena..

“UtilityClassForPreparingTaxReturnsByAnthonyGfromWestlandsNairobiKenya”Ovakav način je težak za pamćenje i korišćenje.

© SI1P1 – 2004 190/15

Hijerarhijska organizacija

Imena su organizovana u hijerarhijski raspored.“Bill Gates”: Porodica: Gates, Član: Bill.rti.etf.bg.ac.yu254-020-5555555: Kenya (254), Nairobi (020), Broj5555555java.lang.String: String je klasa, u okviru langpaketa, koji se nalazi u okviru osnovnog java paketa.

© SI1P1 – 2004 191/15

Definicija paketa

Potrebno je organizovati klase u skupove ili delove programa koji se nazivaju paketi.Na ovaj način se smanjuje problem konflikta imena i prepoznavanja funkcionalnosti, na primer java.util.Može se ograničiti pristup na nivou paketa.Pripadnost klase paketu se definiše sa:

package imePaketa;class imeKlase{

/* Telo klase */}

© SI1P1 – 2004 192/15

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 može biti tipa public.javac i java će tražiti navedene poddirektorijume iliJAR (Java Archive) fajlove za navedeni kod:– putanja \mypkg\util za paket mypkg.util (naWindows operativnom sistemu)– putanja /mypkg/util/arrays za paketmypkg.util.arrays (na Unix operativnom sistemu)

Page 49: Predavanje Java

49

© SI1P1 – 2004 193/15

Korišćenje 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 korišćeni paket:– import java.lang.*;

© SI1P1 – 2004 194/15

Specifikatori pristupa

Polja, metode, konstruktori i klase koje su definisane kao public omogućavaju pristup iz bilo koje klase bilo kog paketa.Polja, metode, konstruktori i klase koje su definisane kao protected omogućavaju pristup samo klasama koje ih nasleđuju.Polja, metode, konstruktori i klase koje su definisane sa paketnim pristupom omogućavaju pristup iz bilo koje klase istog paketa. Ovakav pristup se podrazumeva.Polja, metode i konstruktori koji su definisani kao private omogućavaju pristup samo kodi iz klase u kojoj se pojavljuju.

© SI1P1 – 2004 195/15

Nivoi kontrole pristupa

© SI1P1 – 2004 196/15

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

}

Page 50: Predavanje Java

50

© SI1P1 – 2004 197/15

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;}

}

© SI1P1 – 2004 198/15

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;}

}

© SI1P1 – 2004 199/15

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 200/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;}

}

Page 51: Predavanje Java

51

© SI1P1 – 2004 201/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaNasleđivanjeNasleđivanje

© SI1P1 – 2004 202/15

Pojam nasleđivanja

U stvarnom svetu: Mi nasleđujemo svoje gene od roditelja. Nasleđujemo gene i od drugih predaka. Možemo imati različite oči, težinu, visinu . . . Ali i dalje veliki broj osobina nasleđujemo od naših roditelja. U svetu softvera: Nasleđivanje kod objekata je mnogo bolje definisano! Objekti koji nasleđuju neke druge objekte, od njih nasleđuju i stanja (polja) i ponašanje(metode).

© SI1P1 – 2004 203/15

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 204/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");}}

Page 52: Predavanje Java

52

© SI1P1 – 2004 205/15

Problem: dupliranje koda

Prethodne dve klase imaju isto polje name i isti metod getNameKlase često imaju veliki broj zajedničkh polja i metodaDobijeni rezultat: dupliranje koda!Koristeći nasleđivanje moguće je napisati novu klasu koja nasleđuje neku većpostojećuPostojeća klasa čije osobine nasleđuju naziva se klasa “roditelj" ili superklasaNova klasa koja nasleđuje superklasu naziva se klasa “potomak" ili subklasaRezultat: Velika ušteda koda! © SI1P1 – 2004 206/15

Primer

© SI1P1 – 2004 207/15

Kenyan superklasa

public class Kenyan {private String name;public Kenyan(Stringn) {

name = n;}public String getName() {

return name;}

}

© SI1P1 – 2004 208/15

Masai podklasa

public class Masai extends Kenyan{private int cows;public Masai(String n, int c) {

super(n); // poziv Kenyan konstruktorcows = c;

}public int getCows() {

return cows;}public void speak() {

System.out.println(“Masai");}

}

Page 53: Predavanje Java

53

© SI1P1 – 2004 209/15

Kikuyu podklasa

public class Kikuyu extends Kenyan{private int money;public Kikuyu(String n, int m) {

super(n); // poziv Kenyan konstruktormoney = m;

}public int getMoney() {

return money;}public void speak() {

System.out.println(“Kikuyu");}

}

© SI1P1 – 2004 210/15

Pitanje

Š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 cowsSheila has 2200 shillings

© SI1P1 – 2004 211/15

Pravila nasleđivanja

Koristi se službena reč extends da bi se naznačilo koja klasa nasleđuje koju klasuPodklasa nasleđuje sva polja i sve metode superklaseKoristi se službena reč super u okviru konstruktora podklasem da bi se pozvao kontruktor superklase

© SI1P1 – 2004 212/15

Konstruktor podklase

Prva stvar koju konstruktor podklase mora da uradi je da pozove konstruktor superklaseNa ovaj način se delovi koji pripadaju super klasi konstruišu pre delova koji su deo same podklaseAko se ne pozove konstruktor superklase pomoću naredbe super i superklasa ima konstruktor bez argumenata, tada će se taj konstuktor pozati implicitno.

Page 54: Predavanje Java

54

© SI1P1 – 2004 213/15

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}}

Je ekvivalentno sa:public class Beef extends Food

{private double weight;public Beef(double w) {

super();weight = w

}}

© SI1P1 – 2004 214/15

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 sledeće naredbe?C x = new C();

I'm AI'm BI'm C

© SI1P1 – 2004 215/15

Preklapanje metoda

Podklasa može preklopiti odgovarajući metod svoje superklase

Šta se dobija na izlazu nakon izvršavanja sledećih naredbi?ThermUS thermometer = new ThermUS(100);System.out.println(thermometer.getTemp());

212© SI1P1 – 2004 216/15

Poziv metoda superklase

Kada se preklopi određeni metod, moguće je pozvati kopiju tog metoda superklase koristeći naredbusuper.metod()

Page 55: Predavanje Java

55

© SI1P1 – 2004 217/15

Koje se linije neće kompajlirati

© SI1P1 – 2004 218/15

Konverzija tipova

© SI1P1 – 2004 219/15

Primer

Kompanija ima listu Zaposlenih. Potrebno je napraviti stranicu za plaanje z asvakog zaposlenog.Na stranici se prikazuju opšti podaci (ime, odeljenje, količina plaćanja, …) za sve zaposlene.Različiti tipoi zaposenih – menadžer, inženjerm sotverski inženjerPostoji stara verzija klase Employee ali je potrebno doti veoma različite podatke i metode za menadžere i inženjere.Neka je neko uključio 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 plaćanju © SI1P1 – 2004 220/15

Primer

Page 56: Predavanje Java

56

© SI1P1 – 2004 221/15

Primer

class Employee {// Dataprivate String firstName, lastName;// Constructorpublic Employee(String fName, String lName) {firstName= fName; lastName= lName;}// Methodpublic void printData() {System.out.println(firstName+ " " + lastName);}

}

© SI1P1 – 2004 222/15

Primer

© SI1P1 – 2004 223/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 NAMESystem.out.println("Weeklypay: $" + getPay(); }}

© SI1P1 – 2004 224/15

Primer

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);}}

Page 57: Predavanje Java

57

© SI1P1 – 2004 225/15

Primer

© SI1P1 – 2004 226/15

Primer

class SalesManager extends Manager {private double bonus; // Bonus Possible as commission.// A SalesManagergets a constant salary of $1250.0public 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 227/15

Primer

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();

}}

© SI1P1 – 2004 228/15

Klasa Object

Sve Javine klase implicitno nasleđuju klasujava.lang.ObjectTako da svaka klasa koja se napiše automatski ima neke metode koji pripadaju klasi Object, kao šo su equals, hashCode, i toString.Neki od ovih metoda će se obrađivati u kasnijim lekcijama

Page 58: Predavanje Java

58

© SI1P1 – 2004 229/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaObradaObrada gregreššaka pomoaka pomoćću u izuzetakaizuzetaka

© SI1P1 – 2004 230/15

U ovoj lekciji

Šta predstavlja izuzetakUobičajena terminologijaZašto koristiti izuzetkeKako se dešava izuzetakKako se obrađuje izuzetakO izuzecima koji se moraju obraditi i o onima koji se ne morajuPrimeri Java izuzetakaKako napisati svoj sopstveni izuzetak

© SI1P1 – 2004 231/15

Šta predstavlja izuzetak?

Izuzetak je događaj koji se dogodio tokom izvršavanja programa i može da prouzrokuje prekid normalnog toka izvršavanja instrukcijaMogući razlozi izuzetaka:Pristup elementu izvan granica nizaPokušaj upisa u read-only dokumentPokušaj čitanja nakon kraja dokumentaSlanje nelegalnih argumenata nekom metoduNelegalne aritmetičke operacije (n.p. deljenje sa 0)Otkaz hardverskih resursa

© SI1P1 – 2004 232/15

Terminologija

Kada se izuzetak (exception) dogodi koristi se izraz da je “bačen” izuzetak (throw)Kada se izvrše određene operacije sa izuzetkom kaže se da je izuzetak obrađen (handled)Deo koda pomoću koga se izvrše određene operacije sa izuzetkom naziva se obrada izuzetaka (exception handler)

Page 59: Predavanje Java

59

© SI1P1 – 2004 233/15

Zašto koristiti izuzetke

Pomoću kompajliranja ne mogu se odrediti sve greškeNa ovaj način se odvaja kod za obradu izuzetaka od ostalog, regularnog koda• Jasnoća i razumljivost koda (debagovanje, timski rad, ...)• Obrada izuzetaka se izvršava samo na jednom mestu

Odvojeni su delovi koda za prepoznavanje greške, izveštavanje i obraduMogu se grupisati i odvojiti različiti tipovi grešakaMogu se obraditi greške koje prouzrokuju veoma specifične izuzetke

© SI1P1 – 2004 234/15

Poruke kod izuzetaka

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 greške i sledeće poruke pri obradi datog izuzetka:

Exception in thread "main"java.lang.ArrayIndexOutOfBoundsException: 2 at ArrayExceptionExample.main(ArrayExceptionExample.j

ava:4)

© SI1P1 – 2004 235/15

Poruke kod izuzetaka

Poruke od izuzetaka imaju sledeći format:

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

© SI1P1 – 2004 236/15

Primeri

Poruka kod izuzetka u primeru sa nizovimajava.lang.ArrayIndexOutOfBoundsException: 2 at ArrayExceptionExample.main(ArrayExceptionExample.j

ava:4)Koja je klasa izuzetka?

java.lang.ArrayIndexOutOfBoundsExceptionKom indeksu niza se pristupa, a on je izvan granica?

2Koji metod generiše izuzetak?

ArrayExceptionExample.mainKoji fajl sadrži ovaj metod?

ArrayExceptionExample.javaKoja linija fajla generiše izuzetak?

4

Page 60: Predavanje Java

60

© SI1P1 – 2004 237/15

Generisanje izuzetaka

Svi metodi mogu koriste naredbu throw da bi prihvatili izuzetak

if (student.equals(null))throw new NullPointerException();

Naredba throw zahteva poseban argument: throwable objekatOva vrsta objekata je instanca bilo koje podklaseThrowable klaseOva klasa obuhvata sve tipove grešaka i izuzetakaU okviru opisa API mogu se pronaći i opisi svihthrowable objekata

© SI1P1 – 2004 238/15

Obrada izuzetaka

Može se koristiti try-catch blok da bi se obradio izuzetak koji se desio

try{// kod u okviru koga može da se desi izuzetak

}catch([Tip izuzetka] e) {

// šta da se izvrši ako se desio izuzetak}

© SI1P1 – 2004 239/15

Obrada više izuzetaka istovremeno

Više mogućih izuzetaka se može istovremeno obraditi pomoću više sukcesivnih catch blokova

try{// kod u okviru koga može da se desi više izuzetaka}catch (IOException e) {

// obrada IOException}catch (ClassNotFoundException e2) {// obrada ClassNotFoundException}

© SI1P1 – 2004 240/15

finally blok

Može se koristiti opcioni finally blok na kraju try-catch blokafinally blok obezbeđuje mehanizam da reguliše sve što se deilou okviru try blokaMože se iskoristiti za zatvranje fajla ili oslobađanja nekog drugog resursaTry-Catch-Finally Blok

try{// kod u okviru koga može da se desi izuzetak}catch([Type of Exception] e) {// šta da se izvrši ako se desio izuzetak}finally{// naredbe u okviru bloka će se uvek izvršiti// bez obzira šta će se dogoditi u okviru bloka}

Page 61: Predavanje Java

61

© SI1P1 – 2004 241/15

Izuzeci koji se ne mogu proveravati

Izuzeci koji se ne mogu proveravati (uncheckedexceptions) ili runtime izuzeci se pojavljuju u okviruJava runtime sistemaPrimeri ovih izuzetakaAritmetičke operacije (deljenje sa nulom)pointer exceptions (pokušaj da se pristupi članu objekta pomoću null reference)Izuzeci sa indeksima (pokušaj da se pristupi elementu niza sa indeksom koji je preveliki ili premali)Metod koji ne sadrži catch ili specificira da može da generiše unchecked exceptions, takođe može u nekim slučajevima ih generisati

© SI1P1 – 2004 242/15

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 sistemaNa primer izuzeci koji se mogu desiti tokom ulazno/izlaznih operacija su non-runtime izuzeciKompajler proverava da li su non-runtime izuzeci obrađeni (ili specificirani korišćenjem throwsnaredbe)

© SI1P1 – 2004 243/15

Obrada izuzetaka koji se mogu proveriti

Svaki metod mora obraditi izuzetak koji se može proveriti ili specificirati da takav izuzetak postoji (korišćenjem throwsnaredbe)

void readFile(Stringfilename) {try {FileReaderreader = newFileReader("myfile.txt");// read from file . . .} catch (FileNotFoundExceptione) {System.out.println("filewas not found");}} ILIvoid readFile(Stringfilename) throwsFileNotFoundException{FileReaderreader = new FileReader("myfile.txt");// read from file . . .}

© SI1P1 – 2004 244/15

Hijerarhija klasa

Page 62: Predavanje Java

62

© SI1P1 – 2004 245/15

Nasleđivanje i izuzeci

Metod može specificirati manje izuzetaka, ali ne više od metoda koji nasleđuje

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}

} © SI1P1 – 2004 246/15

Pisanje sopstvenih izuzetaka

Postoje najmanje 2 tipa konstruktora izuzetaka:Default konstruktor: bez argumenata

NullPointerExceptione = new NullPointerException();Konstruktor koji ima detaljnu poruku: postoji jedanString argument

IllegalArgumentExceptione e =new IllegalArgumentException(“Broj mora biti

pozitivan");

© SI1P1 – 2004 247/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 248/15

Checked ili Unchecked?

Ako korisnik očekuje da se izuzetak pojavi, trebalo bi da bude tipa checkedAko korisnik ne može da preduzme ništa da bi se oporavio od datog izuzetka, trebalo bi da bude unchecked tipa

Page 63: Predavanje Java

63

© SI1P1 – 2004 249/15

Sadržaj lekcije

Izuzeci narušavaju normalno izvršavanje instrukcijau okviru programaIzuzeci se obrađuju pomoću try-catch ili try-catch-finally blokaMetod specificira postojanje izuzetka pomoću throw naredbeMetod koji nema catch deo ili ne specificira da postoji unchecked izuzetak, može da ga generišeSvaki metod mora obraditi checked izuzetke ili specificirati da postojeAko se piše spostveni izuzetak, on mora biti podklasa klase Exception i imati najmanje dva standardna konstruktora

© SI1P1 – 2004 250/15

UvodUvod u u programiranjeprogramiranje 1 1 –– JavaJavaUlazUlaz--izlazizlaz

© SI1P1 – 2004 251/15

U ovoj lekciji

Lekcija je podeljena u dva glavna dela:I –Ulaz/Izlaz:Ulaz ili Izlaz, i Byte ili Character nizoviNajvažnije Stream klase i njihova upotrebaPrimeri čitanja iz i upisa u tekstualni fajlPrimeri prihvatanja teksta sa tastatureUpotreba baferaII –Uvod u postupak parsiranja:DelimiteriStringTokenizer

© SI1P1 – 2004 252/15

Osnove ulaz/izlaz

I/O = Input/Output – ulaz/izlaz – komunikacija između računarskog programa i spoljašnjih izvora informacijaUključuje: - Čitanje ulaznih podataka iz izvoraUpis rezultata u krajnje odredišteČitanje i upis su specifirani pomoću 4 abstraktneklase: • Reader• Writer• InputStream• OutputStream

Page 64: Predavanje Java

64

© SI1P1 – 2004 253/15

Java I/O Streams

Java programi komuniciraju sa spoljašnjim svetom pomoću StreamsStreams se koriste za čitanje i upis podatakaI/O Streams su jednodirekcioniUlazni (Input) stream se koristi za ulazne podatke u programIzlazni (output) stream se koristi za podatke koji predstavljaju rezultat izvršavanja programa Izvor i odredište podataka mogu biti: fajlovi, mrežne konekcije, drugi programi, ...

© SI1P1 – 2004 254/15

Input i Output Stream

Objekat pomoću koga možemo pročitati ulazne podatke je Input Stream

• Objekat pomoću koga možemo prikazati izlazne podatke je Output Stream

© SI1P1 – 2004 255/15

Byte i Character

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 pomoću tastature, ...

© SI1P1 – 2004 256/15

Najvažnije Stream klase

FileInputStreamČitanje podataka u binarnom formatu iz fajlovaFileOutputStreamUpis podataka u binarnom formatu u fajloveFileReaderČitanje tekstualnih podataka iz fajlovaFileWriterUpis tekstualnih podataka u fajlove

Page 65: Predavanje Java

65

© SI1P1 – 2004 257/15

Rad sa Stream klasama

1. Otvaranje streama instanciranjem novog streamobjekta

2. Rad sa informacijama pomoću read/write, read/write u okviru metoda Stream klasa

3. Zatvaranje streama pozivom close() metoda datog objekta

© SI1P1 – 2004 258/15

Java I/O klase

Paket java.io sadrži klase koje s ekoriste za čitanje/upis podataka iz/u fajloveDa bi se čitali/upisivali podaci, moraju se intanciratipodklase jedne od sledeće 4 abstraktne superklase:

© SI1P1 – 2004 259/15

Upotreba Reader klase

Klasa Reader se koristi za čitanje karaktera ulaznogstreamaOva klasa sarži metode za čitanje pojedinačnog karaktera i niza karaktera, na primerint read()Klasa Reader je apstraktna, tako da se mora instancirati u podklasi koja mora preklopiti ove metode

© SI1P1 – 2004 260/15

Čitanje iz tekstualnog fajla

Page 66: Predavanje Java

66

© SI1P1 – 2004 261/15

BufferedReader klasa

BufferedReader je podklasa klase ReaderSkuplja (buffers) karakter stream iz FileReader i sadrži metod readLine() za efikasno čitanje ulazne linije karakteraFileReader fr = new FileReader("myFile.txt");BufferedReader br= new BufferedReader(fr);Merod readLine() kao rezultat vraća vrednost nullako nema više linija za čitanje

© SI1P1 – 2004 262/15

Upotreba BufferedReader klase

© SI1P1 – 2004 263/15

Klasa Writer

Klasa Writer je apstraktna klasa koja se koristi upis karakter stream-ovaOva klasa sadrži metode za upis pojedinačnog karaktera i stringovaNa primer void write(int c)BufferedWriter (podklasa klase Writer) sadrži metode za efikasni upisMetodom newLine() se upisuje prazna linija, a metodom write(String n) se upisuju konkretni podaciKada se završi željena operacija potrebno je zatvoriti Write pomoću metoda close()

© SI1P1 – 2004 264/15

Upis u tekstualni fajl

Page 67: Predavanje Java

67

© SI1P1 – 2004 265/15

Kopiranje fajlova

© SI1P1 – 2004 266/15

Prihvatanje podataka sa tastature

Unos podataka sa tastature u formi Streama se označava kao "standardni" unos, ali za čitanje unetih podataka potrebno je koristiti objekat klaseReaderInputStream se koristi kao prelazna klasa, koja uzima podatke iz Streama i konvertuje ih u tip ReaderDa bi se čitali karakteri pomoću InputStream,potrebno ih je podeliti u okviru InputStreamReaderDa bi se čitala linija po linija, potrebno je podelitiInputStreamReader sa BufferedReader

© SI1P1 – 2004 267/15

Prihvatanje podataka sa tastature

© SI1P1 – 2004 268/15

Zaključak

Potrebno je proučiti hijerarhiju klasa InputStream i OutputStream, kao i Reader i Writer u okviru Java dokumentacije da bi se uočile sve postojeće podklase i metodi koji se mogu koristitiTreba koristiti Java API!!!

Page 68: Predavanje Java

68

© SI1P1 – 2004 269/15

Parsiranje

U okviru programa podaci se obično konvertuju u tekstualni format pre nego što se upišu u fajloveKasnije je potrebno upisane podatke iz tekstualnih fajlova konvertovati u originalne podatkeProces dekodovanje teksta u podatke se jošnaziva i parsiranje

© SI1P1 – 2004 270/15

Delimiteri

Kada su podaci smešteni u tekstualnom formatu, delimiter karakteri se koriste da bi se odvojili delovi(tokens) podatakaNa primer pojedinačna imena u listi su odvojena pomoću delimitera '#': Lana#Pera#Maja#MikaIsta lista sa delimiterom novom linijom: LanaPeraMajaMikaOstali delimiteri koji se koriste su ‘|’ ili ‘:’ ili tab

© SI1P1 – 2004 271/15

StringTokenizer

Kada se pokušava pročitati nova ulazna linija, kao rezultat se dobija jedan, u opštem slučaju dugački string. Potrebno je pronaći delimitere u okviru tog stringa i odvojiti svaki pojedinačni deo informacije (tokens)Da bi se obavila ova operacija koristi se klasaStringTokenizer u okviru paketa java.util

© SI1P1 – 2004 272/15

StringTokenizer

Kada se formira tokenizer objekat, potrebno je specificirati koji se karakteri koriste kao delimiteri u konkretnom slučajuDefault konstruktori pretpostavljaju da su “\t\n\r”delimiteriStringTokenizerr = new StringTokenizer(line);Drugi konstruktori prihvataju kao argument Stringkoji može definisati proizvoljan niz karaktera kao delimiter

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

Page 69: Predavanje Java

69

© SI1P1 – 2004 273/15

StringTokenizer

Korisni StringTokenizer metoda:Metod nextToken() u formi stringa kao rezultat vraća sledeći podatak između delimitera u okviru tekstaMetod hasMoreTokens() u formi boolean vraća rezultat true ako se u tekstu nalazi još tokena

© SI1P1 – 2004 274/15

StringTokenizer

© SI1P1 – 2004 275/15

Parsiranje brojeva

Često je potrebno parsirati brojeve smeštene kao tekst u okviru Java promenljivihKlase koje sadrže statičke metode za razne konverzije suint Integer.parseInt(Strings)double Double.parseDouble(Strings)Potrebno je obraditi izuzetak NumberFormatException ako se specificirani Stringne može konvertovati u okviru promenljive