You are on page 1of 22

POGLAVLJE 10

OBJEKTNO ORJENTISANO RAZMILJANJE


POJAM APSTRAKCIJE KLASE I UAURENJA

Apstrakcija klase je odvajanje njene implementacije od naina korienja. Detalji


implementacije su uaureni i sakriveni od njenih korisnika. To se naziva uaurenjem.

Java obezbeuje puno nivoa apstrakcije. Pastrakcija klase omoguava odvajanja implementaciju
(nain kako je ona realizovana, na programerski nain) i main njenog korienja od strane korisnika
te klase (druge klase, odn. Njihovi metodi).

Kreator klase opisuje funkcije klase i informie korisnika kako da ih koristi. Tzv. Ugovor klase
(nazivaemo ga i interfejsom klase) daje informaciju o skupu metoda i atributa, tj. polja sa podacima
kojima s emoe pristupita spolja (iz drugih klasa), zajedno sa opisom ovih lanova klase (tj. metoda i
atributa). Korisnik ne mora da zna kako je ta klasa stvarno, programerski realizovana, ve samo kako
da je koristi (tj, da koristi njene metode i atribute).

Detalji te implementacije su sakriveni od korisnika. To se naziva uaurenjem klase (slika 1).

ta to praktino znai? Na primer, elite da dobijete povrinu nekog kruga. Pozivate metod, iz vae
klijentske klase metod getArea() klase Circle. Dobijate njegovu povrinu (ako ste unijeli veliinu
poluprenika), a da pri tom ne znate kako je klasa Circle to izraunala. Njena programska
implementacija vam nije poznata. Vi samo znate kako da koristite njene metode i javne atribute.
Implementacija je sakrivena od vas. Zato se klase esto nazivaju i apstraktnim tipovima podataka.

Apstrakcija klase i uaurenje, su kao dve strane iste medalje. Na primer, analogija apstrakciji klasa je
kompjuter. Svaki komjuter ima glavne komponente koje mi biramo kada kupujemo kompjuter )
nemoraj, diskov, monitor, tatstatura i dr.).

Kada koristimo kompjuter, mi ne mora d aznamo kako te komponente rade. Samo znamo da ih
koristimo. Tako je i sa klasama. Kasu ine mnogi metodi i atribute. Samo jedan deo nji,koji su javni,
su nam dostupni, ali samo po nazivu i argumentima (to su potpisi metoda). Kako su oni programerski
realizovani, nije nam poznato.

Unutaranja implementacija (primena) tih komponenti je skrivena od nas, tj. oni su uaureni. Svaka
komponenta je objekat klase koji predstavlja komponentu. Na primer, disk odreenog kapacitetai
proizvoaa je odreena komponenta, koja je objekat klase koja predstvlaj sve diskove
KOJA JE RAZLIKA IZMEU PROCEDURALNOG I OO PROGRAMIRANJA?

Objektno-orijentisano programiranje omoguava viestruku upotrebu klasa, jer se mogu


koristiti od strane razliitih aplikacija.

Pri upotrebi programa (klase) ComputeLoan program main rauna visinu otplate kredita. To je
problem za nejgovo korienje od strane drugih klasa. Pokuaj da se se proraun prebaci u statike
metode nije pravo reenje jer je porblem u unosu i upotrebu datuma odobravanja kredita. On je
promenljiv, jer je razliit za svaki konkretni kredit (ako nije odobren u istom danu).

Kod tradicionalnog proceduralnog programiranja, koji su voeni akcijama, podaci su odvojeni od


akcija. Program nema promenljivu datumOdobravanjaKredita. Ona samo rauna mesenu ratu na
osnovu unetih podataka: visine kredita, duine trajanja kredita (u godinama) i godinje kamate. Ovako
napisan program se ne moe koristiti u drugim programima.

Nasuprot ovome, objektno-orijentisan program koristi klasu Loan, iji je jedan atribut datum
odobrenja kreditai, definisan kao objekatjava.util.Date. Kod objektno-orijentisanih programa, akcije i
podaci su predstavljeni zajedno u istom objektu. Klasa Laon ima i metode za obraun otplate i
ukupnog duga, a i atribut koji definie datum odobrenja kredita (slika 1). Zato se klasa Loan moe
koristiti od strane raziitih klasa klijenata.

PRORAUN BMI INDEKSA PROCEDURALNIM PROGRAMOM

Proceduralno programiranje je usmereno ka projektovanju metoda.

Klase omoguavaju vie fleksibilnosti i veu modularnost pri razvoju softvera za viestruku upotrebu.
Da bi uporedili prceduralno i objektno-oriujentisano programiranje, reiemo isti problem primenom
obae paradgme programiranja.

Treba napraviti program koji proraunjava masu nekog tela, tj. Prorauna tzv. Indeks mase tele (Body
Mass Index BMI) koji se odreuje na osnovu visine i teine oveka. Odreuje delenjem teine
oveka sa kvadratnim korenom njegove visine. Na osnovu tako dobijene vrednosti BMI odreuje se da
li je mrav, normalan, teak preko normale, i debeo:

BMI Interpretacija teine

BMI < 18,5 mrav

18,5 < BMI < 25,0 normalna

25,0 < BMI < 30,0 teina vea od normale

30,0 < BMI debeo

Objektno-orijentisano programiranje, koje povezuje podatke i metode u objekte, usmereno je na


objekte i operacije nad njima
JAVA PROGRAM JE KOLEKCIJA KOOPERATIVNIH OBJEKATA

Upotreba objekata poboljava viestruku upotrebljivost softvera i olakava razvoj softvera i


njegovo odravanje. Programiranje u Javi podrazumeva razmiljanje izraeno objektima.

Metod getBMI() je metod objekta , te vraa vrednost za BMI odreenog oveka. Kako BMI sadri i
podatke o teini i visini, getBMI() moe da rauna vrednost BMI za taj objekat, tj. Za odreenog
oveka.

Ovaj primer pokazuje prednost objektno-orijentisanog programiranja u odnosu na proceduralno


programiranje. Proceduralno programiranje se usmerava ka metodima, a objektno-orijentisano
programiranje ka objektima i ka operacima nad objektima. Objektno-orijentisan pristup kombinuje
snagu proceduralne paradigme sa dodatom dimenzijom, koja integrie podatke sa operacijama u
objektima.

Kod proceduralnog programiranja, podaci i operacije su odvojeni, to zahteva ubacivanje podataka u


metode. Objektno-orijentisano programiranje postavlja podatke i operacije koje ih koriste u isti
objekat. Objektno-orijentisano programiranje organizuje programe na nain koji odslikava stvarni
svet, u kome su svi objekti sadre i podatke i aktivnosti.

Upotreba objekata poboljava viestruku upotrebljivost softvera i olakava razvoj softvera i njgovo
odravanje. Programiranje u Javi podrazumeva razmiljanje izraeno objektima. Java program se
moe smatrati kolekcijom kooperativnih objekata.
VEZE KLASA: asocijacija, agregacija , kompozicija i nasleivanje
ASOCIJACIJA

Asocijacija je opta binarna veza koja opisuje aktivnosti izmeu dve klase.

Asocijacija je opta binarna veza koja opisuje aktivnosti izmeu dve klase. Na primer, na slici 1 je
prikaya veza izmeu klase Zapoleni i klase Kompanija. Veza ima svoje ima (radi za) i
multiplikatore, koji pokazuju broj objekata sa obe strane veze, Znak * oznaava neodreeni broj.
Pored toga, sa obe strane veze sa moe upisata i uloga klasa u vezi (saposlen i poslodavac) .

Asocijacija se grafiki izraava punom linijom izmeu dve klase. Na slici 2 dat je primer asocijacija
koje povezuju tri klase: Student, Predmet i Nstavnik. Jedna asocijacija je oznaena sa studira a
druga sa predaje, oznaavajui karakter veze. Strelica ukazuje na smer kretanja veze. Jadan
nastavnik moe da predaje do 3 predmeta, a jedan predmet moe da ima jednog nastavnika.

Student moe da studira neogranien broj predmeta, a na jednom predmetu moe da bude od 5 do 60
studenata.

Asocijacija se u Javi prmenjuje definisanjem polja podataka (atributa) i metoda. Na primer, asocijacije
na slici 3 prikazane su (dodue u engleskoj varijanti) i Javi kao to je prikazano na slici 3.

Slika-3: Implementacija asocijacija u Javi

IMPLEMENTACIJ ASOCIJACIJA U JAVI


Asocijacija se u Javi primenjuje definisanjem polja podataka (atributa) i metoda

Asocijacija se u Javi prmenjuje definisanjem polja podataka (atributa) i metoda. Na primer, asocijacije
na slici 3 prikazane su (dodue u engleskoj varijanti) i Javi kao to je prikazano na slici 3.

Asocijacija student studira predmet se primenjuje pozivom metoda addCourse() u klasi Student, a
metoda addStudent() u klasi Course (Predmet).

Asocijacia nastavnik predaje predmet se realizuje dodavanjem metoda addCourse() u klasi Faculty
(Nastavnik), a dodavanjem metoda setFaculty() u klasi Course (Predmet). Klasa Student moe da
koristi listu da memorie listu predmeta (courses) koje student studira, a klasa Course (Predmet) ,oe
da koristi listu da memorie studente koji studiraju predmet, a polje podataka da memorie ime
nastavnika koji predaje predmet.

Ako ne postoji veza asocijacije izmeu dve klase, onda ni jedan metod jedne klase ne moe da poziva
metod druge klase, ili da pristupa javnim atributima druge klase. Ako je to potrebno, onda morate
definisati vezu asocijacije izmeu dve klase.

Asocijacina znai da postoji neki vid komunikacije ozmeu dve klase, tj, da neki metod prve klase
alje poruku drugoj klasi, u kojoj poziva neki od njenih metoda. Poruku ine pozuiv nekog od javnih
metoda druge klase ili pristup javnom atributa druge klase.

Jedan objektno-orijentisan program (aplikacija) ae realizuje tako to njeni objekti razmenjuju poruke,
tj. Pozivaju metdote drugih klasa, preko ijih atributa raymenjuju i podatke. Zato, model klasa
programa najee ini vie klasa meu kojima ima razliitih veza, od kojih su veze asocijacije
najee.

Aplikacija se realizuje izvrenjem pozivanih metoda (tj. realizacijom razmenjenih poruka meu
objektima). orkestracija programa poinje od klase koja sadri main metod, a onda ide u skladu sa
redosljedom pozivanja metoda meu objektima aplikacije.

AGREGACIJA I KOMPOZICIJA
Agregacija je veza vlasnitva izmeu dva oblika. Kompozicija daje eksluzivna prava
vlasnitva nad klasama koje sadri klasa vlasnik. Ne mogu se koristiti od strane drugih klasa.

Agregacija je specijalan oblik asocijacije koji predstavlja vezu vlasnitva izmeu dva objekta. Veza je
tipa sadri (has-a). Objekt koji je vlasnik naziva se objekat agregat. Predmetna (sadrana) klasa se
nezivaagregatirana klasa, a objekat agregatiran objekat. Ovaj objekt moe da bude u vlasnitvu i
drugih klasa. Ako je objekt u iskljuivom vlasnitvu jedne klase, onda se takva veza
naziva kompozicija (slika 4)

Slika-4: Agregacija i kompozicija

Slika -5 : Primjer agregacije i kompozicije

Na slici 5 prikazan je primer veza agregacije i kompozicije izmeu imena studenta, studenta, kao
osobe, i adrese.

Veza izmeu Klase Student i klase Ime je kompozicija jer jedan student moe imati samo jedno ime, i
to ime iskljuivo pripada odreenom studentu, tj. Ime je jedinstveno za svakog studenta.. . S druge
strane, veza izmeu klase Student i klase Adresa je agregacija, jer neki objekti klase adresa mogu da
pripadaju i drugim klasama, tj. objektima agregatima. Do tri studenta mogu da budu na istoj adresi, a
jedan student moe d abude samo na jednoj adresi.

IMPLEMENTACIJA AGREGACIJE I KOMPOZICIJE U JAVI

Veza agregacije se najee primenjuje u obliku polja podataka (atributa) klase agregata.

Veza agregacije se najee primenjuje u obliku polja podataka (atributa) klase agregata. Na
slici 6prikazna je implementacija u Javi veze klasa prikazanih na slici 5.

Relacije student ima ime i student ima adresu se realizuju preko polja podataka
(atributa) name iaddress u klasi Student

Veza agregacije moe da postoji izmeu objekata iste klase. Na primer, neka osoba ima supervizora
(slika 7). U vezi student ima supervizora .supervizor se predstavlja pomou polja podatka (atributa)
u klasi Person.

Ako neka osoba ima vie supervizora, kao to je prikazano na slici 8.a, moete koristiti jedan niz za
memorisanje ovih supervizora., kao to je pokazano na slici 8.b.
Koje su zajednike veze meu klasama?

ta je asocijacija? ta je agregacija? ta je kompozicija?

Kakva je UML notacija za agregaciju i kompoziciju?

Zato se agregacija i kompozicija nazivaju kompozicijama?


TA JE STEK?

Stek (stack) je struktura podataka koja dri podatka po strategiji poslednji uao, prvi izlazi
(last-in, first-out).

Stek ( stack) je struktura podataka koj dri podatka po strategiji poslednji uao, prvi izlazi ( last-in,
first-out). Slika 1 prikazuje nain rada steka (slika 1).

Slika-1: Stek dri podatke po strategiji "poslednji uao, prvi izlazi"

Stekovi se koriste u mnogim aplikacijama. Na primer, kompajleri koriste stek pri obradi metoda koje
pozivaju. Kada s emetod pozove, njegovi parametri i lokalne promenljive se g uraju u stek. Kada neki
metod poziva drugi metod, parametri i lokalne promenljive se ubacuju u stek. Kada metod zavri svoj
rad i kada se vraa onom koji ga je pozvao, njegov prostor veza se oslobaa iz steka. To ynai da iz
steka ispadaju njegovi parametri i lokalne promenljive.

Klasa StackOfIntegers (slika 2) realizuje stek celih brojeva i sadri operacije ya manipulaciju sa njima.

KLASA TESTSTACKOFINTEGERS

Klasa TestStackOfIntegers kreira stek, memorie prvih 10 celih brojeva (1,2,3...9) i prikazuje ih u
obrnutom redosledu.

Listing klase TestStackOfIntegers kreira stek objekat klaseStackOfIntegers , memorie prvih 10 celih
brojeva (1,2,3...9) i prikazuje ih u obrnutom redosledu. OUTPUT : 9 8 7 6 5 4 3 2 1
Kako da pimenimo klasu StackOfInteger? Elementi steka (celi brojevi) se smetaju u niz elements.
Kada se kreira stek, kreira se i ovaj niz. Poetni kontruktor klase kreira i nz elements veliine 16.
Promenljiva size sadri broj celih brojeva u steku, a element na vrhu onda ima indeks size-1. Slika 4
prikazuje stek bez elementa, tj. kada je size=0.

Slika-4: Struktura steka u klasi StackOfIntegers

Primena metoda push(int value) dodaje value u elements[size] ako je size &lt; capacity. Ako je stek
pun, njegov sadraj se prebacuje u novi, duplog kapaciteta.

RAD SA PRIMITIVNIM TIPOVIMA KAO SA OBJEKTIMA


Primenom tzv. klasa omotaa moete bilo koju vrednost primitivnog tipa da
pretvorite u objekat. Klasa omota omotavaju tu vrednost i svojim metodima
omoguava sve operacije koje normalno radimo sa objektima.
KLASE OMOTAI

Vrednost primitivnog tipa nije objekat, ali se moe umotati u objekat primenom klasa
omotaa koje nudi Java API.

Zbog efikasnosti rada, Java ne koristi objekte koji bi predstavljali primitivne tipove podataka (kao na
primer, SmallTalk). Rad sa objektima usporava rad programa, te bi rad sa objektima koji predstavljaju
primitivne tipove podataka znatno se odrazilo na efikasnot programa pisanih u Javi. Meutim, poznato
je da mnogi Javini metodi koriste objekte kao svoje argumente. ta raditi u tim sluajevima, ako su ti
argumenti primitivni tipovi podataka (int, float, double,....).?

Kao odgovor na ovo pitanje Java nudi tzv. Klase omotae koje sadre u sebi primitivne tipove
podataka, ali im obezbeuju operacije (metode) ya rad sa njima, te spolja gledano, oni se ponaaju kao
objekti. Javin paket java.lang obezbeuje sledee klase omotae: Boolean, Character, Double, Float,
Byte, Short, Integer, and Long koje odgovaraju odgovarajuim primitivnim tipovimapodataka.
( boolean, char, double, float, bzte, short, int i long).. Ovde emo koristiti klase
omotaeInteger i Double da bi pokazali upotrebu klasa omotaa.

Slika-1: Klasa omota obezbeuje kontruktore, konstante, metode za knverziju i manipulaciju


razliitih tipova podataka

SVOJSTVA KLASA OMOTAA


Objekat omota se moe kreirati (konstruisati) ili od vrednosti primitivnog tipa ili od tipa string. Klase
omotai nemaju konstruktore bez argumenata.

Objekat omota se moe kreirati (konstruisati) ili od vrednosti primitivnog tipa, ili od tipa string
predstavljene preko svoje numerike vrednosti, na primer: new Double(5.0), new Double("5.0"), new
Integer(5), i new Integer("5").

Klase omotai nemaju konstruktore bez argumenata. Primerci (objekti) klasa omotaa su
nepromenljivi. To znai da kada one kreiraju svoje objekte, ti objekti se ne mogu vie menjati, jer je
njihova unutranja vrednost nepromenljiva. Mogu da se samo unite i kreiraju novi.

Svaka klasa omota sadri dve konstante: MAX_VALUE i MIN_VALUEkoje definiu maksimalne i
minimlne dozvoljene vrednosti koje umotavaju u objekat. U sluaju klase Float i Double,
MIN_VALUE definie najmanje dozvoljenu pozitivnu vrednost tipa float i double. Sledei izkazi
prikazuju najvei ceo broj ((2,147,483,647)), najmanju float vrednost (1.4E45) i najveu vrednost
tipa double (1.79769313486231570e + 308d).

Svaka klasa omota sadri metode doubleValue(), floatValue(), intValue(),


longValue() i shortValue() koje vraaju vrednosti primitivnih tipova: double, float, int, long, ili short. .
Na primer,

new Double(12.4).intValue() vraa 12;


new Integer(12).doubleValue() vraa 12.0;

Klasa String ima metod compareTo() radi uporeivanja dva tekstualna podatka (tj. tipa string).
Numerike klase omotoi takoe sadre metod compareTo() zbog uporeivanja dva broja. Vraaju 1, 0
ili -1, zavisno od toga da li je prvi broj vei, jednak ili manji od drugog. Evo primera:

new Double(12.4).compareTo(new Double(12.3)) vraa 1;


new Double(12.3).compareTo(new Double(12.3)) vraa 0;
new Double(12.3).compareTo(new Double(12.51)) vraa -1;

Numerike klase omotai imaju i koristan statiki metod valueOf(String s). On kreira novi objekat koji
je inicijalizovan sa unetom vrednou s.

METODI KONVERZIJE TIPOVA VREDNOSTI


Svaka klasa omota ima dva metoda za konverziju numerike string vrednosti u odgovarajuu
numeriku vrednost

Metod parseInt() klase I nteger se koristi za konverziju numeriku string vrednost u int vrednost, a
metod parseDouble() klase Double za konverziju numerike string vrednosti u double vrednost.

Svaka klasa omota ima dva metoda za konverziju numerike string vrednosti u odgovarajuu
numeriku vrednost, koje koriste dekadni (10), binarni (2), oktalni (8) ili heksadecimalni sistem (16).

Na primer:

Integer.parseInt("11", 2) vraa 3;
Integer.parseInt("12", 8) vraa 10;
Integer.parseInt("13", 10) vraa 13;
Integer.parseInt("1A", 16) vraa 26;
Integer.parseInt("12", 2) provocira javljanje izuzetka izvrenja jer 12 nije binarni broj.

Obratite panju da moete da konvertujete decimalni broj u heksadecimalni broj primenom metoda
format(). Na primer:

String.format("%x", 26) vraa 1A;

AUTOMATSKA KONVERZIJA PRIMITIVNIH TIPOVA U TIPOVE KLASE OMOTAA

Vrednost primitivnog tipa moe da se automatski konvertuje u objekat upotrebom odgovarajue klase
omotaa, i suprotno, zavisno od konteksta.

Konverzija vrednosti primitivnog tipa u objekat klase prekrivaa, naziva sepakovanje, (engl. boxing).
Inverzna operacija konverzije se naziva raspakovanje (engl. unboxing). Java dozvoljava automatsku
realizaciju ovih operacija. Kompajler e automatsku upakovati vrednost primitivnog tipa u
odgovarajui objekt klase omotaa, ako to kontekst primene zahteva. Isto tako, raspakovae objekt
omotaa ako kontekst zahteva vrednost primitivnog tipa. Takve operacije se onda nazivaju:
automatsko pakovanje (engl- autoboxing) , odn. automatsko raspakovanje (engl.,outounboxing).

Na primer, sledei iskaz u (a) moe se uprostiti u (b) automatskim pakovanjem:

Slika-5: Primer automatskog pakovanja

Razmotrimo sledei primer:


1 Integer[] intArray = {1, 2, 3};
2 System.out.println(intArray[0] + intArray[1] + intArray[2])

U liniji 1, vrednosti primitivnog tipa: 1,2 i 3 su automatski konvertovane i objekta sa new Integer(1), new
Integer(2), i new Integer(3). U liniji 2, objekti intArray[0], intArray[1], I intArray[2] automatski se raspakuju int
vrednosti tipa int.

Proverite da li ste ovo do sada dobro razumeli.

Opiite klase omotae primitivnih tipova podataka.


Da li se svaki od sledeih iskaza moe da komilira?
a. Integer i = new Integer("23");
b. Integer i = new Integer(23);
c. Integer i = Integer.valueOf("23");
d. Integer i = Integer.parseInt("23", 8);
e. Double d = new Double();
f. Double d = Double.valueOf("23.45");
g. int i = (Integer.valueOf("23")).intValue();
h. double d = (Double.valueOf("23.4")).doubleValue();
i. int i = (Double.valueOf("23.4")).intValue();
j. String s = (Double.valueOf("23.4")).toString();
Kako konvertujete ceo broj u string? Kako konvertujete numeriki string u ceo broj? Kako konvertujete
broj tipa double u string? Kako konvertujete numeriki string u vrednost tipa double?
Da li su sledei iskazi tani?
1) Integer x = 3 + new Integer(5);
2) Integer x = 3;
3) Double x = 3;
4) Double x = 3.0;
5) int x = new Integer(3);
6) int x = new Integer(3) + new Integer(4);

Pokaite rezultat sledeeg programskog koda:

public class Test { public class Test {

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

Integer x = new Integer(3);


System.out.println(Integer.parseInt("10"));
System.out.println(x.intValue());
System.out.println(Integer.parseInt("10", 10));
System.out.println(x.compareTo(new Integer(4)));
System.out.println(Integer.parseInt("10", 16));
}}
System.out.println(Integer.parseInt("11"));

System.out.println(Integer.parseInt("11", 10));
public class Test {
System.out.println(Integer.parseInt("11", 16));
public static void main(String[] args) {
}}
Double x = 3.5;

System.out.println(x.intValue());

System.out.println(x.compareTo(4.5));

}}
KLASA STRING
Klasa String je nepromenljiva. Njen sadraj se ne moe promeniti posle formiranja objekta
klase String.
KREIRANJE OBJEKTA KLASE STRING

Klasa String ima 13 konstruktora za kreiranje svojih objekata.

String objekat s emoe kreirati od tekstualne oznake (string literala) ili od niza oznaka ( characters)..
Sledea sintaksa kreira String objekat iz string literala:

String newString = new String(stringLiteral);

stringLiteral je skup poreanih oznaka izmeu duplih znaka navoda . Na primer, sledei iskaz
kreira String objekat pod nazivo message:

String newString = new String(stringLiteral);

Java radi sa string literalima kao sa String objektima. Sledei iskaz je taan:

String message = "Welcome to Java";

Moete kreirati String objekt (ovde ga skraeno zovemo string) upotrebom niza oznaka (tip char). Na
primer, sledei iskaz kreira string Good Day:

char[] charArray = {'G', 'o', 'o', 'd', ' ', 'D', 'a', 'y'};
String message = new String(charArray);

Promenljiva tipa String nosi referencu ka String objeku, koji memorie string vrednosti. Strikno
govorei, String promenljiva, String objekat i string vrednost su razliiti. Meutim, te razlike moemo
da zanemarimo. Da bi pojednostavili stvari, koristimo izraz string umesto izraza String promenljiva ,
String objekta i string vrednosti.

NEPROMENLJIVOST STRING OBJEKATA

Jednom kreiran, String objekat je nepromenljiv, tj. ne moe da mu se promeni sadraj. Moe
samo da se kreira novi i da mu se dodeli ista referenca.

String objekti su nepromenqivi. To znai da kada se jednom kreiraju, ne mogu se promeniti. Mogu
samo da se zamene sa novim. Na primer, sledei kod ne moe da promeni String objekat.

1. String s = "Java";

2. s = "HTML";

Prvi iskaz kreira String objekat sa sadrajem Java i dodeljuje mu referncu s.Drugi iskaz klreira novi
String objekat sa sadrajem HTML i dodeljuje mu referencu s. Iako prvi String objekat i dalj
epostoji (nije uniten) njemu se vie ne moe pristupiti jer je njegova referenca dodeljena novom
objektu, kao to je pokazano na slici 1.

Slika-1: String "Java" postaje nedostupan jer mu je referncu preuzeo string "HTML"
INTERNIRANI STRING

Internirani string je String objekat, ima isti niz oznaka izmeu duplih znaka navoda, ali ima drugu
adresu, tj. referencu.

Kako su String objekti nepromenljivi, JVM upotrebljava isti objekat za strig literale sa istim
redosledom oznaka da bi se poveala efikasnost i utedela memorija. Takav objekat se nazive
interniranim stringom (engl. interned string). Na primer, sledei iskazi:

Slika-2: Primena interniranog stringa

Prikazuje:

s1 == s2 is false

s1 == s3 is true

U gornjim iskazima s1 i s3 se odnose na isti interniran string. Welcome to Java., te je iskaz s1 ==


s3true (istinit). Meutim, s1 == s2 je false (pogrean) jer su s1 i s2 dva posebna stringa , iako imaju
isti sadraj. Ovde se uporeuju adrese (reference) string objekata, a ne njihovi sadraji.

ZAMENA I PODELA STRINGOVA


Metodi replace, replaceFirst i replaceAll vraaju novi string koji je dobijen iz originalnog stringa
(koji se nije promenio).

Klasa String sadri metode koji omoguavaju zamenu i podelu stringova (slika 3)

Slika-3: Metodi klase String

Kada je String objekat kreiran, njegov sadraj se ne moe promeniti. Metodi replace,
replaceFirst, ireplaceAll vraaju novi string koji je dobijen iz originalnog stringa (koji se nije
promenio). Obezbeeno je nekoliko verzija metoda replace da bi se vrila zamena oznaka ili
podstringa sa novom oznakom, ili novim podstringom.

Na primer:

"Welcome".replace('e', 'A') vraa novi string , WAlcomA.


"Welcome".replaceFirst("e", "AB") vraa novi string WABlcome.
"Welcome".replace("e", "AB") vraa novi , WABlcomAB.
"Welcome".replace("el", "AB") returns a new string, WABcome

Metod split() se moe koristiti da izvue deo stringa sa specificarom definicijom. Na primer, sledei
kod:

1. String[] tokens = "Java#HTML#Perl".split("#");

2. for (int i = 0; i < tokens.length; i++)

3. System.out.print(tokens[i] + " ");

OUTPUT : Java HTML Perl


REGULARNI IZRAZ

Regularni izraz je string koji opisuje ablon po kome se uporeuje skup stringova

Kako kontrolisati da li je korisnik uneo ispravan unos podataka, tj. Da je uneo broj, tekst ili neki
poseban broj. Za tu stvrhu se koristi tzv. regularni izraz.

Regularni izraz je string koji opisuje ablon po kome se uporeuje skup stringova. Moete uporediti,
zameniti ili podeliti neki string specificiranjem odgovarajueg ablona (engl. pattern).Ovo je izuzetno
korisna i mona karakteristika klase String.

Metod maches() je vrlo slian metodu equals(). Na primer, sledea dva iskaza su tani, tj. true:

1. "Java".matches("Java");

2. "Java".equals("Java");+ " ");

Meutim, metod maches() je moniji. On moe d auporedi ne samo fiksiran string, ve i skup
stringova koji sledi odreeni ablon. Na primer, sledei iskazi su istiniti (true):

1. "Java is fun".matches("Java.*")

2. "Java is cool".matches("Java.*")

3. "Java is powerful".matches("Java.*")

Java.* u prikazanim iskazima je regularni izraz. On opisuje ablon strigova koji poinje sa strihom
Java koji sledi nula i vili vie oznaka. U navedenim iskazima, podstringovi odgovaraju sa nula ili vie
oznaka.

Sledei iskaz takoe je taan (daje true):

1. "440-02-4534".matches("\\d{3}-\\d{2}-\\d{4}")

Ovde \\d predstavlja pojednianu cifru, a \\d(3) predstavlja tri cifarska mesta.

Metodi replaceAll, replaceFirst, i split mogu da koriste takoe rekularne izrraze. Na primer, sledei
iskaz vraa novi string koji zamenjuje $, + ili #. U stringu a+b$#c sa stringom NNN.

1. String s = "a+b$#c".replaceAll("[$+#]", "NNN");

2. System.out.println(s);

Ovde regularan izraz [$+#] specificira ablon koji sadri $, + i # . Dobijen rezultat je aNNNbNNNNNNc..

DELJENJE STRINGA

Dati iskaz deli string u niz stringova, odvojenih sa znakom odvajanja.

Sledei iskaz deli string u niz stringova odvojenih sa znakom odvajanja ;.

1. String[] tokens = "Java,C?C#,C++".split("[.,:;?]");


2. for (int i = 0; i < tokens.length; i++)

3. System.out.println(tokens[i]);

U ovim izkazima regularan izraz [.,:;?] koji se uparuje sa ., ,, :, ;, ili sa ?. Svaki od ovih oznaka je delilac podele
striga. Prema tome, string je podeljen na Java, C, C#, i C++, koji su memorisani u nizu tokens.

KONVERZIJE IZMEU STRINGOVA I NIZOVA

Metod toCharArray() konvertuje string u niz oznaka.

String se moe konvertovati u bilo koji niz i suprotno. MetodtoCharArray() konvertuje string u niz
oznaka. Na primer, sledei iskaz konvertuje string Java u niz oznaka:

char[] chars = "Java".toCharArray();

Prema ovome, izvrene su sledee konverzije: chars[0] je J, chars[1] jea, chars[2] je v,


i chars[3] je a.

Moete upotrebiti metod:

getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

Koji kopira podstring u string pocev od indeksa srcBeging do indeksa srcEnd-1, stvarajui niz
oznaka dst, polazei od indeksa dstBegin-

Na primer, sledei kod kopira "3720" u "CS3720 od indeksa 2 do indeksa6-1 u niz oznaka dst koji
polazi od indeksa 4:

char[] dst = {'J', 'A', 'V', 'A', '1', '3', '0', '1'};
"CS3720".getChars(2, 6, dst, 4);

Prema ovome, dst postahe niz sa; {'J', 'A', 'V', 'A', '3', '7', '2', '0'} .

Da bi se konvertoval niz oznaka u string, treba koristiti String(char[])konstruktor ili metod


valueOf(char[]). Na primer, sledei iskaz kreira string iz niza upotrebom String konstruktora:

String str = new String(new char[]{'J', 'a', 'v', 'a'});

Sledei iskaz kreira string od niza upotrebom metoda valueOf():

String str = String.valueOf(new char[]{'J', 'a', 'v', 'a'});

KONVERZIJA OZNAKA I NUMERIKIH VREDNOSTI U STRINGOVE

Metod valueOf() konvertuje nekog broja u string.

Za konverziju stringa u vrednost tipa double ili int, moete konvertovati i neku oznaku ili broj u string
korienjem operatora za povezivanje stringa.

Drugi nain za konverziju broja u string je da se upotrebi preotereeni metod static valueOf(). Ovaj
metod se moe koristiti i za konverziju oznake ili niza oznaka u string, kao to je pokazano na slici 4.
Slika-4: Statikim metodi klase Strng za konverziju primitivnih tipova u stringove

Na primer, da bi se konvertovala vrednost tipa Double 5.44 u string, treba upotrebiti:

String.valueOf(5.44)

Vrednost koja se vraa je: string sledeih oznaka: '5', '.', '4', '4'.

FORMATIRANJE STRINGOVA

Metod format() vraa formatizovani string.

Klasa String sadri metod format() koj vraa formatizovan string. Metod se poziva na sledei nain:

String.format(format, item1, item2, ..., itemk)

Metod format() klase String je slian metod printf(). Razlika je u tome to


metod formt() vraa formatizovan string, a metod printf() prikazujeformatizovan string. Na primer,
iskaz

String s = String.format("%7.2f%6d%-4s", 45.556, 14, "AB");


System.out.println(s);

Prokazuje:

Treba napomenuti da iskaz:

System.out.printf(format, item1, item2, ..., itemk);

Je ekvivalentan iskatima:

1. System.out.print(

2. String.format(format, item1, item2, ..., itemk));


ZADACI

Pretpistavimo da su s1, s2, s3 i s4 etiri stringa definisani na sledei nain:

1. String s1 = "Welcome to Java";

2. String s2 = s1;

3. String s3 = new String("Welcome to Java");

4. String s4 = "Welcome to Java";

ta su rezultati sledeih izraza:


a. s1 == s2
b. s1 == s3
c. s1 == s4
d. s1.equals(s3)
e. s1.equals(s4)
f. "Welcome to Java".replace("Java", "HTML")
g. s1.replace('o', 'T')
h. s1.replaceAll("o", "T")
i. s1.replaceFirst("o", "T")
j. s1.toCharArray()

Da bi kreirai string Welcome to Java moete koristiti iskaz:

1. String s = "Welcome to Java";

Ili iskaz:

String s = new String("Welcome to Java");

Koji je bolji? Zato?

ta je rezutat sledeeg koda:

String s1 = "Welcome to Java";


String s2 = s1.replace("o", "abc");
System.out.println(s1);
System.out.println(s2);

Da li bilo koji metod klase String menja sadraj stringa?


Pretpostavimo da je string s kreiran upotrebom new String(). ta jes.lenghth?
Kako s ekonvertuje vrednost tipa char u niz oznaka ili u broj u vidu stringa?
Primenom tzv. klasa omotaa moete bilo koju vrednost primitivnog tipa da pretvorite u objekat. Klasa omot

You might also like