You are on page 1of 115

10/30/2016

Programski jezik C
Karakteristike
jezik opte namena
pisanje strukturiranih programa
pristup hardveru raunara
Uvod u programski jezik Java Razlog nastanka
potreba za jezikom sa osobinama viih programskih jezika
koji moe da zameni simbolike mainske jezike
Nastao 1972. godine u Bell-ovim laboratorijama
Autor: Dennis Ritchie
Brian Karnighan, Dennis Ritchie: The C Programming
Language, Prentice-Hall, 1978
Standardizovan 1989, ANSI C

1 3

Nastanak Programski jezik C++


Programski jezik C Potreba da se u C dodaju nove mogunosti
Programski jezik C++ Objektno orijentisano programiranje
Programski jezik Java Nastao 1980. godine u Bell-ovim laboratorijama
Autor: Bjarne Stroustrup
Ime C++ dobio 1983
prvobitno ime je bilo C sa klasama
Razvijan dui niz godina
ANSI standard za C++ usvojen 1997
Odnos C i C++
vie od 95% jezika C preneto je u C++
u C++ su dodate nove mogunosti (klase, ...)

2 4

1
10/30/2016

Programski jezik Java Prenosivost na druge platforme

Razlog nastanka: potreba za programskim jezikom koji Prevodilac za Javu pravi bajt kod a ne izvrni kod
je nezavisan od platforme raunara Bajt kod (bytecode) je visokooptimizovan skup instrukcija
C i C++ zavise od platforme raunara Tumai ga Javi izvrni sistem Javina virtuelna maina
Prvobitni motiv: programiranje kunih aparata (Java virtual machine, JVM)
Najjai motiv za razvoj: Internet, World Wide Web interpretator koda (bajt koda)
za razliite platforme prave se razliite virtuelne maine
C++ se prevodi u izvrni kod, ne interpretira se
potrebni razliiti prevodioci za razliite platforme
Program koji se interpretira izvrava se sporije od
izvrnog programa
JIT prevodilac (Just In Time) za bajt kod bre
izvravanje
5 7

Programski jezik Java Java apleti i aplikacije


Jezik je koncipirao tim firme Sun Microsystems, Inc. Aplikacije su programi
1991. godine izvravaju pod operativnim sistemom raunara
Od 1993. godine razvija se prvenstveno zbog Interneta za aplikaciju pisanu na Javi potrebno ja da bude
razliite vrste raunara, operativih sistema, procesora instalirana i Java virtuelna maina
Ime Java dobija 1995 . godine Apleti su programi (uglavnom mali)
prvobitni naziv je bio Oak prenose se preko Interneta, odnosno WWW servisa, kao
delovi HTML stranica
Veinu osobina Java je nalsedila od jezika C i C++
pokreu se u okviru WWW itaa (Web browser-a)
aplet nije animacija
Apleti se prave samo u Javi
Bezbednost apleta
ogranieni na okruenje za izvravanje Java programa
6 8

2
10/30/2016

Koncepti
Objektna-orijentisanost moderan OO jezik: klase, nasleivanje,
polomorfizam, interfejsi
Jednostavnost C/C++ sintaksna slinost, ali harmoniniji i
jednostavniji OO model
Prenosivost postie se interpretacijom bajtkoda
Sigurnost JVM prua zatitu od virusa koji bi se prenosili kroz
izvrni kod (firewall)
Robusnost stroga provera tipova, proveravani izuzeci, automatsko
sakupljanje ubreta
Efiksanost JIT prevodioci
Konkurentnost biblioteka podrka programiranju kroz vie
programskih niti
Distribuiranost biblioteka podrka za RMI i servlete
Komponentizacija Java Beans i Enterprise Java Beans
9 11

10 12

3
10/30/2016

Drugi jednostavan program


// Datoteka se zove "Primer2.java".
class Primer2 {
public static void main(String args[]) {
int broj; // deklaracija promenljive broj tipa int
broj = 100; // dodela vrednosti promenljivoj
Pregled jezika Java
// Sabiranje podataka razliitih tipova
System.out.println("Ovo je broj: " + broj);
broj = broj * 2;
System.out.print("Promenljiva broj je sada: ");
System.out.println(broj);
}
}
Rezultat izvravanja programa
Ovo je broj: 100
13 Promenljiva broj je sada: 200 15

Jednostavan program Trei jednostavan program


/* class PrimerZaIf {
Ovo je jednostavan Java program. public static void main(String args[]) {
Datoteka se zove "Primer.java". int x, y; // deklaracija dve promenljive
*/ x = 10;
class Primer { y = 20;
// Program pocinje pozivanjem metoda main(). if (x < y)
System.out.println("x je manje od y");
public static void main(String args[]) {
x = x * 2;
System.out.println("Ovo je jednostavan Java program."); if (x < y)
} System.out.println("x je jo uvek manje od y");
} if (x == y) {
System.out.print("x je sada jednako y");
Prevoenje programa System.out.println(", x je " + x + ", y je " + y);
C:\>javac Primer.java }
Pokretanje programa }
}
C:\>java Primer
Rezultat izvravanja programa
Rezultat izvravanja programa x je manje od y
Ovo je jednostavan Java program. 14 x je sada jednako y, x je 20, y je 20 16

4
10/30/2016

for petlja Elementi jezika


for(inicijalizacija; uslov; korak) naredba; Prazna mesta
Komentari
Primer for petlje sa jednom naredbom
Identifikatori
for(i=0; i<10; i=i+1) naredba;
Literali
Primer for petlje sa blokom Operatori
for(i=0; i<10; i++) { Separatori
naredba1; Rezervisane rei
naredba2;
...
naredbaN;
}
17 19

Primer za for petlju i blok Prazna mesta


class PrimerZaBlok Rezultat Prazna mesta su
{ izvravanja
i je: 0 prazan znak ( )
public static void main(String args[])
y je: 10 tabulator
{
prelazak u novi red
int i, y=10; i je: 1
for(i=0; i<5; i++) y je: 7 Obavezna su izmeu elemenata jezika koji nisu
{ operatori
i je: 2
System.out.println("i je: " + i); separatori
y je: 4
System.out.println("y je: " + y); int i,y=10;
System.out.println(); i je: 3 int i, y = 10;
y = y - 3; y je: 1 int i
} , y =
i je: 4
}
y je: -2 10 ;
}
18 20

5
10/30/2016

Komentari Literali

Komentar u jednom redu Konstantne vrednosti koje se navode doslovno


// Proizvoljan tekst do kraja reda 100 // Celobrojni literal
1.23 // Broj u pokretnom zarezu
Komentar u proizvoljnom broju redova
x // Znak
/*
Ovo je test // Znakovni niz
tekst napisan u proizvoljnom broju redova
*/
/* moe i unutar jednog reda */
int i/*komentar*/=2;

Dokumentacioni komentar
/** Slui za pravljenje HTML datoteke
za dokumentovanje programa */
21 23

Identifikatori Separatori
Imena klasa, metoda, promenljivih () Zagrade slue za liste parametara metoda,
naglaavanje prioriteta, grupisanje izraza,
Koriste se zadavanje tipa pri konverziji
velika i mala slova {} Vitiaste zagrade slue za definisanje klasa, metoda,
brojevi blokova naredbi, automatsku inicijalizaciju nizova
znakovi: _ i $ [] Uglaste zagrade slue za deklarisanje nizova
i pristupanje pojedinanim lanovima niza
Primeri identifikatora
; Znak taka zarez oznaava kraj naredbe
a4 srednja_vrednost SrednjaVrednost
, Zarez slui za razdvajane identifikatora u deklaraciji
_a4 $test srednjaVrednost promenljivih i za povezivanje naredbi
Neispravno napisani identifikatori . Taka razdvaja ime paketa od potpaketa i klasa,
4a srednja-vrednost srednja vrednost razdvaja promenljive i metode od imena objekata

22 24

6
10/30/2016

Rezervisane rei
abstract const finaly int public this

boolean continue float interface return throw

break default for long short throws

byte do goto native static transient

case doube if new strictfp try

catch else implements package super void

char extends import private switch volatile

class final instanceof protected synchronized while

Ne koriste se rezervisane rei const i goto


Rezervisane rei su i vrednosti: true, false, null
25 27

Javine biblioteke
Java sadri biblioteke klasa
Klase su grupisane prema funkcijama kojima se bave
ulaz i izlaz podataka
rad sa tekstom
rad sa grafikom
rad u mrei
komunikcija sa SQL bazama podataka
...

26 28

7
10/30/2016

Prosti tipovi

Tipovi za cele brojeve


byte // 8 bita
short // 16 bita (kratak ceo broj)
int // 32 bita (ceo broj)
Tipovi podataka, promenljive
long // 64 bita (dugaak ceo broj)
Tipovi za brojeve u pokretnom zarezu
float // 32 bita
double // 64 bita (broj dvostruke tanosti)
Tip za znakove
char // 16 bita
Tip za logike vrednosti
boolean // dve vrednoti, true i false
29 31

Tipovi podataka Celi brojevi


Vrste tipova Oznaeni (pozitivni i negativni)
Prosti tipovi (vrednosti koje nisu objekti) Negativni brojevi se zapisuju u drugom komplementu
Klasni tipovi (objekti) Duina celobrojnog tipa odreuje ponaanje
duinu ne treba shvatiti kao stvarnu koliinu memorije za
Java je strogo tipiziran jezik vrednost datog tipa
mogue je da vrednost zauzme vie memorije, npr. byte i
short da zauzmu 32 bita
Opseg brojeva predstavljenih sa n bita

2 n1 do 2 n1 1

30 32

8
10/30/2016

Konverzija broja iz sistema sa osnovom b


Numeriki sistemi
u decimalni numeriki sistem
Decimalni n1
osnova 10
cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
broj(10 ) = c b i
i

Binarni i = m
osnova 2
n je broj celih mesta
cifre: 0, 1
Oktalni m je broj razlomljenih mesta
osnova 8 b je osnova sistema iz kojeg se prevodi broj
cifre: 0, 1, 2, 3, 4, 5, 6, 7
ci su cifre sistema iz kojeg se prevodi broj
Heksadecimalni, osnova 16
osnova 16
i je pozicija cifre
cifre: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F bi je teina cifre na poziciji i
33 35

Jedan nain konverzije celog broja


Primer konverzije iz decimalnog u binarni sistem
iz decimalnog sistema u sistem sa osnovom N
Broj se uzastopno deli osnovom sistema N sve dok Prevodi se broj 109 Krai nain pisanja
rezultat deljenja ne postane nula 109 : 2 = 54, ostatak 1 109 1
Zapisuje se ostatak pri svakom deljenju, svaki ostatak je 54 : 2 = 27, ostatak 0 54 0
jedna cifra u sistemu sa osnovom N 27 : 2 = 13, ostatak 1 27 1
Cifre koje predstavljaju ostatke napiu se u obrnutom 13 : 2 = 6, ostatak 1 13 1
redosledu u odnosu na redosled kojim su dobijene
6 : 2 = 3, ostatak 0 6 0
deljenjem
3 : 2 = 1, ostatak 1 3 1
1 : 2 = 0, ostatak 1 1 1
Zapis broja je 0
109(10) = 1101101(2)

34 36

9
10/30/2016

Konverzija iz binarnog
Primer konverzije iz binarnog u decimalni sistem
u heksadecimalni numeriki sistem i obrnuto
Za decimalni broj 109: Za osnove sistema vai: 24=16
1 0 9 etiri binarne cifre odgovaraju jednoj heksadecimalnoj cifri
2 1 0 - pozicije cifara Prevoenje iz binarnog u heksadecimalni sistem:
teine cifara su poevi od cifre najmanje teine grupiu se po etiri
109 = 1102
+ 0101+ 9100 binarne cifre i zamene se jednom heksadecimalnom cifrom
ako poslednja grupa ima manje od etiri cifre dopisuje se
Prevoenje binarnog broja 1101101 u decimalni
potreban broj nula sa prednje strane
1 1 0 1 1 0 1
Primer: binarni broj 1101101:
6 5 4 3 2 1 0 - pozicije cifara
110 1101(2) = 0110 1101(2) = 6 D(16)
1101101(2)
Prevoenje broja iz heksadecimalnog u binarni sistem
= 126 + 125 + 024 + 123 + 122 + 021 + 120
svaka heksadecimalna cifra zameni se kombinacijom etiri
= 64 + 32 + 0 + 8 + 4 + 0 + 1 binarne cifre koja odgovara toj heksadecimalnoj cifri
= 109(10) 37 39

Primer konverzije broja iz decimalnog


Zapis negativnih celih brojeva u binarnom sistemu
u heksadecimalni numeriki sistem
Prva cifra za pozitivne brojve je 0
Prevodi se broj 109 Krai nain pisanja
Negativni brojevi se zapisuju u drugom komplementu
109 : 16 = 6, ostatak 13 109 13 = D
Prvi komplement broja: sve nule se zamene jedinicama,
6 : 16 = 0, ostatak 6 6 6 a sve jedinice nulama
0 ili: prvi komplement = 2n 1 broj, n je broj cifara
Zapis broja je
109(10) = 6D(16) Drugi komplement broja: na prvi komplement se doda 1
ili: drugi komplement = 2n broj, n je broj cifara
Pravilo za prevoenje u drugi komplement:
idui od cifre najmanje teine, sve uzastopne nule se
prepiu, a takoe i prva jedinica na koju se naie
preostale cifre: sve nule se zamene jedinicama, a jedinice
nulama
38 40

10
10/30/2016

Primeri odreivanja drugog komplementa Drugi komplement: primeri sabiranja


Za decimalni broj 109: Za decimalni broj 16: Sabiranje 5 i 3: Sabiranje 5 i -3:
109(10) = 01101101(2) 16(10) = 00010000(2) prenos 0000 111 prenos 1 1111 101
Drugi komplement: Drugi komplement: 5(10) 0000 0101(2) 5(10) 0000 0101(2)
0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 3(10) 0000 0011(2) -3(10) 1111 1101(2)
1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 8(10) 0000 1000(2) 2(10) 1 0000 0010(2)
Negativan broj: Negativan broj:
-109(10) = 10010011(2) -16(10) = 11110000(2) Sabiranje -5 i -3: Sabiranje -5 i 3:
prenos 1 1111 111 prenos 0000 011
-5(10) 1111 1011(2) -5(10) 1111 1011(2)
-3(10) 1111 1101(2) 3(10) 0000 0011(2)
-8(10) 1 1111 1000(2) -2(10) 1111 1110(2)
41 43

Primer: drugi komplement broja 1 Predstavljanje celih brojeva u raunaru


Zapis pozitivnog broja: Pozitivni brojevi imaju vodeu nulu
1(10) = 0000 0001(2) Negativni brojevi se zapisuju u drugom komplementu,
Drugi komplement: imaju vodeu jedinicu
0 0 0 0 0 0 0 1 Nula ima jedinstven zapis: 00 ... 000
1 1 1 1 1 1 1 1 Negativnih brojeva ima vie za 1 nego pozitivnih, tj. ako
Negativan broj: se brojevi zapisuju sa N bita:
negativnih brojeva ima 2N1
-1(10) = 1111 1111(2)
pozitivnih brojeva ima 2N11

42 44

11
10/30/2016

byte Little-Endian i Big-Endian formati (primer za int)

Duina 8 bita Little-Endian Big-Endian


Opseg: 128 do 127 byte3 byte2 byte1 byte0 byte0 byte1 byte2 byte3
127(10) = 0111 1111(2) = 0x7F(16)
-128(10) = 1000 0000(2) = 0x80(16)
Osnovna adresa+0: byte0 Osnovna adresa+0: byte3
Osnovna adresa+1: byte1 Osnovna adresa+1: byte2
Deklaracija promenljive:
byte a;
Osnovna adresa+2: byte2 Osnovna adresa+2: byte1
byte b, c; Osnovna adresa+3: byte3 Osnovna adresa+3: byte0

Little-Endian: Intelovi procesori x86 koje se koriste u PC


Big-Endian: Motorola procesori koji se koriste za Mac

45 47

short int

Duina 16 bita Duina 32 bita


Opseg: 32768 do 32767 Opseg: 2 147 483 648 do 2 147 483 647
32767 = 0x7FFF 2147483647 = 0x7FFFFFFF
-32768 = 0x8000 -2147483648 = 0x80000000
Big-Endian format Deklaracija promenljive:
Deklaracija promenljive: int i, j;
short s;

46 48

12
10/30/2016

long Standard IEEE 754, brojevi u pokretnom zarezu

Duina 64 bita Znak Eksponent Mantisa Bias


Opseg: 9 223 372 036 854 775 808 do float 1 bit [31] 8 bita [30-23] 23 bita [22-0] 127
9 223 372 036 854 775 807 double 1 bit [63] 11 bita [62-52] 52 bita [51-0] 1023
9223372036854775807 = 0x7FFFFFFFFFFFFFFF
Znak
-9223372036854775808 = 0x8000000000000000
0 za pozitivne brojeve
Deklaracija promenljive: 1 za negativne brojeve
long broj_sekundi; Eksponent je za osnovu 2
Vrednost u memoriji je <stvatna vrednost eksponenta> + Bias
Eksponenti 00...00 i 11...11 imaju specijalno znaenje
Primeri za float
Zapis 200 predstavlja eksponent 73 (200127=73)
Najmanja vrednost eksponenta je 1127=126
Najvea vrednost eksponenta je 254127=127
49 51

Standard IEEE 754, brojevi u pokretnom zarezu Standard IEEE 754, opsezi brojeva
Znak (z) Eksponent (e) Mantisa (m) Bias (b) Sa normalizovanom mantisom (eksponent 0)
float 1 bit [31] 8 bita [30-23] 23 bita [22-0] 127
min max priblini opseg
double 1 bit [63] 11 bita [62-52] 52 bita [51-0] 1023
float 2126 (2223)2127 1037.93 1038.53
Mantisa sadri zapis o razlomljenom delu
double 21022 (2252)21023 10307.65 10308.25
Normalizovana mantisa ima oblik 1.m,
Zapisuje se "m", a "1." se podrazumeva
Tip float ima 24 tane binarne cifre, a double 53 Sa denormalizovanom mantisom (eksponent = 0)
Zapis broja je: (1)z 1.m 2e-b
min max priblini opseg
Denormalizovana mantisa ima oblik 0.m i
mantisa je denormalizovana ako je m 0, e = 0 float 2149 (1223)2126 1044.85 1037.93
Zapis broja je: (1)z 0.m 2-126
double 21074 (1252)21022 10323.3 10307.65
50 52

13
10/30/2016

Standard IEEE 754, opsezi brojeva Standard IEEE 754, specijalne operacije

Sa normalizovanom mantisom (eksponent 0) Operacija Rezultat


min max priblini opseg n / beskonano 0
float 2126 (2223)2127 1,171038 3,401038 beskonano beskonano beskonano
double 21022 (2252)21023 2,2210308 1,7910308 <ne_nulta_vrednost> / 0 beskonano
beskonano + beskonano beskonano
Sa denormalizovanom mantisom (eksponent = 0)
0 / 0 NaN
min max priblini opseg beskonano beskonano NaN
float 2149 (1223)2126 1,401045 1,751038 beskonano / beskonano NaN
double 21074 (1252)21022 4,9410324 2,2210308 beskonano 0 NaN
53 55

Standard IEEE 754, specijalne vrednosti Standard IEEE 754, sumarna tabela
Znak Eksponent (e) Mantisa (m) Vrednost
Nula: eksponent sadri nule, mantisa sadri sve nule
0 00..00 00..00 +0
ne moe da se zapie sa normalizovanom mantisom
0 00..00 00..01 11..11 0.m 2-b+1
postoje +0 i 0 koje su jednake pri poreenju
0 00..01 11..10 XX..XX 1.m 2e-b
Beskonano (): eksponent sadri sve jedinice, 0 11..11 00..00 +beskonano
mantisa sadri sve nule
0 11..11 00..01 01..11 QNaN
NaN (Not a Number): eksponent sadri sve jedinice, 0 11..11 10..01 11..11 SNaN
mantisa je razliita od nule (ne sadri sve nule) 1 00...00 00...00 0
QNaN (Quiet NaN): MSB mantise je 1, oznaava rezultat 1 00...00 00..01 11..11 0.m 2-b+1
matematike operacije koji nije nedefinisan
1 00..01 11..10 XX..XX 1.m 2e-b
SNaN (Signalling NaN): MSB mantise je 0, nevaea
1 11..11 00..00 beskonano
operacija, izuzetak
1 11..11 00..01 01..11 QNaN
1 11..11 10..01 11..11 SNaN
54 56

14
10/30/2016

float Znakovni tip - char

Duine 32 bita Duina 16 bita


Opseg za pozitivne brojeve je: Koristi se UNICODE
(3.4e38?) 1.18e38 do 3.4e+38 Opseg: 0 do 65535
Negativni brojevi imaju isti opseg po apsolutnoj vrednosti ASCII znakovi imaju nepromenjene vrednosti 0-127,
kao i pozitivni brojevi odnosno od 0-255 je ISO-Latin-1
Tip float se koristi kad nije potrebna velika tanost Mogu da se izvode raunske operacije sa znakovnim
Deklaracija promenljive: tipom
float temperatura; Deklaracija promenljive:
char z, znak;

57 59

double Primer za znakovni tip


Duina 64 bita class PrimerZaChar {
public static void main(String args[]) {
Opseg za pozitivne brojeve je: char znak = X;
(1.74e-308?) 2.2e308 do 1.7e+308 System.out.println(znak);
Negativni brojevi imaju isti opseg po apsolutnoj vrednosti znak++;
kao i pozitivni brojevi System.out.println(znak);
Matematike funkcije iz klase Math kao rezultat vraaju }
}
tip double
sin(), cos(), sqrt(), ...
Rezultat izvravanja programa:
Izraunavanje je bre nego sa float
X
Deklaracija promenljive:
double r;
Y

58 60

15
10/30/2016

Logiki tip - boolean Literali u pokretnom zarezu


Vrednosti: true, false Standardna forma: 8.53, 0.021, 375.63
Operatori poreenja vraaju rezultat tipa boolean Nauna forma: 6.022E23, 314259e-05, -5e24
Podrazumeva se tip double
boolean b = true; Tip float se oznaava slovom F na kraju (malo ili
System.out.println(b); // Prikazuje "true" veliko slovo): 20.3F, -2.3f, 7.1e-4F
Tip double moe da se oznai slovom D ili d na
kraju, ali je to suvino

61 63

Celobrojni literali Logiki literali


Decimalni sistem: 7, 123 Postoje dve vrednosti:
Oktalni sistem, prva cifra je 0: 07, 056 true
false
Heksadecimalni sistem, brojevi poinju sa 0x ili 0X
cifre od A do F mogu da se piu malim ili velikim slovima
Podrazumeva se da je tip int
Moe se dodeliti promenljivoj tipa byte ili short ako
je vrednost literala unutar opsega tipa:
byte b = 26;
Literal tipa long oznaava se slovom L na kraju:
0x7FL, 0xac23l

62 64

16
10/30/2016

Znakovni literali Deklarisanje promenljive

Vidljivi znakovi mogu da se piu unutar polunavodnika: tip identifikator[=vrednost][,identifikator[=vrednost]];


'a', 'A', 'x', '8', '@', '!'
Specijalni znakovi se oznaavaju kosom crtom: Primeri:
'\'' (polunavodnik), '\"' (navodnik), '\t' (tabulator), int i, j; // deklaracija dve promenljive tipa int
'\n' (prelazak u novi red), '\r' (vraanje na poetak int x=3, z, y=-10; // deklaracija i inicijalizacija
reda), '\f' (prelazak na novu stranicu) char znak = w;
Znak moe da se unese pomou vrednosti: double a=3, b=4;
oktalna vrednost se unosi kao trocifren broj '\ddd': double c=Math.sqrt(a*a+b*b); //dinamika inicijalizacija
'\044', '\101'
heksadecimalna vrednost se unosi kao etvorocifren broj Dinamika inicijalizacija je inicijalizacija izraunavanjem
dodatno oznaen kosom crtom i slovom u: '\u0065', izraza koji vai u trenutku izvravanja (sve promenljive u
'\ua075' izrazu moraju dobiti vrednost pre pozivanja izraza)

65 67

Literali znakovnog niza Oblast vaenja i ivotni vek promenljive


Unose se izmeu navodnika: Oblast vaenja
"Tekst koji se ispisuje u jednom redu."
unutar klase
"Tekst koji\nse ispisuje\nu tri reda."
unutar metode
"\"Tekst koji se ispisuje unutar navodnika.\""
unutar bloka
ivotni vek
Naredba System.out.println() bi gornje
nastaju kad se ue u njihovu oblast vaenja
znakovne nizove ispisala ovako:
unitavaju se kad se izae iz njihove oblasti vaenja
Tekst koji se ispisuje u jednom redu.
Tekst koji
se ispisuje
u tri reda.
"Tekst se ispisuje unutar navodnika."

66 68

17
10/30/2016

Oblast vaenja promenljive ivotni vek promenljive


Promenljiva se ne moe koristiti pre deklaracije Promenljive deklarisane u bloku koji se ponavlja u petlji
{ gube vrednost izmeu dva prolaska kroz blok
int p = 3; class ZivotniVek {
{ public static void main(String args[]) {
... int x;
broj = 10; // Greka, promenljiva nije deklarisana for(x=0; x<3; x++){
int broj; int y = -1; // svaki put kad se ue u blok
int m = p; System.out.println("y je: " + y); //uvek -1
... y = y + 101;
} System.out.println("y = " + y); //uvek 100
int k = m; // Greka, m ne postoji u ovom bloku }
int r = p; }
... }
} 69 71

Ilustrovanje oblasti vaenja Oblast vaenja


class OblastVazenja { Promenljive sa istim imenom ne mogu da se deklariu u
public static void main(String args[]) { dva bloka od kojih je jedan spoljanji, a drugi unutranji
int x=10; // vidljiva unutar metode main
// Ovaj program se ne prevodi
if(x==10){ // poetak nove oblasti vaenja
class PogresnaOblastVaznja {
int y=20; // vidljiva samo u ovom bloku
public static void main(String args[]) {
System.out.println("x i y: " + x + " " + y);
int g = 1;
x = y * 2; // u ovom bloku se vide x i y
{ // nova oblast vaenja
}
int g = 2; // greka u prevoenju
//y = 100; // Greka, y se ovde ne vidi
// promenljiva g ve postoji
// x se ovde vidi
}
System.out.println("x je " + x);
}
}
}
}

70 72

18
10/30/2016

Pravila za automatsku konverziju (unapreivanje)


Konverzije
tipova u izrazima
Automatska konverzija byte i short se automatski unapreuju u int
tipovi su meusobno kompatibilni ako je jedan operand izraza long, ceo izraz se
odredini tip je vei (sloeniji) od polaznog unapreuje u long
Izriita (eksplicitna) konverzija ako je jedan operand izraza float, ceo izraz se
unapreuje u float
Javin prevodilac uvek proverava usaglaenost tipova ako je jedan operand izraza double, ceo izraz se
unapreuje u double

73 75

Automatsko unapreivanje tipova u izrazima Primer za automatsku konverziju


class Unapredjivanje {
byte i short se uvek konvertuju u tip int kad se
public static void main(String args[]) {
pojavljuju kao operandi nekog izraza
byte b = 2;
Primer: short s = 300;
byte a=5, b=8; char z = 'a';
int i = 10, j = 5;
byte c=a*b; // Izaziva greku u prevoenju
long k = 0xFFFFFFFFFFL;
byte d = (byte)(a*b); // Ispravno float f = 5.1f;
byte e = (byte)a*b; // Pogreno double d = .1;
double r = (f*b) + (i/z) (j+k) + (d*s);
System.out.println((f*b) + " + " + (i/z) + " "
+ (j+k) + " + " + (d*s));
System.out.println("rezultat = " + r);
}
}
74 76

19
10/30/2016

Primer za eksplicitnu konverziju

Mogui su i neoekivani rezultati, npr. kad je broj koji se


konvertuje izvan opsega tipa u koji se konvertuje
class Konverzija {
public static void main(String args[]) {
int i = 257; // 0...0 0001 0000 0001
double d = 129.142;
byte b = (byte)i; // b=1 0000 0001
i = (int)d; // i=129 0...0 0000 1000 0001
b = (byte)d; // b=-127 1000 0001

// 130 = 0...0 0000 1000 0010


i = -130; // -130 = 1...1 1111 0111 1110
b = (byte)i; // b=126 0111 1110
}
} 77 79

Primer: eksplicitna konverzija int u byte

Tip int je duine 32 bita, tj. 4 bajta


Pri konverziji tipa int u tip byte rezultat je jednak
najniem bajtu (biti na pozicijama od 0 do 7), a tri gornja
bajta se gube (biti na pozicijama od 8 do 31)
Zavisno od vrednosti bita na poziciji 7, rezultat moe
promeniti znak

int byte

byte3 byte2 byte1 byte0 byte0

00110100 10011010 01101110 11111111 11111111



pozicija 7 78 80

20
10/30/2016

Jednodimenzionalni nizovi

Lista (niz) promenljivih istog tipa


Deklaracija
tip ime_niza[];
Nizovi tip[] ime_niza; // alternativna mogunost deklarisanja

Primer
int meseci[];
int[] meseci;

Deklaracija ne rezervie mesto u memoriji za niz

81 83

Nizovi Kreiranje niza


Grupe promenljivih istog tipa Deklaracija a zatim kreiranje niza
Jedna ili vie dimenzija tip ime_niza[];
ime_niza = new tip[velicina];
Primer
int meseci[];
meseci = new int[12];

Deklaracija i pravljenje niza u istoj naredbi


tip ime_niza[] = new tip[velicina];
Primer
int meseci[] = new int[12];
82 84

21
10/30/2016

Primer za jednodimenzionalni niz Viedimenzionalni nizovi


class Niz {
public static void main(String args[]) { Dvodimenzionalni niz je matrica
int meseci[] = new int[12];
Deklaracija dvodimenzionalnog niza
meseci[0] = 31; // januar
tip ime_niza[][];
meseci[1] = 28; // februar
meseci[2] = 31; // mart
// ... Primer
meseci[10] = 30; // novembar int matrica[][] = new int[3][4];
meseci[11] = 31; // decembar
System.out.println("April ima " + meseci[3] +
Ovim se rezervie 3x4=12 lokacija u memoriji za tip int
" dana.");
}
}

April ima 30 dana.


85 87

Inicijalizacija jednodimenzionalnog niza Predstavljanje dvodimenzionalnog niza


Ne koristi se operator new za rezervisanje prostora
int matrica[][] = new int[3][4];
class InicijalizacijaNiza { Prvi indeks odreuje vrstu (red) a drugi kolonu
public static void main(String args[]) {
int meseci[] = {31, 28, 31, 30, 31, 30, 31,
31, 30, 31, 30, 31}; [0][0] [0][1] [0][2] [0][3]
System.out.println("April ima " + meseci[3] +
" dana."); [1][0] [1][1] [1][2] [1][3]
}
}
[2][0] [2][1] [2][2] [2][3]

April ima 30 dana.

86 88

22
10/30/2016

Primer za pristupanje lanovima matrice Drugi nain kreiranja viedimenzionalnog niza


class DvodimenzionalniNiz { class DvodimenzionalniNizDrugiNacin {
public static void main(String args[]) { public static void main(String args[]) {
int matrica[][]= new int[3][4]; int m[][]= new int[3][];
int i, j, k = 0; m[0] = new int[4];
for(i=0; i<3; i++) m[1] = new int[4];
for(j=0; j<4; j++) { m[2] = new int[4];
matrica[i][j] = k; // Isto se dobija sa
k++; // int matrica[][]= new int[3][4];
} ...
for(i=0; i<3; i++) { }
for(j=0; j<4; j++) }
System.out.print(matrica[i][j] + " ");
System.out.println();
}
}
89 91
}

Inicijalizacija dvodimenzionalnog niza Razliit broj elemenata u nekoj dimenziji niza


class DvodimenzionalniNizInit { class DvodimenzionalniNizSpec {
public static void main(String args[]) { public static void main(String args[]) {
int m[][]= { { 0, 1, 2, 3 }, int dd[][]= new int[3][];
{ 4, 5, 6, 7 }, dd[0] = new int[1];
{ 8, 9, 10, 11 } }; dd[1] = new int[2];
int i, j; dd[2] = new int[3];
for(i=0; i<3; i++) { int i, j, k=0;
for(j=0; j<4; j++) for(i=0; i<3; i++)
System.out.print(m[i][j] + " "); for(j=0; j<i+1; j++) {
System.out.println(); dd[i][j] = k;
} k++;
} }
} }
0 1 2 3 }
4 5 6 7
90 92
8 9 10 11

23
10/30/2016

Razliit broj elemenata u nekoj dimenziji niza

[0][0]

[1][0] [1][1]

[2][0] [2][1] [2][2]

93 95

94 96

24
10/30/2016

Aritmetiki operatori
+ Sabiranje
Oduzimanje i unarni minus
* Mnoenje
/ Deljenje
Operatori % Moduo
++ Uveavanje za jedan
Umanjivanje za jedan
+= Dodeljivanje uz sabiranje
= Dodeljivanje uz oduzimanje
*= Dodeljivanje uz mnoenje
/= Dodeljivanje uz deljenje
%= Dodeljivanje uz moduo
97 99

Primer osnovnih operacija sa tipom int


Operatori class OsnovneOperacijeSaIneger {
public static void main(String args[]) {
Aritmetiki operatori int a = 1 + 1;
Operatori nad bitima int b = a * 3;
int c = b / 4;
Operatori poreenja
int d = c - a;
Logiki operatori
int e = -d;
Operator dodeljivanja System.out.println("a = " + a + "\nb = " + b +
Operator ?: "\nc = " + c + "\nd = " + d + "\ne = " + e);
}
}
a=2
b=6
c=1
d = -1
98 100
e=1

25
10/30/2016

Primer osnovnih operacija sa tipom double


class OsnovneOperacijeSaDouble {
Aritmetiki operatori dodeljivanja
public static void main(String args[]) {
double a = 1 + 1; promenljiva = promenljiva operator izraz;
double b = a * 3; promenljiva operator= izraz;
double c = b / 4;
double d = c - a;
Primeri
double e = -d; a = a / 4;
System.out.println("a = " + a + "\nb = " + b + a /= 4;
"\nc = " + c + "\nd = " + d + "\ne = " + e);
} b = b % c;
} b %= c;
a = 2.0
b = 6.0 d = d + e * f;
c = 1.5 d += e * f;
d = -0.5
101 103
e = 0.5

Operator moduo Uveavanje i umanjivanje


class Moduo { x = x + 1;
public static void main(String args[]) { x++;
int x = 7;
x = x 1;
int y = x % 3;
x--;
System.out.println("7 % 3 = " + y);
double d = 5.5; Mogu da budu prefiksi ili sufiksi
double d1 = d % 2; // d1=1.5 Primer za sufiks
System.out.println("d1 = " + d1); x = 5;
double d2 = d % 2.5; // d2=0.5 y = x++; // vrednost koju vraa x++ je ona pre poveanja
System.out.println("d2 = " + d2); // x uvea i dobije vrednost 6, a y dobija vrednost 5
} Primer za prefiks
} x = 5;
7 % 3=1 y = ++x; // vrednost koju vraa x++ je ona posle poveanja,
d1 = 1.5 // x uvea i dobije vrednost 6, i y dobija istu vrednost 6
d2 = 0.5 102 104

26
10/30/2016

Operatori nad bitima


Operatori nad bitima
~ Negacija bita jednog operanda (NE NOT)
& Konjunkcija nad bitima (I AND) 00101010 42
| Disjunkcija nad bitima (ILI OR) ~ 00101010 42 | 00001111 15
^ Iskljuiva disjunkcija nad bitima (EXOR) 11010101 43 00101111 47
>> Pomeranje udesno
>>> Pomeranje udesno sa unoenjem nula
00101010 42 00101010 42
<< Pomeranje ulevo
& 00001111 15 ^ 00001111 15
&= Dodeljivanje uz konjunkciju nad bitima
|= Dodeljivanje uz disjunkciju nad bitima 00001010 10 00100101 37
^= Dodeljivanje uz iskljuivu disjunkcija nad bitima
>>= Dodeljivanje uz pomeranje udesno
>>>= Dodeljivanje uz pomeranje udesno sa unoenjem nula
<<= Dodeljivanje uz pomeranje ulevo
105 107

Tabela operatora nad bitima Pomeranje ulevo

A B A| B A& B A^ B ~A vrednost << broj_bita_za_koliko_se_pomera;


Sa desne strane se dodaju nule
0 0 0 0 0 1
Biti sa leve strane se gube
0 1 1 0 1 1
Primer:
1 0 1 0 1 0 int i = 1 << 3; // i dobija vrednost 8
int p = 0x7FFFFFFF; // p ima vrednost najveeg int
1 1 1 1 0 0
p = p << 1; // p je 0xFFFFFFFE tj. -2
p <<= 1; // p je 0xFFFFFFFC tj. -4

Pomeranje ulevo za N bita odgovara mnoenju sa 2N, pod uslovom


da ne doe do promene znaka broja

106 108

27
10/30/2016

Pomeranje udesno Primeri za operacije nad bitima


byte b = (byte)0xff;
vrednost >> broj_bita_za_koliko_se_pomera;
b = b >>> 4; // Greka, rezultat je tipa int
Pri pomeranju se uva znak, tj. sa leve strane se dodaje b >>>= 28; // Ispravno, b je sad 0x0f
bit jednak bitu koji je prethodno bio na poziciji 31
Biti sa desne strane se gube b = (byte)0xff;
Primer: b = (byte)((b & 0xff) >> 4); // b je sad 0x0f, jer:
int a = 35; // a = 0...0 00100011 // b se unapreuje u int: 0xffffffff
a = a >> 2; // a = 0...0 00001000 (tj. a=8) // AND po bitima sa 0xff: 0x000000ff
a = a >> 4; // a = 0...0 00000000 (tj. a=0) // pomeranje udesno za 4: 0x0000000f
int b = -8; // b = 1...1 11111000 // posle konverzije int u byte: 0x0f
b = b >> 2; // b = 1...1 11111110 (tj. b=-2)
b = b >> 1; // b = 1...1 11111111 (tj. b=-1)
b = b >> 1; // b = 1...1 11111111 (b ostaje -1)

109 111

Pomeranje udesno uz dodavanje nula Operatori poreenja


vrednost >>> broj_bita_za_koliko_se_pomera;
Sa leve strane se dodaju nule == Jednako
Biti sa desne strane se gube != Razliito
Primer: > Vee
int k = -1; // 0xFFFFFFFF < Manje
k = k >>> 1; // 0x7FFFFFFF (k je sad najvei int) >= Vee ili jednako
k = k >>> 23; // 0x000000FF (k je sad 255) <= Manje ili jednako
byte b = (byte)0xff;
b = (byte)(b >>> 4); // b i dalje ima vrednost 0xff
// prvo je unapreen u int: 0xffffffff Rezultat operacija je logiki tip (boolean)
// zatim je pomeren udesno: 0x0fffffff Operatori == i != rade sa svim tipovima
// na kraju je konverzija u byte: 0xff Operatori redosleda (>, <, >=, <=) rade sa numerikim
tipovima i char
110 112

28
10/30/2016

Primeri za operatore poreenja Tabela logikih operatori


int a=1, b=4; A B A| B A& B A^ B !A
boolean c = a < b; // c ima vrednost true
if(c) naredba; false false false false false true
if(a<b) naredba; false true true false true true

true false true false true false

true true true true false false

113 115

Logiki operatori Primer za logike operatore


& Konjunkcija (I AND) class BoolLogic {
| Disjunkcija (ILI OR) public static void main(String args[]) {
^ Iskluiva (ekskluzivna) disjunkcija (EXILI EXOR) boolean a = true, b = false;
boolean c = a | b;
&& Kratkospojena konjunkcija boolean d = a & b;
|| Kratkospojena disjunkcija boolean e = a ^ b;
! Unarna negacija (NE NOT) boolean f = (!a & b) | (a & !b);
== Jednako boolean g = !a;
!= Razliito System.out.println("a = " + a + "\nb = " + b +
"\na|b = " + c + "\na&b = " + d + "\na^b = " +
?: Ternarni operator uslovne dodele
e + "\n!a&b | a&!b = " + f + "\n!a = " + g);
&= Dodeljivanje uz konjunkciju }
|= Dodeljivanje uz disjunkciju }
^= Dodeljivanje uz iskluivu disjunkciju a = true a&b = false !a = false
b = false a^b = true
114 116
a|b = true !a&b | a&!b = true

29
10/30/2016

Kratkospojeni logiki operatori Operator dodeljivanja


boolean c = izraz1 || izraz2; promenljiva = izraz;
Ako je izraz1=true, izraz2 se ne izraunava, poto je u tom sluaju
rezultat true bez obzira na vrednost izraza2 Operator dodeljivanja vraa vrednost izraza sa desne
strane
boolean c = izraz1 | izraz2; // Oba izraza se izraunavaju
int a, b, c, d;
if(d!=0 && b/d>100) naredba; // Ne dolazi do deljenja nulom
a = b = c = d = 10;

if(c==1 & e++<100) naredba; // e se uveava i kad je c=1


Sve etiri promenljive dobijaju vrednost 10
Operatori && i || se koriste ee od & i | Izraz d=10 vraa rezultat 10 koji se dodeljuje
promenljivoj c i tako redom do a

117 119

Prioritet operatora
Ternarni operator ?:
() [] .
++ -- ~ !
izraz1 ? izraz2 : izraz3;
* / %
Rezultat izraz1 mora biti logikog tipa
+ -
ako izraz1 ima vrednost true izvrava se izraz2
>> >>> <<
ako izraz1 ima vrednost false izvrava se izraz3
> >= < <=
Ternarni operator ?: vraa vrednost izraunatog izraza
== !=
Izrazi izraz2 i izraz3 moraju da budu istog tipa i ne
smaju da budu tipa void (vraaju rezultat nekog tipa) &
^
k = i<0 ? i : i; // Izraunavanje apsolutne vrednosti i |
&&
||
?:
= operator= (*=, /=, %=, +=, <<= ...)
118 120

30
10/30/2016

Korienje zagrada

Zagrade slue za definisanje redosleda izraunavanja


(prioriteta) i za pisanje jasnijih izraza

a >> b + 3; // prvo se b uveava za 3,


// zatim se sadraj a pomera udesno
// ("+" ima vei prioritet od ">>")
a >> (b + 3); // ekvivalentno gornjem

(a >> b) + 3; // prvo se sadraj a pomera udesno,


// zatim se uveava za 3

121 123

122 124

31
10/30/2016

Upravljake naredbe

Naredbe uslovljavanja
if
switch
Upravljake naredbe Naredbe ciklusa
while
do while
for
Naredbe skoka
break
continue
return

125 127

Upravljake naredbe Naredba if

Naredbe uslovljavanja Uslovno grananje na dva razliita puta


upravljanje izvravanjem programa na osnovu uslova koji Opti oblik
su poznati u trenutku izvravanja if(uslov) naredba1;
Naredbe ciklusa else naredba2;
izvravanje (ponavljanje) jedne naredbe ili bloka naredbi uslov je izraz koji vraa vrednost tipa boolean,
potreban broj puta, zavisno od uslova ili jedna promenljiva tipa tipa boolean
Naredbe skoka naredba je jedna naredba ili blok naredbi
prekidanje izvravanja redosleda naredbi i nastavljanje na deo else nije obavezan
definisanom mestu, tj. preskakanje naredbi
Izvravanje
ako uslov vrati vrednost true izvrava se naredba1
inae se izvrava naredba2 (ako else deo postoji)

126 128

32
10/30/2016

Primeri za if Ugnjedeni uslovi


int a, b;
// a i b dobijaju neke vrednosti ... if(i == 10) {
if(a < b) a = 0; if(j < 20) {
else b = 0; a = b;
if(k > 100) c = d;
int brojPodataka, n; }
// ... else a = c; // ovaj else se odnosi na uslov if(j < 20)
if(brojPodataka > 0) { }
ObradiPodatke(); // Blok od dve naredbe u if delu else a = d; // ovaj else se odnosi na uslov if(i == 10)
brojPodataka -= n;
}
else
PrikupiPodatke(); // Jedna naredba u else delu
int i = n; // Naredba koja ne pripada if-else delu

129 131

Ugnjedeni uslovi if else if


if(uslov1) if(uslov1)
naredba1; naredba1;
if(i == 10) {
else if(uslov2) else
if(j < 20) a = b;
naredba2; if(uslov2)
if(k > 100) c = d;
else if(uslov3) naredba2;
else a = c; // ovaj else se odnosi na uslov if(k > 100)
naredba3; else
}
else if(uslov4) if(uslov3)
else a = d; // ovaj else se odnosi na uslov if(i == 10)
naredba4; naredba3;
else else
naredba5; if(uslov4)
naredba4;
else
naredba5;

130 132

33
10/30/2016

Primer za if else if
class GodisnjaDobaSaIfElseIf {
Naredba switch
public static void main(String args[]) { izraz je jedan od tipova: byte, short, int ili char
int mesec = 4; // April Svaka od vrednosti je jedinstven literal (konstanta)
String godisnjeDoba;
Ne sme se ponoviti ista vrednost u istom switch
if(mesec==12 || mesec==1 || mesec==2)
godisnjeDoba = "zima"; Sa break se zavrava switch
else if(mesec==3 || mesec==4 || mesec==5) Ako ne postoji break nastavlja se izvravanje sledeeg
godisnjeDoba = "prolee"; case
else if(mesec==6 || mesec==7 || mesec==8)
Deo default je opcioni
godisnjeDoba= "leto";
else if(mesec==9 || mesec==10 || mesec==11)
godisnjeDoba = "jesen";
else
godisnjeDoba = "nepostojei mesec";
System.out.println("Kada je mesec april, godinje doba
je " + godisnjeDoba + ".");
}
}
Kada je mesec april, godinje doba je prolee. 133 135

Primer za switch
Naredba switch class PrimerZaSwitch {
Grananje u vie putanja zavisno od vrednosti izraza public static void main(String args[]) {
Opti oblik for(int i=0; i<6; i++)
switch(i) {
switch(izraz) {
case 0: System.out.println("i je nula."); break;
case vrednost1:
case 1: System.out.println("i je jedan."); break;
niz_naredbi1;
case 2: System.out.println("i je dva."); break;
[break;] case 3: System.out.println("i je tri."); break;
case vrednost2: default: System.out.println("i je vee od tri.");
niz_naredbi2; }
[break;] }
... }
default: i je nula.
niz_naredbiN; i je jedan.
i je dva.
}
i je tri.
i je vee od tri.
134 i je vee od tri. 136

34
10/30/2016

Primer za switch bez break


class PrimerBezBreak {
Ugnjedena naredba switch
public static void main(String args[]) { switch (izraz_spoljasnjeg_switch) {
for(int i=0; i<9; i++) case 1:
switch(i) { switch (izraz_unutrasnjeg_switch) {
case 0: System.out.println("i = 0"); case 0:
case 1:
System.out.println("unutra je 0");
case 2: System.out.println("i < 3"); break;
break;
case 3:
case 4: System.out.println("i < 5"); break;
case 1: // ne smeta spoljanjem switch
default: System.out.println("i >= 5"); System.out.println("unutra je 1");
} break;
} }
} break;
i=0 i<5 case 2:
i<3 i >= 5 ...
i<3 i >= 5 }
i<3 i >= 5
137 139
i<5 i >= 5

Godinja doba sa switch


class GodisnjaDobaSaSwitch { Poreenje if i switch
public static void main(String args[]) {
int mesec = 4;
String godisnjeDoba; switch proverava samo jednakost, a if proizvoljan
switch (mesec) {
case 12:
logiki izraz
case 1: switch je efikasniji od ugnjedenih if else if
case 2: godisnjeDoba = "zima"; break;
case 3:
case 4:
case 5: godisnjeDoba = "prolee"; break;
case 6:
case 7:
case 8: godisnjeDoba = "leto"; break;
case 9:
case 10:
case 11: godisnjeDoba = "jesen"; break;
default: godisnjeDoba = "nepostojei mesec";
}
System.out.println("Kada je mesec april, godinje deoba je " +
godisnjeDoba + ".");
}
} 138 140

35
10/30/2016

Primer za while petlju


Naredbe ciklusa
class PrimerZaWhile {
Izvravanje (ponavljanje) jedne naredbe ili bloka naredbi public static void main(String args[]) {
potreban broj puta, zavisno od uslova int n = 5; // Za n=0 petlja se ne bi izvrila nijednom
while(n > 0) {
System.out.println("Vrednost n je " + n);
Naredbe ciklusa (petlje) n--;
while }
do while }
for }

Vrednost n je 5
Vrednost n je 4
Vrednost n je 3
Vrednost n je 2
Vrednost n je 1

141 143

Petlja while Primer za while bez tela petlje


class WhileBezTelaPetlje {
Opti oblik while petlje public static void main(String args[]) {
while(uslov) int i = 100, j = 200;
// U petlji se nalazi sredina izmeu i i j
telo_petlje
while(++i < --j) ; // Petlja bez tela ima samo znak ";"
uslov je proizvoljan logiki izraz System.out.println("Sredina je " + i);
telo_petlje je jedna naredba (moe biti i prazna }
}
naredba) ili blok naredbi
telo_petlje se ponavlja sve dok uslov ima
Sredina je 150
vrednost true
while petlja je sa proverom na vrhu, tj. ako uslov
ima vrednost false pri prvoj proveri, ne ulazi se u
petlju, tj. telo_petlje se ne izvrava nijednom
142 144

36
10/30/2016

Petlja do while Krae napisan primer za do while


Opti oblik do while petlje class PromenjenPrimerZaDoWhile {
public static void main(String args[]) {
do int n = 5;
telo_petlje do
while(uslov); System.out.println("Vrednost n je " + n);
while(--n > 0);
uslov je proizvoljan logiki izraz }
telo_petlje je jedna naredba ili blok naredbi }
do while petlja je sa proverom na dnu:
telo_petlje se izvrava jednom a posle toga se Vrednost n je 5
proverava uslov Vrednost n je 4
Vrednost n je 3
ako uslov ima vrednost true, telo_petlje se Vrednost n je 2
izvrava ponovo, a ako je vrednost false izlazi se iz Vrednost n je 1
petlje
145 147

Primer za do while
class PrimerZaDoWhile { Petlja for
public static void main(String args[]) {
int n = 5; // Za n=0 petlja bi se izvrila jednom Opti oblik for petlje
do { for(inicijalizacija; uslov; iteracija)
System.out.println("Vrednost n je " + n);
telo_petlje
n--;
} while(n > 0);
}
}
Vrednost n je 5
Vrednost n je 4
Vrednost n je 3
Vrednost n je 2
Vrednost n je 1

Za n=0 rezultat bi bio


Vrednost n je 0 146 148

37
10/30/2016

Petlja for
Deklaracija promenljive unutar for petlje
inicijalizacija je izraz
izvrava se samo jednom na poetku pri ulasku u petlju Upravljaka promenljiva petlje se esto deklarie unutar
obino inicijalizuje upravljaku promenljivu petlje
petlje u delu inicijalizacija
Takva promenljiva postoji samo unutar petlje
uslov je logiki izraz, proverava se pre izvravanja tela
petlje
class DeklaracijaUnutarFor {
ako je vrednost true izvrava se telo petlje
public static void main(String args[]) {
ako je false ne izvrava se telo petlje i izlazi se iz petlje for(int n=5; n>0; n--)
obino zavisi od upravljake promenljive petlje System.out.println("Vrednost n je " + n);
telo_petlje je jedna naredba ili blok naredbi }
iteracija je izraz }
izvrava se posle tela petlje
obino menja upravljaku promenljivu petlje
petlja se nastavlja proverom uslova i izvravanjem tela
petlje i iteracije sve dok je uslov taan 149 151

Primer za for Primer: provera da li je broj prost


class ProstBroj {
class PrimerZaFor {
public static void main(String args[]) {
public static void main(String args[]) {
int broj = 14;
int n;
boolean prost_broj = true;
for(n=5; n>0; n--)
for(int i=2; i < broj/2; i++) {
System.out.println("Vrednost n je " + n);
if((broj % i) == 0) {
}
prost_broj = false;
}
break;
Vrednost n je 5 }
Vrednost n je 4 }
Vrednost n je 3 if(prost_broj) System.out.println("Prost");
Vrednost n je 2 else System.out.println("Nije prost");
Vrednost n je 1
}
}
150 152

38
10/30/2016

Vie upravljakih promenljivih for petlje for petlja bez inicijalizacije i iteracije
U inicijalizaciji se moe deklarisati i inicijalizovati vie
upravljakih promenljivih petlje Delovi for petlje inicijalizacija ili iteracija, ili oba dela, mogu
U iteraciji se moe menjati vie promenljivih da se izostave
Izrazi u inicijalizaciji i iteraciji se razdvajaju zarezima class ForBezInicijalizacijeIIteracije {
class VisePromenljivihForPetlje { public static void main(String args[]) {
public static void main(String args[]) { boolean kraj = false;
for(int a=1, b=4; a<b; a++, b--) { int i = 0;
System.out.println("a = " + a); for( ; !kraj; ) {
System.out.println("b = " + b); System.out.println("i je " + i);
} if(i == 5) kraj = true;
} i++;
} }
a=1 }
b=4 }
a=2
b=3 153 155

Uslov ne zavisi
Beskonana for petlja
od upravljake promenljive for petlje
class ForSaProizvoljnimUslovom { for( ; ; ) {
public static void main(String args[]) { // ...
boolean kraj = false; if(uslov)
for(int i=0; !kraj; i++) { break;
System.out.println("i je " + i); // ...
if(i == 5) kraj = true; }
}
}
}
i je 0
i je 1
i je 2
i je 3
i je 4
i je 5 154 156

39
10/30/2016

Ugnedene for petlje Naredba break


class UgnjezdeneForPetlje {
public static void main(String args[]) { Zavravanje niza naredbi u naredbi switch, tj. izlazak
for(int i=0; i<5; i++) { iz naredbe switch
for(int j=i; j<5; j++) Izlazak iz petlje u specijalnim sluajevima (uobiajeno je
System.out.print(i); da se iz petlje izlazi na osnovu uslova)
System.out.println(); Vaijanta naredbe goto
}
}
}

00000
1111
222
33
4
157 159

Naredbe skoka Zavravanje niza naredbi u naredbi switch


class PrimerBezBreak {
Prekidanje izvravanja redosleda naredbi i nastavljanje public static void main(String args[]) {
na definisanom mestu, tj. preskakanje naredbi for(int i=0; i<9; i++)
break switch(i) {
continue case 0: System.out.println("i = 0");
return case 1:
case 2: System.out.println("i < 3"); break;
case 3:
case 4: System.out.println("i < 5"); break;
default: System.out.println("i >= 5");
}
}
}

158 160

40
10/30/2016

Izlazak iz for petlje sa break break u ugnjedenim petljama


break prekida samo najdublje ugnjedenu petlju u kojoj se nalazi
class BreakPrekidaForPetlju {
public static void main(String args[]) { class BreakUUgnjezdenimPetljama {
public static void main(String args[]) {
for(int i=0; i<100; i++) {
for(int i=0; i<3; i++) {
if(i == 5) break; // prekidanje petlje kad je i=5
System.out.print("i = " + i + "; j: ");
System.out.println("i: " + i); for(int j=0; j<100; j++) {
} if(j == 10) break; // prekida unutranju petlju za j=10
System.out.println("Petlja je zavrena."); System.out.print(j + " ");
} }
} System.out.println();
}
i: 0 System.out.println("Petlja je zavrena.");
i: 1 }
i: 2
}
i: 3
i: 4 i = 0; j: 0 1 2 3 4 5 6 7 8 9
i = 1; j: 0 1 2 3 4 5 6 7 8 9
Petlja je zavrena.
i = 2; j: 0 1 2 3 4 5 6 7 8 9
161 163
Petlja je zavrena.

Izlazak iz while petlje sa break Naredba break sa oznakom


class BreakPrekidaWhilePetlju { Opti oblik
public static void main(String args[]) {
oznaka:{
int i=0;
while(i<100) { ...
if(i == 5) break; // prekidanje petlje kad je i=5 if(uslov) break oznaka;
System.out.println("i: " + i); ...
i++; }
}
oznaka oznaava blok naredbi iza kojeg se nastavlja
System.out.println("Petlja je zavrena.");
program posle izvravanja oznaene naredbe break koja
}
mora biti obuhvaena blokom
}
Moe se izai iz vie ugnjedenih blokova
i: 0
i: 1 Ne moe se preskoiti blok koji ne obuhvata oznaenu
i: 2 naredbu break
i: 3 Naredba if je obavezna, inae se naredbe iza naredbe
i: 4
Petlja je zavrena. 162 break nikad ne bi izvravale, to je greka u prevoenju 164

41
10/30/2016

Primer za oznaeni break


class BreakSaOznakom { Primer sa grekom
public static void main(String args[]) {
boolean t = true; class PogresanBreak {
prvi: { public static void main(String args[]) {
drugi: { prvi: for(int i=0; i<3; i++) {
treci: {
System.out.print("i = " + i + ": j:");
System.out.println("Pre naredbe break.");
if(t) break drugi; }
System.out.println("Posle naredbe break.");
} for(int j=0; j<100; j++) {
System.out.println("U drugom bloku."); if(j == 10) break prvi; // Pogreno
}
System.out.print(j + " ");
System.out.println("U prvom bloku.");
}
}
} }
} }

Pre naredbe break.


U prvom bloku.
165 167

Primer za for i oznaeni break Naredba continue


class ForIBreakSaOznakom { Opti oblik
public static void main(String args[]) {
petlja {
spoljna: for(int i=0; i<3; i++) {
System.out.print("i = " + i + ": j:"); ...
for(int j=0; j<100; j++) { if(uslov) continue;
if(j == 10) break spoljna; ...
System.out.print(j + " "); }
}
Slui za preskakanje naredbi tela petlje od naredbe
System.out.println("Ovo se preskae.");
continue do kraja tela petlje, ali se ne naputa petlja
}
u while i do while petljama posle continue se
System.out.println("Petlja zavrena.");
prelazi na proveru uslova
}
u for petlji posle continue se prelazi na iteraciju
}
Naredba if je obavezna, inae se naredbe iza naredbe
i = 0: j: 0 1 2 3 4 5 6 7 8 9 Petlja zavrena. continue nikad ne bi izvravale, to je greka u prevoenju
166 168

42
10/30/2016

Primer za oznaeni continue


Primer za continue class ContinueSaOznakom {
class PrimerZaContinue { public static void main(String args[]) {
public static void main(String args[]) { spoljna: for(int i=0; i<5; i++) {
for(int i=0; i<10; i++) { for(int j=0; j<5; j++) {
System.out.print(i + " "); if(j > i) {
System.out.println();
if(i%2 == 0) continue;
continue spoljna;
System.out.println("");
}
}
System.out.print(i + " ");
} }
} }
System.out.println();
01 }
23 }
45 0
67 1 1
89 2 2 2
169 3 3 3 3 171
4 4 4 4 4

Naredba continue sa oznakom Naredba return


Opti oblik Opti oblik
oznaka: petlja1 { tip ime_metode(lista_parametara) {
petlja2 { ...
... if(uslov) return [vrednost];
if(uslov) continue oznaka; ...
... }
}
Slui za izlazak iz metode
}
Posle naredbe return kontrola se vraa pozivaocu metode
oznaka oznaava petlju koja e se nastaviti posle Naredba if je obavezna ako naredba return nije
izvravanja oznaene naredbe continue poslednja naredba u metodi, inae se naredbe iza naredbe
Naredba if je obavezna, inae se naredbe iza naredbe return nikad ne bi izvravale, to je greka u prevoenju
continue nikad ne bi izvravale, to je greka u prevoenju vrednost ne postoji ako je tip metode void, inae postoji
170 172

43
10/30/2016

Primer za return

class PrimerZaReturn {
public static void main(String args[]) {
boolean t = true;
System.out.println("Pre naredbe return.");
if(t) return; // povratak pozivaocu
System.out.println("Ovo se ne izvrava.");
}
}

Pre naredbe return.

173 175

174 176

44
10/30/2016

Klase i datoteke

Klasa se pie u jednoj datoteci


Imena datoteke i klase moraju da budu jednaka
Ekstenzija datoteke je *.java
Uvod u klase

177 179

Klasa Opti oblik klase (nije kompletan)


class imeKlase {
Klasa je novi tip podataka tip promenljiva1;
Klasa je ablon za objekte tip promenljiva2;
Objekat je primerak (instanca) klase ...
Klase koje se izvravaju imaju metod main tip promenljivaN;

tip imeMetoda1(lista_parametara) {
telo_metoda
}
...
tip imeMetodaM(lista_parametara) {
telo_metoda
}
}
178 180

45
10/30/2016

Termini Pravljenje objekta operator new

Objekat se naziva i instanca klase Objekat se pravi operatorom new


Podaci (promenljive) definisane u klasi nazivaju se polja Pravljenjem objekta se u memoriji rezervie prostor za
(takoe se koriste i termini: promenljive instance, atributi smetanje tog objekta
ili lanovi podaci) Primer:
Kod se pie u metodima Kutija k1 = new Kutija();
Metodi i promenljive deklarisane u klasi nazivaju se k1 je referenca koja ukazuje na objekat u memoriji
lanovi klase

k1 sirina
visina
duzina

181 183

Primer jednostavne klase Operator taka "."


Klasa za opisivanje kutije za koju su bitne samo Operator taka slui za pristupanje lanu objekta
dimenzije
Primer za pristupanje poljima:
k1.sirina = 1;
class Kutija { k1.visina = 2;
double sirina; k1.duzina = 3;
double visina;
double duzina;
}

182 184

46
10/30/2016

Primer 1. sa klasom Kutija Reference i objekti


class PrimerSaKutijom1 {
Deklaracija promenljive
public static void main(String args[]) {
Kutija k1; k1 je null
Kutija k = new Kutija();
// dodela vrednosti poljima Postoji samo referenca k1,
k.sirina = 1;
a objekat jo nije napravljen
k.visina = 2;
k.duzina = 3; Stvaranje objekta
// Raunanje zapremine kutije k1 = new Kutija(); k1 sirina
double zapremina = k.sirina * k.visina * k.duzina; Operator new kreira objekat, tj. visina
System.out.println("Zapremina je " + zapremina); rezervie prostor u memoriji za duzina

} uvanje objekta
} Referenca k1 ukazuje na objekat
Zapremina je 6.0 Preko refernce se pristupa objektu

185 187

Primer 2. sa dva objekta klase Kutija


class PrimerSaDveKutije1 { Reference i objekti
public static void main(String args[]) {
Kutija k1 = new Kutija(); Kutija k1 = new Kutija(); k1 sirina
Kutija k2 = new Kutija(); Kutija k2; visina
// dodela vrednosti clanovima objekta k1 Referenca k2 ne ukazuje na duzina
k2 je null
k1.sirina = 1; k1.visina = 2; k1.duzina = 3; objekat
// dodela vrednosti clanovima objekta k2
k2.sirina = 2; k2.visina = 4; k2.duzina = 5;
// Izraunavanje i ispisivanje zapremina
double z = k1.sirina * k1.visina * k1.duzina;
System.out.println("Zapremina k1 je " + z); k2 = k1; k1 sirina
z = k2.sirina * k2.visina * k2.duzina; Reference k1 i k2 sad imaju iste visina
System.out.println("Zapremina k2 je " + z); vrednosti, tj. ukazuju na isti objekat k2 duzina

} Kopiranje reference ne kopira


objekat
}
Zapremina k1 je 6.0
186 188
Zapremina k2 je 40.0

47
10/30/2016

Reference i objekti - nastavak Osnovno o konstruktorima


k1 sirina
k1 = new Kutija(); Konstruktor definie ta se radi pri stvaranju objekta
visina
Kreiran je jo jedan objekat na koji k2 Ako u klasi nije napisan konstruktor Java obezbeuje
duzina
sad ukazuje referenca k1
podrazumevani konstruktor
sirina
visina
Klasa moe da ima vie konstruktora
duzina

k2 = new Kutija(); k1 sirina


Kreiran je trei objekat na koji sad visina
ukazuje referenca k2 k2 duzina
Na prvi objekat vie ne ukazuje
nijedna referenca i njemu ne moe sirina sirina
da se pristupi visina visina
duzina duzina
189 191

Opti oblik primene operatora new Metodi


ImeKlase promenljiva = new ImeKlase(); Opti oblik metoda
ImeKlase oznaava tip promenljive tip imeMetoda(lista_parametara) {
telo_metoda
ImeKlase() oznaava konstruktor
}
tip je tip podatka koji vraa metod; ako metod ne vraa vrednost
Operator new dodeljuje memoriju dinamiki tip metoda je void
Koliina memorije je ograniena imeMetoda je identifikator
lista_parametara je niz parova tip identifikator
Ako nema dovoljno memorije da se kreira objekat javlja razdvojenih zarezima, a moe biti prazna
se izuzetak Parametri su promenljive koje prihvataju vrednosti argumenata
Operator new se ne koristi za proste tipove (byte, prosleenih metodu u trenutku pozivanja
short, int, long, float, double, char, Metod vraa vrednost pomou naredbe return
boolean). return vrednost;
Promenljive ovih tipova nisu objekti.
190 192

48
10/30/2016

Primer: klasa Kutija ima metod zapremina


ta je loe u klasi Kutija?
class PrimerSaDveKutije2 {
class Kutija { public static void main(String args[]) {
double sirina; Kutija k1 = new Kutija();
double visina; Kutija k2 = new Kutija();
double duzina; // dodela vrednosti clanovima objekta k1
} k1.sirina = 1; k1.visina = 2; k1.duzina = 3;
// dodela vrednosti clanovima objekta k2
U klasi Kutija nije ugraeno "znanje" kako se izraunava zapremina, k2.sirina = 2; k2.visina = 4; k2.duzina = 5;
pa bi to znanje moralo da se ugradi u svaku klasu koja radi sa // Izraunavanje i ispisivanje zapremina
klasom Kutija, ako je potrebna zapremina objekta tipa Kutija
double z = k1.zapremina();
Ne postoji dobar nain da se postave poetne vrednosti polja, ili da
System.out.println("Zapremina k1 je " + z);
se promene vrednosti (pristupa se poljima direktno)
z = k2.zapremina();
System.out.println("Zapremina k2 je " + z);
}
}
193 195

Metod za izraunavanje zapremine u klasi Kutija Krai nain pisanja u prethodnom primeru
class Kutija { Zapremina se izraunavala samo da bi se ispisala na
double sirina; ekranu, i koriene su dve naredbe
double visina; double z = k1.zapremina();
double duzina; System.out.println("Zapremina je " + z);
double zapremina() {
return sirina * visina * duzina;
Prethodne dve naredbe se mogu zameniti jednom
}
System.out.println("Zapremina je " + k1.zapremina());
}

U metodu zapremina direktno se pristupa poljima poto je i


metod zapremina lan klase Kutija
Tip vrednosti koji vraa metod mora da bude kompatibilan sa tipom
metoda
Tip promenljive koja prihvata vrednost koju vraa metod mora biti
kompatibilan sa tipom metoda
194 196

49
10/30/2016

Metod za postavljanje vrednosti polja u klasi Kutija Parametri i argumenti


class Kutija { Parametar je promenljiva deklarisana u listi parametara
double sirina; metoda i kao promenljiva postoji samo unutar metoda
double visina;
Argument je vrednost koja se prosleuje metodu pri
double duzina;
pozivanju metoda
double zapremina() {
return sirina * visina * duzina;
Parametar dobija (prihvata) vrednost argumenta
}
void postaviDimenzije(double s, double v, double d){
sirina = s;
visina = v;
duzina = d;
}
}

197 199

Primer: klasa Kutija ima metod postaviDimenzije


Konstruktori
class PrimerSaDveKutije3 {
public static void main(String args[]) {
Konstruktor moe da inicijalizuje objekat odmah posle
Kutija k1 = new Kutija();
stvaranja objekta, i u tom sluaju ne mora se pozivati
Kutija k2 = new Kutija();
metod za postavljanje vrednosti poljima
// dodela vrednosti clanovima objekta k1
Konstruktor ima isto ime kao i klasa
k1.postaviDimenzije(1, 2, 3);
// dodela vrednosti clanovima objekta k2 Za konstruktore se ne pie tip jer se podrazumeva da
k2.postaviDimenzije(2, 4, 5); konstruktor vraa tip klase
// Izraunavanje i ispisivanje zapremina Ako se ne napie konstruktor, automatski postoji
System.out.println("Zapremina k1 je " + podrazumevani konstruktor koji svim poljima dodeljuje
k1.zapremina()); vrednost nula
System.out.println("Zapremina k2 je " + Ako se napie konstruktor ne moe se vie koristiti
k2.zapremina()); podrazumevani konstruktor
}
}
198 200

50
10/30/2016

Konstruktor sa parametrima u klasi Kutija Primer: korienje konstruktora sa parametrima


class Kutija {
class PrimerSaDveKutije4 {
double sirina;
public static void main(String args[]) {
double visina;
Kutija k1 = new Kutija(1, 2, 3);
double duzina;
Kutija k2 = new Kutija(2, 4, 5);
// Izraunavanje i ispisivanje zapremina
// Konstruktor sa listom parametara
System.out.println("Zapremina k1 je " +
Kutija(double s, double v, double d) {
k1.zapremina());
sirina = s;
System.out.println("Zapremina k2 je " +
visina = v;
k2.zapremina());
duzina = d;
}
}
}

double zapremina() {
return sirina * visina * duzina;
}
} 201 203

Konstruktor sa parametrima u klasi Kutija Rezervisana re this

U klasi Kutija koja ima konstruktor sa parametrima ne Koristi se unutar metoda da ukae na objekat za koji je metod pozvan
mora postojati metod za postavljanje dimenzija, ako se Primer za konstruktor klase Kutija:
pretpostavi da objektu Kutija ne treba menjati dimenzije Kutija(double s, double v, double d) {
Korienje podrazumevanog konstruktora u ovoj klasi sirina = s;
izaziva greku u prevoenju programa visina = v;
Moe se napisati vie konstruktora u jednoj klasi duzina = d;
(sledee poglavlje) }

// Gornji konstruktor promenjen tako da se (nepotrebno) koristi this


Kutija(double s, double v, double d) {
this.sirina = s;
this.visina = v;
this.duzina = d;
}
202 204

51
10/30/2016

Skrivanje polja Metod finalize

Ne mogu postojati dve lokalne promenljive sa istim Koristi se za oslobaanje resursa koji ne potiu iz Jave,
imenom npr. pokaziva na datoteku, Windows font, ... kad se
Lokalna promenljiva ili parametar metoda mogu imati unitava objekat koji je rezervisao te resurse
isto ime kao i polje Metod finalize se poziva neposredno pre nego to
lokalna promenljiva (ili parametar) skriva polje sakuplj smea uniti objekat
polju se moe pristupiti pomou rezervisane rei this Metod finalize se ne poziva kad neki objekat izae
iz opsega vaenja
Primer u kojem je korienje this obavezno
Opti oblik metoda finalize
Kutija(double sirina, double visina, double duzina){
this.sirina = sirina; protected void finalize() {
this.visina = visina;
kod_za_finalizaciju
this.duzina = duzina;
}
}
205 207

Sakupljanje smea (Garbage collection)


Operator new rezervie (dodeljuje) memoriju objektu
Programer ne mora da vodi rauna o oslobaanju
memorije
Oslobaanje memorije
ako vie nijedna referenca ne ukazuje na objekat, taj
objekat vie nije potreban i moe se osloboditi memorija
koju on zauzima
oslobaanje memorije radi sakuplja smea koji se
povremeno ukljuuje

206 208

52
10/30/2016

Primer klase sa preklopljenim metodom


public class Preklapanje {
void test(){
System.out.println("Bez parametara");
}
void test(int a){
System.out.println("Parametar int, a: " + a);
Klase }
void test(int a, int b){
System.out.println("Parametri int, int: a, b: "+a+" "+b);
}
double test(double a){
System.out.println("Parametar double, a = " + a);
return a;
}
//void test(double a){ // Greka, ve postoji metod sa parametrom double
// System.out.println("Parametar double, a = " + a);
//}
209 } 211

Ilustracija rada klase sa preklopljenim metodom


Preklapanje metoda
public class PreklapanjeMain {
public static void main(String[] args){
Dva ili vie metoda u klasi mogu da imaju isto ime i to se Preklapanje obj = new Preklapanje();
zove preklapanje metoda (method overloading) obj.test();
int i = 5; Rezultat izvravanja
Preklopljeni metodi moraju da se razlikuju po tipu
obj.test(i); programa je:
parametara ili po broju parametara (ili po oba)
// Greka, metod sa par. int ne vraa rezultat
Tip preklopljene metode nije bitan tj. ne pravi se razlika //double d = obj.test(i); Bez parametara
izmeu preklopjenih metoda na osnovu tipa koji metoda double d = obj.test((double)i); Parametar int, a: 5
vraa kao rezultat byte b = 4; Parametar double, a = 5.0
obj.test(b); Parametar int, a: 4
obj.test(1,2); Parametri int, int, a, b: 1 2
float f = 3.0f; Parametar double, a = 3.0
obj.test(f);
}
}
210 212

53
10/30/2016

Preklapanje konstruktora u klasi Kutija


Pozivanje preklopljenih metoda
class Kutija {
double sirina;
Koji se metod poziva odreuje se na osnovu broja i / ili
double visina;
tipova argumenata
double duzina;
Odreivanje koji od preklopljenih metoda se poziva radi
se u vreme prevoenja programa
// Konstruktor bez parametara
Kutija() {
}

// Konstruktor sa parametrima za sve tri dimenzije


Kutija(double s, double v, double d) {
sirina = s;
visina = v;
duzina = d;
}
213 215

Preklapanje konstruktora u klasi Kutija nastavak


Preklapanje konstruktora
// Konstruktor sa jednim parametrom (kutija je kocka)
Kutija(double stranica) {
Konstruktori se mogu preklopiti, slino kao i metodi
sirina = visina = duzina = stranica;
Preklopljeni konstruktori moraju da se razlikuju po tipu
}
parametara ili po broju parametara (ili po oba)
// Metod za postavljanje vrednosti polja (dimenzija kutije)
Moe se napisati i kostruktor bez parametara
void postaviDimenzije(double s, double v, double d){
sirina = s;
visina = v;
duzina = d;
}
// Metod za izraunavanje zapremune kutije
double zapremina() {
return sirina * visina * duzina;
}
}
214 216

54
10/30/2016

Upotreba metoda za postavljanje vrednosti polja Pozivanje preklopljenih konstruktora


Metod postaviDimenzije u klasi Kutija treba da
Vai isto pravilo kao i kod metoda
postoji u sledeim sluajevima:
koji se konstruktor poziva odreuje se na osnovu broja i /
ako postoji konstruktor bez parametara, zato to npr. u ili tipova argumenata
trenutku kad se pravi objekat nisu poznate dimenzije
odreivanje koji od preklopljenih konstruktora se poziva
objekta, pa ih treba naknadno postaviti
radi se u vreme prevoenja programa
ako ima smisla da se objektu kutije menjaju dimenzije

217 219

Primer za Kutiju sa preklopljenim konstruktorima


class PrimerPreklapanjeKonstruktora1 { Korienje objekta kao parametra
public static void main(String args[]) {
Kutija k1 = new Kutija(1, 2, 3); Objekat se moe koristiti kao parametar metode
Kutija k2 = new Kutija();
Kutija k3 = new Kutija(2);
// Izraunavanje i ispisivanje zapremina
System.out.println("Zapremina k1 je " +
k1.zapremina());
System.out.println("Zapremina k2 je " +
k2.zapremina());
System.out.println("Zapremina k3 je " +
k3.zapremina());
}
}
Zapremina k1 je 6.0
Zapremina k2 je 0.0
218 220
Zapremina k3 je 8.0

55
10/30/2016

Klasa sa metodom iji je parametar objekat Konstruktor iji je parametar objekat


class Test { Konstruktor iji je parametar objekat moe da se iskoristi
int a, b; da se napravi kopija postojeeg objekta

Test(int _a, int _b) {


a = _a;
b = _b;
}
// Metod equals proverava da li su objekti jednaki
boolean equals(Test obj) {
if(a == obj.a && b == obj.b) return true;
else return false;
}
}

221 223

Klasa Kutija - parametar konstruktora je objekat


Primer kad je objekat parametar class Kutija {
double sirina, visina, duzina;
class PrimerProsledjivanjaObjekta {
// Konstruktor iji je parametar objekat, ovde slui za kopiranje objekta
public static void main(String args[]) {
Kutija(Kutija obj) {
Test obj1 = new Test(10, 2);
sirina = obj.sirina;
Test obj2 = new Test(10, 2);
visina = obj.visina;
Test obj3 = new Test(10, 5);
duzina = obj.duzina;
System.out.println("obj1 == obj2: " +
}
obj1.equals(obj2));
// Konstruktor bez parametara
System.out.println("obj1 == obj3: " +
Kutija() {
obj1.equals(obj3));
}
}
// Konstruktor sa parametrima za sve tri dimenzije
}
Kutija(double s, double v, double d) {
obj1 == obj2: true
sirina = s; visina = v; duzina = d;
obj1 == obj3: false
}
222 224

56
10/30/2016

Preklapanje konstruktora u klasi Kutija nastavak Primer za Kutiju sa preklopljenim konstruktorima


// Konstruktor sa jednim parametrom (kutija je kocka) class PrimerPreklapanjeKonstruktora2 {
public static void main(String args[]) {
Kutija(double stranica) {
Kutija k1 = new Kutija(1, 2, 3);
sirina = visina = duzina = stranica;
Kutija k2 = new Kutija();
} Kutija k3 = new Kutija(2);
// Metod za postavljanje vrednosti polja (dimenzija kutije) Kutija k4 = new Kutija(k1); // k4 je kopija objekta k1
void postaviDimenzije(double s, double v, double d){ // Izraunavanje i ispisivanje zapremina
sirina = s; System.out.println("Zapremina k1 je " + k1.zapremina());
visina = v; System.out.println("Zapremina k2 je " + k2.zapremina());
duzina = d; System.out.println("Zapremina k3 je " + k3.zapremina());
} System.out.println("Zapremina k4 je " + k4.zapremina());
}
void postaviDimenzije(double x){
}
sirina = visina = duzina = x;
} Zapremina k1 je 6.0
Zapremina k2 je 0.0
Zapremina k3 je 8.0
225 Zapremina k4 je 6.0 227

Preklapanje konstruktora u klasi Kutija nastavak


Stek
// Metod za postavljanje vrednosti polja (dimenzija kutije)
void postaviDimenzije(Kutija ref){
Stek je memorija koja privremeno uva podatke
sirina = ref.sirina;
visina = ref.visina;
Podatak koji se poslednji stavi na stek prvi se uzme sa
steka, i obrnuto podatak koji je prvi stavljen na stek
duzina = ref.duzina;
poslednji e se uzeti
}
// Metod za izraunavanje zapremune kutije Stek ima operacije za stavljanje na stek (push) i
double zapremina() { uzimanje sa steka (pop)
return sirina * visina * duzina; Postoji pokaziva koji pokazuje na tekuu vrednost na
} steku (vrh steka)
}

226 228

57
10/30/2016

Jednostavna klasa ilustracija steka


Dodavanje jedne vrednosti na stek
class Stack {
Stanje pre dodavanja Stanje posle dodavanja int stck[] = new int[10];
nove vrednosti na stek nove vrednosti na stek int vrh;

Push(a)
Stack() {
vrh = -1; // Inicijalizacija vrha steka
}

// Dodavanje jedne vrednosti na stek


a
vrh vrh void push(int broj) {
r r if(vrh == 9)
q q System.out.println("Stek je popunjen.");
else
p p
stck[++vrh] = broj;
}
229 231

Jednostavna klasa, ilustracija steka nastavak


Uzimanje jedne vrednosti sa steka
// Uzimanje jedne vrednosti sa steka
Stanje pre uzimanja sa steka Stanje posle uzimanja sa steka int pop() {
if(vrh < 0) {
Pop() System.out.println("Stek je prazan.");
return 0;
}
else
return stck[vrh--];
a }
vrh vrh }
r r
q q
U realnom sluaju umseto naredbe za tampanje koristio
p p bi se izuzetak

230 232

58
10/30/2016

Primer rada jednostavne klase za stek


Prosleivanje argumenata u metode
class PrimerRadaSteka {
public static void main(String args[]) { Argumenti izmeu metoda koji poziva (pozivajui) i
Stack stack1 = new Stack(); metoda koji se poziva (pozvani) prosleuju se preko
Stack stack2 = new Stack();
steka
// Stavljanje na stek
for(int i=0; i<10; i++) stack1.push(i); Pozivajui metod stavlja argumente na stek
for(int i=10; i<20; i++) stack2.push(i); Pozvani metod uzima argumente sa steka
// Uzimanje sa steka
Tek kad se pozvani metod zavri pomera se pokaziva
System.out.println("Stek stack1:");
vrha steka
for(int i=0; i<10; i++)
System.out.println(stack1.pop());
System.out.println("Stek stack2:");
for(int i=0; i<10; i++)
System.out.println(stack2.pop());
}
}
233 235

Rezultat Prosleivanje argumenata u metode


Stek stck1: Stek stck2: Prema tome da li se prosleuju argumenti prostih tipova
9 19 ili klasnih tipova, moe se govoriti o dva naina
8 18 prosleivanja (pozivanja) argumenata:
7 17 po vrednosti
6 16 po referenci
5 15
4 14
3 13 Po vrednosti se prosleuju prosti tipovi (na stek se
2 12 stavlja vrednost argumenta)
1 11 Po referenci se prosleuju klasni tipovi tj. objekti (na stek
0 10 se stavlja referenca na objekat)

234 236

59
10/30/2016

Prosleivanje (pozivanje) po vrednosti Objanjenje prosleivanja (pozivanja) po vrednosti

Tip argumenta je neki od prostih tipova Argument je prost tip ija se vrednost prilikom pozivanja
Po zavretku metoda vrednost prosleenog argumenta metoda stavlja na stek
ostaje nepromenjena Pozvani metod uzima vrednost sa steka, dodeljuje je
parametru
class Test { Parametru se moe menjati vrednost u metodu, ali ta
int izracunaj(int i, int j) { promena nema uticaja na promenljivu ija je vrednost
i *= 3; prosleena parametru
j /= 2;
return i * j;
}
}

237 239

Prosleivanje (pozivanje) po vrednosti


Prosleivanje (pozivanje) po referenci
class PozivanjePoVrednosti {
public static void main(String args[]) { Tip argumenta je klasni tip
Test obj = new Test(); Metod koji poziva stavlja argument referencu
int a = 2, b = 10; (tj. vrednost reference) na stek
System.out.println("Pre pozivanja a, b: " + Pozvani metod uzima vrednost reference sa steka i
a + " " + b); dodeljuje je parametru
int c = obj.izracunaj(a, b);
Parametar ukazuje na isti objekat na koji ukazuje i
System.out.println("Posle pozivanja a, b: " +
argument
a + " " + b);
System.out.println("c: " + c);
Unutar metoda moe se promeniti objekat kojem se
}
pristupa preko parametra
} Sama referenca se prosleuje po vrednosti
Pre pozivanja a, b: 2 10
Posle pozivanja a, b: 2 10
c: 30 238 240

60
10/30/2016

Prosleivanje (pozivanje) po referenci


Prosleivanje po referenci
class PozivanjePoReferenci {
Vrednost argumenta (promenljive koja postoji u metodu public static void main(String args[]) {
koji poziva) je kopirana u parametar (promenljivu koja Test obj = new Test(2, 10);
postoji u pozvanom metodu), tako da ukazuju na isti System.out.println("Pre pozivanja obj.a, obj.b: "
objekat koji je negde u memoriji + obj.a + " " + obj.b);
Objekat se moe promeniti unutar metoda int c = obj.izracunaj(obj);
System.out.println("Posle pozivanja obj.a, obj.b: "
+ obj.a + " " + obj.b);
argument polje 0 System.out.println("c: " + c);
polje 1 }
}
parametar ...
polje N Pre pozivanja obj.a, obj.b: 2 10
Posle pozivanja obj.a, obj.b: 6 5
c: 30
241 243

Prosleivanje (pozivanje) po referenci Objekat kao rezultat metoda


class Test {
int a, b;
Unutar metoda moe da se napravi objekat i da se
referenca na taj novi objekat vrati kao rezultat metoda
Test(int _a, int _b) {
class Test {
a = _a;
int a;
b = _b;
Test(int _a) {
}
a = _a;
}
int izracunaj(Test o) {
Test uvecajZaTri() {
o.a *= 3;
Test privremeniObj = new Test(a + 3);
o.b /= 2;
return privremeniObj;
return o.a * o.b;
}
}
}
}
242 244

61
10/30/2016

Primer za objekat koji je rezultat metoda


class VracanjeObjekta {
public static void main(String args[]) {
Test obj1 = new Test(2);
Test obj2;
obj2 = obj1.uvecajZaTri();
System.out.println("obj1.a: " + obj1.a);
System.out.println("obj2.a: " + obj2.a);
obj2 = obj2.uvecajZaTri();
System.out.println("Drugo uveanje obj2.a: "
+ obj2.a);
}
}
obj1.a: 2
obj2.a: 5
Drugo uveanje obj2.a: 8
245 247

246 248

62
10/30/2016

Rekurzivan metod
class Faktorijel {
// faktorijel je rekurzivan metod
int faktorijel(int n) {
int rezultat;
Rekurzija, upravljanje pristupom, static, final, ... if(n==1) // uslov za zavravanje rekurzivnog pozivanja
return 1;
rezultat = faktorijel(n-1) * n;
return rezultat;
}
}

U rekurzivnom metodu mora postojati uslov za


zavravanje rekurzivnog pozivanja
249 251

Rekurzija Primer za rekurzivan metod


class PrimerRekurzije {
Rekurzija je pojava kad metod poziva samog sebe public static void main(String args[]) {
Primer: faktorijel Faktorijel f = new Faktorijel();
1! = 1 for(int i=1; i<=5; i++)
2! = 2 1! = 2 1 System.out.println(i + "! = " +
3! = 3 2! = 3 2 1 f.faktorijel(i));
4! = 4 3! = 4 3 2 1 }
5! = 5 4! = 5 4 3 2 1 }
...
n! = n (n 1)! 1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
250 252

63
10/30/2016

Iterativno reenje za faktorijel Rekurzivni metodi


class FaktorijelIterativni { Neki problemi su takvi da se lake (prirodnije) reavaju
int faktorijel(int n) { rekurzivnim metodima, odnosno jednostavniji je kod za
int rezultat = 1; rekurzivno nego za iterativno reenje
for(int i=n; i>1; i--)
Problemi koji po prirodi nisu rekurzivni se takoe mogu
rezultat *= i;
reiti rekurzivno, npr. ispisivanje elemenata niza
return rezultat;
}
}

253 255

Rekurzivni metodi Rekurzivno ispisivanje niza


class RekIspisNiza {
Svaki rekurzivan poziv kopira (dodaje) argumente na int vrednosti[];
stek, a argumenti se uklanjaju sa steka kad se metod
zavri RekIspisNiza(int i) {
Kad se zadnji put pozove rekurzivan metod, argumenti vrednosti = new int[i];
svih prethodnih poziva su na steku }
Ako postoji veliki broj rekurzivnih poziva moe doi do
// rekurzivan metod za ispisivanje niza
prekoraenja steka, pri emu se javlja izuzetak
void ispisivanjeNiza(int i) {
Rekurzivno reenje moe biti sporije od iterativnog ako
if(i==0) return;
je broj pozivanja metoda veliki
else ispisivanjeNiza(i-1);
System.out.println("[" + (i-1) + "] = " +
vrednosti[i-1]);
}
254 } 256

64
10/30/2016

Ilustracija rekurzivnog ispisivanja niza Upravljanje pristupom


class IlustracijaRekurzivnogIspisivanja { Nain pristupanja lanu klase odreuje se specifikatorom
public static void main(String args[]) { pristupa
RekIspisNiza obj = new RekIspisNiza(5);
Spacifikator pristupa pie se u deklaraciji lana klase
for(int i=0; i<5; i++) obj.vrednosti[i] = i;
ispred specifikatora tipa
obj.ispisivanjeNiza(5);
}
Specifikatori pristupa su
} public za javni nain pristupanja
protected za zatieni nain pristupanja
[0] = 0 private za privatni nain pristupanja
[1] = 1 bez specifikatora za standardni nain pristupanja
[2] = 2
[3] = 3
[4] = 4

257 259

Kapsuliranje Specifikatori pristupa


Povezivanje podataka i koda koji sa njima radi public lan klase je dostupan svim drugim klasama
Upravljanje pristupom koji delovi programa mogu da koje je koriste
pristupaju lanovima klase protected bie objanjen kasnije
private lan klase se moe koristiti samo unutar
svoje klase
standardni nain pristupanja unutar paketa kojem
pripada klasa pristup je javan, izvan paketa pristup je
onemoguen

258 260

65
10/30/2016

Specifikator pristupa se pie ispred specifikatora tipa Ilustracija javnog i privatnog pristupanja
class ProbaPristupa {
public int i; public static void main(String args[]) {
private double j; Test ob = new Test();
// Poljima a i b se moe pristupati direktno
ob.a = 10;
private int nazivMetoda(int a, char b) {
ob.b = 20;
telo_metoda // Polju c se ne moe pristupati direktno
} // Ovo bi bila greka u prevoenju
//ob.c = 100;
ob.setC(100);
System.out.println("a, b, and c: " + ob.a +
" " + ob.b + " " + ob.getC());
}
}
261 263

Ilustracija javnog i privatnog pristupanja Popravljena klasa za stek


class Stack {
class Test {
private int stck[] = new int[10];
int a; // podrazumevani pristup
private int vrh;
public int b; // javni pristup
private int c; // privatni pristup
public Stack() {
vrh = -1; // Inicijalizacija vrha steka
// postavljanje vrednosti polja c
}
void setC(int i) {
c = i;
// Dodavanje jedne vrednosti na stek
}
public void push(int broj) {
if(vrh == 9)
// dohvatanje vrednosti polja c
System.out.println("Stek je popunjen.");
int getC() {
else
return c;
stck[++vrh] = broj;
}
}
} 262 264

66
10/30/2016

Popravljena klasa za stek nastavak


Rezervisana re static
// Uzimanje jedne vrednosti sa steka
public int pop() { Klasa moe imati lan koji se moe koristiti samostalno,
if(vrh < 0) { odnosno nezavisan je od objekata
System.out.println("Stek je prazan."); Deklaracija takvih lanova sadri rezervisanu re
return 0; static, a lanovi se nazivaju statiki
}
Statiki lanovi mogu biti i podaci i metodi
else
return stck[vrh--];
Statiki lanovi se mogu koristiti i kad nije napravljen
}
nijedan objekat klase
}

Klasa je popravljena tako da se mogu koristiti samo


metodi push i pop, tj. ne mogu se direktno menjati
vrh i stck
265 267

Primer rada jednostavne klase za stek


class PrimerRadaSteka { Statiki lanovi podaci (polja)
public static void main(String args[]) {
Stack stack1 = new Stack(); Statika polja se ponaaju kao globalne promenljive
Stack stack2 = new Stack();
// Stavljanje na stek
Objekat ne sadri statika polja, tj. pri pravljenju objekta
for(int i=0; i<10; i++) stack1.push(i); ne rezervie se prostor za statika polja, ve samo za
for(int i=10; i<20; i++) stack2.push(i); ona koja nisu statika
// Uzimanje sa steka
System.out.println("Stek stack1:");
for(int i=0; i<10; i++)
System.out.println(stack1.pop());
System.out.println("Stek stack2:");
for(int i=0; i<10; i++)
System.out.println(stack2.pop());
//stack1.vrh = -2; //ove dve naredbe su neispravne,
//stack2.stck[3] = 10; //pristupaju privatnim lanovima
}
} 266 268

67
10/30/2016

Statiki metodi Primer: korienje objekata koji imaju redni broj


class PrimerZaObjekatSaRednimBrojem {
Statiki metodi mogu da pristupaju samo statikim public static void main(String[] args) {
poljima RedniBroj objA = new RedniBroj();
Statiki metodi mogu da pozivaju samo statike metode RedniBroj objB = new RedniBroj();
RedniBroj objC = new RedniBroj();
U statikim metodima ne mogu da se koriste rezervisane
rei this i super System.out.println("Ukupan broj objekata: " +
RedniBroj.brojObjekata());
System.out.println("objA, RB: " + objA.id());
System.out.println("objB, RB: " + objB.id());
System.out.println("objC, RB: " + objC.id());
}
}
Ukupan broj objekata: 3
objA, RB: 0
objB, RB: 1
269 271
objC, RB: 2

Primer za statike lanove: objekti imaju redni broj Inicijalizacija statikih promenljivih

Potrebno je da se izbroje objekti koji su napravljeni, i da Statiko polje se moe inicijalizovati prilikom deklaracije
svaki napravljeni objekat ima redni broj: Ako se ne uradi inicijalizacija, statiko polje e imati
broj napravljenih objekata je statiki lan vrednost 0
u konstruktoru se dodeljuje redni broj novom objektu i U klasi moe postojati statiki blok u kojem se mogu
inkrementira se ukupan broj napravljenih objekata inicijalizovati statike promenljive
class RedniBroj { Statiki blok se izvrava samo jednom, kad se klasa
private static int broj_objekata = 0; uita prvi put
private int id;
public RedniBroj() { id = broj_objekata++; }
public int id() { return id; }
public static int brojObjekata() {
return broj_objekata;
}
270 272
}

68
10/30/2016

Primer za statike promenljive, blokove i metode Drugi primer za statike lanove


class StatickiClanoviM {
public class StatickiClanovi {
static int a = 3;
StatickiClanovi() {
static int b;
System.out.println("Konstruktor izvren.");
static void statickiMetod(int x) { }
System.out.println("x = " + x); int i;
System.out.println("a = " + a); static int a = 3;
System.out.println("b = " + b); static int b;
}
static void statickiMetod(int x) {
static { System.out.println("x = " + x);
System.out.println("Statiki blok je izvren."); System.out.println("a = " + a);
b = a * 2; System.out.println("b = " + b);
} }
public static void main(String args[]) { static {
statickiMetod(10); System.out.println("Statiki blok izvren.");
} }
} 273 } 275

Ilustracija rada drugog primera za statike lanove


Rezultat izvravanja klase StatickiClanoviM public class IlustracijaStatic {
public static void main(String[] args) {
Statiki blok je izvren. StatickiClanovi sc1;
x = 10 System.out.println("Prvo ispisivanje.");
sc1 = new StatickiClanovi(); //Ovde se prvo izvri statiki blok
a=3
System.out.println("sc1.i = " + sc1.i);
b=6 StatickiClanovi sc2 = new StatickiClanovi();
sc2.i = 8;
System.out.println("sc2.i = " + sc2.i);
}
}

Prvo ispisivanje.
Statiki blok izvren.
Konstruktor izvren.
sc1.i = 0
Konstruktor izvren.
274 sc2.i = 8 276

69
10/30/2016

Pristupanje statikim lanovima Rezervisana re final

Statikim lanovima se moe pristupati pre nego to je Moe se specificirati da se vrednost promenljive ne
napravljen objekat klase moe promeniti, tj. promenljiva je u stvari konstanta
Javnim statikim lanovima se pristupa preko imena Za ovo se koristi rezervisana re final
klase i operatora taka Vrednost konstante se mora zadati pri deklaraciji
<ime_klase>.<statiki_lan>
Imena konstanti se obino piu velikim slovima
Statikim lanovima se moe pristupati i preko reference final int OVO_JE_KONSTANTA = 5;
na objekat, ali to treba izbegavati
final double MINIMUM = 1.7;
kada se lanu pristupa preko imena klase jasno je da se
pristupa statikom lanu Rezervisana re final moe da se primeni i na
kada se statikom lanu pristupa preko reference nije metode i na klase, a znaenje e biti objanjeno kasnije
odmah uoljivo da li je lan statiki ili ne

277 279

Pristupanje statikom metodu preko imena klase Duina niza


public class PristupanjePrekoImenaKlase { Nizovi se realizuju kao objekti
public static void main(String[] args) { Svi nizovi imaju polje length ija vrednost pokazuje
StatickiClanovi.statickiMetod(5);
koliko elemenata ima niz
StatickiClanovi.statickiMetod(10);
}
}

Statiki blok izvren.


x=5
a=3
b=0
x = 10
a=3
b=0
278 280

70
10/30/2016

Ilustracija rada drugog primera za statike lanove Popravljena klasa za stek stek razliite duine
class Stack {
class DuzinaNiza {
private int stck[];
public static void main(String args[]) {
int a1[] = new int[10];
private int vrh;
int a2[] = {3, 5, 7, 1, 8, 99, 44, -10}; public Stack(int velicina) {
int a3[] = {4, 3, 2, 1}; stck = new int[velicina];
vrh = -1;
System.out.println("Duina niza a1 je " + a1.length);
}
System.out.println("Duina niza a2 je " + a2.length);
System.out.println("Duina niza a3 je " + a3.length); // Dodavanje jedne vrednosti na stek
} public void push(int broj) {
} if(vrh == stck.length-1)
Duina niza a1 je 10 System.out.println("Stek je popunjen.");
Duina niza a2 je 8 else
Duina niza a3 je 4 stck[++vrh] = broj;
}
281 283

Popravljena klasa za stek nastavak


Popravljanje klase Stek // Uzimanje jedne vrednosti sa steka
public int pop() {
Primer za klasu stek koja je ranije koriena moe da se
if(vrh < 0) {
popravi tako to se omogui pravljenje steka zadate
System.out.println("Stek je prazan.");
veliine
return 0;
Veliina steka treba da bude parametar konstruktora }
Koristi se polje length koje sadri duinu niza else
return stck[vrh--];
}
}

U odnosu na prethodu verziju, klasa je popravljena tako


da se moe napraviti stek proizvoljnog kapaciteta
Kapacitet je parametar konstruktora, a u prethodnoj
verziji kapacitet je bio 10)
282 284

71
10/30/2016

Primer rada jednostavne klase za stek


class PrimerRadaSteka { Vrste ugnjedenih klasa
public static void main(String args[]) {
Stack stack1 = new Stack(5); Ugnjedena klasa moe biti statika
Stack stack2 = new Stack(8); Statika ugnjedena klasa se retko koristi
// Stavljanje na stek Ne moe direktno da pristupa poljima obuhvatajue klase,
for(int i=0; i<5; i++) stack1.push(i); ve samo preko reference (objekta)
for(int i=0; i<8; i++) stack2.push(i); Ugnjedena klasa koja nije statika naziva se unutranja
// Uzimanje sa steka klasa
System.out.println("Stek stack1:");
Unutranja klasa moe da pristupa poljima i metodima
for(int i=0; i<5; i++) obuhvatajue klase direktno preko imena polja i metoda
System.out.println(stack1.pop()); kao to se radi i u obuhvaenoj klasi
System.out.println("Stek stack2:");
for(int i=0; i<8; i++)
System.out.println(stack2.pop());
}
} 285 287

Primer unutranje klase


Ugnjedene klase class Spoljasnja {
int sp_x = 100;
Unutar jedne klase (klasa A) moe da se definie druga void prikaziUnutrasnju() {
klasa (klasa B), i tada je klasa B ugnjedena u klasu A, a Unutrasnja un = new Unutrasnja();
klasa A je obuhvatajua klasa un.prikazi();
}
Za ugnjedenu klasu zna samo obuhvatajua klasa
// Unutranja klasa
ugnjedena klasa se ne moe koristiti izvan obuhvatajue class Unutrasnja {
klase int un_y = 10;
Ugnjedena klasa moe da pristupa svim lanovima void prikazi() {
obuhvatajue klase, ak i privatnim lanovima System.out.println("sp_x = " + sp_x);
}
Obuhvatajua klasa ne moe da pristupa poljima } // kraj unutranje klase
(lanovima podacima) unutranje klase, ali moe da
void prikaziY() {
pristupa metodima unutranje klase, bez obzira na Unutrasnja un = new Unutrasnja();
specifikatore pristupa System.out.println("un_y = "+un.un_y); //Greka u prevoenju
}
286 } 288

72
10/30/2016

Ilustracija korienja klase Spoljasnja Korienje ugnjedenih klasa


class PrimerSpoljasnja { Ugnjedene klase nisu postojale u verziji Java 1.0,
public static void main(String args[]) { uvedene su u verziji 1.1
Spoljasnja spoljasnja = new Spoljasnja(); Ugnjedene klase se koriste u apletima
spoljasnja.prikaziUnutrasnju();
}
}

sp_x = 100

289 291

Unutranje klase u bloku Osnovno o klasi String

Unutranja klasa moe da se definie i unutar bilo kojeg Klasa String je ugraena u Javu
metoda ili bloka spoljanje klase Slui za rad sa znakovnim nizovima
Oblast vaenja unutranje klase je blok u kojem je Svi znakovni nizovi su objekti klase String
definisana Objekti tipa String su nepromenljivi
Postojeem objektu tipa String ne moe da se promeni
znak na nekoj poziciji
Pravi se novi znakovni niz sa potrebnim sadrajem

290 292

73
10/30/2016

Znakovni niz i niz znakova Primer nadovezivanja znakovnih nizova


Znakovni niz je objekat klase String class PrimerZaString1 {
public static void main(String args[]) {
Niz znakova je niz elemenata tipa char
String strObj1 = "Prvi znakovni niz";
Primer za niz znakova String strObj2 = "Drugi znakovni niz";
char niz_znakova1[] = new char[5]; String strObj3 = strObj1 + " i " + strObj2;

Primer inicijalizacije niza znakova System.out.println(strObj1);

char niz_znakova2[] = {'a', 'b', 'c', '3'}; System.out.println(strObj2);


System.out.println(strObj3);
Primer inicijalizacije znakovnog niza }
String znakovni_niz1 = "abc3"; }

Prvi znakovni niz


Drugi znakovni niz
293 Prvi znakovni niz i Drugi znakovni niz 295

Operator + za znakovne nizove Neki metodi klase String

Slui za nadovezivanje (konkatenaciju) znakovnih Metod za proveru da li dva znakovna niza imaju isti
nizova, tj. objekata tipa String sadraj
Rezultat je novi objekat tipa String iji je sadraj boolean equals(String objekat)
dobija spajanjem sadraja dva objekta tipa String Metod koji vraa duinu znakovnog niza
Primeri: int length()
String str1 = "prvi " + "drugi"; Napomena: nizovi imaju polje length
String str2 = "prvi drugi"; Metod koji vraa znak sa zadate pozicije
String str3 = "prvi "; char charAt(int indeks)
String str4 = "drugi";
String str5 = str3 + str4;

294 296

74
10/30/2016

Primer za metode znakovnog niza Neki konstruktori klase String


class PrimerZaString4 { Klasa String ima vie konstruktora meu kojima su i
public static void main(String args[]) {
sledei:
String obj = "Prvi znakovni niz";
System.out.println("Duina obj je " + obj.length());
Podrazumevani konstuktor
System.out.println("Znak na poziciji 0 u obj je: " + String()
obj.charAt(0)); Konstuktor iji je parametar objekat tipa String
System.out.println("Znak na poziciji 2 u obj je: " +
String(String objekat)
obj.charAt(2));
System.out.println("Znak na poslednjoj poziciji " + Konstuktor iji je parametar niz znakova
(obj.length()-1) + " u obj je: " + String(char niz_znakova[])
obj.charAt(obj.length()-1));
}
}
Znak na poziciji 0 u obj je: P
Znak na poziciji 2 u obj je: v
297 299
Znak na poslednjoj poziciji 16 u obj je: z

Primer za metode znakovnog niza Primer: poreenje objekata i referenci


class PrimerZaString2 {
public static void main(String args[]) { class PrimerZaString3 {
String obj1 = "Prvi znakovni niz"; public static void main(String args[]) {
String obj2 = "Drugi znakovni niz"; String obj1 = "Prvi znakovni niz";
String obj3 = obj1; // obj1 i obj3 ukazuju na isti objekat String obj2 = obj1; // obj1 i obj2 ukazuju na isti objekat
if(obj1.equals(obj2)) String obj3 = new String(obj1);
System.out.println("obj1 i obj2 su jednaki"); System.out.println("Reference obj1 i obj2 ukazuju na
else isti objekat: " + (obj1 == obj2));
System.out.println("obj1 i obj2 su razliiti"); System.out.println("Reference obj1 i obj3 ukazuju na
if(obj1.equals(obj3)) isti objekat: " + (obj1 == obj3));
System.out.println("obj1 i obj3 su jednaki"); System.out.println("Objekti na koje ukazuju reference
else obj1 i obj3 su jednaki: " + obj1.equals(obj3));
System.out.println("obj1 i obj3 su razliiti"); }
} }
} Reference obj1 i obj2 ukazuju na isti objekat: true
Reference obj1 i obj3 ukazuju na isti objekat: false
obj1 i obj2 su razliiti 298 300
obj1 i obj3 su jednaki Objekti na koje ukazuju reference obj1 i obj3 su jednaki: true

75
10/30/2016

Argumenti u komandnoj liniji


class KomandnaLinija {
public static void main(String args[]) {
for(int i=0; i<args.length; i++)
System.out.println("args[" + i + "]: " +
args[i]);
}
}

java KomandnaLinija 5 proba komandne linije -1 10


args[0]: 5
args[1]: proba
args[2]: komandne
args[3]: linije
args[4]: -1
args[5]: 10
301 303

302 304

76
10/30/2016

Primer izvoenja (nasleivanja)


class A {
int i, j;
void prikaziIJ() {
System.out.println("i, j: " + i + " " + j);
}
}
Nasleivanje
// potklasa B se izvodi iz klase A
class B extends A {
int k;
void prikaziK() {
System.out.println("k: " + k);
}
void PrikaziZbir() {
System.out.println("i+j+k: " + (i+j+k));
}
305 } 307

Nasleivanje Pravljenje objekata klasa A i B


A objA = new A();
Za grupu srodnih pojava moe da se napravi klasa u objA i
kojoj su sve zajednike karakteristike srodnih pojava
Klasa A (objekat klase A) j
Specifinije klase, za svaku od srodnih pojava, mogu da ima dva polja: i, j
se izvedu iz optije kase i da naslede sve njene
karakteristike
Optija klasa se naziva natklasa (superclass)
Klasa koja se izvodi iz natklase naziva se potklasa
(subclass) B objB = new B();
objB i
Potklasa ima samo jednu natklasu
Klasa B (objekat klase B) j
Za izvoenje se koristi rezervisana re extends
ima tri polja: i, j, k k
(i, j su nasleena iz
klase A)
306 308

77
10/30/2016

Primer za nasleivanje
class PrimerNasledjivanja { Kontrola pristupa i nasleivanje
public static void main(String args[]) {
A objA = new A(); Potklasa ne moe pristupati privatnim lanovima
B objB = new B(); natklase
objA.i = 10; objA.j = 20;
objB.i = 7; objB.j = 8; objB.k = 9;
System.out.println("Sadraj objA: ");
objA.prikaziIJ();
System.out.println();
System.out.println("Sadraj objB: ");
objB.prikaziIJ();
objB.prikaziK();
System.out.println();
System.out.println("Zbir i, j, k iz objB:");
objB.prikaziZbir();
}
309 311
}

Primer
Rezultat izvravanja PrimerNasledjivanja class A {
int i;
Sadraj objA: private int j;
i, j: 10 20 void postaviIJ(int _i, int _j) {
i = _i;
j = _j;
Sadraj objB:
}
i, j: 7 8
}
k: 9
class B extends A {
int zbir() {
Zbir i, j, k iz objB: return i + j; // Greka, ovo se ne prevodi
i+j+k: 24 }
}
Klasa B je nasledila polje j, ali se tom polju ne moe pristupiti
direktno u klasi B, poto je polje privatno u klasi A
310 312

78
10/30/2016

Klasa Kutija nastavak


Primer nasleivanja sa klasom Kutija
// Konstruktor sa jednim parametrom (kutija je kocka)
Klasa Kutija e biti osnovna klasa (natklasa) Kutija(double stranica) {
sirina = visina = duzina = stranica;
Iz klase Kuija e biti izvedene dve klase,
}
KutijaSaTezinom i ObojenaKutija
// Metod za postavljanje vrednosti polja (dimenzija kutije)
Klasa KutijaSaTezinom e naslediti klasu Kutija, i void postaviDimenzije(double s, double v, double d){
imae dodatno polje tezina
sirina = s;
Klasa ObojenaKutija e naslediti klasu Kutija, i visina = v;
imae dodatno polje boja
duzina = d;
}
// Metod za izraunavanje zapremune kutije
double zapremina() {
return sirina * visina * duzina;
}
}
313 315

Klasa Kutija Kutija sa teinom potklasa klase Kutija


class Kutija {
class KutijaSaTezinom extends Kutija {
double sirina, visina, duzina;
double tezina;
// Konstruktor iji je parametar objekat, ovde slui za kopiranje objekta
Kutija(Kutija obj) {
KutijaSaTezinom(double s, double v, double d,
sirina = obj.sirina;
double t) {
visina = obj.visina;
sirina = s;
duzina = obj.duzina;
visina = v;
}
duzina = d;
// Konstruktor bez parametara
tezina = t;
Kutija() {
}
}
}
// Konstruktor sa parametrima za sve tri dimenzije
Kutija(double s, double v, double d) {
sirina = s; visina = v; duzina = d;
}
314 316

79
10/30/2016

Primer za kutiju sa teinom


class PrimerZaKutijuSaTezinom1 { Rezervisana re super
public static void main(String args[]) {
KutijaSaTezinom kt1 = new KutijaSaTezinom(1,2,5,3.3); Konstruktor natklase se poziva pomou rezervisane rei
KutijaSaTezinom kt2 = new KutijaSaTezinom(2,3,4,0.01); super
System.out.println("Zapremina kt1: " + kt1.zapremina());
Pomou rezervisane rei super moe se pristupiti
System.out.println("Teina kt1: " + kt1.tezina); lanu natklase koji je sakriven lanom potklase
System.out.println();

System.out.println("Zapremina kt2: " + kt2.zapremina());


System.out.println("Teina kt2: " + kt2.tezina);
}
}
Zapremina kt1: 10.0
Teina kt1: 3.3

Zapremina kt2: 24.0


317 319
Teina kt2: 0.01

Konstruktor klase KutijaSaTezinom je loe napisan Popravljena klasa KutijaSaTezinom


Konstruktor potklase KutijaSaTezinom je class KutijaSaTezinom extends Kutija {
KutijaSaTezinom(double s, double v, double d, double t){ double tezina;
sirina = s;
visina = v; KutijaSaTezinom(double s, double v, double d,
duzina = d;
double t) {
tezina = t;
super(s, v, d);
}
tezina = t;
Konstruktor natklase Kutija je
Kutija(double s, double v, double d) {
}
sirina = s; }
visina = v;
duzina = d;
}
Bolje je da konstruktor podklase KutijaSaTezinom pozove
konstruktor klase Kutija nego da ponavlja sve naredbe koje ve
postoje u konstruktor klase Kutija.
318 320

80
10/30/2016

Pozivanje konstruktora natklase Primer referenciranja objekta potklase


class A {
Opti oblik je int i, j;
super(lista_argumenata); }

class B extends A {
Ako se u konstruktoru potklase poziva konstruktor int k;
natklase, taj poziv mora biti prva naredba u konstruktoru }
potklase
Primer kad nijedan konstruktor nema parametre
ImePotklase() { // konstruktor potklase
super(); // pozivanje konstruktora natklase
...
}

321 323

Primer referenciranja objekta potklase


Referenciranje objekta potklase
A refA = new A(); refA i
Promenljivoj natklase moe se dodeliti referenca na B refB = new B(); j
objekat bilo koje potklase izvedene iz te natklase
refB i
j
k

refA = refB;
Referenca natklase A (refA) moe refA i
ukazivati na objekat potklase B j
Preko refA moe se pristupiti samo
poljima i, j poto refA zna samo za
refB i
lanove koji su definisani u klasi A
Polju k se ne moe pristupiti preko j
refA zato to je to polje definisano u k
klasi B
322 324

81
10/30/2016

Referenca potklase ne moe ukazivati na objekat natklase


Rezultat izvravanja primera za referenciranje
A refA = new A(); refA i
B refB = new B(); Zapremina kutije: 40.0
j

refB i Zapremina kutije sa teinom: 24.0


j Teina kutije sa teinom: 0.1

k
Zapremina: 24.0
refB = refA; // Greka
Referenca potklase B zna za polje k refA i
(moe da pristupi polju k), a to polje j
ne postoji u objektu klase A, pa zato
referenca potklase B ne moe
ukazivati na objekat natklase A refB i
j
k
325 327

Primer za referenciranje objekta potklase Klasa KutijaSaTezinom sa vie konstruktora


class PrimerReferenciranja {
class KutijaSaTezinom extends Kutija {
public static void main(String args[]) {
Kutija refK = new Kutija(2, 4, 5);
double tezina;
KutijaSaTezinom refKST = new KutijaSaTezinom(2,3,4,0.1); // Konstruktor iji je parametar objekat
System.out.println("Zapremina kutije: " + KutijaSaTezinom(KutijaSaTezinom obj) {
refK.zapremina());
// Objekat klase KutijaSaTezinom moe da se prosledi
System.out.println();
// konstruktoru klase Kutija iji je parametar tipa Kutija
System.out.println("Zapremina kutije sa teinom: " +
refKST.zapremina());
super(obj);
System.out.println("Teina kutije sa teinom: " + tezina = obj.tezina;
refKST.tezina); }
System.out.println();
// Konstruktor bez parametara
refK = refKST; //referenca natklase refK ukazuje na objekat potklase
KutijaSaTezinom() {
System.out.println("Zapremina: " + refK.zapremina());
// Greka: referenca natklase ne zna za lanove definisane u potklasi
// Ako se ne navede, poziva se konstruktor bez parametara
//System.out.println("Teina: " + refK.tezina); //super();
} }
} 326 328

82
10/30/2016

Klasa KutijaSaTezinom nastavak


Rezultat izvravanja primera za kutiju sa teinom
// Konstruktor sa parametrima za sva polja natklase i potklase
KutijaSaTezinom(double s, double v, double d, Zapremina kt1: 10.0
double t) { Teina kt1: 3.3
super(s, v, d);
tezina = t; Zapremina kt2: 0.0
} Teina kt2: 0.0

// Konstruktor za kutiju u obliku kocke Zapremina kt3: 8.0


KutijaSaTezinom(double stranica, double t) { Teina kt1: 3.0
super(stranica);
tezina = t; Zapremina kt4: 10.0
} Teina kt4: 3.3
}

329 331

Primer pristupanja lanu natklase


Primer za kutiju sa teinom
class A {
class PrimerZaKutijuSaTezinom2 {
int i;
public static void main(String args[]) {
KutijaSaTezinom kt1 = new KutijaSaTezinom(1,2,5,3.3);
}
KutijaSaTezinom kt2 = new KutijaSaTezinom(); class B extends A {
KutijaSaTezinom kt3 = new KutijaSaTezinom(2, 3); int i; // novo polje, ima isto ime kao i nasleeno polje iz klase A
KutijaSaTezinom kt4 = new KutijaSaTezinom(kt1);
System.out.println("Zapremina kt1: " + kt1.zapremina()); B(int a, int b) {
System.out.println("Teina kt1: " + kt1.tezina + "\n"); super.i = a; // polje i iz klase A
System.out.println("Zapremina kt2: " + kt2.zapremina()); i = b; // polje i iz klase B
System.out.println("Teina kt2: " + kt2.tezina+ "\n"); }
System.out.println("Zapremina kt3: " + kt3.zapremina());
System.out.println("Teina kt3: " + kt3.tezina+ "\n"); void prikazi() {
System.out.println("Zapremina kt4: " + kt4.zapremina()); System.out.println("i iz natklase: " + super.i);
System.out.println("Teina kt4: " + kt4.tezina+ "\n"); System.out.println("i iz potklase: " + i);
} }
} }
330 Polje i u klasi B sakriva nasleeno polje i iz klase A 332

83
10/30/2016

Primer pristupanja lanu natklase nastavak Viestepena hijerarhija


class PrimerPristupanja { class A {
public static void main(String args[]) { ...
B obj = new B(1, 2); }
obj.prikazi();
class B extends A {
}
...
}
}
i iz natklase: 1 class C extends B {
i iz potklase: 2 ...
}

Klasa C je nasledila sve lanove iz klase B, to znai da je nasledila


i lanove klase A
Referenca klase A moe da ukazuje na objekte klasa A, B i C
333 335

Pristupanje lanu natklase Primer: klasa Isporuka


Iz klase KutijaSaTezinom moe Kutija
Rezervisana re super se koristiti za pristupanje se dalje izvesti klasa Isporuka sirina
lanu, slino kao i rezervisana re this, ali je razlika u koja ima polje troskovi visina
tome to rezervisana re super ukazuje na natklasu duzina
Na dijagramu su prikazane klasa za
Primer: ovaj primer sa svojim poljima
super.lan; // lan je polje ili metod natklase
lanovima natklase se pristupa pomou rezervisane rei KutijaSaTezinom
super kad su lanovi natklase sakriveni lanovima tezina
potklase, tj. kad lanovi natklase i potklase imaju ista
imena
Isporuka
troskovi

334 336

84
10/30/2016

Klasa Kutija Klasa KutijaSaTezinom


public class Kutija { public class KutijaSaTezinom extends Kutija {
private double sirina, visina, duzina; private double tezina;

public Kutija() {} public KutijaSaTezinom() { }

public Kutija(Kutija obj) { public KutijaSaTezinom(KutijaSaTezinom obj) {


sirina = obj.sirina; super(obj);
visina = obj.visina; tezina = obj.tezina;
duzina = obj.duzina; }
}
public KutijaSaTezinom(double s, double v, double d,
public Kutija(double s, double v, double d) { double t) {
sirina = s; super(s, v, d);
visina = v; tezina = t;
duzina = d; }
}
public KutijaSaTezinom(double stranica, double t) {
public Kutija(double stranica) { super(stranica);
sirina = visina = duzina = stranica; tezina = t;
} 337 } 339

Klasa Kutija nastavak Klasa KutijaSaTezinom nastavak


public void postaviDimenzije(double s, double v,
double d) { public double tezina() { return tezina; }
sirina = s;
public void postaviTezinu(double t) { tezina = t; }
visina = v;
duzina = d; public String toString() {
} return super.toString() + ", tezina " + tezina;
}
public double sirina() { return sirina; }
public double visina() { return visina; }
}
public double duzina() { return duzina; }

public double zapremina() {


return sirina * visina * duzina;
}

public String toString() {


return "sirina " + sirina + ", visina " + visina +
", duzina " + duzina;
}
338 340
}

85
10/30/2016

Klasa Isporuka Primer za klasu Isporuka


public class Isporuka extends KutijaSaTezinom { class PrimerZaIsporuku {
private double troskovi; public static void main(String args[]) {
Isporuka is1 = new Isporuka(1, 2, 5, 3.3, 81.2);
public Isporuka() { }
Isporuka is2 = new Isporuka(2, 1.1, 2.2);
public Isporuka(Isporuka obj) { Isporuka is3 = new Isporuka(is1);
super(obj); System.out.println("Zapremina is1: " + is1.zapremina());
troskovi = obj.troskovi; System.out.println("Teina is1: " + is1.tezina());
} System.out.println("Trokovi is1: " + is1.troskovi());
System.out.println();
public Isporuka(double s, double v, double d,
System.out.println("Zapremina is2: " + is2.zapremina());
double t, double tr) {
System.out.println("Teina is2: " + is2.tezina());
super(s, v, d, t);
System.out.println("Trokovi is2: " + is2.troskovi());
troskovi = tr;
System.out.println();
}
System.out.println("Zapremina is3: " + is3.zapremina());
public Isporuka(double stranica, double t, double tr) { System.out.println("Teina is3: " + is3.tezina());
super(stranica, t); System.out.println("Trokovi is3: " + is3.troskovi());
troskovi = tr; }
} 341 } 343

Klasa Isporuka nastavak


Rezultat izvravanja primera za isporuku
public double troskovi() { return troskovi; }
Zapremina is1: 10.0
public void postaviTroskove(double tr) {
troskovi = tr; Teina is1: 3.3
} Trokovi is1: 81.2

public String toString() {


Zapremina is2: 8.0
return super.toString() + ", troskovi " + troskovi;
} Teina is2: 1.1
} Trokovi is2: 2.2

Zapremina is3: 10.0


Teina is3: 3.3
Trokovi is3: 81.2

342 344

86
10/30/2016

Redosled pozivanja konstruktora Redefinisanje metoda

Konstruktor natklase se izvrava pre konstruktora U potklasi moe da se napie metod koji ima isto ime i
potklase istu listu parametara (broj i tip parametara) kao i metod
Ako se poziva konstruktor natklase, pozivanje metoda natklase, i to se naziva redefinisanje metoda natklase
super mora biti prva naredba u konstruktoru potklase Kad se u potklasi pozove redefinisani metod izvrava se
Ako se u konstruktoru potklase ne poziva metod super metod potklase tj. metod definisan u potklasi
tada e biti pozvan podrazumevani konstruktor natklase, Ako metod potklase ima isto ime kao i metod natklase, a
ili odgovarajui konstruktor bez argumenata koji e se razlikuje se lista parametara, to je preklapanje metoda a
izvriti prvi ne redefinisanje

345 347

Ilustracija redosleda pozivanja konstruktora Primer redefinisanja metoda


class A { class A {
A() { System.out.println("Izvren konstruktor klase A"); }
int i, j;
}
A(int _i, int _j) { i = _i; j = _j; }
class B extends A {
B() { System.out.println("Izvren konstruktor klase B"); } void prikazi() {
} System.out.println("i, j: " + i + " " + j);
class C extends B { }
C() { System.out.println("Izvren konstruktor klase C"); } }
}
class B extends A {
class RedosledIzvrsavanjaKonstruktora { int k;
public static void main(String args[]) {
C c = new C(); B(int _i, int _j, int _k) { super(_i, _j); k=_k; }
} void prikazi() {
}
System.out.println("k: " + k);
Izvren konstruktor klase A
}
Izvren konstruktor klase B
346 } 348
Izvren konstruktor klase C

87
10/30/2016

Primer redefinisanja metoda Popravljena potklasa B iz primera za redefinisanje


class A {
class PrimerRedefinisanja { int i, j;
public static void main(String args[]) {
A(int _i, int _j) { i = _i; j = _j; }
B obj = new B(1, 2, 3);
void prikazi() {
obj.prikazi(); // poziva se metod prikazi iz klase B
System.out.println("i, j: " + i + " " + j);
A objA = new A(5, 6);
}
objA.prikazi(); // poziva se metod prikazi iz klase A }
}
class B extends A {
}
int k;

k: 3 B(int _i, int _j, int _k) { super(_i, _j); k = _k; }


i, j: 5 6 void prikazi() {
super.prikazi();
System.out.println("k: " + k);
}
349 } 351

Pristupanje redefinisanom metodu natklase Primer redefinisanja sa popravljenom klasom B


class PrimerRedefinisanja {
Redefinisani metod natklase je sakriven u potklasi, tj. ne public static void main(String args[]) {
moe mu se pristupiti direktno preko imena B obj = new B(1, 2, 3);
Redefinisanom metodu natklase se moe pristupiti obj.prikazi(); // poziva se metod prikazi iz klase B
pomou rezervisane rei super A objA = new A(5, 6);
Primer pozivanja redefinisanog metoda natklase: objA.prikazi(); // poziva se metod prikazi iz klase A
super.imeRedefinisanogMetoda(lista_argumenata) }
}

i, j: 1 2
k: 3
i, j: 5 6

350 352

88
10/30/2016

Primer za preklapanje metoda


Dinamiko razreavanje metoda pri izvravanju
class A {
int i, j;
Referenca natklase moe da ukazuje na objekat
A(int _i, int _j) { i = _i; j = _j; } potklase
void prikazi() { Ako se redefinisani metod poziva referenciranjem iz
System.out.println("i, j: " + i + " " + j); natklase, u trenutku pozivanja se odreuje koji se metod
}
poziva na osnovu tipa objekta na koji referenca trenutno
}
ukazuje
class B extends A {
Drugaije, tip referenciranog objekta odreuje koji e
int k;
metod biti pozvan, a ne tip reference koja ukazuje na
B(int _i, int _j, int _k) { super(_i, _j); k = _k; } objekat
void prikazi(String tekst) { Ovo ponaanje se naziva polimorfizam
if(tekst.length() == 0) tekst = "k: "; postoji jedan nain pristupa, a moe se pozvati vie
System.out.println(tekst + k); razliitih metoda
}
} 353 355

Ilustracija dinamikog razreavanja


Primer preklapanja
class A {
class PrimerPreklapanja { void prikazi() {
public static void main(String args[]) { System.out.println("Izvren metod klase A");
B obj = new B(1, 2, 3); }
}
// Pozivanje metoda definisanog u klasi A
obj.prikazi(); class B extends A {
void prikazi() {
// Pozivanje preklopljenog metoda u klasi B
System.out.println("Izvren metod klase B");
obj.prikazi("Vrednost k je: ");
}
obj.prikazi("");
}
}
} class C extends B {
void prikazi() {
i, j: 1 2
System.out.println("Izvren metod klase C");
Vrednost k je: 3
}
k: 3
354 } 356

89
10/30/2016

Ilustracija dinamikog razreavanja Primer sa redefinisanjem metoda


class DinamickoRazresaanje {
public static void main(String args[]) { public class GeometrijskaSlika {
A a = new A(); // objekat klase A public double obim() { return 0; } // Loe napisan metod
B b = new B(); // objekat klase B public double povrsina() { return 0; } // Takoe i ovaj
C c = new C(); // objekat klase C }
A ref; // referenca na objekat klase A
public class Trougao extends GeometrijskaSlika {
ref = a; // ref ukazuje na objekat klase A
private double a, b, c;
ref.prikazi(); // poziva se metod prikazi iz klase A
public Trougao(double a_, double b_, double c_) {
ref = b; // ref ukazuje na objekat klase B a = a_; b = b_; c = c_;
ref.prikazi(); // poziva se metod prikazi iz klase B }
ref = c; // ref ukazuje na objekat klase C public double obim() { return a + b + c; }
ref.prikazi(); // poziva se metod prikazi iz klase C public double povrsina() {
} double s = (a + b + c)/2;
} return Math.sqrt(s*(s-a)*(s-b)*(s-c));
Izvren metod klase A }
Izvren metod klase B
357 } 359
Izvren metod klase C

Redefinisanje metoda Primer sa redefinisanjem metoda - nastavak

Omoguava polimorfizam u trenutku izvravanja public class Kvadrat extends GeometrijskaSlika {


private double a;
Omoguava da se u optoj klasi definiu svi metodi koje
public Kvadrat(double a_) { a = a_; }
treba da imaju objekti izvedenih klasa od kojih e neki
public double obim() { return 4 * a; }
biti redefinisani u izvedenim klasama
public double povrsina() { return a * a; }
}

public class Krug extends GeometrijskaSlika {


private double r;
public Krug(double r_) { r = r_; }
public double obim() { return 2 * Math.PI * r; }
public double povrsina() { return Math.PI * r*r; }
}

358 360

90
10/30/2016

Primer sa redefinisanjem metoda - nastavak Lepe napisan poslednji primer


public class PrimerGeometrijskeSlike {
public static void main(String[] args) { public class PrimerGeometrijskeSlike {
Trougao tr = new Trougao(3, 4, 5); public static void main(String[] args) {
Krug kr = new Krug(1); GeometrijskaSlika slike[] = new GeometrijskaSlika[3];
Kvadrat kv = new Kvadrat(10); slike[0] = new Trougao(3, 4, 5);
GeometrijskaSlika slike[] = new GeometrijskaSlika[3]; slike[1] = new Krug(1);
slike[0] = tr; slike[2] = new Kvadrat(10);
slike[1] = kr; for(int i=0; i<3; i++) {
slike[2] = kv; System.out.println("i: " + i + ", obim: " +
for(int i=0; i<3; i++) { slike[i].obim());
System.out.println("i: " + i + ", obim: " + System.out.println("i: " + i + ", povrina: " +
slike[i].obim()); slike[i].povrsina());
System.out.println("i: " + i + ", povrina: " + }
slike[i].povrsina()); }
} }
}
} 361 363

Primer sa redefinisanjem metoda rezultat Apstraktne klase


i: 0, obim: 12.0 esto natklasa ne moe da definie metod, ali mora da
i: 0, povrina: 6.0 definie njegov potpis (deklarie metod) da bi potklase
i: 1, obim: 6.283185307179586 mogle da redefiniu metod
i: 1, povrina: 3.141592653589793 Takoe treba obezbediti da potklase moraju da
redefiniu metod
i: 2, obim: 40.0
Ovo se obezbeuje pomou apstraktnog metoda, tj.
i: 2, povrina: 100.0 korienjem modifikatora abstract
Apstraktni metod nema telo
Opti oblik deklaracije apstraktnog metoda je
abstract tip imeMetoda(listaParametara);

362 364

91
10/30/2016

Apstraktne klase Popravljanje primera sa geometrijskim slikama

Klasa koja ima bar jedan apstraktan metod je apstraktna public abstract class GeometrijskaSlika {
klasa public abstract double obim();
Deklaracija apstraktne klase mora imati modifikator public abstract double povrsina();
abstract }

Apstraktna klasa moe imati metode koji nisu apstraktni


Ostale klase iz prethodnog primera (Trougao, Kvadrat
Apstraktna klasa moe imati lanove podatke i Krug) ostaju nepromenjene
Ne moe se napraviti objekat apstraktne klase
U potklasi apstraktne klase za koju treba instancirati
objekte moraju biti redefinisani svi apstraktni metodi
Moe se koristiti referenca apstraktne klase i ona moe
referencirati objekte svih potklasa

365 367

Popravljanje primera sa geometrijskim slikama


Popravljanje primera sa geometrijskim slikama
public class PrimerGeometrijskeSlike {
U prethodnom primeru nije dobro napisana klasa public static void main(String[] args) {
// Moe se deklarisati referenca apstraktne klase,
GeometrijskaSlika, jer:
// i moe se napraviti niz referenci apstraktne klase
u njoj su definisani metodi za izraunavanje obima i GeometrijskaSlika slike[] = new GeometrijskaSlika[3];
povrine iako ta klasa ne zna nita o tome kako e se slike[0] = new Trougao(3, 4, 5);
izraunavati obim i povrina u potklasama slike[1] = new Krug(1);
potklase ne moraju da redefiniu metode za izraunavanje slike[2] = new Kvadrat(10);
obima i povrine, a greka je ako se to ne uradi for(int i=0; i<3; i++) {
moe se napraviti objekat tipa GeometrijskaSlika System.out.println("i: " + i + ", obim: " +
iako nema smisla da postoji takav objekat slike[i].obim());
System.out.println("i: " + i + ", povrina: " +
Reenje je da se klasa GeometrijskaSlika bude
slike[i].povrsina());
apstraktna, i da oba metoda (obim i povrsina) budu }
apstraktni }
}
366 368

92
10/30/2016

Rezervisana re final Spreavanje redefinisanja metoda

Ima tri namene: Poto se metodi oznaeni modifikatorom final ne


slui za deklarisanje konstanti mogu redefinisati prevodilac moe umesto poziva
spreava redefinisanje metoda metoda da doda ceo bajt kod metoda
spreava izvoenje iz klase Prevodilac ovo radi samo za kratke metode
Ovaj postupak se naziva inlining

369 371

Spreavanje redefinisanja metoda Spreavanje izvoenja

class A { final class A { // Klasa A ne moe imati podklase


final void prikazi() { // ...
System.out.println("Ne moe se redefinisati."); }
}
} class B extends A { // Greka! Ne moe se izvoditi iz klase A
// ...
class B extends A { }
void prikazi() { // Greka, metod se ne moe redefinisati
System.out.println("Pogreno!"); Ako je klasa oznaena modifikatorom final, i svi njeni
} metodi postaju final
}

370 372

93
10/30/2016

Primer sa redefinisanjem metoda


Klasa Object
public abstract class GeometrijskaSlika {
Klasa Object je natklasa svih klasa u Javi public abstract double obim();
public abstract double povrsina();
Referenca tipa Object moe da referencira objekte
}
svih ostalih klasa
public class Krug extends GeometrijskaSlika {
private double r;
public Krug(double r_) { r = r_; }
public double r() { return r; }
public double obim() { return 2 * Math.PI * r; }
public double povrsina() { return Math.PI * r*r; }
public String toString() {
return "Krug: poluprenik=" + r + ", obim=" +
obim() + ", povrina=" + povrsina();
}
373 } 375

Primer sa redefinisanjem metoda


Metodi klase Object public class Trougao extends GeometrijskaSlika {
protected native Object clone() private double a, b, c;
public boolean equals(Object obj) public Trougao(double a_, double b_, double c_) {
protected void finalize() a = a_; b = b_; c = c_;
public final native Class getClass() }
public double a() { return a; }
protected native int hashCode()
public double b() { return b; }
public final native void notify()
public double c() { return c; }
public final native void notifyAll()
public double obim() { return a + b + c; }
public String toString() public double povrsina() {
public final void wait() double s = (a + b + c)/2;
public final native void wait(long timeout) return Math.sqrt(s*(s-a)*(s-b)*(s-c));
public final void wait(long timeout, int nanos) }
public String toString() {
return "Trougao: stranice a=" + a + ", b=" + b + ", c="
Metod toString se najee redefinie poto se
+ c + ", obim=" + obim() + ", povrina=" + povrsina();
pomou njega objekat prevodi u String }
374 } 376

94
10/30/2016

Primer sa redefinisanjem metoda - nastavak Primer sa redefinisanjem metoda rezultat


public class Kvadrat extends GeometrijskaSlika { Trougao: stranice a=3.0, b=4.0, c=5.0, obim=12.0, povrina=6.0
private double a; Krug: poluprenik=1.0, obim=6.283185307179586, povrina= 3.141592653589793
public Kvadrat(double a_) { a = a_; } Kvadrat: stranica a=10.0, obim=40.0, povrina=100.0
public double a() { return a; }
public double obim() { return 4 * a; }
public double povrsina() { return a * a; }
public String toString() {
return "Kvadrat: stranica a=" + a + ", obim=" +
obim() + ", povrina=" + povrsina();
}
}

377 379

Primer sa geometrijskim slikama


public class PrimerGeometrijskeSlike {
public static void main(String[] args) {
GeometrijskaSlika slike[] =
new GeometrijskaSlika[3];
slike[0] = new Trougao(3, 4, 5);
slike[1] = new Krug(1);
slike[2] = new Kvadrat(10);
for(int i=0; i<3; i++)
System.out.println(slike[i]);
}
}

378 380

95
10/30/2016

Rezervisane rei za obradu izuzetaka


try
catch
throw
Izuzeci throws
finally

381 383

Izuzetak Obrada izuzetka


Izuzetak je greka (vanredno stanje) pri izvravanju Unutar try bloka su naredbe koje mogu da izazovu
programa izuzetak
Java ima mehanizam za obradu izuzetaka Izuzetak se hvata pomou rezervisane rei catch
Izuzetak moe da se: Rezervisana re throw slui za bacanje izuzetka
izazove (baci) - rezervisana re throw Ako unutar metoda A moe da nastane izuzetak koji se
uhvati radi obrade - rezervisana re catch prosleuje pozivajuem metodu B, tada u metodu A taj
Izuzetak je objekat koji se pravi kad nastane vanredno tip izuzetka mora da se oznai pomou rezervisane rei
stanje u nekom metodu throws
Izuzetak moe da napravi Javin izvrni sistem ili moe Naredbe koje moraju da se izvre i kad se pojavi
da se napravi u kodu kad se otkrije greka izuzetak treba staviti u blok finally
Metod moe da obradi izuzetak ili da ga prosledi dalje
pozivajuem metodu
382 384

96
10/30/2016

Novi primer neobraenog izuzetka


Neuhvaeni izuzeci
class Izuzetak1 {
static void izracunaj() {
Ako se u kodu ne obradi izuzetak, obrauje ga Javin int d = 0;
izvrni sistem koji ispisuje tekst sa opisom izuzetka, int a = 7 / d;
stanje steka za metode od trenutka nastanka izuzetka i System.out.println(a);
zavrava program }
Primer: public static void main (String args[]) {
Pri deljenju nulom Javin izvrni sistem pravi izuzetak tipa Izuzetak1.izracunaj();
ArithmeticException i baca ga }
}

java.lang.ArithmeticException: / by zero
at Izuzetak1.izracunaj(Izuzetak1.java:4)
at Izuzetak1.main(Izuzetak1.java:8)
Exception in thread "main"
385 387

Primer za izuzetak koji se ne obrauje u kodu


Opti oblik bloka za obradu izuzetaka
class Izuzetak0 {
try {
public static void main (String args[]) {
// blok u kojem moe da se pojavi izuzetak
int d = 0;
}
int a = 7 / d;
catch (TipIzuzetka1 excObj) {
System.out.println(a);
// kod za obradu izuzetka tipa TipIzuzetka1
}
}
}
catch (TipIzuzetka2 excObj) {
java.lang.ArithmeticException: / by zero // kod za obradu izuzetka tipa TipIzuzetka2
at Izuzetak0.main(Izuzetak0.java:4) }
Exception in thread "main" ...
finally {
Vidi se da je izuzetak nastao u klasi Izuzetak0, metod main, // blok koda koji mora da se izvri
u naredbi koja je u etvrtoj liniji fajla // pre kraja bloka try
Izuzetak je tipa ArithmeticException }
386 388

97
10/30/2016

Primer obraenog izuzetka


class Izuzetak2 { Tipovi izuzetaka
public static void main(String args[]) {
Throwable je nadklasa svih
int d, a;
klasa za izuzetke
try { Error je klasa za izuzetke
d = 0; Javinog izvrnog sistema, npr. Throwable
a = 7 / d; prekoraenje steka, i programi
System.out.println("Ovo se ne prikazuje."); obino ne obrauju ove izuzetke
} Exception je nadklasa za
Exception Error
catch (ArithmeticException e) { izuzetke koje obrauju programi
System.out.println("Deljenje nulom."); RuntimeException je
nadklasa za neproveravane
} RuntimeException
izuzetke npr. aritmetike greke
System.out.println("Posle naredbe catch."); (ArithmeticException),
} indeksiranje niza izvan opsega
} (ArrayIndexOutOfBoundsEx
ception)
Deljenje nulom.
389 391
Posle naredbe catch.

Korienje try i catch Prikazivanje opisa izuzetka


try i catch su jedinstvena celina U klasi Throwable redefinisan je metod toString
catch se odnosi samo na prethodni try tako da vraa opis izuzetka
Iza naredbi try uvek dolazi blok unutar vitiastih
zagrada (vitiaste zagrade su obavezne), a isto vai i za
catch
catch slui da uhvati izuzetak koji se obrauje unutar
tog catch bloka, posle ega se program nastavlja
prvom naredbom ispod svih catch blokova jedne
naredbe try

390 392

98
10/30/2016

Primer prikazivanja opisa izuzetka Primer viestrukog catch


class DvaTipaIzuzetka {
class OpisIzuzetka { public static void main(String args[]) {
static void izracunaj() { try {
int d = 0; int a = args.length;
int a = 7 / d; System.out.println("Broj argumenata = " + a);
System.out.println(a); int b = 7 / a;
} int c[] = { 1 };
public static void main (String args[]) { c[2] = 9;
try { }
OpisIzuzetka.izracunaj(); catch(ArithmeticException e) {
} System.out.println("Deljenje nulom: " + e);
catch (ArithmeticException e) { }
System.out.println(e); catch(ArrayIndexOutOfBoundsException e) {
} System.out.println("Nevaei indeks niza: " + e);
} }
} System.out.println("Iza try/catch blokova.");
}
java.lang.ArithmeticException: / by zero
393 } 395

Viestruki catch Rezultat izvravanja programa


Ako se unutar bloka try moe pojaviti vie razliitih Prvo izvravanje programa, ne zadaju se argumenti
izuzetaka treba staviti vie odredbi catch, po jedna za C:\java DvaTipaIzuzetka
svaki tip izuzetka koji se obrauje Broj argumenata = 0
Deljenje nulom: java.lang.ArithmeticException: / by zero
Posle pojave izuzetka izvrava se prvi catch blok iji
Iza try/catch blokova.
tip izuzetka odgovara nastalom izuzetku, a svi ostali
catch blokovi se preskau
Drugo izvravanje programa, zadaju se dva argumenta
C:\java DvaTipaIzuzetka dve reci
Broj argumenata = 2
Nevaei indeks niza: java.lang.ArrayIndexOutOfBoundsException
Iza try/catch blokova.

394 396

99
10/30/2016

Viestruki catch Ugnjedene naredbe try

Ako iza bloka try ima vie blokova catch, potklase Naredba try moe da bude unutar druge naredbe
izuzetaka moraju da se pojave pre svojih natklasa jer try
catch sa tipom natklase hvata i izuzetke svih svojih Ako se izuzetak ne uhvati u catch delovima untranje
potklasa naredbe try, preuzima ga spoljanja naredba try
Nastavlja se sve dok nek catch blok ne uhvati
izuzetak, ili dok izuzetak ne doe do Javinog izvrnog
sistema

397 399

Primer ugnjedenog try


Primer viestrukog catch sa grekom
class UgnjezdeniTry {
class IzuzetakPotklasePreNatklase { public static void main(String args[]) {
public static void main(String args[]) { try { // Spoljanji try blok
try { int a = args.length;
System.out.println("Broj argumenata = " + a);
int a = 0; int b = 42 / a; // Deljenje nulom za a=0
int b = 7 / a; try { // Unutranji try blok
} if(a==1) a = a/(a-a); // Deljenje nulom za a=1
if(a==2) {
catch(Exception e) { int c[] = { 1 };
System.out.println("catch tipa Exception."); c[42] = 99; // Greka u indeksiranju za a=2
} }
}
catch(ArithmeticException e) { catch(ArrayIndexOutOfBoundsException e) {
// ArithmeticException je potklsa klase Exception i mora se System.out.println("Unutranji try: " + e);
}
// pojaviti u catch pre klase Exception (greka u prevoenju)
}
System.out.println("Nedostupan kod."); catch(ArithmeticException e) {
} System.out.println("Spoljanji try: " + e);
} }
}
} 398 400
}

100
10/30/2016

Primer ugnjedenog try


Rezultat izvravanja programa class UgnjezdeniTry1 {
static void unutrasnjiTry(int a) {
try {
Prvo izvravanje programa, ne zadaju se argumenti if(a==1) a = a/(a-a); // Deljenje nulom za a=1
if(a==2) { // Greka u indeksiranju za a=2
C:\java UgnjezdeniTry int c[] = { 1 }; c[2] = 99;
Broj argumenata = 0 }
Spoljanji try: java.lang.ArithmeticException: / by zero }
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Unutranji try: " + e);
}
Drugo izvravanje programa, zadaje se jedan argument }
C:\java UgnjezdeniTry x
public static void main(String args[]) {
Broj argumenata = 1 try {
Spoljanji try: java.lang.ArithmeticException: / by zero int a = args.length;
System.out.println("Broj argumenata = " + a);
int b = 42 / a; // Deljenje nulom za a=0
Tree izvravanje programa, zadaju se dva argumenta UgnjezdeniTry1.unutrasnjiTry(a);
}
C:\java UgnjezdeniTry dve reci
catch(ArithmeticException e) {
Broj argumenata = 2 System.out.println("Spoljanji try: " + e);
Unutranji try: java.lang.ArrayIndexOutOfBoundsException }
}
401 } 403

Ugnjedeni try u metodima Rezervisana re throw

try naredbe su ugnjedene i u sledeem sluaju: Izuzetak se baca pomou naredbe throw
metod A ima try blok Opti oblik naredbe je
metod B ima try blok throw objekatIzuzetka;
metod A se poziva unutar try bloka metoda B objekatIzuzetka je objekat klase Throwable ili neke
U ovom primeru try blok metoda A je ugnjeden potklase ove klase
unutar try bloka metoda B objekatIzuzetka se moe napraviti operatorom new
ili moe biti objekat uhvaen u naredbi catch
Posle bacanja izuzetka prelazi se na hvatanje izuzetka u
naredbi try bloka koji obuhvata naredbu throw

402 404

101
10/30/2016

Primer za throw
class PrimerZaThrow { Konstruktori izuzetaka
static void bacanjeIzuzetka() {
try { Javini ugraeni izuzeci imaju dva konstruktora, jedan
throw new NullPointerException("proba"); bez parametara i jedan iji je parametar znakovni niz koji
}
catch(NullPointerException e) {
je opis izuzetka
System.out.println("Hvatanje unutar metoda."); Opis izuzetka se moe dohvatiti metodom
throw e; // novo bacanje izuzetka getMessage() koji je definisan u klasi Throwable
}
}
public static void main(String args[]) {
try {
PrimerZaThrow.bacanjeIzuzetka();
}
catch(NullPointerException e) {
System.out.println("Ponovo uhvaen: " + e);
}
}
} 405 407

Rezultat izvravanja programa Proveravani i neproveravani izuzeci


C:\java PrimerZaThrow
Hvatanje unutar metoda.
Ponovo uhvaen: java.lang.NullPointerException: proba

406 408

102
10/30/2016

Ispravan primer za throws


Rezervisana re throws class PrimerZaThrows {
static void bacanjeIzuzetka() throws
Za metod koji baca izuzetke mora da se oznai koje IllegalAccessException {
izuzetke baca System.out.println("Unutar metoda.");
throw new IllegalAccessException("proba");
Moraju se navesti svi izuzeci koje baca metod izuzev }
izuzetaka tipa Error i RuntimeException ili njihovih public static void main(String args[]) {
potklasa try {
Izuzeci koji ne moraju da se navode nazivaju se PrimerZaThrows.bacanjeIzuzetka();
neproveravani izuzeci, a oni koji moraju da se navode }
catch(IllegalAccessException e) {
nazivaju se proveravani izuzeci
System.out.println("Uhvaen: " + e);
Ako se ne navedu izuzeci koje metod baca javlja se }
greka u prevoenju }
Opti oblik deklaracije metoda je }
tip imeMetoda(listaParametara) throws listaIzuzetaka
Unutar metoda.
409 Uhvaen: java.lang.IllegalAccessException: proba 411

Primer za throws sa grekom Tipovi izuzetaka izvedeni iz RuntimeException


class PrimerZaThrows { AritmeticException
static void bacanjeIzuzetka() {
ArrayIndexOutOfBoundException
System.out.println("Unutar metoda.");
throw new IllegalAccessException("proba");
ArrayStoreException
} ClassCastException
public static void main(String args[]) { IllegalArgumentException
PrimerZaThrows.bacanjeIzuzetka(); ...
}
}

Izuzetak tipa IllegalAccessException je


proveravani izuzetak i ako se ne navede u deklaraciji
metoda koji ga baca javlja se greka u prevoenju

410 412

103
10/30/2016

Primer za finally
Rezervisana re finally static void metodC() {
try { // try bloka koji se ne prekida
Prilikom pojavljivanja i obrade izuzetka dolazi do System.out.println("Unutar metoda C");
}
preskakanja pojedinih naredbi
finally {
Naredbe koje se ne smeju peskoiti, npr. zatvaranje System.out.println("Metod C: finally blok");
fajla, stavljaju se u blok finally }
}
Blok finally se izvrava uvek bez obzira da li se
public static void main(String args[]) {
pojavljuje izuzetak ili ne try {
Ako se metod prekida iz bloka try/catch zbog metodA();
pojave izuzetka ili zbog naredbe return, blok }
finally se izvrava neposredno pre izlaska iz metoda catch (Exception e) {
System.out.println("Uhvaen izuzetak");
Blok finally nije obavezan }
Naredba try mora imati bar jednu od naredbi catch metodB();
ili finally metodC();
}
413 } 415

Primer za finally
class PrimerZaFinally { Rezultat izvravanja programa
static void metodA() {
try { // Izuzetak unutar try bloka C:\java PrimerZaFinally
System.out.println("Unutar metoda A"); Unutar metoda A
throw new RuntimeException("proba"); Metod A: finally blok
} Uhvaen izuzetak
finally { Unutar metoda B
System.out.println("Metod A: finally blok"); Metod B: finally blok
} Unutar metoda C
}
Metod C: finally blok
static void metodB() {
try {
System.out.println("Unutar metoda B");
return; // return unutar try bloka
}
finally {
System.out.println("Metod B: finally blok");
}
} 414 416

104
10/30/2016

Ugraeni izuzeci Primer za pravljenje izuzetka

class Izuzetak extends Exception {


private int podatak;

Izuzetak(int a) {
podatak = a;
}

public String toString() {


return "Izuzetak[" + podatak + "]";
}
}

417 419

Primer za pravljenje izuzetka


Pravljenje novih klasa za izuzetke
class PrimerZaIzuzetak {
static void racunaj(int a) throws Izuzetak {
Klase za nove izuzetke se prave da bi se obraivale
System.out.println("racunaj(" + a + ")");
specifine greke programa koji se pie if(a > 10)
Klase za nove izuzetke treba izvoditi iz klase Exception throw new Izuzetak(a);
Klasa Exception ne definie nijedan metod ve sve System.out.println("Normalan izlaz");
}
nasleuje od klase Throwable
public static void main(String args[]) {
U novim klasama za izuzetke ne mora se redefinisati try {
nijedan metod, ali se to moe uraditi PrimerZaIzuzetak.racunaj(1);
PrimerZaIzuzetak.racunaj(20);
}
catch (Izuzetak e) {
System.out.println("Uhvaen " + e);
}
}
418 } 420

105
10/30/2016

Rezultat izvravanja programa


C:\java PrimerZaIzuzetak
racunaj(1)
Normalan izlaz
racunaj(20)
Uhvaen Izuzetak[20]

421 423

Korienje izuzetaka
Za obradu greaka i vanrednih situacija programa uvek
treba koristiti izuzetke
Uvek kad metod ne moe da obavi posao treba da baci
izuzetak
Nikad ne treba koristiti vraanje ifre greke kao nain
na koji metod prijavljuje da se pojavila greka

422 424

106
10/30/2016

Sadraj datoteke *.java

Datoteka *.java moe da sadri sledea etiri dela


jedan iskaz za obrazovanje paketa (neobavezno)
proizvoljan broj naredbi za uvoz (neobavezno)
jednu definiciju javne klase, ime klase je jednako imenu
Paketi datoteke (obavezno)
proizvoljan broj klasa bez specifikatora pristupa
(neobavezno)

425 427

Funkcije paketa Definisanje paketa


Paket deli imenski prostor (u dva paketa mogu postojati Paket se definie naredbom package koja treba da
klase sa istim imenom) bude prva naredba u fajlu Javine izvorne datoteke
Paket slui za upravljanje vidljivou package imePaketa;
moe postojati klasa koja se moe koristiti samo unutar Klase iz fajla u kojem je ova naredba pripadaju paketu
paketa, izvan je nevidljiva imePaketa
u klasi mogu postojati lanovi koji se vide samo unutar Fajlovi koji pripadaju jednom paketu moraju biti u istom
paketa direktorijumu ije je ime isto kao i ime paketa (raspored
malih i velikih slova u imenu paketa i direktorijuma mora
biti isti)
U svim fajlovima koji pripadaju paketu mora da postoji
naredba package koja odreuje kojem paketu pripada
fajl
426 428

107
10/30/2016

Hijerarhija paketa Starovanje programa iz komandne linije

Paketi mogu da obrazuju hijerarhiju, i tada se pie npr. Program se nalazi u nekom paketu
package paket1.paket2.paket3; Radni direktorijum treba da bude onaj koji je odreen
a direktorijum je: paket1\paket2\paket3 sistemskom promenljivom CLASSPATH
Navodi se cela hijerarhija paketa (direktorijuma) poevi
od direktorijuma odreenog sa CLASSPATH,
razdvojenih takom i na kraju je ime klase koja se staruje
Prmer:
C:\java imePaketa1.imePaketa2.imeKlase

429 431

Sistemska promenljiva CLASSPATH Specifikatori pristupa za lanove klase


Odreuje osnovni direktorijum hijerarhije paketa public za javni nain pristupanja
javnim lanovima mogu da pristupaju sve klase
protected za zatieni nain pristupanja
zatienim lanovima mogu da pristupaju sve klase iz
istog paketa i podklase iz drugih paketa
private za privatni nain pristupanja
privatnim lanovima moe da pristupa samo klasa u kojoj
su definisani
bez specifikatora za podrazumevani nain pristupanja
lanovima bez specifikatora pristupa mogu da pristupaju
sve klase iz istog paketa

430 432

108
10/30/2016

Specifikatori pristupa za klase Importovanje


public za javni nain pristupanja Za importovanje klase ili paketa slui naredba import
javnim klasama mogu da pristupaju sve klase koja se pie iza naredbe package a ispred definicije
bez specifikatora za podrazumevani nain pristupanja klase
klasama bez specifikatora pristupa mogu da pristupaju sve Opti oblik naredbe je
klase iz istog paketa import paket1[.paket2].(imeKlase | *)

Primeri:
import java.util.Date;
import java.util.*;
import java.io.*;

433 435

Pristupanje klasi iz drugog paketa Primer: natklasa je u drugom paketu


Klasi koja se nalazi u nekom drugom paketu moe se Natklasa iz drugog paketa mora da bude javna
pristupiti navoenjem hijerarhije paketa razdvojenih
takom i klase Primer sa importovanjem paketa:
Laki nain je da se klasa iz drugog paketa, ili ceo paket, import java.util.*;
importuje i tada se klasi pristupa preko imena
class MojDatum extends Date {
Za importovanje paketa slui naredba import
}

Primer bez importovanja paketa:


class MojDatum extends java.util.Date {
}

434 436

109
10/30/2016

Klasa sa istim imenom postoji u dva paketa Interfejsi

Da bi se koristila jedna od dve klase treba importovati Interfejs sadri potpise metoda, tj. definicija interfejsa je
paket u kojem se nalazi slina apstraktnoj klasi iji su svi metodi apstraktni
Ako se importuju oba paketa i upotrebi se ime klase koje Interfejs nema polja
se nalazi u oba paketa javlja se greka Klasa moe da implementira interfejs
Klasa koja implementira interfejs mora da sadri sve
metode iz interfejsa tj. da definie tela svih metoda iz
interfejsa
Klasa moe da implementira vie interfejsa
Potpuno razliite klase mogu da implementiraju isti
interfejs

437 439

Definisanje interfejsa
Opti oblik je:
pristup interface imeInterfejsa {
tip metod1 ( listaParametara );
Interfejsi tip metod2 ( listaParametara );
// ...
tip metodN ( listaParametara );
final tip promenljiva1 = vrednost;
final tip promenljiva2 = vrednost;
// ...
final tip promenljivaN = vrednost;
}
438 440

110
10/30/2016

Specifikator pristupa za interfejs Primer

Kao i klasa, i interfejs moe imati samo javni i interface InterfejsTest {


podrazumevani nain pristupa void test(int par);
}
Znaenje je isto kao i kod klase
class Klasa1 implements InterfejsTest {
void test(int p) {
// telo metoda iz interfejsa
}
double d;
int metod() {
// telo metoda koji nije iz interfejsa
}
}

441 443

Primer: geometrijska slika je natklasa


Realizovanje interfejsa
public abstract class GeometrijskaSlika {
Rezervisana re implements slui za oznaavanje public abstract double obim();
interfejsa koje implementira klasa public abstract double povrsina();
}
Opti oblik definicije klase koja implementira interfejs je:
pristup class imeKlase [extends imeNatklase] public class Trougao extends GeometrijskaSlika {
[implements interfejs1 [,interfejs2 ...]] { private double a, b, c;
// telo klase public Trougao(double a, double b_, double c_) {
} a = a_; b = b_; c = c_;
}
public double obim() { return a + b + c; }
public double povrsina() {
double s = (a + b + c)/2;
return Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
442 } 444

111
10/30/2016

Primer: geometrijska slika je natklasa Primer: geometrijska slika je interfejs


public interface GSInterface {
public class Kvadrat extends GeometrijskaSlika { public double obim();
private double a; public double povrsina();
public Kvadrat(double a_) { a = a_; } }
public double obim() { return 4 * a; }
public class Trougao implements GSInterface {
public double povrsina() { return a * a; }
private double a, b, c;
}
public Trougao(double a, double b_, double c_) {
public class Krug extends GeometrijskaSlika { a = a_; b = b_; c = c_;
private double r; }
public Krug(double r_) { r = r_; } public double obim() { return a + b + c; }
public double obim() { return 2 * Math.PI * r; } public double povrsina() {
public double povrsina() { return Math.PI * r*r; } double s = (a + b + c)/2;
} return Math.sqrt(s*(s-a)*(s-b)*(s-c));
}
445 } 447

Primer: geometrijska slika je natklasa Primer: geometrijska slika je interfejs

public class PrimerGeometrijskeSlike1 { public class Kvadrat implements GSInterface {


public static void main(String[] args) { private double a;
Trougao tr = new Trougao(3, 4, 5); public Kvadrat(double a_) { a = a_; }
Krug kr = new Krug(1); public double obim() { return 4 * a; }
Kvadrat kv = new Kvadrat(10); public double povrsina() { return a * a; }
GeometrijskaSlika rn; }
rn = tr; // referenca natklase ukazuje na objekat trougla
public class Krug implements GSInterface {
double o = rn.obim(); // obim trougla
private double r;
rn = kr; // referenca natklase ukazuje na objekat kruga
public Krug(double r_) { r = r_; }
double p = rn.povrsina(); // povrina kruga
public double obim() { return 2 * Math.PI * r; }
rn = kv; // referenca natklase ukazuje na objekat kvadrata
public double povrsina() { return Math.PI * r*r; }
o = rn.obim(); // obim kvadrata
}
}
}
446 448

112
10/30/2016

Primer: geometrijska slika je interfejs Referenciranje preko interfejsa


public class PrimerGeometrijskeSlike2 { Moe se definisati referenca tipa interfejsa
public static void main(String[] args) {
Referenca tipa interfejsa moe ukazivati na objekte svih
Trougao tr = new Trougao(3, 4, 5);
klasa koje implementiraju interfejs
Krug kr = new Krug(1);
Kvadrat kv = new Kvadrat(10); Preko reference tipa interfejsa moe se pristupiti samo
GSInterface ri; metodima koje postoje u interfejsu
ri = tr; // referenca tipa interfejsa ukazuje na objekat trougla Razreavanje je dinamiko, tj. koji se metod poziva
double o = ri.obim(); // obim trougla odreuje se u trenutku izvravanja na osnovu tipa
ri = kr; // referenca tipa interfejsa ukazuje na objekat kruga objekta na koji ukazuje referenca tipa interfejsa
double p = ri.povrsina(); // povrina kruga
ri = kv; // referenca tipa interfejsa ukazuje na objekat kvadrata
o = ri.obim(); // obim kvadrata
}
}
449 451

Izvoenje iz natklase ili implementiranje interfejsa? Dva interfejsa imaju isti metod
Ako su klase srodne, kao to je sluaj sa geometrijskim Klasa koja implementira dva interfejsa koji imaju isti
slikama (trougao, krug, kvadrat, ...) treba definisati metod realizuje taj metod samo jednom, tj. isti je metod
natklasu i iz nje izvesti potklase za oba interfejsa
Ako su klase potpuno razliite i nije logino da imaju
zajedniku natklasu, a imaju neke sline (zajednike)
metode, tada treba koristiti interfejse
u interfejs se stave zajedniki metodi raznorodnih klasa
koje sve klase treba da implementiraju

450 452

113
10/30/2016

Delimina realizacija interfejsa Izvoenje interfejsa

Klasa koja implementira interfejs, a ne definie tela za Jedan interfejs moe da se izvede iz drugog i tada
sve metode iz interfejsa je apstraktna nasleuje sve njegove metode

453 455

Nasleivanje interfejsa
Promenljive u interfejsu
interface A {
void metod_A();
Interfejs ne moe imati promenljivem, moe imati samo }
konstante interface B extends A {
Primer: void metod_B();
interface ZajednickeKonstante { }
class Test implements B {
int NE = 0; public void metod_A() {
int DA = 1; // telo metoda iz interfejsa A
}
int MOZDA = 2;
public void metod_B() {
} // telo metoda iz interfejsa B
Ovaj interfejs sadri samo konstante (nema metode) }
public void metod_T() {
Sve klase koje implementiraju ovaj interfejs imaju // telo metoda koji ne postoji u interfejsu
konstante definisane u njemu }
}
454 456

114
10/30/2016

Nasleivanje interfejsa
public class PrimerNasledjivanja {
public static void main(String[] args) {
Test test = new Test();
test.metod_A();
test.metod_B();
test.metod_T();
B rib = test;
rib.metod_A();
rib.metod_B();
rib.metod_T(); // greka, nije iz interfejsa B
A ria = test;
rib.metod_A();
rib.metod_B(); // greka, nije iz interfejsa A
}
}
457

115