Professional Documents
Culture Documents
OBJEKTNO ORIJENTISANO
PROGRAMIRANJE
sa praktikumom
Recenzent:
Prof. dr Ranko Popović
Izdavač:
Visoka poslovna škola - Blace
Za izdavača:
dr Ružica Stanković, direktor
Sva prava zadržana. Ni jedan deo ove knjige ne može biti reprodukovan,
presnimavan ili prenošen bilo kojim sredstvom, elektronskim,
mehaničkim, za kopiranje, za snimanje, ili na bilo koji drugi način bez
prethodne saglasnosti Izdavača.
ISBN 978-86-7544-089-5
ii
Sadržaj
1. UVOD .................................................................................. 1
1.1. Programske paradigme............................................................................. 2
iii
4.6. Objekat String .......................................................................................... 73
5. ENKAPSULACIJA ............................................................ 87
5.1. Paketi ........................................................................................................ 87
iv
VEŽBA 1. - JAVA RAZVOJNO OKRUŽENJE ......................... 163
VEŽBA 2. - INTEGRISANO RAZVOJNO OKRUŽENJE –
NETBEANS .............................................................................. 173
VEŽBA 3. - ELEMENTI JAVE .................................................. 181
VEŽBA 4. - PROJEKTOVANJE KLASE KOCKA.................... 187
VEŽBA 5. - OBJEKAT NIZ I STRING ...................................... 193
VEŽBA 6. - PROJEKTOVANJE KLASE STUDENT ................ 205
VEŽBA 7. – KLASA BANKA ................................................... 211
LAB. VEŽBA 8. - NASLEĐIVANJE I POLIMORFIZAM ........... 217
LAB. VEŽBA 9. - PRAVLJENJE GRAFIČKOG KORISNIČKOG
INTERFEJSA U NETBEANS-U ............................................... 221
LITERATURA........................................................................... 227
v
vi
Lista programskih primera
vii
Primer 4.11. PretrazivanjeZnakovnogNiza.java ...................... 80
Primer 4.12. SortiranjeStringova.java ..................................... 81
Primer 4.13. IzdvajanjePodniza.java........................................ 82
Primer 4.14. IzdvajanjePodniza1.............................................. 83
Primer 5.1. Zaposleni.java........................................................ 89
Primer 5.2. ZaposleniPrimer.java ............................................ 90
Primer 5.3. Casovnik.java......................................................... 95
Primer 5.4. Kafa.java................................................................. 96
Primer 5.5. SkuvajKafu.java ..................................................... 97
Primer 5.6. Zaposleni.java........................................................ 97
Primer 6.1. PC.java ................................................................. 100
Primer 6.2. RacunarskaMreza.java ........................................ 101
Primer 6.3. RacunarskaMreza1.java ...................................... 102
Primer 6.4. Zaposleni.java...................................................... 107
Primer 6.5. Direktor.java......................................................... 108
Primer 6.6. ProizvodniRadnik.java ........................................ 109
Primer 6.7. ZaposleniPrimer.java .......................................... 110
Primer 6.8. Dva.java ................................................................ 112
Primer 6.9. RedosledZavisnostiKonstruktora.java .............. 113
Primer 6.10. Zivotinja.java...................................................... 117
Primer 6.11. Lav.java .............................................................. 117
Primer 6.12. Krava .................................................................. 118
Primer 6.13. ZivotinjaPrimer.java .......................................... 118
Primer 7.1. GeomObjekat.java ............................................... 122
Primer 7.2. Krug.java .............................................................. 122
Primer 7.3. Pravougaonik.java ............................................... 122
Primer 7.4. Povrsina.java ....................................................... 123
Primer 7.5. Povrsina1.java ..................................................... 124
viii
Primer 7.6. Povrsina2.java ..................................................... 125
Primer 7.7. X.java .................................................................... 127
Primer 7.8. Y.java .................................................................... 127
Primer 7.9. Z.java .................................................................... 127
Primer 7.10. RazresavanjePoziva.java .................................. 128
Primer 7.11. ProsirivanjePrograma.java ............................... 129
Primer 7.12. KafaZaPoneti.java.............................................. 132
Primer 7.13. CrtajKrug.java .................................................... 134
Primer 8.1. FaktorKonverzije.java ......................................... 139
Primer 8.2. PrimerKonvertor.java .......................................... 139
Primer 8.3. PrimerKonvertor.java .......................................... 140
Primer 8.4. Konvertor.java ..................................................... 140
Primer 8.5. KonvertorValuta.java........................................... 141
Primer 8.6. KonvertorValutaPrimer.java ............................... 141
Primer 8.7. Konvertor.java ..................................................... 142
Primer 8.8. Zivotinja.java........................................................ 143
Primer 8.9. DomacaZivotinja.java .......................................... 144
Primer 8.10. DivljaZivotinja.java ............................................ 144
Primer 8.11. MozeDaCuva.java .............................................. 144
Primer 8.12. MozeDaLovi.java................................................ 144
Primer 8.13. MozeDaTrci.java ................................................ 144
Primer 8.14. Pas.java .............................................................. 144
Primer 8.15. Vuk.java .............................................................. 145
Primer 8.16. Primer.Zivotinje.java ......................................... 145
Primer 9.1. PrimerFinally.java ................................................ 154
Primer 9.2. MojIzuzetak.java .................................................. 157
Primer 9.3. PrimerMojIzuzetak.java ....................................... 157
Primer 9.4. PrimerMojIzuzetak1.java ..................................... 158
ix
x
Uvod
POGLAVLJE 1
1. UVOD
1
Uvod
2
Uvod
3
Uvod
4
Uvod
Enkapsulacija
Nasleđivanje
Polimorfizam
Procesor
Disk
5
Uvod
Memorija...
Korisnik ovih novih tipova ne mora biti i njihov autor, dovoljno je da zna da ih
upotrebi na propisani način.
Enkapsulacija predstavlja skrivanje detalja implementacije objekta od
korisnika objekta. Korisniku se dozvoljava pristup objektu samo kroz jasno
definisan interfejs objekta. Enkapsulacijom se smanjuje međuzavisnost
komponenata, tako što se ne dozvoljava da od internih osobina nekog objekta
zavisi ostatak sistema.
Enkapsulacija se ostvaruje u objektno orijentisanom programskom jeziku
pomoću klase. Klasa definiše strukturu i ponašanja koja su zajednička za skup
objekata. Objekti predstavljaju primerak (instancu) klase, a svaki objekat ima
osobine i ponašanja koja su definisana klasom.
Klasa se sastoji od promenljivih i od metoda. Promenljive definišu stanje
objekata a metode njihova ponašanja. Klase omogućavaju enkapsulaciju tako
što dozvoljavaju da članovi klase (promenljive i metode) mogu biti javni i
privatni.
Javne metode i promenljive su dostupne i van same klase. Privatne metode i
promenljive su dostupne samo iz same klase. Privatne promenljive i privatne
metode su zaštićene i moguće im je pristupiti iz koda van date klase samo
pomoću javnih metoda. To omogućava da se privatni članovi klase menjaju na
kontrolisan i strogo definisan način pomoću unapred definisanog interfejsa. Taj
interfejs je određen javnim metodama. Javne metode grade jedan zaštitni
omotač koji štiti privatne članove klase od spoljnog uticaja, i koji definiše tačno
određen način na koji mogu da se menjaju privatni članovi.
Nasleđivanje se definiše kao redosled apstrakcija.
Nasleđivanje je mehanizam koji omogućava jednoj klasi objekata da nasledi
karakteristike druge klase objekata.
Nasleđivanje objekata predstavlja primer hijerarhije. Nasleđivanje podržava
koncept hijerarhijske klasifikacije, tako da za objekte treba definisati samo one
karakteristike koje ih čine jedinstvenim u klasi.
Tako, na primer, sve geometrijske objekte možemo svrstati u
dvodimenzionalne i trodimenzionalne.
Svi geometrijski objekti imaju osobine kao što su: dimenzije, boja, površina...
Dvodimenzionalni objekti imaju dve dimenzije, oni nasleđuju sve osobine klase
GeometrijskiObjekti i oni su podklasa klase GeometrijskiObjekti a klasa
GeometrijskiObjekti su nadklasa klase DvodimenzionalniObjekti.
Trodimenzionalni objekti imaju tri dimenzije. Oni nasleđuju osobine klase
GeometrijskiObjekti ali se zato razlikuju od objekata klase
DvodimenzionalniObjekti.
6
Uvod
Objekat može biti upotrebljen kao objekat sopstvene klase ili kao objekat
nadklase. Na primer, trougao se može posmatrati kao objekat klase Trougao
ili kao objekat klase Geometrijski objekti. Svi geometrijski objekti imaju
metodu izracunajPovrsinu(). Pozivanje metode izracunajPovrsinu() za neki
objekat, izvršava operaciju izračunavanja površine za specifičan tip, a ne za
osnovni tip bez obzira ako se dati objekat tretira kao osnovni tip. Ova osobina
se naziva Polimorfizam, i ona omogućava da se prilikom programiranja piše
kod koji ne zavisi od specifičnog tipa.
Znači, neki objekat možemo tretirati kao osnovni tip (na primer Trougao
možemo tretirati kao Geometrijsku Figuru) ali se prilikom pozivanje nekog
ponašanja (izracunajPovrsinu()) za taj objekat izvršava ponašanje specifičnog
tipa a ne osnovnog (izračunaće se površina trougla).
Polimorfizam omogućava bolju organizaciju koda i znatno poboljšava čitljivost
koda. Polimorfizam omogućava i pisanje proširivih programa. Programu se lako
mogu dodavati nove mogućnosti, u početnoj fazi izrade programa i kasnije.
7
Uvod
Slika 1.1.
8
Uvod
9
Uvod
Slika 1.2.
Java virtuelna mašina učitava Java class datoteke iz programa koje piše
programer i iz Java API-ja pomoću Java loader-a. Tako učitan Java bajtkod
se izvršava pomoću izvršne mašine (slika 1.3.).
10
Uvod
Slika 1.3
11
Uvod
1
Slika 1.4.
1
izvor: http://docs.oracle.com/javase/7/docs/
12
Uvod
Tabela 1.1.
Reči kao const i goto su rezervisane, ali se više ne upotrebljavaju. Reči true i
false mogu da se smatraju rezervisanim rečima, mada su one tehnički
boolean literali. Takođe i reč null se može smatrati rezervisanom rečju, ali
tehnički to je null literal.
13
Uvod
14
Klase i objekti
POGLAVLJE 2
2. KLASE I OBJEKTI
Slika 2.1.
15
Klase i objekti
Slika 2.2.
Forma i ponašanje objekata definisani su logičkom konstrukcijom koja se
naziva klasa (class).
Objekti su primerci klasa koje predstavljaju osnovne projektne elemente
programa. Pomoću definisane klase može se napraviti proizvoljan broj
objekata. Klase je moguće zamisliti kao šablone ili kalupe, a objekte kao
predmete koje oblikujemo kalupom. Klase su logička apstrakcija, a objekti su
fizička realnost.
Neke od definicija klase su:
Klasa predstavlja osnovnu organizacionu jedinicu koja omugućava
implementaciju koncepata OOP.
Klasa predstavlja šablon koji omogućava kreiranje višestrukih
objekata sa sličnim karakteristikama.
Klase predstavljaju sve karakteristike jednog posebnog niza
objekata odnosno, skup objekata sa istim svojstvima.
Klasa objekata predstavlja model klase entiteta koji obuhvata
objekte sa istom strukturom i ponašanjem.
Kada se projektuje objektno orijentisani model nekog realnog sistema, ne
definišu se individualni objekti, već klase objekata.
U proceduralnim programskim jezicima postoje ugrađeni tipovi podataka kao
što su int, float, string... Klasa omogućava da se definiše neki novi apstraktni
tip. Kada se definiše ovaj novi tip podataka on može da se koristi za pravljenje
objekata tog tipa. Objekti predstavljaju primerke (instance) klase.
Tako, na primer, ako projektujemo softverski sistem koji treba da predstavi
poslovanje neke firme, onda klasa Zaposleni predstavlja sve zaposlene
radnike te firme, klasa Masine predstavlja sve mašine koje se koriste u
procesu proizvodnje te firme itd.
Skup svih radnika (objekata) sa sličnim osobinama (ime, prezime, datum
rođenja, stručna sprema, stručna usavršavanja, radno mesto...) predstavlja
klasu Zaposleni.
Klase se sastoje od polja, koja definišu svojstva objekata i koja su promenljivi
podaci i metoda koje su skupovi naredbi koje manipulišu poljima i na taj način
menjaju unutrašnje stanje objekata.
16
Klase i objekti
Atributi ili svojstva razlikuju jednu klasu objekata od druge i oni sadrže
informacije o stanju objekata. Svojstva klase Zaposleni predstavljaju na
primer: ime, prezime, radno mesto, plata, norma itd. Atributi definisani unutar
klase nazivaju se promenljive instance, jer svaki objekat klase sadrži svoju
kopiju ovih promenljivih, koje su nezavisne od promenljivih koje sadrže drugi
objekti klase.
Ponašanje ili metode definišu šta i na koji način klasa objekata može da uradi
sebi ili drugim objektima. Ponašanje klase Zaposleni mogu biti na primer:
dođiNaPosao(), opslužiMašinu(), isplatiPlatu(), idiNaPauzu(), ...
Objekti međusobno komuniciraju pomoću metoda, i to tako što jedna klasa
objekata može da pozove metode druge klase objekata da bi promenili neko
svojstvo drugog objekta ili da bi prijavili neku svoju promenu ili da bi zatražili da
drugi objekat uradi nešto.
Na primer, objekat vozačBagera, klase Zaposleni, može da zatraži od objekta
bager, klase Mašine, da pokrene kašiku, ili objekat vozačBagera, klase
Zaposleni, može da obavesti objekat šef, klase Zaposleni, da je posao
završen.
class Casovnik {
Deklaraciji klase mogu prethoditi modifikatori klasa koji daju određena svojstva
nekoj klasi. Modifikatori mogu biti:
public, njoj može pristupiti bilo koji Java kod koji može da pristupi
njenom paketu.
abstarct, klasa se smatra apstraktnom ukoliko je barem jedna metoda
deklarisana kao apstraktna.
final, ne dozvoljava nasleđivanje, tj. podklase.
Klasa može da sadrži tri vrste članova:
Polja
• čine strukturu podataka objekta
17
Klase i objekti
Komentar Opis
// Zanemaruju se znakovi do kraja reda.
/* … */ Zanemaruju se svi znakovi između oznaka /* i */.
/** … */ Dokumentacioni komentari.
Tabela 2.1.
class Casovnik{
// Ovde treba definisati clanove klase
/*
Clanovi klase mogu biti
polja i
metode
*/
}
18
Klase i objekti
Deklaracija klase stvara ime tipa. Referenca na objekat datog tipa deklariše se
na sledeći način:
Casovnik mojSat;
Casovnik mojSat;
mojSat = new Casovnik ();
Date danasnjiDatum;
danasnjiDatum = new Date();
Kada se objekat pravi naredbom new navode se tip objekata i svi njegovi
konstrukcioni elementi. Izvršni sistem alocira dovoljno memorije za smeštanje
tog objekata i vraća referencu na dati objekat. Kada objekat prestane da se
koristi izvršni sistem sam uklanja objekat i oslobađa prostor u memoriji koji je
objekat zauzimao.
2.3. Polja
19
Klase i objekti
U Java programskom jeziku svaka promenljiva mora da ima svoj tip, svaki
izraz mora da ima svoj tip i svaki tip je strogo definisan. Kod svih dodeljivanja
vrednosti strogo se proverava saglasnost tipova.
Java operiše sa primitivnim tipovima i objektima. Definisano je osam
primitivnih tipova podataka, koji se mogu svrstati u četiri grupe:
Celi brojevi (integer) – byte, short, int i long;
Brojevi u pokretnom zarezu (floating point) – float i double;
Znakovi (character) – char - namenjen simbolima u skupu znakova, na
primer slovima i ciframa;
Logičke vrednosti – boolean - specijalni tip za predstavljanje vrednosti
tačno/netačno (true/false).
Njihove karakteristike su prikazane u tabeli 2.2.
20
Klase i objekti
Tabela 2.2.
Za podatke koji uzimaju logičke vrednosti Java ima boolean tip podataka koji
može da da ima jednu od dve moguće vrednosti: tačno (true) i netačno (false).
Za čuvanje znakovnih vrednosti koristi se podatak tipa char. U Javi se koristi
16-o bitni Unicode standard za prikazivanje znakova.
U Javi je moguće prikazati četiri tipa celobrojnih vrednosti: byte, short, int i
long. Opsezi ovih tipova su prikazani u prethodnoj tabeli.
Brojevi u pokretnom zarezu se koriste za izračunavanje izraza koji daju
vrednosti decimalne tačnosti. Postoje dva tipa brojeva u pokretnom zarezu:
float i double. Float je tip realnog broja sa jednostrukom tačnošću i on se
prikazuje pomoću 32-bitnog broja, a double je realan broj dvostruke tačnosti
koji se predstavlja 64-bitnim brojem.
Konverzija tipova (casting) podrazumeva dodeljivanje vrednosti jednog tipa,
promenljivoj drugog tipa. Na primer, vrednost tipa int može se dodeliti
promenljivoj tipa long.
Konverzija može biti automatska ili izričita (eksplicitna).
Do automatske konverzije tipova će doći samo ukoliko su ispunjena sledeća
dva uslova:
tipovi su međusobno kompatibilni;
odredišni tip je veći od polaznog.
21
Klase i objekti
Ukoliko treba vrednosti tipa int dodeliti promenljivoj tipa byte, onda se ova
konverzija neće obaviti automatski, jer je tip byte manji od tipa int. Ova vrsta
konverzije se naziva konverzija skraćivanjem, pošto forsira skraćivanje
promenljive da bi stala u odredišni tip.
Slika 2.3.
2.3.2. Promenljive
int x, y;
Promenljive mogu da imaju i početnu vrednost koja im se dodeljuje prilikom
deklaracije:
22
Klase i objekti
int x, y;
isto što i:
int x;
int y;
int brojPristupa;
String korisničkoIme;
boolean studentJeDiplomirao;
23
Klase i objekti
int x = 5;
int y = 3;
int z = x*y; // Ovo je izraz
Izrazi se grade korišćenjem operatora. Postoje sledeći operatori:
int x, y;
x = 5;
y = x++; // y ima vrednost 5 a x ima vrednost 6
x = --y; // x ima vrednost 4
24
Klase i objekti
x=x-y x -= y
x=x*y x *= y
x=x/y x /= y
Tabela 2.4.
Oparatori poređenja su:
Operator Opis
== Jednako
!= Nije jednako
> Veće
< Manje
>= Veće ili jednako
<= Manje ili jednako
Tabela 2.5.
Operator Operacija
! Negacija
& Konjukcija (AND)
| Disjunkcija (OR)
&& Uslovna konjukcija
|| Uslovna disjunkcija
Tabela 2.6.
25
Klase i objekti
class Casovnik {
int sat;
int minut;
int sekunda;
String tip;
}
Casovnik mojSat ;
mojSat = new Casovnik ();
mojSat.sat= 12;
mojSat.minut= 0;
mojSat.sekunda= 0;
mojSat.tip= “Rolex”;
Ako je potrebno da svi objekti neke klase dele samo jedan primarak polja, ova
polja se deklarišu modifikatorom static. Kada u klasi postoji polje deklarisano
kao static onda postoji samo jedno polje bez obzira koliko je primeraka te
klase napravljeno.
Na primer, klasi Casovnik moguće je dodati još jedno polje serijskiBroj i
definisati statičko polje redniBroj na sledeći naćin:
class Casovnik {
int sat;
int minut;
int sekunda;
String tip;
int serijskiBroj;
static int redniBroj = 0;
}
26
Klase i objekti
Casovnik a, b,c;
a = new Casovnik ();
b = new Casovnik ();
c = new Casovnik ();
Sve tri instance klase Casovnik raspolagaće samo sa jednim primerkom polja
redniBroj.
Statičkom polju pristupa se preko imena klase:
class Krug {
public int x1,y1, r;
public final float pi = 3.141592653;
}
27
Klase i objekti
2.4. Metode
28
Klase i objekti
Sada je moguće definisati još jednu metodu klase Casovnik, koja će izračunati
tačno vreme i prikazati ga korisniku.
void tacnoVreme(){
Date datum = new Date();
sati= datum.getHours();
minuti= datum.getMinutes();
sekunde= datum.getSeconds();
System.out.println("Sada je: " + sati+
":" + minuti + ":" + sekunde);
}
Klasa Date je deo biblioteke java.util, pa je neophodno pre upotrebe ove klase
eksplicitno izvršiti njen uvoz pomoću naredbe import:
import java.util;
import java.util.*;
public class Casovnik {
int sati;
int minuti;
int sekunde;
String tip;
int serijskiBroj;
static int redniBroj = 0;
29
Klase i objekti
void postaviSerijskiBroj(){
redniBroj++;
serijskiBroj = redniBroj;
}
void tacnoVreme(){
Date datum = new Date();
sati= datum.getHours();
minuti= datum.getMinutes();
sekunde= datum.getSeconds();
System.out.println("Tacno vreme: " + sati+":" +
minuti+":" + sekunde);
}
}
30
Klase i objekti
Primer
Slika 2.4.
31
Klase i objekti
class KolikoJeSati {
public static void main(String[] arg){
Casovnik s = new Casovnik();
s.tacnoVreme();
}
}
Metoda main mora da bude javna (public) i statička (static) a povratni rezultat
je void (ne vraća ništa).
Argumenti (arg) u nizu tipa String su programski argumenti i njih, opciono,
upisuje korisnik prilikom pozivanja programa.
Statička metoda može obavljati opšti zadatak za sve objekte klase i ona može
da pristupi samo statičkim poljima i statičkim metodima klase.
Svaka metoda nekog objekta ima specijalnu referencu this na aktuelni objekat
za koji je data metoda pozvana. Ona definiše način da se prosledi referenca na
tekući objekat kao parametar drugim metodima. Referenca this omogućava
upotrebu imena polja klase u metodi u kojoj je definisana lokalna promenljiva
32
Klase i objekti
Kako kod statičke metode nema specifičnog objekta nad kojim se radi, to ne
postoji this referenca. Referenca this se može koristiti samo unutar ne-
statičkih metoda.
void testBlokIskaza() {
int x = 10;
{ // Pocetak bloka
int y = x + 10;
...
} // Kraj bloka
// y ovde ne postoji
}
Promenljive definisane unutar bloka su lokalne i one imaju oblast važenja samo
u tom bloku.
U prethodnom primeru promenljiva y je vidljiva samo u bloku u kom je
definisana, dok je promenljiva x globalna i ona je vidljiva u svim blokovima
metode testBlokIskaza().
33
Klase i objekti
2.5.2. Selekcije
Slika 2.5.
if (uslov) {
// blok A
} else {
// blok B
}
Na primer:
if (studentJeDiplomirao == true)
System.out.println (“Student je diplomirao ”);
else
System.out.println (“Student nije diplomirao”);
34
Klase i objekti
if (studentJeDiplomirao == true) {
System.out.println (“Student je diplomirao ”);
}
Objekti klase Date raspolažu metodom getDay(), koja za dati datum vraća
redni broj dana.
Klasi Casovnik moguće je dodati i promenljivu dan, koja će služiti kao indikator
koji će korisnika obaveštavati koji je dan. Da bi se redni broj dana u nedelji
preslikao u naziv dana koristi se metoda odrediDan(), kojoj se kao argument
prosleđuje redni broj dana, a metoda vraća naziv dana u nedelji.
Preuređena klasa Casovnik sa metodom odrediDan() data je u primeru 2.9.
import java.util.*;
public class Casovnik {
int sati;
int minuti;
int sekunde;
String tip;
String dan;
int serijskiBroj;
static int redniBroj = 0;
void postaviSerijskiBroj(){
redniBroj++;
serijskiBroj = redniBroj;
}
void tacnoVreme(){
Date datum = new Date();
sati= datum.getHours();
minuti= datum.getMinutes();
sekunde= datum.getSeconds();
dan = odrediDan(datum.getDay());
System.out.println("Tacno vreme: " +
dan + ", " + sati+":"+minuti+":"+sekunde);
}
String odrediDan(int d){
String dan = "Pogresan unos";
if (d == 1){
dan = "pon";
}else if (d == 2){
dan = "uto";
}else if (d == 3){
dan = "sre";
}else if (d == 4){
dan = "cet";
}else if (d == 5){
35
Klase i objekti
dan = "pet";
}else if (d == 6){
dan = "sub";
}else if (d == 7){
dan = "ned";
}
return dan;
}
}
switch (selektorskaPromenljiva) {
case vrednost1:
// niz naredbi
break;
case vrednost2:
// niz naredbi
break;
.
.
.
case vrednostn:
// niz naredbi
break;
default:
// niz naredbi
}
Selektorska promenljiva može biti bilo kog tipa od osnovnih tipova byte, char,
short, int. Ona se poredi sa svakom od vrednosti i ukoliko je uslov ispunjen
izvršava se iskaz, a ukoliko se odgovarajuća vrednost ne pronađe izvršava se
default iskaz.
Break prekida izvršenje case selekcije i izvršavanje se nastavlja na prvoj
sledećoj naredbi iza case selekcije.
Metoda odrediDan(), uz upotrebu switch selekcije je prikazana u primeru 2.10.
36
Klase i objekti
2.5.3. Iteracije
Iteracije su strukture koje imaju za cilj ponavljanje grupe naredbi određen broj
puta.
Iteracije mogu biti:
Iteracija sa eksplicitnim brojačem (for petlja),
Iteracija sa izlazom na vrhu (while petlja) i
Iteracija sa izlazom na dnu (do petlja).
37
Klase i objekti
class KolikoJeSati {
public static void main(String[] arg){
for (int i = 0; i < 10; i++){
Casovnik s = new Casovnik();
if (i%2 == 0){
s.tip = "Rolex";
} else{
s.tip = "Omega";
}
s.postaviSerijskiBroj();
System.out.println(s.tip);
s.tacnoVreme();
}
}
}
While petlja se koristi za ponavljanje nekog bloka naredbi sve dok je određen
uslov tačan.
Grafički prikaz ove petlje je:
38
Klase i objekti
blok A uslov
Slika 2.6.
Opšti oblik naredbe je:
while (uslov) {
// blok A
}
Do petlja je slična while petlji samo što se uslov petlje ispituje na kraju petlje.
Grafički prikaz do petlje je prikazan na slici 2.7.
Slika 2.7.
Opšti oblik petlje je:
do {
// blok A
} (uslov)
Kod while petlje moguće je da se telo petlje ne izvrši ni jedanput dok se kod do
petlje telo petlje mora izvršiti barem jedanput.
39
Klase i objekti
Naredbom break može se izazvati trenutan prekid rada petlje i izlazak iz petlje
uz preskakanje provere uslova i preostalih naredbi u petlji.
Nakon break naredbe izvršavanje programa se nastavlja na naredbi koja
neposredno sledi iza date petlje.
Na primer:
int i = 0;
while (i < 100) {
i++;
System.out.println (" i = " + i);
if (i == 10)
break;
}
int i = 0;
while (i < 10) {
System.out.print (i);
if (i++ % 2 == 0)
continue;
System.out.println("");
Ova petlja ispisuje u svakom redu po dva broja dok je promenljiva i manja od
10.
40
Klase i objekti
2.6. Konstruktori
Casovnik(){
redniBroj++;
serijskiBroj = redniBroj;
}
41
Klase i objekti
Casovnik(String tip){
this.tip = tip;
redniBroj++;
serijskiBroj = redniBroj;
}
Tako da naredbe:
kreiraju dva objekta klase Casovnik, na koje ukuzuju refrence sat1 i sat2, pri
čemu se polje tip ovih objekata inicijalizuju na “ROLEX“, i “OMEGA“, a
redniiBroj se uvećava za jedan i dodeljuje tu vrednost polju serijskiBroj
objektima na koje ukazuju reference sat1 i sat2.
Ako se u Java programu definiše konstruktor koji ima jedan ili više argumenta
onda se mora eksplicitno definisati konstruktor bez argumenata. U tom slučaju
Java ne pravi podrazumevani konstruktor.
U okviru jedne klase više metoda mogu da imaju isto ime ako imaju različit broj
ili tipove argumenata. Ova pojava se naziva preklapanje metoda
(overloaded) jer ime metode ima više od jednog značenja.
Pri pozivu metode, kompajler upoređuje broj i tip argumenata da bi pronašao
odgovarajuću metodu
Preklapanje metode je neophodno kada klasa ima više konstruktora
Kada se iz konstruktora poziva drugi konstruktor, to se može uraditi pomoću
rezervisane reči this, sa odgovarajućom listom argumenata.
Pomoću rezervisane reči this može se pozvati samo jedan konstruktor, i ta
naredba mora biti prva. Konstruktor se može pozvati samo iz drugog
konstruktora, nikako iz neke druge metode.
42
Klase i objekti
Casovnik(String tip){
this();
this.tip = tip;
}
import java.util.*;
public class Casovnik {
int sati;
int minuti;
int sekunde;
String tip;
int serijskiBroj;
static int redniBroj = 0;
Casovnik(){
serijskiBroj = ++redniBroj;
}
Casovnik(String tip){
this();
this.tip = tip;
System.out.println("Konstruisan casovnik tipa: " + tip);
}
void tacnoVreme(){
Date datum = new Date();
sati= datum.getHours();
minuti= datum.getMinutes();
sekunde= datum.getSeconds();
System.out.println("Tacno vreme: " + sati+":" +
minuti+":" + sekunde);
}
}
43
Klase i objekti
class Soba{
Casovnik c1 = new Casovnik("Rolex");
static Casovnik c2 = new Casovnik("Rolex - static 1");
Soba(int br){
System.out.println("Konstruktor Soba("+br+")");
c1.info();
c2.info();
c3.info();
}
void info(){
System.out.println("Ovo je soba sa tri
44
Klase i objekti
casovnika");
}
U primeru 2.14. prave se dva objekta klase Soba s1 i s2. Rezultat izvršavanja
programa KolikoJeSati prikazan je na slici 2.8.
class KolikoJeSati {
public static void main(String[] arg){
Slika 2.8.
45
Klase i objekti
46
Objektno orijentisano modelovanje
POGLAVLJE 3
3. OBJEKTNO ORIJENTISANO
MODELOVANJE
3.1. UML
47
Objektno orijentisano modelovanje
48
Objektno orijentisano modelovanje
49
Objektno orijentisano modelovanje
3.2.1. Klase
izbrisi() Operacije
Slika 3.1.
50
Objektno orijentisano modelovanje
Slika 3.2.
Student
ime : String
prezime : String
brIndeksa : String
diplomirao : Boolean = false
Slika 3.3.
Ispred imena atributa može da stoji oznaka prava pristupa: “+” za javne
atribute (public),”#” za zaštićene (protected) i “-” za privatne (private)
atribute.
Operacija je implementacija nekog servisa koji može zahtevati svaki
objekat klase. Operacije se grafički navode u odeljku odmah ispod
atributa. Operacije mogu biti prikazane samo svojim imenom (slika 3.4.).
Trougao
izbrisi()
nacrtaj()
Slika 3.4.
51
Objektno orijentisano modelovanje
Student
Slika 3.5.
3.2.2. Interfejsi
Runnable
run()
Slika 3.6.
<<Interface>>
Runnable
run() : void
Slika 3.7.
52
Objektno orijentisano modelovanje
3.2.3. Paketi
mat
Complex
ComplexArray
DoubleArray
Matrix
Slika 3.8.
3.2.4. Relacije
53
Objektno orijentisano modelovanje
A B
Slika 3.9.
Tacka Duz
Trougao
Slika 3.10.
54
Objektno orijentisano modelovanje
Slika 3.11.
Slika 3.12.
55
Objektno orijentisano modelovanje
Slika 3.13.
56
Objektno orijentisano modelovanje
Slika 3.14.
57
Objektno orijentisano modelovanje
Tabela 3.2.
Akter (actor) je koherentni skup uloga koje korisnici sistema imaju kada
su u interakciji sa njim.
Akter se prestavlja sličicom čovečuljka (slika 3.15.).
naziv
Slika 3.15.
58
Objektno orijentisano modelovanje
ime
Slika 3.16.
Slučajevi upotrebe daju odgovore na sledeća pitanja:
Ko će koristiti sistem?
Šta će korisnici moći da urade sa sistemom?
Kako će to moći da urade?
Kako bi sistem radio ako bi korisnik to drugačije radio ili ako bi
imao drugačiji cilj?
Koji problemi mogu da se jave prilikom rada?
Dijagrami slučajeva upotrebe pokazuju odnos između aktera i slučajeva
upotrebe.
Svaka figurica predstavlja učesnika, pravougaonik predstavlja granice
sistema a elipse prdstavljaju slučajeve upotrebe.
Linije predstavljaju interakcije između učesnika i slučajeva upotrebe.
Iz slučajeva upotebe proizilaze sve specifikacije zahteva. Ovim
specifikacijama se određuju sve interakcije između korisnika i sistema.
Dijagramima slučajeva upotrebe (slika 3.17.) se definiše statički prikaz
funkcionalnosti sistema.
Banka
Kupac
Uplati depozit
Podigni novac
Slika 3.17.
59
Objektno orijentisano modelovanje
o1:dogadjaj
o2:operacija1()
3:operacija3
o2:operacija4()
Slika 3.18.
Dijagram saradnje (slika 3.19.) modeluje sistem ističući saradnju objekata koji
interaguju.
Ovaj dijagram se grafički predstavlja kao skup čvorova koji predstavljaju
objekte i skup linija koje ih povezuju i preko kojih idu poruke.
60
Objektno orijentisano modelovanje
1: <<create>>
3: zadajAkcije()
4: <<destroy>>
o1:Objekat1 o2:Objekat2
2: zadajVrednosti()
o3:Objekat
Slika 3.19.
Objektno orijentisano modelovanje
62
Nizovi
POGLAVLJE 4
4. NIZOVI
63
Nizovi
int[] x;
int x[];
x = new int[10];
Ovaj izraz kreira niz koji sadrži 10 elemenata koji su tipa int i u promenljivu x
smešta referencu na taj niz (slika 4.1.).
64
Nizovi
Prvo se navodi tip elemenata niza, zatim slede prazne uglaste zagrade, koje
pokazuju da se radi o nizu elemenata a ne o jednoj promenljivoj. Iza znaka "="
navodi se ključna reč new, koja pravi novi objekat niza čiji su elementi tipa int,
a broj elemenata niza određen je brojem u uglastim zagradama nakon oznake
tipa niza. Navedeni iskaz kreira niz koji ima 10 elemenata. Svi elementi niza se
inicijalizuju na podrazumevanu vrednost, a za numeričke vrednosti to je nula.
Slika 4.1.
x[0] = 7;
x[1] = 11;
x[2] = 15;
65
Nizovi
...
x[9] = 21;
Svakom članu niza moguće je pristupiti navođenjem odgovarajućeg indeksa
između uglastih zagrada. Indeksi niza počinju sa 0, tako da niz x ima članove
koji su dostupmi pomoću indeksa od 0 do 9.
Inicijalizacija elemenata niza moguća je i prilikom deklarisanja niza. Ovakva
inicijalizacija se postiže dodavanjem znaka "=" posle deklarisanja promenljive
niza, iza koga sledi lista vrednosti u velikim zagradama.
Na primer:
Ovim kodom istovremeno se deklariše promenljiva niza n i pravi se niz koji ima
pet članova, uz istovremenu inicijalizaciju ovih elemenata. Elementi niza se
dodeljuju redom, tako da će prvi element niza n[0] imati vrednost 1, drugi
elemenat n[1] vrednost 5 itd.
Inicijalizaciju niza moguće je izvršiti i metodom fill klase Arrays, koja je deo
paketa java.util. Tako na primer, niz x, čiji su elementi tipa int, može se
inicijalizovati na sledeći način:
Arrays.fill(x, 5);
Prvi argument metode fill jeste niz koji se inicajalizuje, a drugi argument jeste
vrednost koja će se dodeliti svim elementima datog niza. Pre upotrebe ove
metode potrebno je na početku izvorne datoteke postaviti iskaz import:
import java.util.Arrays;
Kako je metoda fill statička, nju možemo da uvezemo direktno u izvornu
datoteku, pa onda pri pozivu metode ne mora da stoji ime klase.
Objekat niz u Javi ima svojstvo (polje) length koje pokazuje koliko članova ima
dati niz.
Tako na primer kod:
int brojElemenata;
brojElemenata = x.length;
66
Nizovi
67
Nizovi
Kopiranjie svih vrednosti jednog niza u drugi moguće je izvršiti pomoću metode
arraycopy klase System. Sintaksa metode arraycopy je sledeća:
Prvi argument niz1 predstavlja niz iz koga se elementi kopiraju, drugi argument
je indeks od kog treba početi kopiranje, treći je odredišni niz, četvrti je indeks u
odredišnom nizu od koga treba početi kopiranje i poslednji argument je broj
elemenata koji se kopira.
U sledećem primeru (primer 4.3.) prikazana je upotreba metode arraycopy.
import java.util.Arrays;
public class KopiranjeNiza {
public static void main(String[] arg){
int[] x1 = new int[10];
int[] x2 = new int[15];
Arrays.fill(x1, 5);
Arrays.fill(x2, 1);
System.out.println("Niz x1");
stampajNiz(x1);
68
Nizovi
System.out.println("Niz x2");
stampajNiz(x2);
Dva niza su jednaka ako imaju isti broj elemenata i ako je svaki elemenat
jednog niza jednak odgovarajućem elementu drugog niza.
Klasa Arrays raspolaže metodom equals, koja omogućava upoređivanje dva
niza. Opšti oblik ove metode je:
x i y su nizovi čiji elementi mogu biti tipa int, long, short, char, byte, float ili
double.
U sledećem primeru (primer 4.4.), data su tri niza iste dužine. Prvi i treći niz
inicijalizuju se sa vrednošću 5, a drugi sa 7. Prvo poređenje, kao rezultat daje
false, pošto se nizovi razlikuju, a drugo poređenje daje rezultat true, kako su
nizovi x1 i x3 jednaki.
import java.util.Arrays;
public class PoredjenjeNizova {
public static void main(String[] arg){
int[] x1 = new int[10];
int[] x2 = new int[10];
int[] x3 = new int[10];
69
Nizovi
Arrays.fill(x1, 5);
Arrays.fill(x2, 7);
Arrays.fill(x3, 5);
if(Arrays.equals(x1, x2)){
System.out.println("Nizovi x1 i x2 su jednaki");
} else {
System.out.println("Nizovi x1 i x2 nisu jednaki");
}
if(Arrays.equals(x1, x3)){
System.out.println("Nizovi x1 i x3 su jednaki");
} else {
System.out.println("Nizovi x1 i x3 nisu jednaki");
}
}
}
import java.util.Arrays;
public class SortiranjeNiza {
public static void main(String[] arg){
int[] x1 = {5,7,1,3,9};
String[] x2 = {"jedan", "dva", "tri", "cetiri", "pet"};
Arrays.sort(x1);
stampajNiz(x1);
Arrays.sort(x2);
stampajNiz(x2);
}
70
Nizovi
import java.util.*;
public class PretrazivanjeNiza {
public static void main(String args[]) {
// definisanje i inicijalizacija niza x
int x[] = new int[10];
for(int i = 0; i < 10; i++)
x[i] = 3 * i;
// prikaz, sortiranje, prikaz
System.out.print("Originalan niz: ");
stampaj(x);
Arrays.sort(x);
System.out.print("Sortiran niz: ");
stampaj(x);
// popunjavanje od 2 do 5 elementa vrednoscu 1
Arrays.fill(x, 2, 5, 1);
System.out.print("Posle popunjavanja elemenata od 2
do 5: ");
stampaj(x);
// sortiranje i prikaz
Arrays.sort(x);
System.out.print("Sortiran niz: ");
stampaj(x);
// binarySearch pretrazivanje 21
System.out.print("Vrednost 21 je na lokaciji ");
71
Nizovi
72
Nizovi
ime = "Pera";
Slika 4.2.
73
Nizovi
Klasa String ima više konstruktora, neki od njih, kao i primeri njihovih
korišćenja prikazani su u tabeli 3.1.
Konstruktor O p is Primer
Tabela 3.1.
Ovaj kod definiše referencu imePrezime na objekat klase String koji ima
vrednost "Petar Petrovic". Operator "+" dovodi do stvaranja novog objekta
klase String, koji je različit od stringova koji se koriste kao operandi ove
operacije. U slučaju da su prilikom upotrebe operatora "+" argumenti različitog
tipa, ali da je makar jedan argument tipa String, tada će svi ostali argumenti
biti konvertovani u String i izvršiće se spajanje znakovnih nizova (primer 4.7.).
74
Nizovi
String s4 = s1 + s2 + s3;
System.out.println(s4);
Objekti klase String su nizovi vrednosti tipa char i oni raspolažu metodom
length(), koja vraća broj znakova u znakovnom nizu. Tako na primer, kod:
String ime="Petar";
System.out.println(ime.length());
if (korisnickoIme == ime)
dozvoljenPristup();
75
Nizovi
Rezultat ovog poređenja će biti tačan, samo ako obe promenljive ukazuju na
isti objekat.
U sledećem primeru (primer 4.8.), u prvom slučaju promenljive s3 i s4 ukazuju
na posebne objekte klase String koji imaju isti sadržaj, ali kako operator "=="
poredi da li reference ukazuju na isti objekat, a ne da li su sadržaji objekta isti
rezultat poređenja će biti false. U drugom slučaju promenljive s1 i s4 ukazuju
na isti objekat, pa je i rezultat poređenja true.
s1 = s4;
// Prikaz Stringova s3 i s4
System.out.println("String s1 = " + s1);
System.out.println("String s4 = " + s4);
//Poredjenje Promenljivih s1 i s4
if (s1 == s4)
System.out.println("Poredjenje s1 == s4
daje rezultat true");
else
System.out.println("Poredjenje s1 == s4
daje rezultat false");
}
}
if (korisnickoIme.equals(ime))
76
Nizovi
dozvoljenPristup();
Metoda equals daje rezultat true samo u slučaju ako oba niza imaju istu
dužinu i ako je svaki znak jednog znakovnog niza identičan odgovarajućem
znaku drugog znakovnog niza.
U sledećem primeru (primer 4.9.) je prikazan način upotrebe metode equals.
if (s3.equalsIgnoreCase(s4))
System.out.println("Poredjenje
s3.equalsIgnoreCase(s4) daje rezultat true");
else
System.out.println("Poredjenje
s3.equalsIgnoreCase(s4) daje rezultat false");
}
}
77
Nizovi
if (Character.isLetter(s.charAt(i)))
brojSlova++;
if (Character.isDigit(s.charAt(i)))
brojBrojeva++;
}
78
Nizovi
Metoda indexOf(String s), traži prvo pojavljivanje znaka ili podniza u datom
znakovnom nizu. Metoda vraća poziciju prvog znaka ili podniza, koji je jednak
stringu s. Ukoliko je potrebno pretraživanje znakovnog niza početi od neke
specificirane pozicije, na primer od pozicije indeksOd, onda se može koristiti
drugi oblik metode, odnosno indexOf(String s, int indeksOd). Ako metoda
indexOf ne pronađe dati znak ili podniz u specificiranom znakovnom nizu, ona
kao rezultat vraća -1. Ista vrednost se dobija i kada se metodi prosledi
pogrešan indeks kao argument.
Primena metode indexOf() prikazana je u sledećem primeru (primer 4.11.).
Na početku je definisan znakovni niz s. Ideja je da se u datom znakovnom
nizu prebroji (brojReci) pojavljivanje zadatog stringa (trazenaRec). Prvo se
pronalazi pozicija (indeks) prvog pojavljivanja zadatog stringa pomoću
naredbe s.indexOf(trazenaRec). Ako u string s postoji niz trazenaRec
izvršava se while petlja u kojoj se promenljiva brojReci uvećava za jedan.
Zatim se pretraživanje nastavlja nakon poslednjeg pronađenog znaka u
79
Nizovi
int brojReci = 0;
String trazenaRec = "ra";
int indeks = s.indexOf(trazenaRec);
while(indeks >= 0){
brojReci++;
indeks = indeks + trazenaRec.length();
indeks = s.indexOf(trazenaRec, indeks);
}
Klasa String ima metodu compareTo(), koja upoređuje dva objekta tipa String
i određuje da li je jedan znakovni niz veći, manji ili jednak drugom. Ova metoda
upoređuje dva znakovna niza tako što poredi njihove odgovarajuće znakove,
počevši od prvog. Poređenje znakova se svodi na poređenje njihovih Unicode
vrednosti. Jedan znak je veći, manji ili jednak drugom znaku, ako je njegova
Unicode vrednost veća, manja ili jednaka Unicode vrednosti drugog znaka.
Jedan String je veći od drugog ako je prvi znak koji se razlikuje od
odgovarajućeg znaka drugog znakovnog niza veći od odgovarajućeg znaka
drugog niza.
Na primer, neka je :
80
Nizovi
string1.compareTo(string2);
Ako je znakovni niz string1 veći od niza string2, rezultat je veći od nule, ako je
manji rezultat je manji od nule, a ako su nizovi jednaki rezultat poređenja je
nula.
Sledeći primer (slika 4.12.) prikazuje upotrebu metode compareTo().
Na početku se deklariše i inicijalizuje niz nizStringova, zatim se metodom
izbora vrši sortiranje elemenata niza koristeći metodu compareTo(). Zamena
elemenata niza vrši se pomoćnom metodom zamena(), a štampanje
elemenata niza metodom prikazi().
81
Nizovi
82
Nizovi
System.out.println(znakovniNiz.substring(indeks1));
}
}
Isti rezultat moguće je dobiti upotrebom metode split(). Metoda split ima dva
argumenta. Prvi definiše oblik graničnika, a drugi argument je celobrojna
vrednost koja pokazuje koliko puta se dati graničnik može upotrebiti.
U sledećem primeru (primer 4.14.) je pokazano kako se može upotrebiti
metoda split(). Na početku se definiše znakovni niz koji treba da se rastavi na
elemente, a zatim se poziva metoda split(), čiji prvi argument definiše zarez,
prazno mesto i znak uzvika kao graničnike, a drugi argument je nula, što
kazuje da graničnik može da se upotrebi onoliko puta koliko je to moguće,
odnosno da se ceo znakovni niz razdeli na elemente između kojih može da se
nalazi zarez, prazno mesto ili znak uzvika.
StringBuffer sbNiz;
83
Nizovi
84
Nizovi
zamenjuje podniz “pet” znakovnog niza “Tamo ima pet ljudi!”, koji je
enkapsuliran u objektu bafer klase StringBuffer znakovnim nizom "mnogo".
Metoda replace ima tri argumenta. Prva dva argumenta, tipa int, određuju
poziciju početka podniza i indeks prve sledeće pozicije nakon završetka
podniza koji se menja. Treći argument je tipa String i on definiše znakovni niz
koji će biti umetnut.
Umetanje znakovnog niza u objekat tipa StringBuffer, može da se izvrši
metodom insert(), koja ima dva argumenta. Prvi argument je tipa int i određuje
poziciju u objektu klase StringBuffer, gde će se insertovati objekat klase
String koji predstavlja drugi argument metode insert().
Metode klasa String i StringBuffer, kao i ostalih klasa Javinih biblioteka,
njihovi opisi i specifikacije nalaze se u API dokumentaciji, koja je dostupna na
Internetu (http://docs.oracle.com/javase/1.4.2/docs/api/index.html). Forma
prikaza API dokumentacije se sastoji od tri prozora (Slika 4.3.). Sa leve strane
nalaze se dva prozora u kojima su dati svi paketi, kao i spisak svih klasa.
Klikom na odgovarajuću klasu, prikazuje se API dokumentacija za tu klasu u
desnom, većem okviru.
Slika 4.3.
85
Nizovi
86
Enkapsulacija
POGLAVLJE 5
5. ENKAPSULACIJA
5.1. Paketi
Paket čine srodne klase i interfejsi. Srodne klase i interfejsi se grupišu u pakete
koji se mogu nezavisno distribuirati i kombinovati sa drugim paketima kako bi
formirali aplikacije. Paketi omogućavaju klasama da budu dostupne samo ako
su potrebne i onemogućavaju konflikte koji mogu nastati zbog imenovanja
87
Enkapsulacija
Paket Namena
88
Enkapsulacija
Svaka datoteka čije klase i interfejsi pripadaju nekom paketu, na primer paketu
com.kompanija, deklarišu svoje članstvo tom paketu na sledeći način:
package com.kompanija;
package com.kompanija;
/**
*
* @author Nenad Jovanovic
*/
public class Zaposleni {
String ime;
String prezime;
int zaposleniID;
static int redniBroj = 0;
public Zaposleni(){
redniBroj++;
zaposleniID = redniBroj;
}
public Zaposleni(String ime, String prezime){
this();
this. ime = ime;
this.prezime = prezime;
}
89
Enkapsulacija
Slika 5.1.
/**
*
* @author Nenad Jovanovic
*/
import com.kompanija.*;
public class ZaposleniPrimer {
public static void main(String[] arg){
Zaposleni radnik = new Zaposleni("Petar", "Petrovic");
radnik.prikazi();
}
}
90
Enkapsulacija
Slika 5.2.
91
Enkapsulacija
import java.util.*;
Na ovaj način dostupne su sve klase paketa java.util. Moguće je iskaz import
koristiti i za uvoz samo određene klase. Na primer, komanda:
import java.util.Date;
uvozi klasu Data, pa je moguće koristiti klasu Date bez navođenja pune
putanje odnosno na sledeći način:
mat
Complex
ComplexArray
DoubleArray
Matrix
Slika 5.3.
92
Enkapsulacija
mat podaci
Complex ComplexToken
ComplexArray << import >> DoubleToken
DoubleArray MatrixToken
Matrix
Slika 5.4.
Paket Podaci uvozi paket mat tako da klase paketa mat postaju vidljive
klasama iz paketa podaci, ali obrnuto ne važi.
Samo javni delovi paketa mogu biti izvezeni.
93
Enkapsulacija
Modifikator
Dostupnost
pristupa
Prijateljski član Za sve klase u istom paketu
Tabela 5.2.
Slika 5.5.
94
Enkapsulacija
Slika 5.6.
import java.util.*;
public class Casovnik {
private int sati;
private int minuti;
private int sekunde;
private int serijskiBroj;
static int redniBroj = 0;
String tip;
Casovnik(){
serijskiBroj = ++redniBroj;
}
95
Enkapsulacija
Casovnik(String tip){
this();
this.tip = tip;
System.out.println("Konstruisan casovnik tipa: "
+ tip);
}
class Kafa {
private Kafa(){
System.out.println("Skuvaj kafu");
}
static Kafa kuvajKafu(){
System.out.println("Pazi da ne iskipi!");
return new Kafa();
}
}
96
Enkapsulacija
Primer klase Kafa (primer 5.4.) pokazuje upotrebu modifikatora private kada
se želi ograničiti način pravljenja objekata. Objekat klase Kafa nije moguće
napraviti upotrebom konstruktora, nego se mora upotrebiti metoda
kuvajKafu(), koja će to uraditi, ali na jedan kontrolisani način (primer 5.5.).
class SkuvajKafu{
public static void main(String[] arg){
//Kafa k1 = new Kafa(); // Ovo ne može
Kafa k2 = Kafa.kuvajKafu();
}
}
public Zaposleni(){
97
Enkapsulacija
redniBroj++;
zaposleniID = redniBroj;
}
public Zaposleni(String ime, String prezime, double koef){
this();
this. ime = ime;
this.prezime = prezime;
this.koef = koef;
}
98
Upotreba klasa
POGLAVLJE 6
6. UPOTREBA KLASA
6.1. Okupljanje
99
Upotreba klasa
Kao primer posmata se klasa Automobil koja sadrži dve reference na objekte
klasa Motor. Referenca motor1 ukazuje na objekat koji se pravi u konstruktoru
klase Automobil, pa je u pitanju kompozicija, a referenca motor2 ukazuje na
postojeći objekat klase Motor, koji se prosleđuje kao argument metode, pa se
u ovom slučaju radi o agregaciji.
public class PC {
private String ime;
PC(String ime){
System.out.println("Novi PC - " + ime);
this.ime = ime;
}
Klasa RacunarskaMreza definiše objekte koji čuvaju dva objekta tipa String,
po jedan objekat prostih tipova int i float i jedan objekat klase PC:
100
Upotreba klasa
Slika 6.1.
101
Upotreba klasa
RacunarskaMreza1(){
max_broj = 15;
brzina = 1.4;
//Inicijalizacija u konstruktoru
System.out.println("Inicijalizacija u konstruktoru");
racunar2 = new PC("PC2");
}
// blok za inicijalizaciju
{
System.out.println("Inicijalizacija u bloku
za inicijalizaciju");
swic = new String("SWITCH");
}
void ispisi(){
System.out.println("svic = " + swic);
// Inicijalizacija na mestu upotrebe
System.out.println("Inicijalizacija na mestu upotrebe");
hub = "HUB";
System.out.println("utp = " + hub);
System.out.println("max_broj = " + max_broj);
System.out.println("brzina = " + brzina);
System.out.println("PC = " + racunar1);
System.out.println("PC = " + racunar2);
}
public static void main(String[] arg){
RacunarskaMreza1 rm = new RacunarskaMreza1();
102
Upotreba klasa
rm.ispisi();
}
}
Slika 6.2.
Slika 6.3.
103
Upotreba klasa
6.2. Nasleđivanje
104
Upotreba klasa
Slika 6.4.
105
Upotreba klasa
Klasa koja nasleđuje neku drugu klasu deklariše se korišćenjem ključne reči
class, dodelom indentifikatora klase, navođenjem ključne reči extends i imena
superklase. Na primer, sledeći kod:
Slika 6.5.
106
Upotreba klasa
public Zaposleni(){
redniBroj++;
zaposleniID = redniBroj;
}
public Zaposleni(String ime, String prezime, double koef){
this();
this. ime = ime;
this.prezime = prezime;
this.koef = koef;
}
107
Upotreba klasa
108
Upotreba klasa
Ako potklasa ima metodu koja ima isto ime, ali se razlikuje po povratnom tipu ili
po broju ili tipu argumenata, kao i metoda superklase, onda se ova pojava
naziva preklapanje metode.
Slično, i klasa ProizvodniRadnik (primer 6.6.) nasleđuje sve javne članove
klase Zaposleni, definiše privatno polje brCasova i metode za pristup tom
privatnom polju. I klasa ProizvodniRadnik definiše svoju posebnost u odnosu
na klasu Zaposleni, a ona se ogleda u drugačijem načinu izračunavanja plate.
Ta posebnost se ispoljava u smislu uključivanja broja radnih sati, kao faktora
koji utiče na platu proizvodnog radnika. U ovom slučaju se prvo izračunava
vrednost jednog radnog sata, kao odnos plate zaposlenog i prosečnog broja
radnih sati 174, pa se onda plata proizvodnog radnika dobija kao proizvod
broja radnih sati i vrednosti jednog radnog sata.
109
Upotreba klasa
import java.text.*;
public class ZaposleniPrimer {
public static void main(String[] arg){
110
Upotreba klasa
df.format(d.izracunajPlatu(1153.56)));
}
}
111
Upotreba klasa
class Jedan{
Jedan(){
System.out.println("Konstruktor klase JEDAN");
}
}
Slika 6.6.
Posle alokacije memorije za objekat, koji je napravljen, i postavljanja polja na
podrazumevane vrednosti izvršava s se konstruktor. Svaki konstruktor ima tri
faze:
1. Prvo se poziva eksplicitno ili implicitno konstruktor superklase.
Konstruktor superklase, takođe, ima iste tri faze.
112
Upotreba klasa
class RedosledZavisnostiKonstruktora {
public static void main(String[] arg){
KlasaDva d = new KlasaDva();
}
}
class KlasaJedan{
int jedan = 1;
int broj;
KlasaJedan(){
broj = m(jedan);
System.out.println("[KlasaJedan] jedan = " +jedan);
System.out.println("[KlasaJedan] broj/jedan = " +broj);
}
113
Upotreba klasa
Slika 6.7.
Tabela 6.1.
114
Upotreba klasa
115
Upotreba klasa
objekat obeleži kao final onda će referenca biti konstantna i kada se jednom
inicijalizuje na neki objekat, ona više ne može da se menja i da pokazuje na
neki drugi objekat. Međutim, sam objekat na koji referenca final pokazuje može
da se menja. Ako se finalno polje ne inicijalizuje prilikom deklarisanja, onda se
ono naziva prazno finalno polje. Prazno finalno polje mora da se inicijalizuje
pre upotrebe, a to može da se uradi u konstruktoru klase. Prazno finalno polje
može da bude rarazličito za objekate klase. Ako su argumenti metode
deklarisani kao final, onda unutar metode nije moguće menjati ono na šta taj
argument ukazuje.
Upotrebom modifikatora final na metode povećava se bezbednost jer se
obezbeđuje njeno nepromenjeno ponašanje prilikom nasleđivanja, ali se
povećava i efikasnost, obzirom da kompajler može poziv toj metodi da ugradi
direktno u kod. Finalna metoda ne može da se menja, odnosno nije moguće
redefinisati tu metodu.
Ako se klasa označi modifikatorom final, onda nijedna klasa ne može da
nasledi tu klasu. Sve metode finalne klase su i same posredno finalne.
Upotreba finalnih klasa optimizuje kod, obzirom da su provere tipova brže ako
su klase final.
116
Upotreba klasa
Slika 6.8.
Klasa Lav (primer 6.11.) nasleđuje klasu Zivotinja, dakle predstavlja
konkretizaciju apstraktnog pojma “zivotinja”, pa mora i da realizuje apstraktnu
metodu hraniSe(), koja je nasleđena iz klase Zivotinja. Klasa Lav nasleđuje i
metodu dise().
Druga potklasa klase Zivotinja je klasa Krava (primer 6.12.). Klasa Krava
nasleđuje metodu dise(), ali posto se zivotinje koje pripadaju klasi Krava hrane
na drugačiji način od životinja koje pripadaju klasi Lav, klasa Krava realizuje
svoju verziju metode hraniSe(), čija je apstraktna verzija nasleđena iz klase
Zivotinja.
117
Upotreba klasa
Osnovna klasa svih klasa jeste klasa Object, bez obzira što se ona ne navodi
kao superklasa u deklaraciji neke klase, to kompajler radi automatski. Činjenica
da je klasa Object bazna klasa, dovodi do toga da referenca na objekat bilo
koje klase može da se čuva u promenljivu klase Object. To znači da
promenljiva deklarisana kao objekat klase Object može da čuva vrednost bilo
kog tipa, odnosno da metodi, kojoj je argument tipa Object, može da se
prosledi argument različitog tipa.
Kao potklase klase Object, sve klase nasleđuju metode definisane u klasi
Object. Metode klase Object su date u tabeli 6.2.
118
Upotreba klasa
119
Upotreba klasa
120
Polimorfizam
POGLAVLJE 7
7. POLIMORFIZAM
121
Polimorfizam
Klasa Krug nasleđuje klasu GeomObjekat i definiše privatno polje r tipa int,
kao i realizaciju apstraktne metode povrsina().
122
Polimorfizam
123
Polimorfizam
Slika 7.1.
124
Polimorfizam
125
Polimorfizam
U metodi main formira se niz čiji su elementi tipa GeomObjekat, ali i svi objekti
klasa koje su potklase klase GeomObjekat, i kojih ima jedanaest članova.
Dakle, u nizu g nalaze se objekti različitog tipa, ali koji pripadaju zajedničkom
osnovnom tipu. Zahvaljijući polimorfizmu, različiti objekti mogu da se čuvaju u
jednom nizu i mogu da se obrađuju iterativno.
Osnovna klasa GeomObjekat definiše zajednički interfejs za sve objekte
nasleđenih klasa. Izvedene klase redefinišu ove metode da bi obezbedile
ponašanje za specifične objekte.
Statička metoda izaberi() vraća referencu na slučajno izabran geometrijski
objekat. Pri svakoj naredbi return obavlja se svođenje naviše, pa se referenca
na objekat klase Krug ili klase Pravougaonik pretvara u referencu na objekat
klase GeomObjekat, pa se kao povratna vrednost dobija referenca na objekat
klase GeomObjekat.
Kada se iterativno prođe kroz niz g, čiji su elementi objekti klase
GeomObjekat, i pozove metoda izracunajPovrsinu() za svaki objekat, svaki
tip počinje da se pravilno ponaša, odnosno izvršava se operacija specifičnog a
ne osnovnog tipa.
Polimorfizam omogućava da se doda proizvoljan broj geometrijskih objekata,
bez potrebe da se menja metoda izracunajPovrsinu(). Polimorfizam
omogućava proširivost, jer je moguće dodati nove funkcionalnosti. Metode koje
obavljaju posao putem interfejsa osnovne klase, nije potrebno menjati jer one
mogu da rade i sa objektima novih klasa, koje nasleđuju osnovnu klasu.
126
Polimorfizam
class X{
public void priazi(){
System.out.println("Metoda prikazi() u klasi X");
}
}
class Y extends X{
public void priazi(){
System.out.println("Metoda prikazi() u klasi Y");
}
}
class Z extends X{
public void priazi(){
System.out.println("Metoda prikazi() u klasi Z");
}
}
127
Polimorfizam
Slika 7.2.
128
Polimorfizam
Slika 7.3.
129
Polimorfizam
} else {
int slucajnoR = (int)(Math.random()*7);
while (slucajnoR == 0){
slucajnoR = (int)(Math.random()*7);
}
return new CrveniKrug(slucajnoR);
}
} else {
//Pravimo objekat klase Pravougaonik
int slucajnoA = (int)(Math.random()*7);
int slucajnoB = (int)(Math.random()*9);
while (slucajnoA == 0 | slucajnoB == 0){
slucajnoA = (int)(Math.random()*7);
slucajnoB = (int)(Math.random()*9);
}
return new Pravougaonik(slucajnoA, slucajnoB);
}
}
130
Polimorfizam
protected int r;
public final double pi = 3.14;
Krug(int r){
this.r = r;
}
public void povrsina(){
System.out.println("Povrsina Kruga poluprecnika r = "
+ r+ " je: " + r*r*pi);
}
}
PlaviKrug(int r){
super(r);
}
CrveniKrug(int r){
super(r);
}
131
Polimorfizam
Kad god se u niz g, u klasi main(), ubaci novi element vrši se svođenje naviše
ka klasi GeomObjekat. Metoda izracunajPovrsinu() ostaje nepromenjena. To
je i najvažnija funkcija polimorfizma, da rzdvoji promenljive od nepromenljivih
stvari.
Kao što je objašnjeno u prethodnom poglavlju, svaki konstruktor ima tri faze.
Prvo se poziva eksplicitno ili implicitno konstruktor superklase, zatim se
inicijalizuju polja, redolsedom kojim su deklarisana, kao i blokovi za
inicijalizaciju i na kraju se izvršava telo konstruktora.
Potklasa ima pristup svojim poljima, ređe poljima superklase pošto su ona
obično privatna. Samo konstruktor natklase ima pravo pristupa i mogućnost
inicijalizacije elemenata te klase. Kako objekat potklase sadrži podobjekat
superklase, neophodno je da se pozovu svi konstruktori da bi se pravilno
izvršila inicujalizacija. Ako se u konstruktoru izvedene klase izričito ne pozove
konstruktor superklase, prevodilac će automatski da pozove podrazumevani
konstruktor, a ako takvog konstruktora nema, doći će do greške.
Uticaj polimorfizma, nasleđivanja i kompozicije na redosled pozivanja
konstruktora, prikazan je u sledećem primeru.
Složena klasa KafaZaPoneti nasleđuje klasu Kafa i sastoji se od klasa Casa i
Secer. Svaki konstruktor ispisuje poruku kada se pozove. Ova klasa
objedinjuje tri nivoa nasleđivanja i dva objekta člana.
class Casa {
Casa(){
System.out.println("Casa()");
}
}
132
Polimorfizam
class Secer {
Secer(){
System.out.println("Secer()");
}
}
class Pice {
Pice(){
System.out.println("Pice()");
}
}
Slika 7.4.
133
Polimorfizam
Slika 7.5.
class Oblik {
Oblik(){
System.out.println("Oblik() pre poziva crtaj()");
crtaj();
System.out.println("Oblik() posle poziva crtaj()");
}
void crtaj(){
System.out.println("Crtaj oblik ");
}
}
}
void crtaj(){
134
Polimorfizam
Klasa Krug nasleđuje klasu Oblik i redefiniše metodu crtaj() ali, metodu crtaj()
poziva konstruktor osnovne klase Oblik. Pošto se polimorfna metoda poziva iz
konstruktora, biće pozvana redefinisana metoda. Kako se prvo poziva
konstruktor superklase, u trenutku poziva redefinisane metode crtaj(), polje r
još uvek neće biti inicijalizovano, pa će se i pozvati redefinisana metoda crtaj
za poluprecnik r = 0.
Rezultat je sledeći:
Slika 7.6.
135
Polimorfizam
136
Interfejsi
POGLAVLJE 8
8. INTERFEJSI
137
Interfejsi
Interfejs se pravi tako što se umesto ključne reči class upotrebi ključna reč
intrface. Ispred reči interface može da stoji i reč public, ako je dati interfejs
definisan u datoteci sa istim imenom. Ako je izostavljen modifikator pristupa,
onda je interfejs prijateljski i može da se koristi samo unutar istog paketa.
Članovi interfejsa mogu da budu:
polja (konstante),
metode bez implementacije i
ugnežđene klase i interfejsi.
Svi članovi interfejsa su implicitno javni, ali se prema konvenciji modifikator
public se izostavlja.
Interfejs može da deklariše imenovane konstante. Ove konstante se definišu
kao polja ali su implicitno public, static i final i ova polja moraju da se
inicijalizuju.
Metode deklarisane u interfejsu su implicitno abstaract i public. Iza zaglavlja
metode navodi se tačka i zarez i one ne mogu biti statičke kao ni final, jer još
nisu implementirane.
138
Interfejsi
class PrimerKonvertor {
public static void main(String[] arg){
System.out.println("EUR_USD = "+
FaktoriKonverzije.EUR_USD);
System.out.println("EUR_RSD = "+
FaktoriKonverzije.EUR_RSD);
System.out.println("USD_RSD = "+
FaktoriKonverzije.EUR_USD);
}
}
139
Interfejsi
140
Interfejsi
import java.text.*;
public class KonvertorValutaPrimer {
public static void main(String[] arg){
KonvertorValuta kv = new KonvertorValuta();
DecimalFormat df = new DecimalFormat("#.##");
141
Interfejsi
142
Interfejsi
Slika 8.1.
143
Interfejsi
144
Interfejsi
145
Interfejsi
146
Izuzeci
POGLAVLJE 9
9. IZUZECI
147
Izuzeci
Slika 9.1.
Izvršni sistem pretražuje call stack, tražeći blok koda koji može da obradi
izuzetak. Taj blok koda se zove rukovalac izuzetkom. Pretraživanje počinje
metodom gde se dogodila greška i nastavlja kroz listu call stack u reverznom
redosledu, u odnosu na pozive metoda (slika 9.2.).
Kada se pronađe odgovarajući rukovalac izuzetkom, izvršni sistem predaje
izuzetak rukovaocu. Rukovalac izuzetkom odlučuje da uhvati izuzetak (catch
exception). Ako izvršni sistem ne pronađe odgovarajućeg rukovaoca
izuzetkom, prestaje sa radom.
Slika 9.2.
148
Izuzeci
Slika 9.3.
149
Izuzeci
Ukoliko u programu postoji metoda koja može da izbaci izuzetak tipa koji
predstavlja potklasu klase Exception, onda taj izuzetak mora da se obradi u toj
metodi ili data metoda treba da se deklariše da može da izbaci dati izuzetak.
Ako se ne učine jedna od ove dve stvari, kod neće moći da se kompajlira.
Ovo ne važi za izuzetke tipa RuntimeException. Metoda koja može da izbaci
izuzetak ovog tipa ne mora da se deklariše da može da izbaci taj izuzetak, niti
u metodi treba definisati rukovaoca izuzetkom.
Objekti klase RuntimeException definišu interne uslove izuzetaka, koje
aplikacija uobičajeno ne očekuje i od kojih se ne može oporaviti. To su obično
programerske greške, kao što je loša eksplicitna konverzija ili pristup
elementima niza izvan granice niza ili neinicijalizovanoj referenci, odnosno to
su logičke greške ili nepropisno korišćenje API-ja.
Postoji veliki broj klasa, koje su podklase klase RuntimeException, i koje se
koriste se za definisanje problema u različitim Java bibliotekiama. U paketu
java.lang definisane su sledeće klase izuzetaka, koje su potklase klase
RuntimeException:
ArithmeticException – pokušaj nedozvoljene aritmetičke operacije,
na primer, deljenje nulom
IndexOutOfBoundsException – indeks je van dozvoljenih granica
objekta, koji može biti niz, String ili Vector.
NegativeArraySizeException – pokušaj definicije niza sa negativnim
indeksom.
SecurityException - pokušaj narušavanja sigurnosnih pravila (security
manager).
150
Izuzeci
151
Izuzeci
treba da sadrži deo za obradu tog izuzetka ili i ta sama mateoda treba da bude
deklarisana da može da vrati objekat izuzetka tipa IOException.
Ako u nekoj metodi postoji kod koji može da dovede do izbacivanja više
izuzetaka različitih tipova, onda u deklaraciji te metode iza reći throws treba
navesti listu tipova mogućih izuzetaka.
Na primer:
try {
// kod koji moze da generise izuzetak
} catch (TipIzuzetka e) {
// Obrada izuzetaka koji uhvacen
} finally {
// kod joji se izvrsava ako izuzetak
// nije uhvacen
}
Prvi korak u formiranju rukovaoca izuzetkom jeste stavljanje bloka koda, koji bi
mogao da izazove izuzetak u blok try:
152
Izuzeci
try {
// kod koji može da izazove izuzetak;
}
Segment koda je kod koji sadrži jednu ili više legalnih komandi koje bi mogle
da izbace izuzetak.
Kod koji može da izbaci izuzetak e tipa TipIzuzetka, koji mora da bude
potklasa klase Throwable, stavlja se u blok koji je označen ključnom rečju try.
Ako dati kod izbaci izuzetak definisanog tipa, onda se ostatak koda u bloku try
preskače i izvršava se kod unutar bloka catch. Svaki catch blok rukuje tipom
izuzetka koji je specificiran argumentom. Tip argumenta TipIzuzetka, deklariše
tip izuzetka i mora biti objekat potklase klase Throwable.
Ako catch rukuje sa više tipova izuzetka, tada je catch parametar implicitno
final.
Ako kod unutar bloka try ne izbaci izuzetak, onda se izvršava kod unutar bloka
try, a kod unutar bloka catch se preskače. Ako kod unutar bloka try izbaci
izuzetak koji nije tipa TipIzuzetka, onda metoda momentalno prekida sa
radom.
Kada kod za obradu izuzetaka, unutar bloka try, uhvati izuzetak obrada se
nastavlja unutar bloka catch, a kada ne uhvati izuzetak blok try se završava, a
blok catch se preskače. Problem nastaje ako je metoda zauzela neke resurse i
ako ti resusrsi treba da se oslobode. U tom slučaju kod za oslobađanje resursa
153
Izuzeci
...
try {
readTextFile();
} catch (IOException e) {
// Obrada izuzetaka koji nastaju sa U/I aktivnostima
} finally {
closeTextFile();
}
...
154
Izuzeci
Kako se blok finally izvršava u svakom slučaju, onda će metoda f() vratiti
pravilan rezultat za sve vrednosti argumenta, osim za i = 3, kada će se blok
finally izvršiti i vratiti rezultat nula, bez obzira na originalnu vrednost 9, koja je
izračunata i vraćena u bloku try.
if (a == null)
throw new NullPointerException();
Izraz throw zahteva jedan argument Throwable tipa, koji mora da bude
instanca klase koja je potklasa klase Throwable.
Klasa Throwable je bazna klasa za sve Java izuzetke i ima dva public
konstruktora:
Podrazumevani kontruktor.
Kontruktor koji prihvata argument tipa String (tu može biti smeštena
informacija o prirodi greške)
Exception objekat koji se prosleđuje catch bloku sadrži informacije o prirodi
problema.
Poruka koja se inicijalizuje u konstruktoru.
Zapis o call steku (execution stack) u trenutku kada je izuzetak
kreiran i on sadrži pun naziv svih pozvanih metoda, kao i broj linije u
kojoj se poziv dogodio.
Throwable klasa ima public metode koje omogućavaju pristup zapisu poruka i
steka:
getMessage() - Vraća sadržaj poruke koja opisuje aktuelni izuzetak
(null za većinu predefinisanih klasa),
printStackTrace() - Ispis poruka i steka na standardni izlaz,
155
Izuzeci
156
Izuzeci
Klasa MojIzuzetak (primer 9.2.) definiše novu klasu izuzetaka. Ona nasleđuje
klasu Exception i definiše dva konstruktora. Prvi konstruktor je podrazumevani
konstruktor, a drugi konstruktor ima kao argument objekat klase String.
157
Izuzeci
System.out.println("Uhvacen je objekat
klase MojIzuzetak");
}
}
}
try {
izuzetak.f1();
} catch (MojIzuzetak i){
System.out.println(i.getMessage());
}
}
}
158
OBJEKTNO ORIJENTISANO
PROGRAMIRANJE
PRAKTIKUM
159
Praktikum
160
Praktikum
OBJEKTNO ORIJENTISANO
PROGRAMIRANJE
Evidencija vežbi
161
Praktikum
162
Praktikum
Cilj vežbe:
a) Upoznavanje sa Java razvojnim okruženjem.
b) Upoznavanje sa načinom pisanja, kompajliranjem i izvršavanjem
Java programa.
c) Rad sa editorom Text Pad.
Dopuniti sliku.
163
Praktikum
3. _____________________________________________,
4. _____________________________________________,
5. ______________________________________________...
Java tehnologija je razvijena od strane kompanije
__________________________ pa ćemo razmotriti instalaciju i upotrebu
razvojnog okruženja JDK-a (Java Development Kit). JDK je dostupan,
besplatno, i može se dobiti sa WWW sajta (slika 1.1.):
http://www.oracle.com/technetwork/java/javase/downloads/index.html
javac Primer.java
Ova komanda poziva Java kompajler koji treba da prevede izvorni Java
program Primer.java da bi se dobila Primer.class binarna datoteka.
Bajtkod u obliku class datoteke može se izvršiti komandom:
java Primer
164
Praktikum
Slika 1.1.
165
Praktikum
Slika 1.2.
U ovom primeru datoteka java.exe, JDK razvojnog alata verzije 1.3.0_02
nalazi se u katalogu C:\jdk1.3.0_02\bin tako da je potrebno podesiti sistemsku
varijablu Path na sledeći način:
Kliknuti desnim tasterom miša na My computer, pa izabrati karticu Advanced
i kliknuti na dugme Enviroment Variables (sl.1.3.).
Slika 1.3.
Izabrati sistemsku variablu Path, kliknuti na Edit i uneti vrednost:
166
Praktikum
PATH = C:\JDK1.3.0_02\BIN
Slika 1.4.
Nakon završene instalacije, i unetih izmena sistemske varijable Path možemo
proveriti da li je JDK razvojni sistem pravilno instaliran i konfigurisan. To
možemo učiniti ako otkucamo sledeću komandu u MS DOS komandnoj liniji:
java –version
Ako je sve u redu treba da se dobije sledeća poruka (u skladu sa verzijom
JDK-a) (sl.1.5.)
Slika 1.5.
167
Praktikum
Ako se dobije poruka -File not found- sistem ne može da pronađe Java
interpretator tako da je potrebno proveriti da li je varijabla PATH dobro
podešena.
C:\>edit
Listing 1 : PozdravSvetu.java
class PozdravSvetu {
public static void main(String[] arg){
System.out.println("Pozdrav svetu!!");
}
}
Slika 1.6.
Nakon editovanja izvorne verzije programa potrebno je snimiti ga pod nazivom
PozdravSvetu.java.
Ovde treba primetiti da klasa i datoteka izvornog programa moraju da imaju
isto ime (pri čemu treba praviti razliku između malih i velikih slova).
168
Praktikum
C:\>javac PozdravSvetu.java
C:\>java PozdravSvetu
Slika 1.7.
Kao što smo već napomenuli izvorni Java program može biti napisan u bilo
kom tekstualnom editoru.
Editor TextPad olakšava pisanje izvornog programa, a prilagođen je i za
kompajliranje i izvršavanje Java programa uz pomoć JDK razvojnog okruženja.
Prethodni Java program napisan pomoću TextPad editora prikazan je na slici
1.8.:
169
Praktikum
Slika 1.8.
Ovako napisan Java program potrebno je snimiti koristeći Save opciju menija
File (slika 1.9.).
Slika 1.9.
Kompajliranje Java programa moguće je izvršiti pomoću opcije Compile Java
menija Tools (slika 1.10.).
170
Praktikum
Slika 1.10.
Izvršavanje Java aplikacije moguće je pomoću opcije Run Java Application
menija Tools (slika 1.10.), a rezultat je prikazan na slici 1.11.
Slika 1.11.
171
172
Vežba 2. - Integrisano razvojno okruženje –
NetBeans
Cilj vežbe
a). Upoznavanje sa integrisanim razvojnim okruženjem NetBeans-om
b). Kreiranje projekta u BetBeans-u
c). Dodavanje novih klasa
d). Pokretanje programa
2.1. Uvod
Slika 2.1.
173
Praktikum
Slika 2.2.
Slika 2.3.
174
Praktikum
Sve ove podatke NetBeans smešta u glavni folder projekta. Glavni folder
projekta sadrži podfoldere u kojima grupiše podatke po nekom kriterijumu. Da
bi se omogućilo grupisanje više povazanih projekata na jednom mestu, svi
folderi takvih projekata postavljaju u jedan folder koji se naziva radno mesto
(engl. workplace).
1. Novi projekat se pravi biranjem opcije New Project, menija File
Slika 2.4.
Slika 2.5.
175
Praktikum
Slika 2.6.
Slika 2.7.
176
Praktikum
Slika 2.8.
Nakon toga dobijamo kostur klase u kome treba da dodamo odgovarajući kod
(slika 2.9.).
Slika 2.9.
177
Praktikum
Slika 2.10.
Zatim, kreiramo novu klasu KrugPrimer, birajući u listi File Type stavku Java
Main Calss (slika 2.11.).
Slika 2.11.
178
Praktikum
Slika 2.12.
Slika 2.13.
179
180
Praktikum
Cilj vežbe
a). Upoznavanje sa tipovima podataka u Javi
b). Rad sa operatorima
c). Upoznavanje sa osnovnim kontrolnim strukturama
d). Modularizacija programa
Zadatak 1.
Vrednost funkcije y se izračunava na sledeći način:
y = min(x,z) + 10
gde min(x,z) predstavlja funkciju koja upoređuje vrednosti promenljivih x i z i
kao rezultat daje manju vrednost. Napisati program koji, za zadate vrednosti x i
z izračunava vrednost funkcije y.
class Zadatak1 {
public static void main (String arg[]){
int x = 5;
int z = 8;
int y = min(x,z) + 10;
System.out.println("Vrednost funkcije y je:"+ y);
}
public static int min (int a, int b){
if (a < b){
return a;
} else {
return b;
}
}
}
Zadatak 2.
Vrednost funkcije y se izračunava na sledeći način:
y = (min(x,z) +5)*max(x,z)
181
Praktikum
class Zadatak2 {
public static void main (String arg[]){
int x = 5;
int z = 8;
Zadatak 3.
Napisati program koji za zadato n izračunava zbir kvadrata prvih n
nenegativnih celih brojeva.
class Zadatak31 {
public static void main (String arg[]) {
182
Praktikum
int n = 7;
int suma = 0;
class Zadatak32 {
public static void main (String arg[]) throws
java.io.IOException{
int n;
int suma = 0;
BufferedReader b;
b = new
BufferedReader(new InputStreamReader(System.in));
System.out.print("Unesi n:");
n = Integer.parseInt(b.readLine());
import javax.swing.*;
import javax.swing.event.*;
class Zadatak33 {
public static void main (String arg[]){
int n;
int suma = 0;
String s = JOptionPane.showInputDialog("Unesi n: ");
n = Integer.parseInt(s);
for (int i = 1; i <= n; i++){
183
Praktikum
import java.util.*;
class Zadatak34 {
public static void main (String arg {
int n;
int suma = 0;
System.out.print("Unesi n:");
Scanner s = new Scanner(System.in);
n = s.nextInt();
for (int i = 1; i <= n; i++){
suma = suma + i*i;
}
System.out.println("Zbir kvadrata prvih " + n +
" nenegativnih celih brojeva je;"+ suma);
}
}
Zadatak 4.
Izračunati novu cenu proizvoda nakon poskupljenja od 15%. Prvobitna cena se
unosi sa tastature kao neki decimalni broj. Novu cenu treba formatirati pre
prikaza na ekranu.
import java.util.*;
import java.text.DecimalFormat;
public class Zadatak4 {
public static void main(String[] args){
double cena = 0;
System.out.println("Unesite cenu pre poskupljenja: ");
Scanner s = new Scanner(System.in);
cena = s.nextDouble();
cena = cena * 1.15;
DecimalFormat formater =
184
Praktikum
new DecimalFormat("###,###.##");
System.out.println("Cena posle poskupljenja od 15%
iznosi: " + formater.format(cena));
}
}
185
186
Praktikum
Cilj vežbe:
a). Definisanje klase
b). Identifikacija polja u klasi prema zadatim uslovima
c). Identifikacija metoda klase prema zadatim uslovima
d). Kreiranje objekata klase i rad sa njima
Rešenje
class Kocka{
private int visina;
private int duzina;
private int sirina;
private double povrsina;
private double zapremina;
}
187
Praktikum
public Kocka(){
visina = 0;
duzina = 0;
sirina = 0;
}
188
Praktikum
class Kocka{
private int visina;
private int duzina;
private int sirina;
private double povrsina;
private double zapremina;
public Kocka(){
visina = 0;
duzina = 0;
sirina = 0;
}
189
Praktikum
Zadatak
190
Praktikum
Rešenje
class PrimerSaKockom{
public static void main(String[] arg){
Kocka novaKocka = new Kocka(7,5,9);
novaKocka.povrsinaKocke();
novaKocka.zapreminaKocke();
novaKocka.prikazi ();
novaKocka.postaviVisinu(11);
novaKocka.postaviSirinu(3);
novaKocka.povrsinaKocke();
novaKocka.zapreminaKocke();
System.out.println("Nove dimenziije su:");
novaKocka.prikazi();
}
}
191
Praktikum
192
Vežba 5. - Objekat Niz i String
Cilj vežbe:
193
Praktikum
// Konstruktor
public Niz(int brojElemenata){
x=new int[brojElemenata];
}
194
Praktikum
195
Praktikum
196
Praktikum
min=x[i];
}
return min;
}
// metoda promeni()
public void promeni(int i, int j){
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}
Zadatak 1:
Koristeći klasu Niz napisati program u Java programskom jeziku koji će:
Kreirati objekat klase Niz sa 9 elemenata
Generisati slučajne vrednosti za elemente niza
Prikazati vrednosti elemenata niza
197
Praktikum
Sortirati niz
Prikazati vrednosti elemenata niza
Naći i prikazati maksimalan elemenat niza.
Rešenje
Listing 5.2. - PrimerSaNizom.java
class PrimerSaNizom{
public static void main(String[] arg){
Niz x=new Niz(9);
x.generisiSlucajanNiz();
x.stampajNiz();
System.out.println("Sortiran niz je:");
x.sortirajNizMI();
x.stampajNiz();
int max=x.nadjiMaksimalanClan();
System.out.println("Maksimalan clan niza je: "
+ max);
}
}
Stek
198
Praktikum
// konstruktor
public Stek() {
this.elementi = new int[100];
}
// punjenje steka
public void push(int e) {
elementi[velicina++] = e;
}
// praznjenje steka
public int pop() {
int rezultat= elementi[--velicina];
elementi[velicina] = 0;
return rezultat;
}
// operacija sabiranja
public void add() {
199
Praktikum
// operacija množenja
public void mull() {
int zbir = elementi[velicina-1] *
elementi[velicina-2];
velicina=velicina-1;
elementi[velicina] = 0;
elementi[velicina-1] = zbir;
}
// konstruktor
public Stek() {
this.elementi = new int[100];
}
// punjenje steka
public void push(int e) {
elementi[velicina++] = e;
}
// praznjenje steka
public int pop() {
int rezultat= elementi[--velicina];
elementi[velicina] = 0;
return rezultat;
}
// operacija sabiranja
public void add() {
int zbir = elementi[velicina-1] +
elementi[velicina-2];
200
Praktikum
velicina=velicina-1;
elementi[velicina] = 0;
elementi[velicina-1] = zbir;
}
// operacija množenja
public void mull() {
int zbir = elementi[velicina-1] *
elementi[velicina-2];
velicina=velicina-1;
elementi[velicina] = 0;
elementi[velicina-1] = zbir;
}
}
Zadatak 2:
Koristeći klasu Stek Napisati program u Java programskom jeziku koji će:
Kreirati novi objekat klase Stek.
Izračunari izraz W = (X+Y)*Z za X = 3, Y = 5, Z = 2.
Prikazati vrednost promenljive W na ekranu.
Rešenje
Listing 5.4. - PrimerSaStekom.java
201
Praktikum
String
Zadatak 3
Napisati program koji učitava tekst sa tastature i formira jedan String (npr.
source). Program zatim kreira jos dva Stringa:
1) string1 se dobija eliminisanjem svih karaktera koji nisu cifre iz
stringa source,
2) string2 se dobija zamenom svih parnih cifara stringa source
njihovim nazivima ispisanih između para uglastih zagrada (npr. 2 -
<dva>, 4 - <cetiri> itd.).
Sva tri stringa ispisati na ekranu jedan ispod drugog.
Rešenje
// izracunava string 2
for (int i = 0; i < string1.length(); i++) {
char k = string1.charAt(i);
202
Praktikum
case '0':
temp.append("<nula>");
break;
case '2':
temp.append("<dva>");
break;
case '4':
temp.append("<cetiri>");
break;
case '6':
temp.append("<sest>");
break;
case '8':
temp.append("<osam>");
break;
}
}
}
string2 = temp.toString();
// ispisivanje rezultata
System.out.println("source: " + source);
System.out.println("string1: " + string1);
System.out.println("string2: " + string2);
}
}
Zadatak 4
Napisati program koji prima jedan String koji se sastoji od vše brojeva
odvojenih zarezom (npr., "456,32,44,31,5"), izracunava zbir tih brojeva
(456+32+44+31+5).
Listing5.6. - Zadatak4.java
class Zadatak4 {
public static void main(String arg[]){
int zbir = 0;
String nizBrojeva = "123,56,23,89,33";
String[] brojevi = nizBrojeva.split(",");
203
Praktikum
204
Vežba 6. - Projektovanje klase Student
Cilj vežbe:
a). Definisanje klase
b). Identifikacija polja u klasi prema zadatim uslovima
c). Identifikacija metoda klase prema zadatim uslovima
d). Preklapanje metoda
e). Kreiranje objekata klase i rad sa njima
Listing 6.1.
class Student{
String ime;
String prezime;
String brIndeksa;
String odsek;
String[] ispiti;
205
Praktikum
int[] ocene;
static int indeksNiza = 0;
...
}
Student(){
ispiti = new String[10];
ocene = new int[10];
}
Listing 3.3.
public void postaviIme(String ime){
this.ime = ime;
}
public void postaviPrezime(String prezime){
this.prezime = prezime;
}
public void postaviIndeks(String indeks){
this.brIndeksa = indeks;
}
public void postaviOdsek(String odsek){
this.odsek = odsek;
}
206
Praktikum
207
Praktikum
208
Praktikum
System.out.println("Prezime: "+prezime);
System.out.println("Broj indeksa: " + brIndeksa);
System.out.println("Studijski program: " + odsek);
System.out.println("Student je polozio sledece ispite");
for (int i = 0; i< ispiti.length; i++){
if (ispiti[i]!=null)
System.out.println(""+ispiti[i]+"-----" +
ocene[i]);
}
System.out.println("----------------------------");
}
Zadatak
Napisati program u Java programskom jeziku koji će:
Kreirati nove objekat pera klase Student
Objekat pera treba da ima sledeće karakteristike
ime: Petar
prezime:Petrovic
broj indeksa: 377/89
odesek: poslovna informatika
Student pera položio je sledeće ispite:
Matematika 7
Sociologija 8
Informatika 9
prikazati karakteristike objekta pera
Prikazati ocenu za predmet "Sociologija"
209
Praktikum
class PrimerStudent {
public static void main(String arg[]){
Student pera;
pera = new Student();
pera.postaviIme("Petar");
pera.postaviPrezime("Petrovic");
pera.postaviIndeks("377/89");
pera.postaviOdsek("Poslovna informatika");
pera.polozioIspit("Matematika", 7);
pera.polozioIspit("Sociologija", 8);
pera.polozioIspit("Informatika", 8);
pera.prikazi();
pera.prikazi("Sociologija");
}
}
210
Vežba 7. – Klasa Banka
Zadatak
Klasa Banka ima metodu otvoriRacun() koja otvara novi račun i ubacuje ime
komintenta i broj računa u bazu podataka, metodu povecajUlog () koja
povecava zadati ulog za zadati broj računa i metodu prikaziStanje () koja
prikazuje stanje na datom računu.
class Banka{
public final int BROJ = 100;
String[] komintent;
int[] brojRacuna;
int[][] iznos;
int broj = 0;
int broj1 = 0;
}
public Banka(){
komintent = new String[BROJ];
brojRacuna = new int[BROJ];
iznos = new int[BROJ][2];
}
Metoda otvoriracun()
211
Praktikum
broj++;
}
Metoda povecajUlog()
Metoda prikaziStanje()
JOptionPane.showMessageDialog(null,
"Broj racuna Iznos \n\n" +
sadrzaj, "ime:" + ime,JOptionPane.PLAIN_MESSAGE );
}
212
Praktikum
class Banka{
public final int BROJ = 100;
String[] komintent;
int[] brojRacuna;
int[][] iznos;
int broj = 0;
int broj1 = 0;
public Banka(){
komintent = new String[BROJ];
brojRacuna = new int[BROJ];
iznos = new int[BROJ][2];
}
213
Praktikum
if (brRacuna == iznos[i][0])
sadrzaj = sadrzaj + iznos[i][0] +
" "+ iznos[i][1] + " \n";
}
JOptionPane.showMessageDialog(null,
"Broj racuna Iznos \n\n" +
sadrzaj, "ime:" + ime,JOptionPane.PLAIN_MESSAGE );
}
}
Zadatak:
214
Praktikum
Rešenje
class BankaPrimer{
public static void main (String[] arg){
Banka b = new Banka();
b.otvoriRacun();
b.otvoriRacun();
b.otvoriRacun();
b.povecajUlog();
b.povecajUlog();
b.povecajUlog();
b.povecajUlog();
b.povecajUlog();
b.povecajUlog();
b.povecajUlog();
b.prikaziStanje();
}
}
215
216
Lab. vežba 8. - Nasleđivanje i polimorfizam
Cilj vežbe:
a) Upoznavanje i definisanje apstraktne klase
b) Upoznavanje sa nasleđivanjem klasa
c) Upoznavanje sa polimorfizmom
d) Upotreba redefinisanja metoda
Zadatak
217
Praktikum
Zaposleni p = (Zaposleni)o;
if ( p.getPlata() == this.getPlata() )
return true;
else
return false;
}
218
Praktikum
Zadatak
Napraviti klasu PrimerZaposleni i kreirati dva objekta klase
KancelarijskiRadnik i jedan objekat klase Menadzer i smestiti sve ove objekte
u niz čiji su elementi objekti klase Zaposleni. Izracunati i ispisati plate svih
radnika, ako se zna da je Menadzer radio 200 sati, a kancelarijski radnici 200
odnosno 400 sati.
KancelarijskiRadnik k1 =
new KancelarijskiRadnik("Petar", "Petrovic");
KancelarijskiRadnik k2 =
new KancelarijskiRadnik("Mile", "Milic");
Menadzer m = new Menadzer("Micko", "Mickic");
k1.izracunajPlatu(200);
k2.izracunajPlatu(400);
m.izracunajPlatu(200);
z[0] = k1;
z[1] = k2;
z[2] = m;
if (k2.equals(m)){
System.out.println("Zaposleni "+ m.getIme() +
" i zaposleni " + k2.getIme() +
" imaju iste plate");
} else {
System.out.println("Zaposleni "+ m.getIme() +
" i zaposleni " + k2.getIme() +
" nemaju iste plate");
}
}
}
219
Lab. vežba 9. - Pravljenje grafičkog
korisničkog interfejsa u NetBeans-u
Slika 9.1.
221
Slika 9.2.
Karakteristike možemo da podesimo ako desnim tasterom miša kliknemo na
prozor.
Način prikazaivanja komponenata na prozoru određen je opcijom Set Layout
(slika 9.3.).
Slika 9.3
222
Slika 9.4.
Slika 9.5.
223
Sada je potrebno podesiti svojstva dugmeta i definisati šta će da se desi kada
se mišem klikne na njega.
Kliknuti desnim tasterom miša na dugme, izabrati Events, Mouse i klknuti
mišem na MouseClicked.
U odgovarajućoj datoteci biće dodata metoda:
Slika 9.6.
224
Sada možemo da izvršimo program (Run Run file). U polje poluprecnik
treba uneti odgovarajuću vrednost i klikom na dugme Izracunaj dobijamo
rezultat (slika 9.7).
Slika 9.7.
225
Literatura