Professional Documents
Culture Documents
Java 1
Java 1
Java 1
• Programski jezik C
• Programski jezik C++
• Programski jezik Java
Uvod u programski jezik Java
1 2
3 4
Programski jezik Java Programski jezik Java
• Razlog nastanka: potreba za programskim jezikom koji • Jezik je koncipirao tim firme Sun Microsystems, Inc.
je nezavisan od platforme računara 1991. godine
– C i C++ zavise od platforme računara • Od 1993. godine razvija se prvenstveno zbog Interneta
• Prvobitni motiv: programiranje kućnih aparata – različite vrste računara, operativih sistema, procesora
• Najjači motiv za razvoj: Internet, World Wide Web • Ime Java dobija 1995 . godine
– prvobitni naziv je bio Oak
• Većinu
V ći osobina
bi JJava jje nalsedila
l dil odd jjezika
ik C i C
C++
5 6
11 12
Jednostavan program
/*
Ovo je jednostavan Java program.
Datoteka se zove "Primer
Primer.java
java".
*/
class Primer {
Pregled jezika Java // Program
g p
pocinje
j ppozivanjem
j metoda main().
()
public static void main(String args[]) {
System.out.println("Ovo je jednostavan Java program.");
}
}
• Prevođenje programa
C:\>javac Primer.java
Primer java
• Pokretanje programa
C:\>java Primer
• Rezultat izvršavanja programa
13 Ovo je jednostavan Java program. 14
Literali Separatori
• Konstantne vrednosti koje se navode doslovno () Zagrade služe za liste parametara metoda,
naglašavanje prioriteta, grupisanje izraza,
100 // Celobrojni literal
zadavanje tipa pri konverziji
1.23 // Broj u pokretnom zarezu
{} Vitičaste zagrade služe za definisanje klasa, metoda,
’x’ // Znak blokova naredbi, automatsku inicijalizaciju nizova
”Ovo je test” // Znakovni niz [] Uglaste zagrade služe za deklarisanje nizova
i pristupanje pojedinačnim članovima niza
; Znak tačka zarez označava krajj naredbe
, Zarez služi za razdvajane identifikatora u deklaraciji
promenljivih i za povezivanje naredbi
. Tačka razdvaja ime paketa od potpaketa i klasa
klasa,
razdvaja promenljive i metode od imena objekata
23 24
Rezervisane reči Javine biblioteke
abstract const finaly int public this
• Java sadrži biblioteke klasa
boolean continue float interface return throw • Klase su grupisane prema funkcijama kojima se bave
break default for long short throws – ulaz i izlaz podataka
byte do goto native static transient
– rad sa tekstom
– rad sa grafikom
case doube if new strictfp try
– rad u mreži
catch else implements package super void
– k
komunikcija
ik ij sa SQL bbazama podataka
d t k
char extends import private switch volatile – ...
class final instanceof protected synchronized while
27 28
Tipovi podataka
• Vrste tipova
– Prosti tipovi (vrednosti koje nisu objekti)
– Klasni tipovi (objekti)
Tipovi podataka,
podataka promenljive
• Java je strogo tipiziran jezik
29 30
b j(10 ) =
broj ∑c ⋅ b
i =− m
i
i 109 : 2 = 5454, ostatak
54 : 2 = 27, ostatak
1
0
109
54
1
0
27 : 2 = 13, , ostatak 1 27 1
• n je broj celih mesta 13 : 2 = 6, ostatak 1 13 1
6 : 2 = 3, ostatak 0 6 0
• m je broj razlomljenih mesta
3 : 2 = 1, ostatak 1 3 1
• b je osnova sistema iz kojeg se prevodi broj 1 : 2 = 0, ostatak 1 1 1
• ci su
s cifre sistema iiz kojeg se pre
prevodi
odi broj • Zapis broja je 0
• i je pozicija cifre 109(10) = 1101101(2)
• bi je težina cifre na poziciji i
35 36
Primer konverzije broja iz decimalnog
Primer konverzije iz binarnog u decimalni sistem
u heksadecimalni numerički sistem
• Za decimalni broj 109:
1 0 9 • Prevodi se broj 109 • Kraći način p
pisanja
j
109 : 16 = 6, ostatak 13 109 13 = D
2 1 0 - pozicije cifara
– težine cifara su 6 : 16 = 0, ostatak 6 6 6
109 = 1×102 + 0×101 + 9×100 0
• Zapis broja je
• Prevođenje binarnog broja 1101101 u decimalni 109(10) = 6D(16)
1 1 0 1 1 0 1
6 5 4 3 2 1 0 - pozicije cifara
1101101(2)
= 1×26 + 1×25 + 0×24 + 1×23 + 1×22 + 0×21 + 1×20
= 64 + 32 + 0 + 8 + 4 + 0 + 1
= 109(10) 37 38
Konverzija iz binarnog
Zapis negativnih celih brojeva u binarnom sistemu
u heksadecimalni numerički sistem i obrnuto
• Za osnove sistema važi: 24=16 • Prva cifra za pozitivne brojve je 0
– četiri binarne cifre odgovaraju jednoj heksadecimalnoj cifri • Negativni brojevi se zapisuju u drugom komplementu
• Prevođenje iz binarnog u heksadecimalni sistem: • Prvi komplement broja: sve nule se zamene jedinicama,
– počevši od cifre najmanje težine grupišu se po četiri a sve jedinice nulama
binarne cifre i zamene se jednom heksadecimalnom cifrom – ili: prvi komplement = 2n – 1 – broj, n je broj cifara
– ako poslednja grupa ima manje od četiri cifre dopisuje se • Drugi komplement broja: na prvi komplement se doda 1
potreban broj nula sa prednje strane
– ili:
ili d t = 2n – broj,
drugii kkomplement
l b j n jje b
brojj cifara
if
• Primer: binarni broj 1101101:
• Pravilo za prevođenje u drugi komplement:
110 1101(2) = 0110 1101(2) = 6 D(16)
– idući od cifre najmanje težine
težine, sve uzastopne nule se
• Prevođenje broja iz heksadecimalnog u binarni sistem prepišu, a takođe i prva jedinica na koju se naiđe
– svaka heksadecimalna cifra zameni se kombinacijom četiri – preostale cifre: sve nule se zamene jedinicama, a jedinice
binarne cifre koja odgovara toj heksadecimalnoj cifri nulama
39 40
Primeri određivanja drugog komplementa Primer: drugi komplement broja –1
• Za decimalni broj 109: • Za decimalni broj 16: • Zapis pozitivnog broja:
109(10) = 01101101(2) 16(10) = 00010000(2) 1(10) = 0000 0001(2)
• Drugi komplement: • Drugi komplement: • Drugi komplement:
0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1
• Negativan broj: • Negativan broj: • Negativan broj:
-109(10) = 10010011(2) -16(10) = 11110000(2) -1(10) = 1111 1111(2)
41 42
45 46
47 48
long Standard IEEE 754, brojevi u pokretnom zarezu
• Dužina 64 bita Znak (z) Eksponent (e) Mantisa (m) Bias (b)
• Opseg: –99 223 372 036 854 775 808 do float 1 bit [31] 8 bita [30-23]
[30 23] 23 bita [22
[22-0]
0] 127
9 223 372 036 854 775 807 double 1 bit [63] 11 bita [62-52] 52 bita [51-0] 1023
9223372036854775807 = 0x7FFFFFFFFFFFFFFF
-9223372036854775808
9223372036854775808 = 0x8000000000000000
0 8000000000000000 • Mantisa sadrži zapis o razlomljenom delu
• Normalizovana mantisa ima oblik 1.m,
• Deklaracija promenljive: – Zapisuje se "m", a "1." se podrazumeva
long broj_sekundi;
broj sekundi; – Tip
Ti float ima
i 24 ttačne
č binarne
bi cifre,
if a double 53
– Zapis broja je: (–1)z × 1.m × 2e-b
• Denormalizovana mantisa ima oblik 0.m i
– mantisa je denormalizovana ako je m ≠ 0, e = 0
– Zapis broja je: (–1)z × 0.m × 2-126
49 50
Standard IEEE 754, brojevi u pokretnom zarezu Standard IEEE 754, opsezi brojeva
Znak Eksponent Mantisa Bias Sa normalizovanom mantisom (eksponent ≠ 0)
float 1 bit [31] 8 bita [30-23]
[30 23] 23 bita [22
[22-0]
0] 127
min
i max približni
ibliž i opseg
double 1 bit [63] 11 bita [62-52] 52 bita [51-0] 1023
float 2–126 (2–2–23)·2127 10–37.93 ÷ 1038.53
• Znak
– 0 za pozitivne brojeve
double 2–1022 (2–2–52)·21023 10–307.65 ÷ 10308.25
– 1 za negativne brojeve
• Eksponent je za osnovu 2 S denormalizovanom
Sa d li mantisom
ti ((eksponent
k t = 0)
– Vrednost u memoriji je <stvatna vrednost eksponenta> + Bias
– Eksponenti 00...00 i 11...11 imaju specijalno značenje min max približni opseg
– Primeri za float
float 2–149 (1–2–23)·2–126 10–44.85 ÷ 10–37.93
• Zapis 200 predstavlja eksponent 73 (200–127=73)
• Najmanja vrednost eksponenta je 1–127=–126 double 2–1074 (1–2
(1 2–52))·2
2–1022 10–323.3 ÷ 10–307.65
• Najveća vrednost eksponenta je 254–127=127
51 52
Standard IEEE 754, opsezi brojeva Standard IEEE 754, specijalne vrednosti
Sa normalizovanom mantisom (eksponent ≠ 0) • Nula: eksponent sadrži nule, mantisa sadrži sve nule
min
i max približni
ibliž i opseg – ne može da se zapiše sa normalizovanom mantisom
– postoje +0 i –0 koje su jednake pri poređenju
float 2–126 (2–2–23)·2127 1,17·10–38 ÷ 3,40·1038
• Beskonačno (±∞): eksponent sadrži sve jedinice,
double 2–1022 (2–2–52)·21023 2,22·10–308 ÷ 1,79·10308 mantisa sadrži sve nule
• NaN (Not a Number): eksponent sadrži sve jedinice,
S denormalizovanom
Sa d li mantisom
ti ((eksponent
k t = 0) mantisa je različita od nule (ne sadrži sve nule)
– QNaN (Quiet NaN): MSB mantise je 1, označava rezultat
min max približni opseg matematičke operacije koji nije nedefinisan
float 2–149 (1–2–23)·2–126 1,40·10–45 ÷ 1,75·10–38 – SNaN (Signalling NaN): MSB mantise je 0, nevažeća
operacija, izuzetak
double 2–1074 (1–2–52))·2
2–1022 4,94·10
4,94 10–324 ÷ 2,22
2,22·10
10–308
53 54
Standard IEEE 754, specijalne operacije Standard IEEE 754, sumarna tabela
Znak Eksponent (e) Mantisa (m) Vrednost
Operacija Rezultat
0 00..00 00..00 +0
n / ±b k
±beskonačno
č 0 0 00..00 00..01 ÷ 11..11 0.m × 2-b+1
±beskonačno × ±beskonačno ±beskonačno 0 00..01 ÷ 11..10 XX..XX 1.m × 2e-b
0 11 11
11..11 00 00
00..00 +beskonačno
±<ne_nulta_vrednost> / 0 ±beskonačno
0 11..11 00..01 ÷ 01..11 QNaN
beskonačno + beskonačno beskonačno 0 11..11 10..01 ÷ 11..11 SNaN
57 58
59 60
Logički tip - boolean Celobrojni literali
• Vrednosti: true, false • Decimalni sistem: 7, 123
• Operatori poređenja vraćaju rezultat tipa boolean • Oktalni sistem,
sistem prva cifra je 0: 07,
07 056
• Heksadecimalni sistem, brojevi počinju sa 0x ili 0X
boolean b = true; – cifre od A do F mogu da se pišu malim ili velikim slovima
System.out.println(b); // Prikazuje "true" • Podrazumeva se da je tip int
• Može se dodeliti promenljivoj tipa byte ili short ako
j vrednost
je d liliterala
l unutar opsega tipa:
i
byte b = 26;
• Literal tipa long označava se slovom L na kraju:
0x7FL, 0xac23l
61 62
63 64
Znakovni literali Literali znakovnog niza
• Vidljivi znakovi mogu da se pišu unutar polunavodnika: • Unose se između navodnika:
a , 'A',, 'x',, '8',
'a', 8 , '@',
@ , '!'
! "Tekst koji se ispisuje u jednom redu."
"Tekst koji\nse ispisuje\nu tri reda."
• Specijalni znakovi se označavaju kosom crtom:
'\'' (polunavodnik), '\"' (navodnik), '\t' (tabulator), "\"Tekst koji se ispisuje unutar navodnika.\""
\ (prelazak
'\n' ( l k u novii red),
d) '\r'
\ (vraćanje
( ć j na početak
č t k
reda), '\f' (prelazak na novu stranicu) • Naredba System.out.println() bi gornje
• Znak može da se unese pomoću vrednosti: znakovne nizove ispisala
p ovako:
oktalna vrednost se unosi kao trocifren broj '\ddd': Tekst koji se ispisuje u jednom redu.
'\044', '\101' Tekst koji
heksadecimalna vrednost se unosi kao četvorocifren broj se ispisuje
i i j
dodatno označen kosom crtom i slovom u: '\u0065', u tri reda.
'\ua075' "Tekst
e st se ispisuje
sp suje u
unutar
uta navodnika."
a od a.
65 66
• Di
Dinamička
ičk iinicijalizacija
i ij li ij je
j iinicijalizacija
i ij li ij iizračunavanjem
č j
izraza koji važi u trenutku izvršavanja (sve promenljive u
izrazu moraju dobiti vrednost pre pozivanja izraza)
67 68
Oblast važenja promenljive Ilustrovanje oblasti važenja
• Promenljiva se ne može koristiti pre deklaracije class OblastVazenja {
{ public static void main(String args[]) {
int p = 3; int x=10; // vidljiva unutar metode main
{ if(x==10){ // početak nove oblasti važenja
... int y=20; // vidljiva samo u ovom bloku
broj = 10; // Greška, promenljiva nije deklarisana System.out.println("x i y: " + x + " " + y);
int broj; x = y * 2; // u ovom bloku se vide x i y
int m = p; }
... //y = 100; // Greška, y se ovde ne vidi
} // x se ovde vidi
int k = m; // Greška, m ne postoji u ovom bloku System.out.println("x je " + x);
int r = p; }
... }
} 69 70
73 74
• Mogući su i neočekivani rezultati, npr. kad je broj koji se • Tip int je dužine 32 bita, tj. 4 bajta
konvertuje izvan opsega tipa u koji se konvertuje • Pri konverziji tipa int u tip byte rezultat je jednak
class Konverzija { najnižem bajtu (biti na pozicijama od 0 do 7), a tri gornja
public static void main(String args[]) { bajta se gube (biti na pozicijama od 8 do 31)
i t i = 257
int 257; // 0...0
0 0 0001 0000 0001
• Zavisno od vrednosti bita na poziciji 7, rezultat može
double d = 129.142;
byte b = (byte)i; // b=1 0000 0001
promeniti znak
i = (i
(int)d;
t)d // ii=129
129 0 0 0000 1000 0001
0...0
b = (byte)d; // b=-127 1000 0001
int → byte
// 130 = 0...0
0 0 0000 1000 0010 byte3 byte2 byte1 byte0 → byte0
i = -130; // -130 = 1...1 1111 0111 1110
b = (byte)i; // b=126 0111 1110 00110100 10011010 01101110 11111111 → 11111111
} ↑
} 77 pozicija 7 78
79 80
Nizovi
• Grupe promenljivih istog tipa
• Jedna ili više dimenzija
Nizovi
81 82
• Ovim se rezerviše 3x4=12 lokacija u memoriji za tip int [2][0] [2][1] [2][2] [2][3]
87 88
Primer za pristupanje članovima matrice Inicijalizacija dvodimenzionalnog niza
class DvodimenzionalniNiz { class DvodimenzionalniNizInit {
public static void main(String args[]) { public static void main(String args[]) {
int matrica[][]= new int[3][4]; int m[][]= { { 0, 1, 2, 3 },
int i, j, k = 0; { 4, 5, 6, 7 },
for(i=0; i<3; i++) { 8, 9, 10, 11 } };
for(j=0; j<4; j++) { int i,
i j;
matrica[i][j] = k; for(i=0; i<3; i++) {
k++; for(j=0; j<4; j++)
} System.out.print(m[i][j] + " ");
for(i=0; i<3; i++) { System.out.println();
for(j=0; j<4; j++) }
System.out.print(matrica[i][j] + " "); }
System.out.println(); }
} 0 1 2 3
} 4 5 6 7
89 90
} 8 9 10 11
Drugi način kreiranja višedimenzionalnog niza Različit broj elemenata u nekoj dimenziji niza
class DvodimenzionalniNizDrugiNacin { class DvodimenzionalniNizSpec {
public static void main(String args[]) { public static void main(String args[]) {
int m[][]= new int[3][]; int dd[][]= new int[3][];
m[0] = new int[4]; dd[0] = new int[1];
m[1] = new int[4]; dd[1] = new int[2];
m[2] = new int[4]; dd[2] = new int[3];
// Isto se dobija sa int i, j, k=0;
// int matrica[][]= new int[3][4]; for(i=0; i<3; i++)
... for(j=0; j<i+1; j++) {
} dd[i][j] = k;
} k++;
}
}
}
91 92
Različit broj elemenata u nekoj dimenziji niza
[0][0]
[1][0] [1][1]
93 94
95 96
Operatori
• Aritmetički operatori
• Operatori nad bitima
• Operatori poređenja
Operatori • Logički operatori
• Operator dodeljivanja
• Operator ?:
97 98
promenljiva
lji operator=
t i
izraz; x = x – 1;
1
x--;
• Pomeranje
P j ulevo
l za N bita
bit odgovara
d množenju
ž j sa 2N, pod
d uslovom
l
da ne dođe do promene znaka broja
107 108
Pomeranje udesno Pomeranje udesno uz dodavanje nula
109 110
117 118
Prioritet operatora
Operator dodeljivanja
() [] .
promenljiva = izraz; ++ -- ~ !
* / %
• Operator dodeljivanja vraća vrednost izraza sa desne + -
strane >> >>> <<
> >= < <=
int a, b, c, d; == !=
a = b = c = d = 10; &
^
• Sve četiri promenljive dobijaju vrednost 10 |
• Izraz d=10
d 10 vraća rezultat 10 koji se dodeljuje &&
promenljivoj c i tako redom do a ||
?:
= operator= (*=, /=, %=, +=, <<= ...)
119 120
Korišćenje zagrada
• Zagrade služe za definisanje redosleda izračunavanja
(prioriteta)
(p o e a) i za
appisanje
sa je jas
jasnijih
j izraza
a a
121 122
123 124
Upravljačke naredbe
• Naredbe uslovljavanja
– upravljanje izvršavanjem programa na osnovu uslova koji
su poznati u trenutku izvršavanja
Upravljačke naredbe • Naredbe ciklusa
– izvršavanje (ponavljanje) jedne naredbe ili bloka naredbi
potreban broj puta, zavisno od uslova
• Naredbe
N db skoka
k k
– prekidanje izvršavanja redosleda naredbi i nastavljanje na
definisanom mestu, tj.j p
preskakanje
j naredbi
125 126
127 128
Primeri za if Ugnježdeni uslovi
int a, b;
// a i b dobijaju neke vrednosti ... if(i == 10) {
if(a < b) a = 0; if(j < 20) a = b;
else b = 0; if(k > 100) c = d;
else a = c; // ovaj else se odnosi na uslov if(k > 100)
int brojPodataka,
brojPodataka n; }
// ... else a = d; // ovaj else se odnosi na uslov if(i == 10)
if(brojPodataka > 0) {
ObradiPodatke(); // Blok od dve naredbe u if delu
brojPodataka -= n;
}
else
PrikupiPodatke(); // Jedna naredba u else delu
int i = n; // Naredba koja ne pripada if-else delu
129 130
131 132
Primer za if else if
class GodisnjaDobaSaIfElseIf {
Naredba switch
public static void main(String args[]) { • Grananje
G j u više
iš putanja
t j zavisno
i od
d vrednosti
d ti iizraza
int mesec = 4; // April
• Opšti oblik
String godisnjeDoba;
switch(izraz) {
if(mesec==12 || mesec==1 || mesec==2)
godisnjeDoba = "zima"; case vrednost1:
else if(mesec==3 || mesec==4 || mesec==5) niz_naredbi1;
godisnjeDoba
di j D b = "proleće";
" l ć " [b
[break;]
k ]
else if(mesec==6 || mesec==7 || mesec==8) case vrednost2:
godisnjeDoba= "leto";
niz_naredbi2;
else if(mesec==9 || mesec==10 || mesec==11)
godisnjeDoba = "jesen"; [break;]
else ...
godisnjeDoba = "nepostojeći
nepostojeći mesec
mesec";
; default:
System.out.println("Kada je mesec april, godišnje doba niz_naredbiN;
je " + godisnjeDoba + ".");
}
}
}
Kada je mesec april, godišnje doba je proleće. 133 134
Primer za switch
Naredba switch class PrimerZaSwitch {
• izraz je
i j jjedan
d od d ti
tipova: byte,
b t short,
h t inti t ili char
h public static void main(String args[]) {
• Svaka od vrednosti je jedinstven literal (konstanta) for(int i=0; i<6; i++)
• Ne sme se pponoviti ista vrednost u istom switch switch(i) {
case 0: System.out.println("i je nula."); break;
• Sa break se završava switch
case 1: System.out.println("i je jedan."); break;
• Ako ne postoji break nastavlja se izvršavanje sledećeg case 2: System.out.println("i je dva."); break;
case case 3: System.out.println("i je tri."); break;
• Deo default je opcioni default: System.out.println("i je veće od tri.");
}
}
}
i jje nula.
i je jedan.
i je dva.
i jje tri.
i je veće od tri.
135 i je veće od tri. 136
Primer za switch bez break Godišnja doba sa switch
class PrimerBezBreak { class GodisnjaDobaSaSwitch {
public
bli static
t ti void
id main(String
i (St i args[])
[]) {
public static void main(String args[]) {
int mesec = 4;
for(int i=0; i<9; i++) String godisnjeDoba;
switch(i) { switch (mesec) {
case 0: System.out.println("i = 0"); case 12:
case 1:
case 1: case 2: godisnjeDoba = "zima"; break;
case 2: System.out.println("i < 3"); break; case 3:
case 3: case 4:
case 5: godisnjeDoba = "proleće"; break;
case 4: System.out.println("i < 5"); break;
case 6:
default: System.out.println("i >= 5"); case 7:
} case 8: godisnjeDoba = "leto"; break;
} case 9:
case 10:
} case 11: godisnjeDoba = "jesen";
jesen ; break;
default: godisnjeDoba = "nepostojeći mesec";
i=0 i<5
}
i<3 i >= 5 System.out.println("Kada je mesec april, godišnje deoba je " +
i<3 i >= 5 godisnjeDoba + "
".");
");
i<3 i >= 5 }
137 } 138
i<5 i >= 5
139 140
Naredbe ciklusa Petlja while
• Izvršavanje (ponavljanje) jedne naredbe ili bloka naredbi • Opšti oblik while petlje
potreban broj puta, zavisno od uslova
while(uslov)
telo_petlje
• Naredbe ciklusa (petlje)
– while • uslov je proizvoljan logički izraz
– do while • telo_petlje je jedna naredba (može biti i prazna
– for naredba) ili blok naredbi
• telo_petlje se ponavlja sve dok uslov ima
vrednost true
• while petlja je sa proverom na vrhu, tj. ako uslov
ima vrednost false pri prvoj proveri, ne ulazi se u
petlju tj.
petlju, tj telo_petlje
telo petlje se ne izvršava nijednom
141 142
143 144
Petlja do while Primer za do while
class PrimerZaDoWhile {
• Opšti oblik do while petlje public static void main(String args[]) {
int n = 5; // Za n=0 petlja bi se izvršila jednom
do do {
telo_petlje System.out.println("Vrednost n je " + n);
while(uslov); n--;
} while(n > 0);
• uslov je proizvoljan logički izraz }
• telo_p
petljej jje jjedna naredba ili blok naredbi }
• do while petlja je sa proverom na dnu: Vrednost n je 5
– telo_petlje se izvršava jednom a posle toga se Vrednost n je 4
Vrednost n je 3
proverava uslov
l
Vrednost n je 2
– ako uslov ima vrednost true, telo_petlje se Vrednost n je 1
izvršava ponovo, a ako je vrednost false izlazi se iz
petlje Za n=0 rezultat bi bio
145 Vrednost n je 0 146
Vrednost n je 5
Vrednost n je 4
Vrednost n je 3
Vrednost n je 2
Vrednost n je 1
147 148
Petlja for
Primer za for
• inicijalizacija je izraz
– izvršava se samo jednom na početku pri ulasku u petlju class PrimerZaFor {
public static void main(String args[]) {
– obično inicijalizuje upravljačku promenljivu petlje
int n;
• uslov je logički izraz, proverava se pre izvršavanja tela
for(n=5; n>0; n--)
petlje System.out.println("Vrednost n je " + n);
– ako
k je
j vrednost
d t true
t i š
izvršava se ttelo
l petlje
tlj }
– ako je false ne izvršava se telo petlje i izlazi se iz petlje }
– obično zavisi od upravljačke promenljive petlje
• telo_petlje je jedna naredba ili blok naredbi Vrednost n je 5
Vrednost n je 4
• iteracija je izraz Vrednost n je 3
– izvršava se posle tela petlje Vrednost n je 2
– obično menja upravljačku promenljivu petlje Vrednost n je 1
• petlja
tlj se nastavlja
t lj proverom usloval i iizvršavanjem
š j ttela
l
petlje i iteracije sve dok je uslov tačan 149 150
155 156
Ugneždene for petlje Naredbe skoka
class UgnjezdeneForPetlje {
public static void main(String args[]) { • Prekidanje izvršavanja redosleda naredbi i nastavljanje
for(int i=0; i<5; i++) { na definisanom mestu,
mestu tjtj. preskakanje naredbi
for(int j=i; j<5; j++) – break
System.out.print(i); – continue
System.out.println();
– return
}
}
}
00000
1111
222
33
4
157 158
159 160
Izlazak iz for petlje sa break Izlazak iz while petlje sa break
class BreakPrekidaForPetlju { class
l B
BreakPrekidaWhilePetlju
kP kid Whil P tlj {
public static void main(String args[]) { public static void main(String args[]) {
for(int i=0; i<100; i++) { int i=0;
if(i == 5) break; // prekidanje petlje kad je i=5 while(i<100) {
System.out.println("i: " + i); if(i == 5) break; // prekidanje petlje kad je i=5
} System.out.println("i:
Syste .out.p t ( : " + i); );
System.out.println("Petlja je završena."); i++;
} }
} S t
System.out.println("Petlja
t i tl ("P tlj j je završena.");
š ")
}
i: 0 }
i: 1
i: 0
i: 2
i: 1
i: 3 i: 2
i: 4 i: 3
Petlja je završena. i: 4
161 Petlja je završena. 162
class PrimerZaReturn {
public static void main(String args[]) {
boolean t = true;
System.out.println("Pre naredbe return.");
if(t) return;
t // povratak
t k pozivaocu
i
System.out.println("Ovo se ne izvršava.");
}
}
173 174
175 176
Klasa
177 178
tip imeMetoda1(lista_parametara) {
telo_metoda
}
...
tip imeMetodaM(lista
imeMetodaM(lista_parametara)
parametara) {
telo_metoda
}
}
179 180
Termini Primer jednostavne klase
• Objekat se naziva i instanca klase • Klasa za opisivanje kutije za koju su bitne samo
• Podaci (promenljive) definisane u klasi nazivaju se polja dimenzije
(takođe se koriste i termini: promenljive instance, atributi
ili članovi podaci)
• Kod se piše u metodima class Kutija {
• Metodi i promenljive deklarisane u klasi nazivaju se double sirina;
članovi klase double visina;
double duzina;
}
181 182
k1 sirina
visina
duzina
183 184
Primer 2. sa dva objekta klase Kutija
Primer 1. sa klasom Kutija class PrimerSaDveKutije1 {
public static void main(String args[]) {
class PrimerSaKutijom1 {
Kutija k1 = new Kutija();
public static void main(String args[]) {
j k2 = new Kutija();
Kutija j
Kutija k = new Kutija();
// dodela vrednosti clanovima objekta k1
// dodela vrednosti poljima
k1.sirina = 1; k1.visina = 2; k1.duzina = 3;
k.sirina = 1;
// dodela vrednosti clanovima objekta k2
k.visina = 2;
k2.sirina = 2; k2.visina = 4; k2.duzina = 5;
k.duzina = 3;
// Izračunavanje i ispisivanje zapremina
// Računanje zapremine kutije
double z = k1.sirina * k1.visina * k1.duzina;
double zapremina = k.sirina * k.visina * k.duzina;
System.out.println("Zapremina k1 je " + z);
System.out.println("Zapremina je " + zapremina);
z = k2.sirina * k2.visina * k2.duzina;
}
System.out.println("Zapremina k2 je " + z);
}
}
Zapremina je 6.0 }
Zapremina k1 je 6.0
185 186
Zapremina k2 je 40.0
• Stvaranje objekta
k1 = new Kutija();j (); k1 sirina
• Operator new kreira objekat, tj. visina
k2 = k1; k1 sirina
rezerviše prostor u memoriji za duzina
• Reference k1 i k2 sad imaju iste visina
čuvanje objekta vrednosti, tj. ukazuju na isti objekat duzina
k2
• Referenca k1 ukazuje na objekat • Kopiranje reference ne kopira
• Preko refernce se pristupa objektu objekat
187 188
Reference i objekti - nastavak Opšti oblik primene operatora new
k1 sirina
k1 = new Kutija(); ImeKlase promenljiva = new ImeKlase();
visina
• Kreiran jje jjoš jjedan objekat
j na kojij k2 • ImeKlase označava tip promenljive
duzina
sad ukazuje referenca k1
• ImeKlase() označava konstruktor
sirina
visina
duzina • Operator new dodeljuje memoriju dinamički
• Količina memorije je ograničena
k2 = new Kutija();
K tij ()
k1 sirina • Ako nema dovoljno memorije da se kreira objekat javlja
• Kreiran je treći objekat na koji sad visina
ukazuje referenca k2 se izuzetak
k2 duzina
• Na prvi objekat više ne ukazuje • Operator new se ne koristi za proste tipove (byte
(byte,
nijedna referenca i njemu ne može sirina sirina short, int, long, float, double, char,
da se pristupi visina visina boolean).
duzina duzina Promenljive ovih tipova nisu objekti.
189 190
191 192
Šta je loše u klasi Kutija? Metod za izračunavanje zapremine u klasi Kutija
class Kutija { class Kutija {
double sirina; double sirina;
double visina; double visina;
double duzina; double duzina;
} double zapremina() {
return sirina * visina * duzina;
• U klasi Kutija nije ugrađeno "znanje" kako se izračunava zapremina, }
pa bi to znanje moralo da se ugradi u svaku klasu koja radi sa
}
klasom Kutija, ako je potrebna zapremina objekta tipa Kutija
• Ne postoji dobar način da se postave početne vrednosti polja, ili da • U metodu zapremina direktno se pristupa poljima pošto je i
se promene vrednosti (pristupa se poljima direktno) metod zapremina član klase Kutija
• Tip vrednosti koji vraća metod mora da bude kompatibilan sa tipom
metoda
• Tip promenljive koja prihvata vrednost koju vraća metod mora biti
kompatibilan sa tipom metoda
193 194
199 200
Konstruktor sa parametrima u klasi Kutija
class Kutija {
Konstruktor sa parametrima u klasi Kutija
double sirina;
• U klasi Kutija koja ima konstruktor sa parametrima ne
double visina;
mora postojati metod za postavljanje dimenzija, ako se
double duzina;
pretpostavi da objektu Kutija ne treba menjati dimenzije
// Konstruktor sa listom parametara • Korišćenje podrazumevanog konstruktora u ovoj klasi
Kutija(double s, double v, double d) { i
izaziva
i grešku
šk u prevođenju
đ j programa
sirina = s; • Može se napisati više konstruktora u jednoj klasi
visina = v; (sledeće poglavlje)
duzina = d;
}
double zapremina() {
return sirina * visina * duzina;
}
} 201 202
Metod finalize
207 208
Preklapanje metoda
209 210
213 214
219 220
Klasa sa metodom čiji je parametar objekat Primer kad je objekat parametar
class Test { class PrimerProsledjivanjaObjekta {
int a, b; public static void main(String args[]) {
Test obj1 = new Test(10, 2);
Test(int _a, int _b) { Test obj2 = new Test(10, 2);
a = _a;
a; Test obj3 = new Test(10,
Test(10 5);
b = _b; System.out.println("obj1 == obj2: " +
} obj1.equals(obj2));
// Metod equals proverava da li su objekti jednaki System.out.println("obj1 == obj3: " +
boolean equals(Test obj) { obj1.equals(obj3));
if(a == obj.a && b == obj.b) return true; }
else return false; }
} obj1 == obj2: true
} obj1 == obj3: false
221 222
225 226
Zapremina k1 je 6.0
Zapremina k2 je 0.0
Zapremina k3 je 8.0
Zapremina k4 je 6.0 227 228
Dodavanje jedne vrednosti na stek Uzimanje jedne vrednosti sa steka
Stanje pre dodavanja Stanje posle dodavanja
nove vrednosti na stek nove vrednosti na stek Stanje pre uzimanja sa steka Stanje posle uzimanja sa steka
Push(a) Pop()
a a
vrh vrh vrh vrh
r r r r
q q q q
p p p p
229 230
235 236
Prosleđivanje (pozivanje) po vrednosti Prosleđivanje (pozivanje) po vrednosti
class PozivanjePoVrednosti {
• Tip argumenta je neki od prostih tipova public static void main(String args[]) {
• Po
P završetku
š tk metoda
t d vrednost
d t prosleđenog
l đ argumenta
t Test obj = new Test();
ostaje nepromenjena int a = 2, b = 10;
System.out.println("Pre pozivanja a, b: " +
a + " " + b);
class Test {
int c = obj.izracunaj(a, b);
int izracunaj(int i, int j) {
y p
System.out.println("Posle pozivanja
p j a, , b: " +
i *
*= 3
3;
a + " " + b);
j /= 2;
System.out.println("c: " + c);
return i * j;
}
}
}
}
Pre pozivanja a, b: 2 10
Posle
P l pozivanja
i j a, b:
b 2 10
237
c: 30 238
239 240
Prosleđivanje po referenci Prosleđivanje (pozivanje) po referenci
class Test {
• Vrednost argumenta (promenljive koja postoji u metodu int a, b;
koji poziva) je kopirana u parametar (promenljivu koja
postoji u pozvanom metodu), tako da ukazuju na isti Test(int _a, int _b) {
objekat koji je negde u memoriji a = _a;
• Objekat
Obj k t se može ž promenitiiti unutar
t metoda
t d b = _b;
}
int izracunaj(Test o) {
argument polje 0
o.a *= 3;
polje 1
o b /= 2;
o.b
parametar ...
return o.a * o.b;
polje N }
}
241 242
247 248
Rekurzija
249 250
253 254
[0] = 0
[1] = 1
[2] = 2
[3] = 3
[[4]] = 4
257 258
259 260
Ilustracija javnog i privatnog pristupanja
Specifikator pristupa se piše ispred specifikatora tipa
class Test {
public int i; int a; // podrazumevani pristup
private double j; public int b; // javni pristup
private int c; // privatni pristup
267 268
Statički metodi Primer za statičke članove: objekti imaju redni broj
• Statički metodi mogu da pristupaju samo statičkim • Potrebno je da se izbroje objekti koji su napravljeni, i da
poljima svaki napravljeni objekat ima redni broj:
• Statički metodi mogu da pozivaju samo statičke metode – broj napravljenih objekata je statički član
• U statičkim metodima ne mogu da se koriste rezervisane – u konstruktoru se dodeljuje redni broj novom objektu i
reči this i super i k
inkrementira
ti se ukupan
k broj
b j napravljenih
lj ih objekata
bj k t
class RedniBroj {
private static int broj_objekata
broj objekata = 0;
private int id;
public RedniBroj() { id = broj_objekata++; }
public int id() { return id; }
public static int brojObjekata() {
return broj_objekata;
}
269 270
}
Primer: korišćenje objekata koji imaju redni broj Inicijalizacija statičkih promenljivih
class PrimerZaObjekatSaRednimBrojem {
public static void main(String[] args) { • Statičko polje se može inicijalizovati prilikom deklaracije
RedniBroj objA = new RedniBroj(); • Ako se ne uradi inicijalizacija,
inicijalizacija statičko polje će imati
RedniBroj objB = new RedniBroj(); vrednost 0
RedniBroj objC = new RedniBroj();
• U klasi može postojati statički blok u kojem se mogu
S t
System.out.println("Ukupan
t i tl ("Uk b
broj
j objekata:
bj k t " +
inicijalizovati statičke promenljive
RedniBroj.brojObjekata());
• Statički blok se izvršava samo jednom, kad se klasa
System.out.println("objA, RB: " + objA.id());
učita prvi put
System.out.println("objB, RB: " + objB.id());
System.out.println("objC, RB: " + objC.id());
}
}
Ukupan broj objekata: 3
objA RB: 0
objA,
objB, RB: 1
271 272
objC, RB: 2
Primer za statičke promenljive, blokove i metode
class StatickiClanoviM { Rezultat izvršavanja klase StatickiClanoviM
static int a = 3;
static int b; Statički blok je izvršen.
static void statickiMetod(int x) { x = 10
System.out.println("x = " + x);
a=3
System.out.println("a = " + a);
System out println("b = " + b);
System.out.println("b b=6
}
static {
System.out.println("Statički blok je izvršen.");
b = a * 2;
}
Drugi primer za statičke članove Ilustracija rada drugog primera za statičke članove
public class StatickiClanovi { public class IlustracijaStatic {
StatickiClanovi() { public static void main(String[] args) {
System.out.println("Konstruktor izvršen."); StatickiClanovi sc1;
} System out println("Prvo
System.out.println( Prvo ispisivanje.
ispisivanje ");
);
sc1 = new StatickiClanovi(); //Ovde se prvo izvrši statički blok
int i;
System.out.println("sc1.i = " + sc1.i);
static int a = 3;
StatickiClanovi sc2 = new StatickiClanovi();
static int b;
sc2.i = 8;
static void statickiMetod(int x) { System.out.println("sc2.i = " + sc2.i);
System.out.println("x
System.out.println( x = " + x); }
System.out.println("a = " + a); }
System.out.println("b = " + b);
Prvo ispisivanje.
}
Statički blok izvršen.
static { Konstruktor izvršen.
System.out.println("Statički blok izvršen."); sc1.i = 0
} Konstruktor izvršen.
} 275 sc2.i = 8 276
Pristupanje statičkim članovima Pristupanje statičkom metodu preko imena klase
• Statičkim članovima se može pristupati pre nego što je public class PristupanjePrekoImenaKlase {
napravljen objekat klase public static void main(String[] args) {
StatickiClanovi.statickiMetod(5);
• Javnim statičkim članovima se pristupa preko imena
StatickiClanovi.statickiMetod(10);
klase i operatora tačka
<ime_klase>.<statički_član>
i ič i č }
}
• Statičkim članovima se može pristupati i preko reference
na objekat,
objekat ali to treba izbegavati
– kada se članu pristupa preko imena klase jasno je da se Statički blok izvršen.
pristupa statičkom članu x=5
a=3
– kada
k d se statičkom
ičk članu
čl pristupa
i preko k reference
f nije
ij
b=0
odmah uočljivo da li je član statički ili ne
x = 10
a=3
b=0
277 278
279 280
Ilustracija rada drugog primera za statičke članove
Popravljanje klase Stek
class DuzinaNiza {
public static void main(String args[]) { • Primer za klasu stek koja je ranije korišćena može da se
int
t a
a1[]
[] = new
e int[10];
t[ 0]; popravi tako što se omogući pravljenje steka zadate
int a2[] = {3, 5, 7, 1, 8, 99, 44, -10}; veličine
int a3[] = {4, 3, 2, 1};
• Veličina steka treba da bude parametar konstruktora
System.out.println("Dužina niza a1 je " + a1.length); • Koristi se polje length koje sadrži dužinu niza
System.out.println("Dužina niza a2 je " + a2.length);
System.out.println("Dužina
System.out.println( Dužina niza a3 je " + a3.length);
}
}
Dužina niza a1 je 10
Dužina niza a2 je 8
Dužina niza a3 je 4
281 282
Popravljena klasa za stek – stek različite dužine Popravljena klasa za stek – nastavak
class
l St k {
Stack // Uzimanje jedne vrednosti sa steka
private int stck[]; public int pop() {
private int vrh; if(vrh < 0) {
System.out.println("Stek je prazan.");
public Stack(int velicina) {
return 0;
stck = new int[velicina];
}
vrh
h = -1;
1
else
}
return stck[vrh--];
// Dodavanje jedne vrednosti na stek }
public void push(int broj) { }
if(vrh == stck.length-1)
System.out.println("Stek
i j popunjen.");
je j
• U odnosu na prethodu verziju, klasa je popravljena tako
else
da se može napraviti stek proizvoljnog kapaciteta
stck[++vrh] = broj; • Kapacitet je parametar konstruktora, a u prethodnoj
} verziji
iji kkapacitet
it t jje bi
bio 10)
283 284
Primer rada jednostavne klase za stek
class PrimerRadaSteka { Ugnježdene klase
public static void main(String args[]) {
Stack stack1 = new Stack(5); • Unutar jedne klase (klasa A) može da se definiše druga
Stack stack2 = new Stack(8); klasa (klasa B), i tada je klasa B ugnježdena u klasu A, a
// Stavljanje na stek klasa A je obuhvatajuća klasa
for(int i=0; i<5; i++) stack1.push(i); • Za ugnježdenu klasu zna samo obuhvatajuća klasa
f (i t i=0;
for(int i 0 ii<8;
8 i++)
i ) stack2.push(i);
k2 h(i) – ugnježdena klasa se ne može koristiti izvan obuhvatajuće
// Uzimanje sa steka klase
System.out.println("Stek stack1:");
• Ugnježdena klasa može da pristupa svim članovima
for(int i=0; i<5; i++)
obuhvatajuće klase, čak i privatnim članovima
System.out.println(stack1.pop());
System.out.println("Stek
System.out.println( Stek stack2:
stack2:");
);
• Obuhvatajuća klasa ne može da pristupa poljima
for(int i=0; i<8; i++)
(članovima podacima) unutrašnje klase, ali može da
System.out.println(stack2.pop());
pristupa metodima unutrašnje klase, bez obzira na
}
specifikatore
p p
pristupa
p
} 285 286
sp_x = 100
289 290
• Ugnježdene klase nisu postojale u verziji Java 1.0, • Klasa String je ugrađena u Javu
uvedene su u verziji 1.1 • Služi za rad sa znakovnim nizovima
• Ugnježdene klase se koriste u apletima • Svi znakovni nizovi su objekti klase String
j
• Objekti tipa
p String g su nepromenljivi
p j
– Postojećem objektu tipa String ne može da se promeni
znak na nekoj poziciji
– Pravi
P i se novii znakovni
k i niz
i sa potrebnim
t b i sadržajem
dž j
291 292
Znakovni niz i niz znakova Operator + za znakovne nizove
• Znakovni niz je objekat klase String • Služi za nadovezivanje (konkatenaciju) znakovnih
• Niz znakova je niz elemenata tipa char o a, tj.j obje
nizova, objekata
a a tipa
pa St
String
g
• Rezultat je novi objekat tipa String čiji je sadržaj
• Primer za niz znakova dobija spajanjem sadržaja dva objekta tipa String
char niz_znakova1[]
niz znakova1[] = new char[5];
• Primeri:
• Primer inicijalizacije niza znakova String str1 = "prvi " + "drugi";
char niz_znakova2[]
niz znakova2[] = { {'a',
a , 'b',
b , 'c',
c , '3'};
3 }; St i
String str2
t 2 = "
"prvii d
drugi";
i"
• Primer inicijalizacije znakovnog niza String str3 = "prvi ";
String znakovni
znakovni_niz1 niz1 = "abc3";
abc3 ; String str4 = "drugi";
drugi ;
String str5 = str3 + str4;
293 294
java K
j KomandnaLinija
d Li ij 5 proba
b kkomandne
d li
linije
ij -1
1 10
args[0]: 5
args[1]: proba
args[2]: komandne
args[3]: linije
args[4]: -11
args[5]: 10
301 302
303 304
Nasleđivanje
• Za grupu srodnih pojava može da se napravi klasa u
kojoj su sve zajedničke karakteristike srodnih pojava
• Specifičnije klase, za svaku od srodnih pojava, mogu da
se izvedu iz opštije kase i da naslede sve njene
Nasleđivanje k kt i tik
karakteristike
• Opštija klasa se naziva natklasa (superclass)
• Klasa koja se izvodi iz natklase naziva se potklasa
(subclass)
• Potklasa ima samo jednu natklasu
• Za izvođenje se koristi rezervisana reč extends
305 306
Primer
Kontrola pristupa i nasleđivanje class A {
int i;
• Potklasa ne može pristupati privatnim članovima private int j;
natklase void postaviIJ(int _i,
i int _j)
j) {
i = _i;
j = _j;
}
}
class
l B extends
t d A {
int zbir() {
return i + j; // Greška, ovo se ne prevodi
}
}
• Klasa B je nasledila polje j, ali se tom polju ne može pristupiti
direktno u klasi B, pošto je polje privatno u klasi A
311 312
Klasa Kutija
Primer nasleđivanja sa klasom Kutija class Kutija {
double sirina, visina, duzina;
• Klasa Kutija će biti osnovna klasa (natklasa)
// Konstruktor čiji je parametar objekat, ovde služi za kopiranje objekta
• Iz klase Kuija će biti izvedene dve klase
klase, Kutija(Kutija obj) {
KutijaSaTezinom i ObojenaKutija sirina = obj.sirina;
– Klasa KutijaSaTezinom će naslediti klasu Kutija, i visina = obj.visina;
imaće dodatno polje tezina duzina = obj.duzina;
– Klasa ObojenaKutija će naslediti klasu Kutija, i }
imaće dodatno p
polje
j boja
j // Konstruktor bez parametara
Kutija() {
}
// Konstruktor
K t kt sa parametrima ti za sve tri
t i dimenzije
di ij
Kutija(double s, double v, double d) {
sirina = s; visina = v; duzina = d;
}
313 314
319 320
Pozivanje konstruktora natklase Referenciranje objekta potklase
• Opšti oblik je • Promenljivoj natklase može se dodeliti referenca na
super(lista argumenata);
super(lista_argumenata); objekat bilo koje potklase izvedene iz te natklase
321 322
void prikazi() {
p
Zapremina kt4: 10.0
System out println("i iz natklase: " + super
System.out.println("i super.i);
i);
Težina kt4: 3.3
System.out.println("i iz potklase: " + i);
}
}
331 • Polje i u klasi B sakriva nasleđeno polje i iz klase A 332
Primer pristupanja članu natklase – nastavak Pristupanje članu natklase
class PrimerPristupanja {
public static void main(String args[]) { • Rezervisana reč super se koristiti za pristupanje
B obj = new B(1, 2); članu,
č a u, sslično
č o kao
ao i rezervisana
e e sa a reč
eč t s, ali
this, a je razlika
a au
obj.prikazi(); tome što rezervisana reč super ukazuje na natklasu
} • Primer:
} super.član;
č // član
čl jje polje
lj ili metod
t d natklase
tkl
• Članovima natklase se pristupa pomoću rezervisane reči
i iz natklase: 1
super kad su članovi natklase sakriveni članovima
i iz potklase: 2 potklase, tj. kad članovi natklase i potklase imaju ista
imena
333 334
void prikazi() {
System.out.println("k: " + k);
}
347 } 348
Primer redefinisanja metoda Pristupanje redefinisanom metodu natklase
class PrimerRedefinisanja {
public static void main(String args[]) {
• Redefinisani metod natklase je sakriven u potklasi, tj. ne
B obj = new B(1, 2, 3);
može mu se pristupiti direktno preko imena
obj.prikazi(); // poziva se metod prikazi iz klase B • Redefinisanom metodu natklase se može pristupiti
A objA = new A(5, 6); pomoću rezervisane reči super
objA.prikazi(); // poziva se metod prikazi iz klase A • Primer pozivanja redefinisanog metoda natklase:
} super.imeRedefinisanogMetoda(lista_argumenata)
}
k: 3
i,i j: 5 6
349 350
363 364
Apstraktne klase Popravljanje primera sa geometrijskim slikama
• Klasa koja ima bar jedan apstraktan metod je apstraktna • U prethodnom primeru nije dobro napisana klasa
klasa GeometrijskaSlika,
Geo et js aS a, jer:
je
• Deklaracija apstraktne klase mora imati modifikator – u njoj su definisani metodi za izračunavanje obima i
abstract površine iako ta klasa ne zna ništa o tome kako će se
izračunavati obim i površina u potklasama
• Apstraktna klasa može imati metode koji nisu apstraktni
– potklase ne moraju da redefinišu metode za izračunavanje
• Apstraktna klasa može imati članove podatke obima i površine, a greška je ako se to ne uradi
• N može
Ne ž se napravitiiti objekat
bj k t apstraktne
t kt kl klase – može se napraviti objekat tipa GeometrijskaSlika
• U potklasi apstraktne klase za koju treba instancirati iako nema smisla da postoji takav objekat
objekte moraju biti redefinisani svi apstraktni metodi • Rešenje je da se klasa GeometrijskaSlika bude
• Može se koristiti referenca apstraktne klase i ona može apstraktna, i da oba metoda (obim i povrsina) budu
referencirati objekte svih potklasa apstraktni
365 366
class B extends A {
void ik i() { // Greška,
id prikazi() G šk metod
t d se ne može
ž redefinisati
d fi i ti
System.out.println("Pogrešno!");
}
}
369 370
• Pošto se metodi označeni modifikatorom final ne final class A { // Klasa A ne može imati podklase
mogu redefinisati prevodilac može umesto poziva // ...
metoda da doda ceo bajt kod metoda }
371 372
Klasa Object Metodi klase Object
protected native Object clone()
• Klasa Object je natklasa svih klasa u Javi public boolean equals(Object obj)
• Referenca tipa Object može da referencira objekte protected void finalize()
svih ostalih klasa public final native Class getClass()
protected native int hashCode()
public
bli final
fi l native
ti void
id notify()
tif ()
public final native void notifyAll()
public String toString()
public final void wait()
public final native void wait(long timeout)
public final void wait(long timeout, int nanos)
377 378
379 380
Izuzetak
• Izuzetak je greška (vanredno stanje) pri izvršavanju
programa
• Java ima mehanizam za obradu izuzetaka
Izuzeci • Izuzetak može da se:
– izazove (baci) - rezervisana reč throw
– uhvati radi obrade - rezervisana reč catch
• IIzuzetak
t k je
j objekat
bj k t koji
k ji se pravii kkad
d nastane
t vanredno
d
stanje u nekom metodu
• Izuzetak može da napravi Javin izvršni sistem ili može
da se napravi u kodu kad se otkrije greška
• Metod može da obradi izuzetak ili da ga prosledi dalje
pozivajućem
i j ć metodu
t d
381 382
383 384
Primer za izuzetak koji se ne obrađuje u kodu
Neuhvaćeni izuzeci
class Izuzetak0 {
public static void main (String args[]) {
• Ako se u kodu ne obradi izuzetak, obrađuje ga Javin int d = 0;
izvršni sistem koji ispisuje tekst sa opisom izuzetka, int a = 7 / d;
stanje steka za metode od trenutka nastanka izuzetka i System.out.println(a);
završava program
p g }
• Primer: }
– Pri deljenju nulom Javin izvršni sistem pravi izuzetak tipa java.lang.ArithmeticException: / by zero
ArithmeticException
i h i i ib
baca ga at Izuzetak0.main(Izuzetak0.java:4)
Exception in thread "main"
java.lang.ArithmeticException: / by zero
393 394
• Prvo izvršavanje programa, ne zadaju se argumenti • try naredbe su ugnježdene i u sledećem slučaju:
C:\java
j UgnjezdeniTry
g j y – metod A ima try blok
Broj argumenata = 0
– metod B ima try blok
Spoljašnji try: java.lang.ArithmeticException: / by zero
– metod A se poziva unutar try bloka metoda B
• Drugo izvršavanje programa, zadaje se jedan argument • U ovom primeru try blok metoda A je ugnježden
C:\java UgnjezdeniTry x unutar try bloka metoda B
B j argumenata
Broj t = 1
Spoljašnji try: java.lang.ArithmeticException: / by zero
407 408
Rezervisana reč throws Primer za throws sa greškom
409 410
Unutar metoda.
Uhvaćen: java.lang.IllegalAccessException: proba 411 412
Primer za finally
Rezervisana reč finally class PrimerZaFinally {
static void metodA() {
• Prilikom pojavljivanja i obrade izuzetka dolazi do try { // Izuzetak unutar try bloka
preskakanja pojedinih naredbi System.out.println("Unutar metoda A");
throw new RuntimeException("proba");
• Naredbe koje se ne smeju peskočiti, npr. zatvaranje }
fajla, stavljaju se u blok finally finally {
• Blok finally se izvršava uvek bez obzira da li se System.out.println("Metod A: finally blok");
}
pojavljuje izuzetak ili ne }
• Ako se metod prekida iz bloka try/catch zbog static
t ti voidid metodB()
t dB() {
pojave izuzetka ili zbog naredbe return, blok try {
finally se izvršava neposredno pre izlaska iz metoda System.out.println("Unutar metoda B");
return;
t // return
t unutar
t try
t bloka
bl k
• Blok finally nije obavezan }
• Naredba try mora imati bar jednu od naredbi catch finally {
ili finally System out println("Metod
System.out.println( Metod B: finally blok
blok");
);
}
413 } 414
Primer za finally
static void metodC() { Rezultat izvršavanja programa
try { // try bloka koji se ne prekida
System.out.println("Unutar metoda C"); C:\java PrimerZaFinally
} Unutar metoda A
finally { Metod A: finally blok
System.out.println("Metod C: finally blok"); Uhvaćen izuzetak
} Unutar metoda B
}
Metod B: finally blok
public static void main(String args[]) {
Unutar metoda C
try {
Metod C: finally blok
metodA();
t dA()
}
catch (Exception e) {
System out println("Uhvaćen
System.out.println( Uhvaćen izuzetak
izuzetak");
);
}
metodB();
metodC();
}
} 415 416
Ugrađeni izuzeci Pravljenje novih klasa za izuzetke
• Klase za nove izuzetke se prave da bi se obrađivale
specifične greške programa koji se piše
• Klase za nove izuzetke treba izvoditi iz klase Exception
• Klasa Exception ne definiše nijedan metod već sve
nasleđuje od klase Throwable
• U novim klasama za izuzetke ne mora se redefinisati
nijedan metod
metod, ali se to može uraditi
417 418
421 422
423 424
Funkcije paketa
• Paket deli imenski prostor (u dva paketa mogu postojati
klase sa istim imenom)
• Paket služi za upravljanje vidljivošću
– može postojati klasa koja se može koristiti samo unutar
Paketi paketa, izvan je nevidljiva
– u klasi mogu postojati članovi koji se vide samo unutar
p
paketa
425 426
429 430
431 432
Specifikatori pristupa za klase Pristupanje klasi iz drugog paketa
• public za javni način pristupanja • Klasi koja se nalazi u nekom drugom paketu može se
– javnim klasama mogu da pristupaju sve klase pristupiti navođenjem hijerarhije paketa razdvojenih
• bez specifikatora za podrazumevani način pristupanja tačkom i klase
– klasama bez specifikatora pristupa mogu da pristupaju sve • Lakši način je da se klasa iz drugog paketa, ili ceo paket,
klase iz istog paketa i
importuje
t j i ttada
d se kl
klasii pristupa
i t preko
k iimena
• Za importovanje paketa služi naredba import
433 434
435 436
Klasa sa istim imenom postoji u dva paketa
• Da bi se koristila jedna od dve klase treba importovati
paket u kojem se nalazi
• Ako se importuju oba paketa i upotrebi se ime klase koje
se nalazi u oba paketa javlja se greška
Interfejsi
437 438
441 442
451 452
Delimična realizacija interfejsa Promenljive u interfejsu
• Klasa koja implementira interfejs, a ne definiše tela za • Interfejs ne može imati promenljivem, može imati samo
sve metode iz interfejsa je apstraktna konstante
• Primer:
interface ZajednickeKonstante {
int NE = 0;
int DA = 1;
int MOZDA = 2;
}
• Ovaj interfejs sadrži samo konstante (nema metode)
• Sve klase koje implementiraju ovaj interfejs imaju
konstante definisane u njemu
j
453 454
Nasleđivanje interfejsa
Izvođenje interfejsa
interface A {
void metod_A();
• Jedan interfejs može da se izvede iz drugog i tada }
nasleđuje sve njegove metode i
interface
f B extends
d A {
void metod_B();
}
class
l Test implements
i l B {
public void metod_A() {
// telo metoda iz interfejsa A
}
public void metod_B() {
// telo metoda iz interfejsa B
}
public void metod_T() {
// telo metoda koji ne postoji u interfejsu
}
}
455 456
Nasleđivanje 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(); // greška, nije iz interfejsa B
A ria = test;
rib.metod_A();
rib.metod_B(); // greška, nije iz interfejsa A
}
}
457