Java Materijal (1)

Embed Size (px)

Citation preview

  • 7/23/2019 Java Materijal (1)

    1/76

    1

    Uvod

    Raunar je sloen sistem koji se sastoji iz puno komponenata. Najvanija komponenta je centralna

    procesorska jedinica. U pitanju je jedan ip iji je posao da izvrava programe.

    Program je lista nedvosmislenih instrukcija koje raunar mehaniki izvrava. Raunar moe da

    izvrava instrukcije koje su napisane u tzv. mainskom jeziku. Svaki tip raunara ima svoj mainski jezik i moe da direktno izvrava samo programe koji su pisani u tom jeziku. (Programe koji su

    pisani u drugim jezicima moe da izvrava samo ako se prevedu u mainski jezik tog raunara.)

    Mainski jezik se sastoji od vrlo jednostavnih isntrukcija koje CPU tog raunara moe direktno da

    izvrava. Sa druge strane, skoro svi programi se piu u programskim jezicima vieg nivoa, kao to

    su Java, Pascal ili C++. Program koji se napie u nekom od ovih jezika ne moe da se direktno

    izvrava na nekom raunaru. On mora da se prvo prevede u mainski jezik. Ovo radi poseban

    program, kompajler. Kompajler uzima program napisan u jeziku vieg nivoa i prevodi ga u izvrni

    program u mainskom jeziku. Ako program treba da se izvri na nekom drugom raunaru, mora da

    se prevede u taj drugi mainski jezik uz upotrebu drugog kompajlera, koji odgovara tom drugom

    tipu raunara.

    Postoji i alternativa za kompajliranje programa pisanog u jeziku vieg nivoa. Umesto da se koristi

    kompajler koji odjednom prevodi program, moete da koristite interpreter, koji prevodi instrukciju

    po instrukciju. Interpreter je program koji se ponaa slino kao CPU, odnosno postoje ciklusi

    vaenja instrukcija i njihovog izvravanja. Interpreter radi u petlji koja stalno ita instrukcije iz

    programa, odluuje da li je potrebno da se ona izvri i ako je potrebno obavlja odgovarajuu

    komandu iz mainskog jezika.

    Postoje interpreteri koji izvravaju jezike vieg nivoa. Na primer, programski jezik LISP radi preko

    interpretera, a ne preko kompajlera.

    Dizajneri Jave su odluili da koriste kombinaciju kompilacije i interpretacije. Programi koji su

    pisani u Javi se kompajliraju u mainski jezik, ali je u pitanju mainski jezik za raunar koji nepostoji u stvarnosti. U pitanju je virtuelni raunar, poznat kao Java virtuelna maina. Mainski kod

    za JVM se naziva bajtkod. Nema nijednog razloga zato Java bajtkod ne bi mogao da se koristi kao

    mainski jezik za pravi raunar. Sun Microsystems su i napravili takav raunar, odnosno procesor.

    Sa druge strane, jedna od najvanijih stvari u Javi je da se Java program moe da izvrava na bilo

    kom raunaru. Sve to na tom raunaru treba da postoji je interpreter za Java bajtkod.

    Za svaki raunar treba da postoji drugi Java bajtkod interpreter, ali kad raunar jednom ima taj

    interpreter, on moe da izvrava bilo koji program pisan u Javi. Isti Java program se moe da izvri

    na bilo kom raunaru koji ima takav interrpreter. Ovo je i jedna od najvanijih karakteristika Jave,

    Isti program moe da se izvrava na razliitim raunarima.

  • 7/23/2019 Java Materijal (1)

    2/76

    2

    Zato biste koristili Java bajtkod? Zato se ne bi distribuisao originalni Java program, koji bi se

    kasnije kompajlirao u odgovarajui mainski jezik. Postoji vie razloga. Prvo, kompajler mora da

    razume Javu, koja je sloeni jezik visokog nivoa. Sam kompajler je sloeni program. Interpreter za

    bajtkod je sa druge strane prilino jednostavan program. Lako je napisati interpterer bajtkoda za

    svaki tip raunara, nakon ega taj interpreter moe da izvri bilo koji Java program. Bilo bi mnogo

    tee napisati Java kompajler za svaki tip raunara.

    Jo jedan razlog je sigurnost. Puno Java programa se preuzimaju preko mree. Ne biste eleli dapreuzmete program koji e otetiti Va raunar. Interpreter bajtkoda se ponaa kao bafer izmeu

    Vas i programa koji ste preuzeli. Vi u sutini pokreete interpreter, koji indirektno izvrava preuzeti

    program. Interpreter moe da Vas zatiti od potencijalno opasnih akcija, koje su deo tog programa.

    Java i Java bajtkod ne moraju obavezno da budu povezani. Program napisan u Javi bi mogao da se

    kompajlira i u neki drugi mainski jezik, realnog raunara. Programi pisani u drugim programskim

    jezicima bi mogli da se kompajliraju u Java bajtkod. Ipak, kombinacija Jave i Java bajtkoda je ono

    to daje nezavisnost platforme, sigurnost i kompatibilnost.

    Objektno orijentisano programiranje

    Objektno orijentisano programiranje je odgovor na softversku krizu iz devedesetih godina pro{logveka. Tada dolazi do nagle ekspanzije primene ra~unara u svim oblastima. Programi postaju sve

    ve}i i slo`eniji. U njihovom razvoju u~estvuje sve ve}i broj programera. Tradicionalni algoritamski

    na~in programiranja ne mo`e da odgovori izazovima koji se tada javljaju. Ovde se pre svega misli

    na mogu}nost kasnijeg odr`avanja softvera. Programi imaju vi{e hiljada linija koda u kojima se

    treba sna}i. Odgovor je bio u objektno orijentisanom programiranju.

    [ta su objekti?

    Sve mo`e biti objekat. Objekti su svuda oko nas. Objektni mogu predstavljati realne ili apstraktne

    stvari. Objekat je va{ pas, sto, knjiga, bicikla sve {to nas okru`uje.

    Objekti iz realnog sveta imaju dve karakteristike, a to su stanje i pona{anje. Stanje Va{eg psapredstavlja njegova boja, ime, rasa i sl. Pona{anje nam govori da li on laje, da li je gladan i sl.

    Softverski objekti su sli~ni ovim objektima iz realnog sveta po tome {to imaju stanje i pona{anje.

    Stanje softverskog objekta se izra`ava njegovim atributima, koji se opisuju preko promenljivih.

    Pona{anje softverskog objekta se implementira preko metoda. Metodi su funkcije (potprogrami)

    koji su pridru`eni jednom objektu.

    Objekti iz realnog sveta mogu da se predstave softverskim objektima. Na primer u programu za

    kontrolu rada elektronske bicikle, se bicikla mo`e predstaviti softverskim objektom, bicikl. Pored

    realnih objekata softverski objekti se mogu koristiti i za predstavljanje apstraktnih stvari. Tako na

    primer, u programiranju GUI-ja (grafi~ki korisni~ki interfejs) se za predstavljanje doga|aja mo`e

    koristiti objekat. Doga|aj mo`e biti klik mi{em, ili pritisak nekog tastera na tastaturi.

    Sve {to jedan softverski objekat zna (stanje) i mo`e da uradi (pona{anje) se predstavlja atributima imetodima koji se u njemu nalaze. Na primer, bicikla iz realnog sveta ima svoje atribute, koji se

    odnose na trenutnu brzinu (10 km/h), broj zup~anika (5) i sl.

  • 7/23/2019 Java Materijal (1)

    3/76

    3

    Objektni dijagrami pokazuju da atributi objekta ~ine njegovo jezgro. Metodi okru`uju to jezgro i

    sakrivaju ga od ostatka programa. Pakovanje atributa objekta i njihova za[tita putem metoda se

    naziva u~aurenjem. Objekat se prema tome, sastoji od jezgra, koje ~ine njegovi atributi i

    membrane, koju ~ine njegovi metodi, preko koje se tom jezgru pristupa.

    U~aurenje promenljivih i metoda je ideja koja programerima pru`a dve osnovne prednosti:

    Modularnost: Izvorni kod objekta se mo`e napisati i kasnije se mo`e odr`avati nezavisno od drugih

    objekata i njihovog koda. Objekat se tako|e mo`e lako proslediti izvan granica sistema. mo`ete

    nekom dati svoju biciklu i ona }e i dalje da radi.Skrivanje informacija: Objekat ima javni interfejs koji drugi objekti koriste za komunikaciju sa

    njim. Objekat mo`e da odr`ava svoje privatne informacije i metode koji se mogu u bilo kom

    trenutku promeniti, a da to ne uti~e na objekte oko njega. Ne morate da poznajete detalje u vezi

    mehanizma sa zup~anicima bicikle, da biste mogli da je koristite.

    ^emu ova pri~a o objektima? Java je ~ist objektno orijentisani jezik. To zna~i da u Javi nijedno

    par~e koda ne mo`e da postoji ako nije deo objekta. U C++-u koji je tako|e objektno orijentisani

    jezik, mogu da postoje i delovi koda koji nisu objektno orijentisani. Ne samo da mogu, nego uvek

    postoji takav kod, jer uvek mora da postoji funkcija main, koja ozna~ava glavni program, a koja

    nije deo nijedne klase.

    Java aplikacije

    Svaka aplikacija pisana u Javi mora da sadr`i klasu, koja defini{e metod po imenu main(). Klasa

    mo`e da ima proizvoljno ime, ali metod koji se u aplikaciji prvi pokre}e je metod po imenu main().

    Obi~no se iz ovog metoda pozivaju druge metode te ili drugih klasa.

    Prva Java aplikacija

    Prva aplikacija je ona koju }ete videti na po~etku rada s abilo kojim programskim jezikom,

    aplikacija koja }e ispisati tekst Zdravo. Evo kako izgleda kod:/**

    * Klasa ZdravoApp implementira aplikaciju koja na

    * standardnom izlazu prikazuje tekst zdravo

    */

    public class ZdravoApp {

    public static void main(String[] args) {

    System.out.println("Zdravo!"); //Prikazuje string

    }

    }

    Program sadr`i definiciju klase ZdravoApp. U ovoj klasi postoji samo jedan metod, metod main().

    Prva linija definicije ovog metoda je uvek:

    public static void main(String[] args)

    U metodu postoji samo jedan izvr{ni iskaz:System.out.println("Zdravo!");

  • 7/23/2019 Java Materijal (1)

    4/76

    4

    Klju~na re~ public u definiciji metoda main ozna~ava da tom metodu mo`e da se globalno pristupi.

    Klju~na re~ static osigurava pristup ~ak i kada ne postoji objekat (instanca) klase ZdravoApp.

    Klju~na re~ void ozna~ava da ovaj metod ne vra}a nikakvu vrednost.

    System je standardna klasa koja podr`ava unos preko tastature i prikazivanje izlaza na ekranu. Ova

    klasa se nalazi u paketu java.lang i mo`e joj se pristupiti samo preko imena klase, System.

    Objekat out predstavlja standardni izlazni tok, u ovom slu~aju ekran monitora. Ovaj objekat je ~lanklase System. Ovaj metod je deklarisan kao static, {to zna~i da mu se mo`e pristupati i kada ne

    postoji instanca klase System.

    println je metod koji pripada objektu out i on {tampa tekst koji se nalazi u zagradama na ekran.

    Program se kompajlira komandom:

    javac ZdravoApp.java

    a izvr{ava komandom

    java ZdravoApp

    Kada se program izvr{i na ekranu treba da se prika`e tekstZdravo

    Komentari u kodu

    Postoji nekoliko mogu}ih vrsta definisanja komentara. Jedan od na~ina je da se se upotrebe dve

    kose crte //. Sve {to sledi iza ovih znakova, a nalazi se u istom redu, smatra se komentarom i to

    kompajler zanemaruje prilikom prevo|enja.

    // ovo je komentar u jednom redu

    Alternativa je da se po~etak komentara ozna~i sa /*, a kraj komentara sa */. Sve {to se nalazi

    izme|u po~etka i kraja komentara kompajler zanemaruje prilikom prevo|enja. Tekst komentara se na

    ovaj na~in mo`e da pro{iri na vi{e redova.

    /* ovo je komentar u

    u vi{e redova

    */

    Komentari koji slu`e za generisanje dokumentacije po~inju znacima /**, a zavr{avaju se kao i

    obi~an komentar sa */. Ovakve komentare zatim ~ita poseban program, javadoc, koji od nje pravi

    dokumentaciju sa hiperlinkovima. Sva dokumentacija koju nalazite na sajtovima vezanim za Java

    kod, je napravljena na ovaj na~in. U okviru ove dokumentacije mogu se koristiti razli~ite HTML

    oznake. Na primer:

    @version - ozna~ava verziju programa

    @author - ozna~ava autora itd.

    Osnove jezika Java

    Podaci i promenljive

    Promenljiva je imenovani deo memorije koji se koristi za sme{tanje informacija u programu. Svaki

    deo memorije kome ste dali ime mo`e da primi sa odre|eni tip podatka. Svaka promenljiva ima

    svoje ime i tip. Preko imena pristupate podatku na koji ta promenljiva ukazuje. tip odre|uje {ta u toj

    promenljivoj mo`e da se na|e i koje su peracije dozvoljene. Kada se jednom defini{e tip promenljive

    u tom delu memorije mogu da se sme{taju samo podaci tog tipa (ceo broj, realan broj, niz karaktera,

    objekat i sl.) Na osnovu zadatog tipa kompajler kasnije mo`e da proverava da ste toj promenljivoj

  • 7/23/2019 Java Materijal (1)

    5/76

    5

    poku{ali da zadate neki drugi tip podatka. Ime i tip se promenljivoj zadaju preko deklaracije. Op{ti

    oblik deklaracije je:

    tip ime

    Pored imena i tipa svaka promenljiva ima i svoj domen. Domen promenljive je deo koda u kome se

    ta promenljiva mo`e da koristi. Domen se implicitno defini{e na osnovu mesta gde se nalazi

    deklaracije promenljive.

    Osnovni tipovi promenljivih

    Celobrojne vrednosti

    Postoje ~etiri tipa promenljivih koji se mogu koristiti za celobrojne vrednosti. Svaki od njih mo`e

    da ima predznak, {to zna~i da mogu da sadr`e pozitivne i negativne brojeve. Ovi tipovi se razlikuju

    po opsegu vrednosti koje mogu da se sme{taju. Evo koji su to tipovi:

    byte - vrednosti mogu biti od -128 do +128 i u memoriji zauzimaju 1 bajt (8 bitova)

    short - vrednosti mogu biti od -32768 do 32767 i u memoriji zauzimaju 2 bajta (16 bitova)

    int - vrednosti mogu biti o -2147483648 do +2147483647 i u memoriji zauzimaju 4 bajta (32 bita)

    long - vrednosti mogu biti od -9223372036854775808 do +9223372036854775807 i u memoriji

    zauzimaju 8 bajtova (64 bita)

    Evo kako izgledaju deklaracije ovih tipova:

    byte najmanjaVrednost;

    short brojac;

    int br;

    long najvecaVrednost;

    U jednom iskazu se mo`e deklarisati i vi{e promenljivih:

    int a, b;

    Prilikom deklaracije se mo`e izvr{iti i inicijalizacija promenljive.

    int a = 1;

    Tipovi sa pokretnim zarezom

    Slu`e za sme{tanje realnih brojeva. Postoje dva tipa, float i double.

    float - vrednosti mogu biti od-3.4x1038 do 3.4x1038 i u memoriji zauzimaju 4 bajta. Vrednosti se

    predstavljaju sa ta~no{}u od 7 cifara.

    double - vrednosti mogu biti od -1.7x10308 do 1.7x10303 i u memoriji zauzimaju 8 bajtova.

    Vrednosti se predstavljaju sa ta~no{}u od 17 cifara.

    Primer:

    float a = 1.5;

    double b = 1.67;

    Znakovne promenljive

    Promenljiva tipa char zauzima u memoriji dva bajta. Vrednost ovakve promenljive je jedan

    karakter, kao {to je A, * , x ili belina (blanko karakter). Vrednost mo`e biti i neki specijalnikarakter, kao {to je tabulator, ili neki od Unicode karaktera koji dolaze iz razli~itih jezika. Kada se

  • 7/23/2019 Java Materijal (1)

    6/76

    6

    karakter unosi u program on se mora uokviriti jednostrukim navodnicima A, *. Navodnici nisu

    deo vrednosti i ne sme{taju se u promenljivu. U pitanju je samo konvencija.

    char c = a;

    Promenljive tipa boolean

    Promenljive ovog tipa mogu da imaju samo dve vrednosti: true (ta~no) i false (neta~no).boolean t = false;

    boolean p = true;

    Primer:public class MaxVariablesDemo {

    public static void main(String args[]) {

    // celi brojevi

    byte najveciByte = Byte.MAX_VALUE;

    short najveciShort = Short.MAX_VALUE;

    int najveciInteger = Integer.MAX_VALUE;

    long najveciLong = Long.MAX_VALUE;

    // realni brojevi

    float najveciFloat = Float.MAX_VALUE;

    double najveciDouble = Double.MAX_VALUE;

    // ostali pritimitivni tipovi

    char c = 'S';

    boolean b = true;

    // prikazivanje

    System.out.println("Najveca vrednost tipa byte je " + najveciByte);

    System.out.println("Najveca vrednost tipa short je " + najveciShort);

    System.out.println("Najveca vrednost tipa int je " + najveciInteger);System.out.println("Najveca vrednost tipa long je " + najveciLong);

    System.out.println("Najveca vrednost tipa float je " + najveciFloat);

    System.out.println("Najveca vrednost tipa double je " + najveciDouble);

    if (Character.isUpperCase(c)) {

    System.out.println("Karakter " + c + " je veliko slovo.");

    } else {

    System.out.println("Karakter " + c + " je malo slovo.");

    }

    System.out.println("Vrednost za promenljivu b je " + b);

    }

    }

    Operatori i zrazi

    Aritmeti~ki operatori

    U tabeli koja sledi su prikazani tipovi i opis aritmeti~kih operatora:

    Operator Upotreba Opis

    + op1 + op2 Sabira op1 i op2

    - op1 - op2 Oduzima op2 od op1

  • 7/23/2019 Java Materijal (1)

    7/76

    7

    * op1 * op2 Mno`i op1 sa op2

    / op1 / op2 Deli op1 sa op2

    % op1 % op2 Ra~una ostatak deljenja op1 sa op2

    Sledi primer AritmetikaDemo u kome se defini{u dve celobrojne promenljive i dva realna broja sadvostrukom precizno{}u i sa njima se obavljaju razli~ite aritmeti~ke operacije.

    public class ArithmeticDemo {

    public static void main(String[] args) {

    //nekoliko brojeva

    int i = 37;

    int j = 42;

    double x = 27.475;

    double y = 7.22;

    System.out.println("Vrednosti promenljivih su...");

    System.out.println(" i = " + i);System.out.println(" j = " + j);

    System.out.println(" x = " + x);

    System.out.println(" y = " + y);

    //sabiranje brojeva

    System.out.println("Sabiranje...");

    System.out.println(" i + j = " + (i + j));

    System.out.println(" x + y = " + (x + y));

    //oduzimanje brojeva

    System.out.println("Oduzimanje...");

    System.out.println(" i - j = " + (i - j));

    System.out.println(" x - y = " + (x - y));

    //Mno`enje brojeva

    System.out.println("Mnozenje...");

    System.out.println(" i * j = " + (i * j));

    System.out.println(" x * y = " + (x * y));

    //deljenje brojeva

    System.out.println("Deljenje...");

    System.out.println(" i / j = " + (i / j));

    System.out.println(" x / y = " + (x / y));

    //Deljenje po modulu

    System.out.println("Deljenje po modulu...");

    System.out.println(" i % j = " + (i % j));

    System.out.println(" x % y = " + (x % y));

    //mesanje tipova

    System.out.println("Mesanje tipova...");

    System.out.println(" j + y = " + (j + y));

    System.out.println(" i * x = " + (i * x));

    }

    }

    Izlaz iz ovog programa je:

    Vrednosti promenljivih su...i = 37

    j = 42

    x = 27.475

  • 7/23/2019 Java Materijal (1)

    8/76

    8

    y = 7.22

    Sabiranje...

    i + j = 79

    x + y = 34.695

    Oduzimanje...

    i - j = -5

    x - y = 20.255

    Mnozenje...

    i * j = 1554

    x * y = 198.37

    Deljenje...

    i / j = 0

    x / y = 3.8054

    Deljenje po modulu...

    i % j = 37

    x % y = 5.815

    Mesanje tipova...

    j + y = 49.22

    i * x = 1016.58

    Kada se kao operandi u jednoj aritmeti~koj operaciji koriste zajedno ceo broj i realan broj, rezultat

    je realan broj. Ceo broj se implicitno konvertuje u realan broj pre samog izra~unavanja. U tabelikoja sledi su prikazani tipovi podataka koji se vra}aju iz aritmeti~kih operacija, na osnovu tipova

    operanada. Potrebne konverzije se vr{e pre {to se obavi operacija.

    Tip podatka za

    rezultatTipovi podataka za operande

    longNijedan od operanada nije float ili double (artiemtika celih brojeva), a

    najmanje jedan od operatora je tipa long.

    int Nijedan od operanada nije float ili double (aritmetika celih brojeva).Nijedan operand nije long.

    double Najmanje jedan operand je tipa double.

    float Najmanje jedan operand je tipa float. Nijedan nije tipa double.

    Postoje i dva operanda koji omogu}avaju skra}eno izra~unavanje. To su operator ++ koji operand

    pove}ava za 1 i operator -- koji operand smanjuje za 1. Oba operatora mogu da se pojave ispred

    operanda (prefiks) i iza operanda (postfiks). Kod verzije prefiks, ++op/--op se prvo operand

    pove}ava za 1, pa se taj rezultat koristi dalje u izrazima. Kod verzije postfix se prvo operand

    primeni u izrazu (stara vrednost), a tek posle se ta vrednost promeni.

    public class Voce

    {

    public static void main(String[] args)

    {

    //deklaracija i inicijalizacija tri promenljive

    int brojNarandzi = 5;

    int brojJabuka = 10;

    int brojVocaka = 0;

    // povecava se broj narandzi i racuna zbir vocaka

    brojVocaka = ++brojNarandzi + brojJabuka;

    System.out.println(Ukupan broj vocaka u programu);System.out.println(Broj narandzi je + brojNarandzi);

    System.out.println(Ukupan broj vocaka je + brojVocaka);

  • 7/23/2019 Java Materijal (1)

    9/76

    9

    }

    }

    Ukupan broj vo}aka je sada 16. Razlog je {to se broj narand`i prvo pove}ao za 1, pa je taj broj u{ao

    u sabiranje.

    Ako se iskaz sabiranja promeni na:

    brojVocaka = brojNarandzi++ + brojJabuka;

    ukupni broj vo}aka je 15, po{to je u sabiranje u{la stara vrednost za broj narand`i, koja je tek

    naknadno pove}ana.

    Relacioni i uslovni operatori

    Relacioni operator poredi dve vrednosti i odre|uje vrednost izme|u njih. Na primer, != vra}a ta~no

    ako dva operanda nisu jednaki. U tabeli koja sledi su dati relacioni operatori:

    Operator Upotreba Vra}a true(ta~no) ako je

    > op1 > op2 op1 ve}e op2

    >= op1 >= op2 op1 ve}e ili jednako od op2

    i)); //true

    System.out.println(" k > j = " + (k > j)); //false, oni su jednaki

    //vece ili jednako

    System.out.println("Vece ili jednako...");

    System.out.println(" i >= j = " + (i >= j)); //false

    System.out.println(" j >= i = " + (j >= i)); //true

    System.out.println(" k >= j = " + (k >= j)); //true

    //manje od

    System.out.println("Manje od...");

    System.out.println(" i < j = " + (i < j)); //true

    System.out.println(" j < i = " + (j < i)); //false

    System.out.println(" k < j = " + (k < j)); //false

  • 7/23/2019 Java Materijal (1)

    10/76

    10

    //manje ili jednako

    System.out.println("Manje ili jednako...");

    System.out.println(" i

  • 7/23/2019 Java Materijal (1)

    11/76

    11

    & op1 & op2i op1 i op2 imaju vrednost ta~no. Uvek se izra~unava i op1 i

    op2.

    | op1 | op2 Ili je op1 ili je op2 true (ta~no). Uvek se izra~Unava i op1 i op2.

    ^ op1 ^ op2ako su op1 i op2 razli~iti, odnosno ako jedan ima vrednost true,

    ali ne oba.

    Koja je razlika izme|u operatora && i &? Razlika je u brzini izvr{avanja programa. Sa operatorom

    & se vrednost drugog operatora uvek izra~unava, dok se sa operatorom && izra~unava vrednost

    prvog operanda, a ako je to dovoljno da se izra~una vrednost celog izraza, drugi operand se ne

    izra~unava.

    Operatori dodele

    Osnovni operator dodele je operator =, kojim se jedna vrednost dodeljuje drugoj.

    U Javi postoje i operatori dodele kojim se odjednom izvr{ava vi{e operacija. Pretpostavimo da

    `elite da saberete vrednost promenljive sa nekim brojem i da rezultat dodelite istoj promenlivoj.Napisali biste:

    i = i + 2;

    Skra}eno se ovo mo`e napisati pomo}u operatora += na slede}i na~in:

    i += 2;

    Prethodna dva izraza su ekvivalentna.

    U tabeli koja sledi su dati neki od operatora ovog tipa:

    Operator Upotreba Ekvivalentno sa

    += op1 += op2 op1 = op1 + op2

    -= op1 -= op2 op1 = op1 - op2

    *= op1 *= op2 op1 = op1 * op2

    /= op1 /= op2 op1 = op1 / op2

    %= op1 %= op2 op1 = op1 % op2

    &= op1 &= op2 op1 = op1 & op2

    |= op1 |= op2 op1 = op1 | op2

    ^= op1 ^= op2 op1 = op1 ^ op2

    Ostali operatori

    U tabeli koja sledi su dati ostali operatori koji postoje u Javi.

    Operator Opis

    ?: Skra}eni iskaz if-else

    []Koristi se za deklarisanje nizova, za kreiranje nizova, i za pristup elementima

    niza.

  • 7/23/2019 Java Materijal (1)

    12/76

    12

    . Koristi se za formiranje kvalifikovanih imena.

    (params) Defini{e se lista parametara. Vrednosti se odvajaju zarezima.

    (tip) Konvertuje se jedan tip u neki drugi.

    new Kreira se novi objekat ili niz.

    instanceof Odre|uje se da li je prvi operator instanca (primerak) drugog

    Operator ?:

    Ovaj operator vra}a op2, ako op1 ima vrednost true (ta~no) ili vrednost op3 ako op1 ima vredcnost

    false (neta~no).

    op1 ? op2 : op3

    Pretpostavimo da imamo dve celobrojne promenljive tipa int, mojeGodine i tvojeGodine. @elimo

    da tre}oj promenljivoj, stariji, dodelimo ve}u od ove dve vrednosti. Evo kako izgleda iskaz:

    stariji = tvojeGodine > mojeGodine ? tvojeGodine : mojeGodine

    Prvi argument ovog operatora je logi~ki izraz tvojeGodine > mojeGodine. Ako taj izraz ima

    vrednost true (ta~no), promenljiva stariji dobija vrednost tvojeGodine, a ako je prvi izraz ocenjen

    kao false (neta~no) promenljiva stariji dobija vrednost mojeGodine.

    Operator []

    Ovaj operator se koristi za deklarisanje nizova i za pristupanje elementima niza.

    float [] realniNiz = new float[10];

    Ovaj izraz deklari{e niz realnih brojeva sa deset elemenata. Sedmom ~lanu niza mo`ete da

    pristupite na slede}i na~in:

    realniNiz[6]

    Operator .

    Ovaj operator se koristi za pristup ~lanovima klase. Vi{e o njemu kada se bude govorilo o klasama.

    Operator ()

    Koristi se prilikom deklarisanja i poziva metoda klase. Vi{e o njemu kada se bude govorilo o

    klasama.

    Operator (tip)

    Vrednost se konvertuje u odre|eni tip.

    (double) a a se pretvara u tip double.

    Operator new

    Koristi se za kreiranje novog objekta ili niza.

    Integer a = new Integer(10);

    U ovom primeru se kreira novi objekat klase Integer.

    Operator instanceof

    Ovaj operator testira da li prvi operator predstavlja priemrak klase koja je data drugim operatorom.

  • 7/23/2019 Java Materijal (1)

    13/76

    13

    op1 instanceof op2

    op1 mora biti objekat, a op2 mora biti ime klase. Objekat je instanca klase ako je primrak ba{ te

    klase ili neke klase koja je iz nje izvedena.

    Prioritet operatora

    Ako se u izrazu na|e vi{e operatora oni se izvr{avaju odre|enim redosledom. U tabeli koja sledi jedat prioritet operatora. Operatori sa najvi{im prioritetom su navedeni prvi, a zatim slede oni sa

    ni`im prioritetom. Ako `elite da promenite prioritet operatora, treba da koristite zagrade.

    postfiks operatori [] . (params) expr++ expr--

    unarni operatori ++expr --expr +expr -expr ~ !

    operatori kreiranja i kovenrzije new (type)expr

    mno`enje * / %

    sabiranje + -

    pomeranje > >>>

    relacioni < > = instanceof

    jednakost == !=

    bitovsko I &

    bitovsko isklju~ivo ILI ^

    bitovsko uklju~ivo ILI |

    Logi~ko I &&

    logi~ko ILI ||

    uslovni ? :

    dodela = += -= *= /= %= &= ^= |= = >>>=

    Logi~ki izrazi

    Osnovni element svih programa je dono{enje odluka. Morate biti u stanju da izaberete izme|u

    razli~itih mogu}nosti, na primer, Ako imam para na ra~unu kupi}u nov auto, a ako nemam kupi}u

    mese~nu kartu za autobus.. Programski se dono{enje odluka realizuje pomo}u relacionih operatora

    i odgovaraju}ih logi~kih izraza.

    Iskaz if

    Iskaz if je elementarni logi~ki izraz. Njegov najjednostavniji oblik je:

    if (izraz)

    iskaz;

    Izraz mo`e biti bilo koji izraz koji daje vrednost true (ta~no) ili false (neta~no). Ako je vrednostizraza true, onda se izvr{ava iskaz koji sledi, u suprotnom ne.

    Primer:

  • 7/23/2019 Java Materijal (1)

    14/76

    14

    if(broj % 2 != 0) //proverava se da li je broj neparan

    ++broj; //ako je neparan, neka postane paran

    Ovaj iskaz se mo`e napisati i na neki drugi na~in, ali se preporu~uje ovakva forma.

    if(broj %2 != 0) ++broj; //ovako ne bi trebalo, mada je mogu}e

    Ako je potrebno da se kao rezultat iskaza if izvr{i vi{e iskaza, a ne samo jedan kao u prethodnom

    primeru, mogu se uporebiti viti~aste zagrade.

    if(izraz){

    iskaz1;

    iskaz2;

    }

    Primer:

    if(broj % 2 != 0){ //proverava se da li je broj neparan

    ++broj; //ako je neparan, neka postane paran

    System.out.println(Broj je pretvoren u paran i njegova vrednost je sada + broj);}

    Ako je izraz ocenjen kao ta~an, izvr{avaju se svi iskazi izme|u viti~astih zagrada, a ako nije, ne

    izvr{ava se nijedan.

    Klauzula else

    Osnovni iskaz if mo`e da se pro{iri klauzulom else.

    if(izraz)

    iskaz1;

    else

    iskaz2;

    Iskaz ili iskazi koji slede iza klauzule elese se izvr{avaju samo u slu~aju da izraz u klauzuli if nije

    ta~an. Ako je potrebno da se u klauzuli else izvr{i vi{e iskaza tako|e se mogu uporebiti viti~aste

    zagrade.

    if(izraz){

    iskaz1;

    }else{

    iskaz2;

    }

    Klauzula else if

    Ukoliko prilikom dono{enja oluke postoji vi{e mogu}nosti, mo`e se upotrebiti klauzula else if.

    if(izraz1)

    iskaz1;

    else if(izraz2)

    iskaz2;

    else if(izraz3)

    iskaz3;

    else

    iskaz4;

  • 7/23/2019 Java Materijal (1)

    15/76

    15

    Ako je vrednost izraza izraz1 ocenjena kao ta~na, izvr{ava se iskaz1. Ako izraz nema vrednost true,

    proverava se vrednost izraza izraz2. Ako je njegova vrednost ta~na, izvr{ava se iskaz iskaz2. Posle

    izvr{enja iskaza iskaz2 program se nastavlja kodom koji sledi iza celog iskaza if. Ako vrednost

    izraza izraz2 nije true, proverava se vrednost izraza izraz3 itd. Ako nijedan od izraza u klauzulama

    else if nije ocenjen kao ta~an (true), izvr{ava se iskaz (iskazi) iza klauzule else, ako ona postoji.

    Primer:public class IfElseDemo {

    public static void main(String[] args) {

    int rezultatTesta = 76;

    char ocena;

    if (rezultatTesta >= 90) {

    ocena = 'A';

    } else if (rezultatTesta >= 80) {

    ocena = 'B';

    } else if (rezultatTesta >= 70) {

    ocena = 'C';

    } else if (rezultatTesta >= 60) {

    ocena = 'D';} else {

    ocena = 'F';

    }

    System.out.println("Ocena = " + ocena);

    }

    }

    Izlaz iz programa je:

    Ocena = C;

    Kao {to vidite vrednost promenljive rezultatTesta mo`e da zadovolji vi{e od jednog uslova, jer je

    76 >= 70, a tako|e je i rezultatTesta >= 60. Ocena je ipak C, zato {to se izvr{ava samo prvi blok

    koda koji pripada izrazu rezultatTesta >= 70. Kada se izvr{i taj blok, kontrola programa prelazi na

    kod iza iskaza if, u ovom slu~aju na iskaz System.out Izrazi koji slede iza izraza koji je bio

    zadovoljen se ne proveravaju, a samim tim se i ne izvr{ava pripadaju}i kod.

    Iskazi if mogu biti ugne`deni. U okviru jednog if iskaza mo`e da se na|e drugi, u okviru tog drugog,

    tre}i itd. Evo kako to izgleda:

    if(izraz1){

    if(izraz1-1){

    if(izraz1-1-1)

    iskaz1-1-1;

    }else iskaz1-1;

    }

    Iskaz switch

    Ovaj iskaz se koristi za uslovno izvr{avanje iskaza na bazi vrednosti celobrojnog izraza. U primeru

    koji sledi je upotrebljen iskaz switch koji na osnovu celobrojne vrednosti mesec {tampa ime

    meseca, na koji promenljiva ukazuje.public class SwitchDemo {

    public static void main(String[] args) {

    int mesec = 8;

    switch (mesec) {

    case 1: System.out.println("Januar"); break;

    case 2: System.out.println("Februar"); break;

  • 7/23/2019 Java Materijal (1)

    16/76

    16

    case 3: System.out.println("Mart"); break;

    case 4: System.out.println("April"); break;

    case 5: System.out.println("Maj"); break;

    case 6: System.out.println("Jun"); break;

    case 7: System.out.println("Jul"); break;

    case 8: System.out.println("Avgust"); break;

    case 9: System.out.println("Septembar"); break;

    case 10: System.out.println("Oktobar"); break;

    case 11: System.out.println("Novembar"); break;

    case 12: System.out.println("Decembar"); break;

    }

    }

    }

    Rezultat ovog programa je Avgust. Isti efekat se mogao posti}i i pomo}u iskaza if:int mesec = 8;

    if (mesec == 1) {

    System.out.println("Januar");

    } else if (month == 2) {

    System.out.println("Februar");

    }

    itd.

    Stvar je li~nog izbora koji }ete od ovih metoda koristiti. Prilikom dono{enja odluke treba imati u

    vidu iskaz switch odluku mo`e da donese samo na osnovu celobrojne vrednosti, dok se u iskazu if

    mogu da koriste razli~iti uslovi.

    Verovatno ste u prethodnom kodu primetili prisustvo iskaza break. Ovaj iskaz se naj~e{}e koristi

    zajedno sa iskazom switch, jer se bez njega kontrola toka programa, nakon izvr{enja pravog iskaza,

    prenosi na slede}i iskaz u switch bloku. Ako se doda iskaz break, onda se kontrola toka, nakon {to

    se izvr{i pravi iskaz, prenosi na kod koji sledi iza iskaza switch.

    Na~in kontrole toka programa u iskazu switch (bez iskaza break) mo`e ponekad i da bude od

    koristi. Evo primera u kome smo to iskoristili:public class SwitchDemo2 {

    public static void main(String[] args) {

    int mesec = 2;

    int godina = 2000;

    int brojDana = 0;

    switch (mesec) {

    case 1:

    case 3:

    case 5:

    case 7:

    case 8:

    case 10:

    case 12:

    brojDana = 31;

    break;

    case 4:

    case 6:

    case 9:

    case 11:

    brojDana = 30;

    break;

    case 2:

    if ( ((godina % 4 == 0) && !(godina % 100 == 0))

    || (godina % 400 == 0) )

    brojDana = 29;else

    brojDana = 28;

    break;

  • 7/23/2019 Java Materijal (1)

    17/76

    17

    }

    System.out.println("Broj dana je " + brojDana);

    }

    }

    Izlaz iz programa je:

    Broj dana je 29

    Ovaj program izra~unava broj dana u mesecu za zadatu godinu i mesec. Kao {to vidite svi mesecikoji imaju 31 dan su bez iskaza break, koji postoji samo kod poslednjeg u nizu. Isto va`i i za mesec

    koji imaju 30 dana (i oni su grupisani i postoji samo jedan iskaz break).

    Ako `elite da se neki iskazi izvr{e u slu~aju da nijedan od case iskaza nije zadovoljen, mo`ete da

    upotrebite klauzulu default. Iskazi koji slede iza ove klauzule se izvr{avaju ako nijedan slu~aj

    (case) nije zadovoljen. Evo kako izgleda prepravljen program iz prvog primera, sada sa dodatom

    klauzulom default:public class SwitchDemo {

    public static void main(String[] args) {

    int mesec = 8;

    switch (mesec) {case 1: System.out.println("Januar"); break;

    case 2: System.out.println("Februar"); break;

    case 3: System.out.println("Mart"); break;

    case 4: System.out.println("April"); break;

    case 5: System.out.println("Maj"); break;

    case 6: System.out.println("Jun"); break;

    case 7: System.out.println("Jul"); break;

    case 8: System.out.println("Avgust"); break;

    case 9: System.out.println("Septembar"); break;

    case 10: System.out.println("Oktobar"); break;

    case 11: System.out.println("Novembar"); break;

    case 12: System.out.println("Decembar"); break;

    default: System.out.println("Niste uneli ispravan broj za mesec");break;

    }

    }

    }

    Petlje

    Petlje se koriste za izvr{avanje dela koda koji se ponavlja. U Javi postoje tri vrste petlji: while, do

    while i for.

    Petlja while

    Ova petlja se koristi za ponovljeno izvr{avanje bloka iskaza sve dok je uslov ta~an. Evo kakoizgleda ta petlja:

    while(izraz){

    iskazi..

    }

    Prvo se izra~unava vrednost izraza. Ta vrednost mora biti tipa boolean. Ako je vrednost izraza true

    (ta~no), izvr{avaju se iskazi koji pripadaju petlji. Posle izvr{avanja iskaza, ponovo se proverava

    vrednost izraza, i ako je ta vrednost true, ponovo se izvr{avaju iskazi. Ovo se ponavlja sve dok je

    vrednost izraza ocenjena kao ta~na (true).

    U primeru koji sledi se pomo}u petlje while ide kroz string. Ovo se ponavlja sve dok se ne nai|e nakarakter g. Svaki karakter koji nije g se dodaje u objekat StringBuffer. Na kraju se rezultuju}i string

    {tampa.public class WhileDemo {

  • 7/23/2019 Java Materijal (1)

    18/76

    18

    public static void main(String[] args) {

    String kopirajOdMene = "Kopiraj ovaj string sve dok se ne " +

    " dodje do slova 'g'.";

    StringBuffer kopirajUMene = new StringBuffer();

    int i = 0;

    char c = kopirajOdMene.charAt(i);

    while (c != 'g') {

    kopirajUMene.append(c);

    c = kopirajOdMene.charAt(++i);

    }

    System.out.println(kopirajUMene);

    }

    }

    Izlaz iz ovog programa je:

    Kopiraj ovaj strin

    Petlja do-while

    Ova petlja je sli~na sa petljom while. Sintaksa za petlju do-while je:

    do{

    iskazi..

    }while(izraz);

    Razlika u odnosu na petlju while je u tome da se kod petlje while uvek prvo proveri vrednost izraza,

    pa se tek u zavisnosti od rezultata izvr{ava telo petlje. Kod petlje do-while se telo petlje uvek

    izvr{ava makar jednom, a tek posle prvog izvr{enja se proverava vrednost izraza.

    Evo kako izgleda prethodni primer, ali sa petljom do-while:

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

    String kopirajOdMene = "Kopiraj ovaj string sve dok se ne " +

    " dodje do slova 'g'.";

    StringBuffer kopirajUMene = new StringBuffer();

    int i = 0;

    char c = kopirajOdMene.charAt(i);

    do {

    kopirajUMene.append(c);

    c = kopirajOdMene.charAt(++i);

    } while (c != 'g');System.out.println(kopirajUMene);

    }

    }

    Petlja for

    Op{ti oblik ove petlje je:

    for(inicijalizacija; uslov_petlje; izraz petlje){

    iskazi

    }

    Deo ozna~en sa inicijalizacija se izvr{ava jednom pre pokretanja petlje. Tu se obi~no inicijalizuje

    broja~ petlje. Izvr{avanje petlje se nastavlja sve dok se uslov_petlje izra~unava kao ta~an. Ovaj

    izraz se proverava na po~etku svakog izvr{enja petlje. Kada njegova vrednost bude false (neta~no),

  • 7/23/2019 Java Materijal (1)

    19/76

    19

    program se nastavlja kodom koji sledi iza petlje. Izraz ozna~en sa izraz_petlje se izvr{ava na kraju

    petlje. Obi~no se tu pove}ava ili smanjuje broja~ petlje za neku zadatu vrednost.

    Primer:Public class ForPetlja{

    public static void main (String[] args){

    int limit = 20; // Trazi se suma od 1 do ove vrednosti

    int sum = 0; // vrednost sume

    for(int i = 1; i

  • 7/23/2019 Java Materijal (1)

    20/76

    20

    Nizovi i stringovi

    Niz je struktura podataka koja se sastoji od zadatog broja stavki, pri ~emu su sve stavke (elementi)

    istog tipa. ^lanovi niza se u Javi uvek numeri{u po~ev od 0. Jedan niz, na primer, mo`e da sadr`i

    100 celobrojnih vrednosti, koje su numerisane od 0 do 99. Niz se deklari{e na slede}i na~in:

    int[] niz;

    Ovo je deklaracija niza. U ovom trenutku niz jo{ uvek nema dodeljenu memoriju.

    U trenutku kreiranja niza se defini{e njegova du`ina i dodeljuje se potrebna memorija. Nizovi u Javi

    su objekti pa se u skladu sa time kreiraju pomo}u operatora new. Iskaz koji sledi zauzima dovoljno

    memorije za niz od deset celobrojnih vrednosti i zatim taj niz dodeljuje promenljivoj niz, koju smo

    ranije deklarisali.

    niz = new int[10];

    Pristup elementima niza

    Elementima niza se pristupa preko imena niza, iza kojeg u uglastim zagradama sledi indeks

    elementa, kome se pristupa. Na primer, iskazniz[4]

    pristupa petom elementu niza.

    Java proverava da li element niza kome pristupate postoji. Ako poku{ate da pristupite nepostoje}em

    elementu niza javi}e se izuzetak tipa IndexOutOfBoundsException.

    Veli~ina (du`ina) niza

    Veli~inu niza }ete dobiti na slede}i na~in:

    imeNiza.length

    Sledi primer koji pokazuje kako se pristupa elementima niza i kako se odre|uje njegova veli~ina.for (int i = 0; i < niz.length; i++) {

    niz[i] = i;

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

    }

    Inicijalizacija nizova

    Elementima niza se mogu odmah u toku definisanja dodeliti vrednosti. Evo kako se to radi:

    boolean[] answers = { true, false, true, true, false };

    Veli~ina niza je u ovom slu~aju odre|ena brojem elemenata. Ako zadajete inicijalne vrednosti niza,

    morate da ih zadate za sve elemente.U primeru koji sledi je pokazano kako se odre|uje element niza sa najve}om vredno{}u.

    public class MaxNiz{

    public static void main (String[] args){

    double[] A = {2., 5., 3., 12.5, 5.3, 17.5};

    double max = A[0];

    for (int i = 1; i < A.length; i++) {

    if (A[i] > max)

    max = A[i];

    }

    System.out.println("Maksimum je " + max);}

    }

  • 7/23/2019 Java Materijal (1)

    21/76

    21

    Kopiranje niza

    Kopiranje niza se vr{i tako {to se u novi niz kopira svaki novi element niza zasebno. Iskazi:

    double [] A = {1.,4..6.};

    double [] B = A;

    ne dovode do kopiranja niza A u niz B. U ovom slu~aju je samo napravljena nova promenljiva B,

    koja ukazuje na isti niz kao i promenljiva A. Ako se `eli kopiranje treba napisati:double[] B = new double[A.length]; //Pravi se novi niz, iste velicine kao

    A

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

    B[i] = A[i]; // Kopira se svaki element iz A u B.

    Vi{edimenzionalni nizovi

    Niz kao elemente mo`e da ima druge nizove.

    Pretpostavimo da `elite da pratite vremenske prilike na 10 razli~Itih geografskih lokacija, tokom

    jedne godine. Ho}ete da merite temperaturu na svakoj od ovih lokacija u toku svakog dana u godini.

    Ovo mo`ete da ostvarite pomo}u niza od 10 elemenata, ~iji je svaki element drugi niz od 365

    ~lanova. Ovakav niz bi se deklarisao na slede}i na~in:

    float [] [] temperatura = new float [10] [365];

    Ovaj niz ima dve dimenzije, pa je zna~i u pitanju dvodimenzionalan niz. Prva dimenzija se kre}e od

    0 do 9 i odnosi se na geografsku lokaciju, a druga se kre}e od 0 do 364 i odnosi se na temperature.

    Ako `elite da uka`ete na temperaturu u toku stotog dana na {estoj lokaciji mo`ete da napi{ete:

    temperatura [5] [99]

    U primeru koji sledi }emo vrednosti za temperaturu generisati po slu~ajnom principu. Uzima}emo

    nasumi~ne vrednosti izme|u -10 i +35 stepeni Celzijusa.public class Vreme {

    public static void main(String[] args) {float[][] temperatura = new float[10][365];

    // generisanje temperature

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

    for(int j = 0; j < temperatura[i].length; j++)

    temperatura [i][j] = (float) (45.0 * Math.random() - 10.0);

    //izracunavanje prosecne vrednosti za temperaturu

    for(int i = 0; i < temperatura.length; i++){

    float prosek = 0.0f; // prosecna vrednost

    for(int j = 0; j < temperatura[i].length; j++)

    prosek += temperatura[i][j];

    //prikaz prosecne temperature za trenutnu lokacijuSystem.out.println("Prosecna temperatura na lokaciji " + (i+1) + " je " +

    prosek/(float) temperatura[i].length);

    }

    }

    }

    Nizovi nizova promenljive du`ine

    Kada su elementi jednog niza drugi nizovi, oni ne moraju biti iste du`ine. Niz se mo`e deklarisati na

    slede}i na~in:

    float primer [] [];

    Ovim se deklari{e niz primer tipa float. Broj elemenata u prvoj dimenziji se mo`e zadti izrazom:primer = new float [6] []; // definicija sest elemenata, od kojih je svaki niz

  • 7/23/2019 Java Materijal (1)

    22/76

    22

    Sada imamo dodeljenih {est elemenata od kojih svaki mo`e da sadr`i jednodimenzionalni niz. Ti

    nizovi se dalje mogu definisati pojedina~no:

    primer[2] = new float [6];

    primer[5] = new float[10];

    Ukoliko bismo hteli da niz primer ima trougaoni oblik, odnosno da prvi element bude niz sa jednim

    elementom, drugi niz sa dva elementa, tre}i niz sa tri elementa itd., mogli biste da napi{ete:for(int i = 0; i < primer.length; i++)

    primer[i] = new float[i+1];

    Niste ograni~eni na dve dimenzije. Niz mo`e da ima i vi{e dimenzija. Na primer niz sa tri dimenzije

    se mo`e deklarisati na slede}i na~in:

    int [] [] [] triDim= new int[3] [] []; // tri dvodimenzionalna niza

    Svaki od ova tri elementa u prvoj dimenziji niza mo`e da sadr`i razli~it dvodimenzionalni niz, tako

    da mo`ete da napi{ete:

    triDim[0] = new int[4] [];triDim[1] = new int[2] [];

    triDim[2] = new int[5] [];

    Dalje bismo mogli da napi{emo:

    triDim[0][1] = new int[3]; //itd

    Nizovi karaktera

    Nizovi koje smo dosada pominjali su bili numeri~ki nizovi. Mnogo ~e{}e od numeri~kih nizova

    }ete koristiti nizove znakova (karaktera). Mo`ete na primer, da deklari{ete promenljivu niza tipa

    char, sa 50 ~lanova:char[] poruka = new char[50];

    Sa nizovima karaktera se obi~no ne radi preko ovakvih nizova. U Javi postoji posebna klasa koja se

    koristi specijalno za rad sa karakterima. To je klasa String. U pitanju je standardna klasa koja dolazi

    zajedno sa Javom.

    String literali

    Do sada smo ve} vi{e puta koristili String literale. Skoro svaki put kada smo koristili iskaz println,

    kao argument smo koristili i string literal. String literal je bilo koja vrednost napisana izme|u

    dvostrukih navodnika:

    Ovo je string literal

    Ovo je konstantan objekat klase String, koji kompajler pravi za upotrebu u programu. Ako u okviru

    Stringa `elite da ubacite i neki specijalni karakter, kao {to je znak za novi red, ili tabulator morate

    da koristite escape sekvencu. Iskaz

    System.out.println(Ovo je \n String konstanta);

    Dodaje novi red kod {tampanja.

    Znak \n je oznaka za novi red. Ovaj kod daje slede}i izlaz:

    Ovo je

    String konstanta

  • 7/23/2019 Java Materijal (1)

    23/76

    23

    Objekti tipa string

    Promenljiva tipa String je u stvari objekat klase String. Ova promenljiva se deklari{e sli~no kao i

    ostale promenljive osnovnih tipova. Ako je potrebno ova promenjiva se mo`e inicijalizovati odmah

    prilikom deklaracije:

    String mojString = Moj prvi string;

    Promenljiva mojString sadr`i referencu na deo memorije u kome se ~uva sam string. Mo`ete danapi{ete:

    mojString = Ovo je drugi string;

    Promenljiva mojString sada ukazuje na drugi deo memorije, sa drugim stringom, a prvi se odbacuje.

    Objekti klase String su nepromenljivi. Ako `elite da promenite sadr`aj stringa morate da odbacite

    staru referencu i da napravite novu. O izbacivanju starog stringa brine sama Java preko skuplja~a

    otpada. To je mehanizam koji objekte i promenljive koji vi{e nisu potrebni, posle izvesnog vremena

    izbacuje iz memorije.

    Promenljiva tipa string mo`e da se inicijalizuje i na null vrednost. Iskaz

    String mojString = null;

    deklari{e promenljivu mojString koja ne ukazuje ni na jedan string. Dobra programerska praksa je

    da stringove kojima `elite da vrednost dodelite kasnije, uvek inicijalizujete na ovaj na~in.

    Operacije nad stringovima

    Spajanje stringova

    Spajanje dva stringa se mo`e ostvariti putem operatora +.

    mojString = Prvi string se spaja + sa drugim;

    Operacijom spajanja stringova preko operatora + se pravi potpuno novi objekat tipa String koji jenezavisan od operanada. Na taj novi objekat ukazuje promenljiva mojString.

    Za spajanje stringova mo`ete da upotrebite i operator +=:

    String fraza = Spajanje je ;

    fraza += moguce izvrsiti i ovako;

    Ovim se ne menja string Spajanje je . String na koji promenljiva fraza ukazuje posle nakon

    izvr{enja drugog iskaza je potpuno novi objekat.

    Primer:public class StringProba {

    public static void main(String[] args) {String prviString = "Puno ";

    String drugiString = "ruku ";

    String treciString = "olaksavaju posao";

    String mojString; // promenljiva za smestaj rezultata

    mojString = prviString + drugiString + treciString;

    System.out.println(mojString);

    // konverzija celih brojeva u string i spajanje sa dva stringa

    int brojRuku = 99;

    mojString = brojRuku + " " + drugiString + treciString;

    System.out.println(mojString);

    //kombinacija stringa i celih brojeva

    mojString = "pedeset pet je " + 5 + 5;

    System.out.println(mojString);

  • 7/23/2019 Java Materijal (1)

    24/76

    24

    // kombinacija celih brojeva i stringa

    mojString = 5 + 5 + " je deset";

    System.out.println(mojString);

    }

    }

    Prvo spajanje je jednostavno i spaja tri stringa. Tri promenljive prviString, drugiString i treciString

    se spajaju i sme{taju u ~etvrtoj promenljivoj mojString.

    Drugo spajanje stringova se odnosi na spajanje celog broja 99 i stringa . Ovde pre samog

    spajanja dolazi do konverzije numeri~ke vrednosti brojRuku u String, nakon ~ega se to spaja sa

    stringom . Razlog je u tome {to je operator + levo asocijativan, pa se parovi kod spajanja

    uskla|uju sa leve strane. Ovo je bitno kod slede}a dva spajanja.

    Iskazi izgledaju sli~no, ali u jednom slu~aju 5 + 5 daje 55, a u drugom 10.

    Razlika je u tome da kod prvog iskaza prilikom sabiranja uvek postoji makar jedan operand tipa

    string, tako da se uvek radi o spajanju stringova. U drugom iskazu je prva operacija matemati~ko

    sabiranje, a rezultat se konvertuje u String da bi se omogu}ilo spajanje sa literalom je 10.

    Pore|enje stringova

    Osnovni tipovi se porede pomo}u operatora ==. Za objekte tipa String (ili bilo koje druge objekte)

    ovo ne va`i. Iskaz

    string1 == string2

    }e proveriti da li ove dve promenljive ukazuju na isti string. Ako referenciraju (ukazuju) na

    razli~Ite stringove, bez obzira na to da li je sadr`aj tih stringova identi~an, ovaj iskaz vra}a false

    (neta~no). Drugim re~ima, ovaj iskaz ne poredi same stringove, ve} reference na stringove.

    Primer:public class PoredjenjeStringova {

    public static void main(String[] args) {

    String string1 = "Suvise " ;

    String string2 = "kolacica";

    String string3 = "Suvise kolacica";

    string1 += string2;

    System.out.println("Test 1");

    System.out.println("string3 je sada: " + string3);

    System.out.println("string1 je sada: " + string1);

    if(string1 == string3){

    System.out.println("string1 == string3 je tacno " + "string1 i string3

    referenciraju na isti string");}else{

    System.out.println("string1 == string3 je netacno " + "string1 i string3

    ne referenciraju isti string");

    }

    // sada string1 i string3 referenciraju na iste stringove

    string3 = string1;

    System.out.println("Test 2");

    System.out.println("string3 je sada: " + string3);

    System.out.println("string1 je sada: " + string1);

    if(string1 == string3){

    System.out.println("string1 == string3 je tacno " + "string1 i string3referenciraju na isti string");

    }else{

  • 7/23/2019 Java Materijal (1)

    25/76

    25

    System.out.println("string1 == string3 je netacno " + "string1 i string3

    ne referenciraju isti string");

    }

    }

    }

    Na po~etku su definisane i inicijalizovane tri promenljive tipa String. Nakon iskaza dodele sadr`aj

    promenljivih string1 i string3 }e biti identi~an, ali pore|enje po jednakosti ipak vra}a false, po{to

    promenljive ukazuju na dva razli~ita stringa.

    Nakon toga smo promenili promenljivu string3, tako da ukazuje na isti objekat kao i string1. U tom

    slu~aju iskaz if se ocenjuje kao ta~an, po{to string1 i string3 ukazuju na isti objekat.

    Ako `elite da uporedite dve promenljive tipa String i da utvrdite da li je njihov sadr`aj identi~an,

    koristi}ete metod equal, klase String. Ovaj metod poredi stringove sa pravljenjem razlike izme|u

    malih i velikih slova. Dva stringa su jednaka ako su iste du`ine, ako imaju isti broj znakova i ako je

    svaki znak u jednom stringu identi~an odgovaraju}em znaku u drugom.

    Ako ne `elite da se pravi razlika izme|u malih i velikih slova, mo`ete da koristite metod

    equalIgnoreCase().

    Primer:public class PoredjenjeStringova1 {

    public static void main(String[] args) {

    String string1 = "Suvise " ;

    String string2 = "kolacica";

    String string3 = "Suvise kolacica";

    string1 += string2;

    System.out.println("Test 1");

    System.out.println("string3 je sada: " + string3);

    System.out.println("string1 je sada: " + string1);

    if(string1.equals(string3)){

    System.out.println("string1.equals(string3) je tacno " + "string1 i

    string3 su jednaki");

    }else{

    System.out.println("string1.equals(string3) je netacno " + "string1 i

    string3 nisu jednaki");

    }

    // razlikuje se velicina slova

    string3 = "SUVISE kolacica";

    System.out.println("Test 2");

    System.out.println("string3 je sada: " + string3);

    System.out.println("string1 je sada: " + string1);

    if(string1.equals(string3)){

    System.out.println("string1.equals(string3) je tacno " + "string1 i

    string3 su jednaki");

    }else{

    System.out.println("string1.equals(string3) je netacno " + "string1 i

    string3 nisu jednaki");

    }

    if(string1.equalsIgnoreCase(string3)){// poredjenje uz zanemarivanje malih i

    velikih slova

    System.out.println("string1.equalsIgnoreCase(string3) je tacno " +

    "string1 i string3 su jednaki, ali ako se ne pravi razlika izmedju malih i

    velikih slova");}else{

    System.out.println("string1equalsIgnoreCase(string3) je netacno " +

    "string1 i string3 nisu jednaki");

  • 7/23/2019 Java Materijal (1)

    26/76

    26

    }

    }

    }

    Pre nego {to se pozabavimo primerom objasni}emo sintaksu koja je vezana za objekte.

    U iskazu if smo pozvali metod equals(), objekta string1. To je ista sintaksa koju smo koristili i za

    poziv metode println, objekta out. Sintaksa za pozivanje metoda nekog objekta je:

    imeObjekta.imeMetoda(lista argumenata odvojenih zarezima)

    Metod equals() zahteva jedan argument, tipa String. U pitanju je string koji se poredi sa originalnim

    objektom. Metod vra}a true (ta~no) ako je vrednost koja mu je prosle|ena (u ovom primeru string3)

    identi~na sa stringom ~iji je metod equals() pozvan. Va`i i obrnuto:

    string3.equals(string1)

    pri ~emu se dobija isti rezultat.

    Metod equalsIgnoreCase() poredi stringove, ali se pri tome zanemaruje razlika izme|u malih i

    velikih slova. U skladu sa tim rezultat poslednjeg pore|enja je true (ta~no) jer se stringovi razlikuju

    samo po velikim i malim slovima.

    Po~etak i kraj stringa

    Metod startsWith() klase String omogu}ava proveru da li neki string po~inje odre|enom

    kombinacijom znakova. Ako je

    string1 = Suvise kolacica;

    onda iskaz

    string1.startsWith(Suv)

    vra}a true. Prilikom pore|enja se vodi ra~una o malim i velikim slovima, tako da iskaz

    string1.startsWith(sUV)

    vra}a false.

    Ako `elite da proverite da li se string zavr{ava nekom kombinacijom karaktera, koristi}ete metod

    endsWith(), klase String. Iskaz

    string1.endsWith(ica) vra}a true. I ovde se pravi razlika izme|u malih i velikih slova.

    Pristup pojedinim znakovima u stringu

    Vrlo ~esto se javlja potreba za pristupom odre|enom znaku ili znacima koji su deo stringa.

    Odre|enom karakteru u stringu se pristupa preko celobrojnog indeksa, koji ozna~ava poziciju znaka

    u stringu, ra~unaju}i od po~etka. Prvi znak u stringu je na poziciji 0, drugi na poziciji 1 itd. Po{to je String objekat, to se i karakterima koji ga ~ine pristupa preko odre|enog metoda. U pitanju je

    metod charAt(). Ovaj metod prihvata argument koji predstavlja poziciju karaktera u stringu,

    odnosno indeks. Ako poku{ate da upotrebite indeks koji je manji od 0 ili ve}i od du`ine niza, desi}e

    se gre{ka u programu.

    Da bi se izbegle gre{ke ovakvog tipa potrebno je poznavati du`inu stringa. U tu svrhu se koristi

    metod length() objekta tipa String.

    U primeru koji sledi je dat program koji analizira odre|eni tekst i odre|uje broj samoglasnika,

    razmaka i slova koji ga ~ine.

    Primer:public class KarakteriStringa {public static void main(String[] args) {

    // string koji se analizira

  • 7/23/2019 Java Materijal (1)

    27/76

    27

    String tekst = "Ovo je tekst koji sluzi za vezbu prilikom pristupanja

    elementima stringa.";

    int razmaci = 0, samoglasnici = 0, slova = 0;// broj razmaka, samoglasnika i

    slova u tekstu

    int duzinaTeksta = tekst.length();

    for (int i = 0; i < duzinaTeksta; i++){

    char ch = Character.toLowerCase(tekst.charAt(i));

    // provera da li je samoglasnik

    if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')

    samoglasnici++;

    // provera da li je slovo

    if(Character.isLetter(ch))

    slova++;

    // provera da li je razmak

    if(Character.isWhitespace(ch))

    razmaci++;

    }

    System.out.println("Tekst sadrzi: samoglasnika - " + samoglasnici + "\n" +

    " suglasnika - " +(slova-samoglasnici) + "\n" +

    " razmaka - " + razmaci);}

    }

    Metod charAt(i) se koristi za odre|ivanje znaka na i-oj poziciji u stringu. Karakter koji se dobija se

    pretvara u malo slovo, radi lak{eg ispitivanja da li je u pitanju samoglasnik. Karakter se u pretvara

    u malo slovo pomo}u metoda toLowerCase() klase Character. Ovo je klasa koja je u Javi unapred

    definisana i slu`i za rad sa karakterima.

    Kasnije se u kodu pomo}u metoda isLetter(), klase Character, proverava da li je u pitanju slovo i

    pomo}u metoda isWhiteSpace() iste klase, da li je u pitanju razmak (blanko karakter).

    Ako `elite da ceo string pretvorite u mala ili velika slova mo`ete uporebiti metode toLowerCase() i

    toUpperCase(), klase String. U tom slu~aju se ceo string pretvara u tekst sa samo malim, odnosno

    samo velikim slovima.String tekst = Ovo su me{ovita slova?;

    String tekstMala = tekst.toLowerCase(); // ovo su samo mala slova

    String testVelika = tekst.toUpperCase(); // ovo su samo velika slova

    Pretra`ivanje stringova u potrazi za odre|enim karakterima

    Ako `elite da u okviru stringa prona|ete odre|eni karakter koristi}ete metode indexOf() i

    lastIndexOf(), koji pripadaju klasu String.int indeks = 0;

    indeks = tekst.indexOf(a);

    U prethodnom iskazu se pretra`uje sadr`aj stringa tekst i to po~ev{i od po~etka. Vra}a se pozicija

    indeksa prvog karaktera a na koji se nai|e. Ako slovo a ne postoji u stringu, vrati}e se -1.

    Oba pomenuta metoda vra}aju ili indeks pojavljivanja karaktera koji se tra`i ili -1, ako karakter nije

    prona|en. Zato je va`no da se uvek proverava da li je vrednost koju vra}aju -1 i da se u zavisnosti od

    toga izvr{avaju dalje akcije.

    Ako `elite da prona|ete poslednje pojavljivanje karaktera a u nizu tekst napisa}ete:indeks = tekst.lastIndexOf(a);

    Ako `elite da prona|ete poziciju znaka koji nije ni na po~etku ni na kraju, mo`ete da koristite

    varijaciju ovih metoda. U ovom slu~aju se metodima {alju dva argumenta. Pored karaktera koji se

    tra`i, zadaje se i pozicija od koje treba da se tra`i.indeks = tekst.index(a, startIndeks);

  • 7/23/2019 Java Materijal (1)

    28/76

    28

    Ovde se tra`i karakter koji je zadat kao prvi argument, ali po~ev od pozicije koja je zadata kao drugi

    argument. U primeru koji sledi se pronalazi prvo pojavljivanje karaktera b, ali iza prvog

    pojavljivanja karaktera a.int aIndeks = -1;

    int bIndeks = -1;

    aIndeks = tekstIndexOf(a);

    if(aIndeks >= 0)

    bIndeks = tekst.indexOf(b, ++aIndeks);

    Ako napi{ete

    indeks = tekst.lastIndexOf(b, aIndeks);

    onda tra`ite poslednje pojavljivanje karaktera b u stringu tekst, ali po~ev od indeksa aIndeks.

    Pretra`ivanje stringova u potrazi za odre|enim potstringovima

    Postoje i verzije metoda indexOf() i lastIndexOf() koje kao argumente prihvataju znakovni podniz.

    U tom slu~aju se tra`i ceo zadati podniz, a ne samo jedan karakter. U svemu ostalom ovi metodi

    rade potpuno isto kao verzije koje smo pomenuli u prethodnom odeljku.

    indeks = tekst.indexOf(ovo je);

    U ovom slu~aju se vra}a pozicija prvog pojavljivanja podstringa ovo je u okviru stringa tekst.

    U primeru koji sledi se pretra`uje zadati string u potrazi za svim pojavljivanjima zadatog

    podstringa. Vra}a se broj pojavljivanja podstringa u okviru glavnog stringa.

    Primer:public class PodstringoviStringa {

    public static void main(String[] args) {

    // string koji se analizira

    String tekst = "Ovo je string koji sluzi za probu. " +

    "U njemu treba proveriti koliko puta se pojavljuje kombinacija 'je'";

    int brojac = 0;// broj pojavljivanjaint indeks = -1; // trenutna pozicija indeksa

    String pod = "je";

    // pretraga unapred po je

    indeks = tekst.indexOf(pod);

    while(indeks >= 0){

    brojac++;

    indeks += pod.length(); // prelaz na poziciju iza poslednjeg slova prvog

    pojavljivanja podstringa

    indeks = tekst.indexOf(pod, indeks);

    }

    System.out.println("Kombinacija je se u nizu pojavljuje " + brojac + "

    puta");}

    }

    Preraditi program, tako da se pretra`ivanje vr{i unazad, pomo}u metoda lastIndexOf().

    Izdvajanje podstringova iz zadatog stringa

    U klasi String postoji metod substring() koji iz niza izdvaja zadati podstring. Postoje dve verzije

    ovog metoda. Jedna iz zadatog stringa vadi podstring, po~ev od zadate pozicije, a kod druge treba

    zadati po~etnu i krajnju poziciju.

    String grad = Novi Sad;

    String poslednjaRec = mesto.substring(5);

    String poslednjaRec nakon izvr{enja ovog iskaza sadr`i tekst Sad. Brojanje indeksa po~inje od 0,

    a u novom podstringu se nalazi i karakter sa te po~etne pozicije.

  • 7/23/2019 Java Materijal (1)

    29/76

    29

    Druga verzija ovog metoda tra`i dva argumenta.

    String segment = mesto.substring(3,6);

    String segment posle izvr{enja ovog iskaza sadr`i tekst i S. Podstring se zavr{ava na jednoj

    poziciji ispred indeksa koji je zadat kao kraj (6-1=5).

    Za razliku od metoda indexOf() kod koje zadavanje indeksa koji je izvan dozvoljenog opsega vra}a

    -1, kod metoda substring, zadavanje indeksa koji je van granica samog stringa, dovodi do pojavegre{ke.

    U primeru koji sledi se pomo}u metoda indexOf() i substring() zadati tekst razdvaja na pojedine

    re~i.

    Primer:public class SubstringPrimer {

    public static void main(String[] args) {

    String tekst = "Ovo je string koji sluzi za probu. " +

    "U njemu treba izdvojiti pojedine reci";

    int count = 0;

    char separator = ' ';

    //odredjivanje broja podnizova

    int indeks = 0;

    do{

    ++count;

    ++indeks; // pomera se na mesto iza poslednje pozicije

    indeks = tekst.indexOf(separator, indeks);

    }while(indeks != -1);

    //izdvajanje podnizova u niz

    String[] subStr = new String[count];// dimenzija niza je prethodno

    odre\ena

    indeks = 0;int endIndeks = 0;

    for(int i = 0; i < count; i++){

    endIndeks = tekst.indexOf(separator, indeks);

    if(endIndeks == -1) //ako ne postoji znak separator

    subStr[i] = tekst.substring(indeks); // izdvaja se do kraja

    else // ako postoji separator

    subStr[i] = tekst.substring(indeks, endIndeks);

    indeks = endIndeks + 1; // pocetak za sledeci ciklus

    }

    // prikaz podnizova, odnosno reci

    for(int i = 0; i < subStr.length; i++){System.out.println(subStr[i]);

    }

    }

    }

    U prvom delu programa smo izbrojili broj reci u zadatom stringu i taj broj kasnije upotrebili za

    definisanje niza. U drugom delu smo, pomo}u metoda substring, vadili iz stringa jednu po jednu

    re~.

    Objekti klase StringBuffer

    Objekti klase String se ne mogu menjati. Ako se `eli da izvede spajanje stringova, da se postoje}i

    string pro{iri ili skrati i sl., treba koristiti klasu StringBuffer. Ove operacije se mogu izvesti ipomo}u klase String, ali je zbog nepromenljivosti ovih objekata cena ve}a. Ve}a cena se ogleda u

    sporijem radu i ve}em zauzimanju memorije.

  • 7/23/2019 Java Materijal (1)

    30/76

    30

    Objekat klase StringBuffer se mo`e napraviti na slede}i na~in:

    StringBuffer primer = new StringBuffer(String za inicijalizaciju);

    Prethodni iskaz kreira objekat klase StringBuffer i inicijalizuje ga stringom String za

    inicijalizaciju. Objekat StringBuffer se mora kreirati uz pomo} klju~ne re~i new. Mogu}e je

    napisati i slede}e:

    StringBuffer mojString = null;

    mojString = new StringBuffer(Novi string);

    Kapacitet objekata StringBuffer

    Objekti klase String imaju dodeljeno onoliko memorije koliko je potrebno za sme{tanje karaktera

    koji se nalaze u tom stringu. Memorija dodeljena ovom objektu se vi{e ne mo`e menjati. Za razliku

    od ovog, memorija koju zauzima objekat klase StringBuffer se mo`e menjati.

    Kada se objekat StringBuffer pravi na osnovu postoje}eg stringa, njegov kapacitet je za 16 ve}i

    du`ine stringa. Kapacitet se ovde izra`ava u karakterima koji mogu da stanu u taj objekat.

    Kapacitet objekta StringBuffer nije fiksan. Prilikom kreiranja ovog objekta mo`ete da eksplicitnozadate njegov kapacitet:

    StringBuffer buf = new StringBuffer(50);

    Ovaj objekat mo`e da uskladi{ti 50 znakova. Ako se prilikom deklaracije izostavi kapacitet, onda se

    koristi podrazumevani kapacitet od 16 znakova. Ne treba brinuti o tome da li objekat StringBuffer

    ima dovoljan kapacitet da primi va{ string, jer se njegov kapacitet automatski prilago|ava veli~ini

    stringa koji u njega treba da se smesti.

    Sa druge strane kapacitet objekta StringBuffer je bitan jer uti~e na upotrebu resursa koji se koriste

    za skladi{tenje i modifikaciju stringova. Ako je po~etni kapacitet suvi{e mali i ako `elite da tu

    ubacite neki ve}i string, onda mora da se zauzme dodatna memorija (da se pove}a kapacite objektaStringBuffer), {to se odra`ava na produ`eno vreme procesa. Efikasnije je, ako je mogu}e, da se

    kapacitet objekta unapred podesi na dovoljnu vrednost, tako da kasnije nisu potrebne promene.

    Dodavanje u objekat klase StringBuffer

    Ako `elite da ne{to dodate na kraj postoje}eg objekta klase StringBuffer koristi}ete metod append.StringBuffer buf = new StringBuffer(Novi bufer);

    buf.append( ovo je dodatak);

    U objektu se nakon ovog nalazi tekst Novi buffer ovo je dodatak. Metod append vra}a pro{ireni

    objekat StringBuffer.

    Postoje razli~ite varijacije metoda append, koje omogu}avaju da se u objekat dodaju i drugiosnovni tipovi. Na primer, iskaziStringBuffer buf = new StringBuffer(Proba );

    buf.append(2.3);

    u objekat buf dodaju tekst 2.3. Argument koji se prosle|uje metodu je tipa double, ali se on pre

    dodavanja pretvara u string i kao takav se dodaje. Sli~ni metodi postoje i za ostale osnovne tipove

    (int, char, boolean).

    Po{to metod append vra}a isti objekat StringBuffer, to je mogu}e koristiti i slede}i iskaz:

    buf.append(dodatak ).append(2.13).append( i ovo je dodatak);

    Umetanje stringova u objekat klase StringBufferMetod append koji smo pomenuli se koristi za dodavanje sadr`aja na kraj bafera. Postoji mogu}nost

    da se novi sadr`aj ubaci i negde u sredinu postoje}eg objekta klase StringBuffer. U tu svrhu se

  • 7/23/2019 Java Materijal (1)

    31/76

    31

    koristi metod insert, klase StringBuffer. Na primer ako se u baferu buf, nalazi tekst Ovo je bafer i

    ako izvr{ite iskaz

    buf.insert(7, dodati );

    onda se u baferu nalazi tekst Ovo je dodati bafer.

    Drugi argument metoda insert mo`e biti i neki od osnovnih tipova, isto kao kod metoda append. I

    ovde se prilikom upotrebe nekog od osnovnih tipova prvo vr{i konverzija tog podatka u string, a tekonda se taj podatak ubacuje u bafer.

    Ostali metodi klase StringBuffer

    Klasa StringBuffer ima metod charAt() koji radi na isti na~in kao i kod klase String, koji smo ve}

    upoznali.

    U klasi StringBuffer postoji i metod setCharAt(), kojim se menja znak na zadatoj poziciji u baferu.

    Metod prima dva argumenta. Prvi je indeks karaktera koji treba zameniti, a drugi je novi karakter.

    buf.setCharAt(3, z);

    Prethodni iskaz menja ~etvrti karakter u baferu i na njegovo mesto stavlja slovo z.

    Postoji i metod za okretanje bafera, odnosno stringa koji se u njemu nalazi. U pitanju je metod

    reverse, koji preokre}e string, po~ev od poslednjeg prema prvom karakteru.

    StringBuffer buf = new StringBuffer(provera);

    buf.reverse();

    Iskaz buf.reverse() vra}a bafer sa sadr`ajem arevorp.

    Vrlo ~esto }e se za same operacije sa nekim stringom koristiti objekat StringBuffer, ali }e na kraju

    biti potrebno da od sadr`aja tog bafera napravimo string. Mo`e biti u pitanju {tampanje ili neka

    druga operacija koja tra`i objekat tipa string. Objekat StringBuffer (kao i svi drugi objekti u Javi)

    sadr`i metod toString, koji vra}a sadr`aj tog bafera, ali sada kao objekat klase String.

    StringBuffer buf = new StringBuffer(proba);

    String izlazIzBafera = buf.toString();

  • 7/23/2019 Java Materijal (1)

    32/76

    32

    Klase i objekti

    Java je programski jezik koji ima puno sli~nosti sa jezikom C++. Ipak Java je jezik koji je vi{e

    objektno orijentisan. C++ sadr`i mnoge elemente koji su tu samo zbog kompatibilnosti sa jezikom

    C, a koji nisu u skladu sa objektnim pristupom.

    Java je sa druge strane potpuno objektno orijentisana. Ako radite u Javi pretpostavlja se da `elite dakoristite samo objektno orijentisano programiranje. U skladu sa ~injenicom da je pravljena kao

    ~isto objektno orijentisani jezik, to je koncepte vezane za objektno programiranje u Javi lak{e

    nau~iti i prihvatiti.

    Svaki programski jezik ima svoje zna~enje pojma manipulacija podacima. Ponekad program mora

    da stalno vodi ra~una o tome kakva je manipulacija u pitanju. Da li se radi direktno sa objektom ili

    se radi sa nekom vrstom indirektne predstave (kao pokaziva~i u C++-u) koja ima specijalnu

    sintaksu.

    U Javi je ovo mnogo jednostavnije. Sve se tretira kao objekat, Koristi se jedinstvena sintaksa. Iako

    se sve tretira kao objekat, identifikator kojim manipuli{ete u stvari predstavlja referencu na

    objekat. Zamislite situaciju kada sedite pred svojim televizorom (objekat) i u ruci dr`ite daljinskiupravlja~ (referenca). Dokle god dr`ite referencu imate vezu sa objektom (televizorom). Kada neko

    zatra`i da promenite kanal, ili da smanjite ton, vi manipuli{ete referencom, koja dalje menja sam

    objekat. Ako `elite da se {etate sobom, a da i dalje kontroli{ete objekat, sa sobom nosite referencu

    (daljinski), a ne sam objekat (televizor).

    Referenca mo`e da postoji i nezavisno od samog objekta. Takva referenca, sa druge strane ne mo`e

    da se koristi.

    Ako napi{ete

    String s;

    vi ste napravili samo referencu na neki objekat klase String, ali jo{ uvek niste toj referenci pridru`ilisam objekat. Da biste mogli da ovu referencu koristite dalje u programu, morate da joj pridru`ite

    neki objekat.

    s = ovo je sada objekat;

    Da biste u programu mogli da koristite neki objekat morate da pre toga imate njegovu definiciju.

    Definicija objekta se naziva klasom. Kada se jednom defini{e klasa, koja opisuje osobine i

    pona{anje nekog objekta, mogu se praviti konkretni primerci te klase. Ovi primerci se ~esto

    nazivaju instancama.

    U definiciji klase mogu da se na|u samo dve stvari:

    polja - promenljive koje skladi{te podatke i koje omogu}avaju da s enapravi razlika izme|u dvaprimerka iste klase.

    metodi - operacije koje se mogu izvoditi sa tom klasom. Metodi obi~no rade sa poljima, odnosno

    promenljivima klase.

    Promenljive u definiciji klasa

    U okviru klase mogu da postoje dve vrste promenljivih. To su promenljive instance i promenljive

    klase.

    Napomenuli smo da klasa predstavlja definiciju objekta, a da se na osnovu te definicije prave

    razli~ite instance (primerci) te klase. Promenljive instance su one promenljive koje su vezane za

    instance klase. Svaka instanca ima svoje vrednosti ovih promenljivih. Ove promenljive razlikujujedan objekat od drugog. Ako biste na primer, imali klasu osoba, sa osobinama visina, te`ina i sl.,

  • 7/23/2019 Java Materijal (1)

    33/76

    33

    svaka instanca te klase, odnosno svaka konkretna osoba bi imali svoje vrednosti za visinu, te`inu i

    ostale sli~ne osobine.

    Promenljive klase je pridru`ena klasi. Ovakve promenljive pripadaju svim instancama te klase.

    U primeru koji sledi se deklari{e klasa Sfera, koja opisuje sferu.public class Sfera {

    //promenljive klase

    static final double PI=3.14;

    static int brojac = 0; // promenljiva klase za brojanje objekata

    //promenljive instance

    double xCentar;

    double yCentar;

    double zCentar;

    double radijus;

    }

    Klasa se u Javi defini{e preko klju~ne re~i class iza koje sledi ime klase. Sama definicija klase,

    odnosno metodi i atributi, moraju biti u okviru zagrada koje slede iza imena klase. Klju~na re~

    public na po~etku prethodnog primera ka`e da se ovoj klasi mo`e da pristupi bilo sa kog mesta uprogramu.

    Kod koji se odnosi na konkretnu klasu treba da bude u datoteci sa istim imenom i ekstenzijom .java.

    Konstanta PI je u prethodnom primeru promenljiva klase. Promenljive klase se deklari{u preko

    klju~ne re~i static. Ako ne `elite da se vrednost neke promenljive kasnije u programu menja,

    odnosno ako `elite da to kompajler proverava i zabranjuje, mo`ete tu promenljivu deklarisati sa

    final, {to je i ura|eno u prethodnom primeru. To zna~i da svaki naredni iskaz koji bi poku{ao da

    promeni vrednost za promenljivu PI, ne bi bio ispravan. Ovo bi trebalo koristiti za sve konstante

    koje imate u programu.

    Slede}a promenljiva je tako|e definisana kao promenljiva klase (static). Ovo je promenljiva koju}emo koristiti za brojanje koliko je instanci te klase napravljeno u programu. Svi objekti klase Sfera

    }e imati samo jednu kopiju promenljivih PI i brojac.

    Naredne ~etiri promenljive su promenljive instance. Svaka instanca te klase }e imati svoje primerke

    promenljivih xCentar

    Metodi klase

    Promenljive klase opisuju stanje objekta, ali nisu dovoljne za funkcionisanje same klase. Mora

    postojati neki na~in da se sa tom klasom ne{to i uradi, a to se ~ini preko metoda.

    Metoda je blok koda koji ima svoje ime i koja se mo`e izvr{avati vi{e puta sa razli~itih mesta u

    programu. Pomo}u metoda mo`ete da slo`ene stvari razlo`ite na zbir manjih, kojima je lak{erukovati. Metoda se poziva preko njenog imena i mo`e, ali ne mora da vrati vrednost. Osnovna

    struktura metode je:

    povratni_tip imeMetode(arg1, arg2, .. argn){

    }

    Za metodu se mo`e definisati povratni tip koji se vra}a posle njenog izvr{enja. Ako ne `elite da

    metoda vra}a vrednost, onda njen povratni tip treba zadati kao void.

    Metodi se mogu proslediti odre|eni argumenti, koji se u telu metode koriste za neka izra~unavanja.

    Metoda mo`e, ali ne mora da ima argumente. Broj argumenata je proizvoljan.

    Povratna vrednost iz metode

    Povratna vrednost se iz metoda vra}a preko iskaza return. Na primer, iskaz

  • 7/23/2019 Java Materijal (1)

    34/76

    34

    return povratnaVrednost;

    vra}a vrednost promenljive povratnaVrednost.

    Nakon izvr{enja iskaza return, program nastavlja sa radom tamo odakle je metoda pozvana. Metode

    koje vra}aju vrednost moraju da u telu metode imaju iskaz return. U metodi mo`e da postoji vi{e

    iskaza return, naravno ako to zahteva logika samog programa.

    Klju~na re~ return mo`e da se upotrebi i sama, bez ikakve promenljive. Ovo se koristi u metodamakoje ne vra}aju vrednost.

    Lista argumenata

    Izme|u zagrada koje slede iza imena metode se nalazi lista argumenata. Svaki argument mora da

    ima svoj tip. Ovo su vrednosti koje se metodi prosle|uju u trenutku njenog poziva i koje ona dalje

    interno koristi.

    public class mojaKlasa(){

    public int mojaMetoda(int a, double b){

    int c;

    return c;}

    }

    Argumenti koji se prosle|uju metodi mogu imati neki od osnovnih tipova (int, float, double), ali

    mogu biti i drugi objekti. Ako se radi o osnovnim tipovima, onda se argumenti prosle|uju po

    vrednosti. To zna~i da se za promenljivu koja se prosle|uje metodi u trenutku poziva, pravi nova

    kopija, sa kojom dalje ta metoda manipuli{e. To dalje zna~i da metoda ne mo`e da promeni

    vrednost promenljive u programu koji je tu metodu pozvao.

    Na primer, ako negde u kodu ka`eteint c = 3;

    double d = 5.;

    mojaMetoda(c, d);

    onda {ta god radili sa argumentom a u samoj metodi, to ne mo`e da promeni vrednost promenljive c

    u programu koji je tu metodu pozvao.

    Ovo ne va`i za objekte koji se prosle|uju meetodama. Objekti se prosle|uju po referenci, tako da

    metoda mo`e da promeni objekat, a to se vidi u u programu iz kojeg je metoda pozvana.

    Kao {to postoje dve vrste promenljivih u klasi, tako postoje i dve vrste metoda. To su metode klase

    (deklarisane preko klju~ne re~i static) i metode instance. Ako se vratimo na klasu Sfera koju smo

    ranije po~eli da defini{emo:public class Sfera{

    // definicija kao i ranije

    public static int getBrojac(){

    return brojac;

    }

    }

    Ovo je metoda klase. Za sve instance te klase, postoji samo jedan primerak ove metode, {to i jeste

    cilj, jer ta metoda vra}a broj instanci klase koji je napravljen. U okviru metoda static ne mo`ete da

    pristupate nijednoj od promenljivih instanci, jer ta metoda postoji dok jo{ nije napravljen nijedan

    objekat, tako da ne mora da postoji nijedna promenljiva instance.

    Pristupanje ~lanu (atributu) klase u metodi

    U metodu instance mo`ete da pristupite bilo kom podatku koji je ~lan te klase. Pro{iri}emo maloklasu Sfera, tako {to }emo dodati metodu za izra~unavanje zapremine.public class Sfera {

    //promenljive klase

  • 7/23/2019 Java Materijal (1)

    35/76

    35

    static final double PI=3.14;

    static int brojac = 0; // promenljiva klase za brojanje objekata

    //promenljive instance

    double xCentar;

    double yCentar;

    double zCentar;

    double radijus;

    // staticka metoda klase koja vraca broj napravljenih objekata

    public static int getBrojac(){

    return brojac;

    }

    // metoda instance koja racuna zapreminu

    double zapremina(){

    return 4.0/3.0 * PI * radijus* radijus* radijus;

    }

    }

    Metoda zapremina je metoda instance. Ona nema ulazne argumente, ali vra}a vrednost tipa double,

    u ovom slu~aju zapreminu sfere. U metodu se za izra~unavanje zapremine koristi promenljiva

    instance radijus.

    Promenljiva this

    Svaka metoda instance ima promenljivu this, koja se odnosi na trenutni objekat za koji je metoda

    pozvana. Kompajler implicitno koristi ovu promenljivu kada se pristupa promenljivim instance te

    klase. Na primer, iskaz za vra}anje zapremine u definiciji klase Sfera bi mogao da izgleda ovako:return 4.0/3.0 * PI * this.radijus* this.radijus* this.radijus;

    Stvar je va{eg izbora da li }ete koristiti promenljivu this ili ne u svojim metodima.

    Lokalne promenljive

    Ako u samoj metodi zadate neke promenljive koje se koriste samo u njoj, te promenljive su lokalneza tu metodu. @ivotni vek tih promenljivih je `ivotni vek metode. Kada se napusti metoda te

    promenljive prestaju da postoje. Skuplja~ otpada u Javi brine o tome da se oslobodi memorija koju

    su te promenljive zauzimale.

    Ako biste na primer, definisali funkciju za promenu radijusa sfere, ona bi mogla da izgelda ovako:void promenaRadijusa (double radijus){

    this.radijus = radijus;

    }

    Promenljiva this.radijus ukazuje na promenljivu radijus u instanci, a promenljiva radijus na ulazni

    parametar.

    Inicijalizacija ~lanova klase

    Prilikom definisanja ~lanova klase mo`e se izvr{iti i njihova inicijalizacija. Dobra programerska

    praksa je da se sve promenljive prilikom deklaracije inicijalizuju.public class Sfera {

    //promenljive klase

    static final double PI=3.14;

    static int brojac = 0; // promenljiva klase za brojanje objekata

    //promenljive instance

    double xCentar = 10.0;

    double yCentar= 10.0 ;

    double zCentar = 10.0;

    double radijus = 5.0;

    }

  • 7/23/2019 Java Materijal (1)

    36/76

    36

    Ako je prilikom inicijalizacije potrebno izvr{iti odre|ena izra~unavanja mo`ete da koristite blok za

    incijalizaciju. Blokovi za incijalizaciju se ozna~avaju viti~astim zagradama, izme|u kojih se

    stavljaju iskazi koji treba da se izvr{e.

    Postoje stati~ki i obi~an blok za incijalizaciju. Stati~ki blok za incijalizaciju se deklari{e klju~nom

    re~i static ispred viti~astih zagrada. Ovakav blok se izvr{ava jednom, prilikom u~itavanja klase i u

    njemu se obi~no inicijalizaciju stati~ki ~lanovi klase.

    Nestati~ki blok za inicijalizaciju se izvr{ava jednom prilikom kreiranja svake instance klase i u

    njemu mogu da se inicijalizuju promenljive instance.

    Primer:public class ProbaInicijalizacije{

    static int[] values = new int[10];

    double fl;

    // blok za incijalizaciju

    static{

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

    values[i] = i;

    }

    // nestaticki blok za inicijalizaciju{

    fl = 28.0;

    }

    }

    Konstruktori

    U svakoj klasi postoji jedna ili vi{e specijalnih metoda, tzv. konstruktora. Ako prilikom definisanja

    klase ne zadate nijedan konstruktor, kompajler }e sam napraviti jedan, prazan, podrazumevani

    konstruktor. Osnovna namena konstruktora je da obezbedi sredstva za inicijalizaciju promenljivih

    instanci. Konstruktor se izvr{ava prilikom kreiranja instance klase. Ako u klasi postoje blokovi za

    incijalizaciju, oni se izvr{avaju pre konstruktora.Konstruktor ima dve osobine koje ga razlikuju od ostalih metoda klase:

    Konstruktor nikada ne vra}a vrednost, tako da se za njega ne zadaje povratni tip (pa ni void)

    Konstruktor uvek ima isto ime kao klasa.

    Primer:public class Sfera {

    //promenljive klase

    static final double PI=3.14;

    static int brojac = 0; // promenljiva klase za brojanje objekata

    //promenljive instance

    double xCentar;

    double yCentar;

    double zCentar;

    double radijus;

    // konstruktor

    Sfera(double rad, double x, double y, double z){

    radijus = rad;

    xCentar = x;

    yCentar = y;

    zCentar = z;

    brojac++;

    }

    // staticka metoda klase koja vraca broj napravljenih objekatapublic static int getBrojac(){

    return brojac;

    }

  • 7/23/2019 Java Materijal (1)

    37/76

    37

    // metoda instance koja racuna zapreminu

    double zapremina(){

    return 4.0/3.0 * PI *radijus * radijus * radijus;

    }

    }

    U gornjem primeru je konstuktor uokviren.

    Kao {to vidite konstruktor ima isto ime kao klasa i nema odre|en povratni tip. Konstruktor mo`e daima vi{e agumenata, ali ne mora da ima ni jedan. U ovom slu~aju postoje ~etiri argumenta i svaki

    od njih se koristi za inicijalizaciju odre|ene promenljive instance. Poslednja akcija u konstruktoru je

    da se uve}a brojac, koji broji instance klase Sfera.

    Kreiranje objekata klase

    Kada se negde u kodu deklari{e promenljiva tipa Sfera, iskazom:

    Sfera lp;

    ne poziva se nikakav konstruktor. Ovde se ne prave nikakvi objekti. Sve {to se uradili je da ste

    napravili promenljivu lp, koja mo`e da sadr`i jedan objekat tipa Sfera, ako ga budemo nekada

    pravili. Da biste napravili instancu klase, morate da upotrebite klju~nu re~ new, iza koje sledi pozivkonstruktora. Za na{u klasu Sfera to mo`e da izgleda ovako:lp = new Sfera(10.0, 1.0, 1.0, 1.0);

    Nakon izvr{enja ovog iskaza postoji objekat Sfera sa polupre~nikom 10.0, ~iji je centar ta~ka sa

    koordinatama 1.0. Promenljiva lp se nakon ovog iskaza pona{a kao referenca na objekat.

    Ako biste sada napisaliSfera josLp = lp;

    nova promenljiva josLp ukazuje na isti objekat kao i promenljiva lp. Jo{ uvek postoji samo jedan

    objekat (instanca), ali postoje dve promenljive koje na njega ukazuju.

    ^injenica da su promenljiva i objekat razdvojeni ima uticaj na na~in na koji se metodi prosle|ujuobjekti kao argumenti.

    Prosle|ivanje objekata metodi

    Objekti se metodama prosle|uju po referenci. To zna~i da se u metodu ne radi sa kopijom objekta,

    kao kada se prosle|uju promenljive osnovnih tipova, ve} se radi sa istim objektom. To dalje zna~i

    da }e ako u metodu do|e do neke promene objekta, ta promena imati uticaja i na osnovni objekat

    koji je metodu prosle|en.

    Primer:

    Datoteka SferaMain.java

    public class SferaMain {

    public static void main(String[] args) {

    Sfera sf = new Sfera(10., 1.0, 1.0, 1.0);

    System.out.println("Radijus sfere je " + sf.getRadijus());

    promenaObjekta(sf);

    System.out.println("Radijus sfere je " + sf.getRadijus());

    }

    static void promenaObjekta(Sfera sf){

    sf.setRadijus(12.0);

    }

    }

    Datoteka Sfera.javapublic class Sfera {

    //promenljive klase

    static final double PI=3.14;

  • 7/23/2019 Java Materijal (1)

    38/76

    38

    static int brojac = 0; // promenljiva klase za brojanje objekata

    //promenljive instance

    double xCentar;

    double yCentar;

    double zCentar;

    double radijus;

    // konstruktor

    Sfera(double rad, double x, double y, double z){

    radijus = rad;

    xCentar = x;

    yCentar = y;

    zCentar = z;

    brojac++;

    }

    // staticka metoda klase koja vraca broj napravljenih objekata

    public static int getBrojac(){

    return brojac;

    }

    // metoda instance koja racuna zapreminu

    double zapremina(){

    return 4.0/3.0 * PI *radijus * radijus * radijus;}

    public void setRadijus(double rad){

    this.radijus = rad;

    }

    public double getRadijus(){

    return this.radijus;

    }

    }

    U ovom primeru smo prikazali dve klase. Jedna je klasa Sfera koju smo ve} koristili, ali sada

    dopunjena metodama setRadijus() i getRadijus(). Ove metode slu`e za promenu atributa radijus i za

    njegovo va|enje iz klase.

    Druga klasa je SferaMain, koja nam slu`i za izvr{enje ovog programa. Obratite pa`nju na njenu

    metodu promenaObjekta(). U ovoj metodi se menja radijus objekta koji se metodi prosle|uje kao

    argument. Po kasnijoj {tampi se vidi da promena radijusa u metodi, menja radijus i u objektu koji je

    metodi prosle|en.

    @ivotni vek objekta (instance)

    @ivotni vek objekta je odre|en promenljivom koja na taj objekat referencira. Ako imate deklaraciju

    Sfera sf = new Sfera(10.0, 1.0, 1.0, 1.0)

    onda objekat sf postoji sve dok postoji promenljiva sf. To }e biti na kraju oblasti u kojoj se ova

    deklaracija nalazi.

    Na isti objekat mo`e da referencira vi{e promenljivih. U tom slu~aju objekat postoji sve dok postoji

    i poslednji objekat koji na njega ukazuje.

    Ako se napi{e iskaz

    sf = null;

    onda promenljiva sf vi{e ne ukazuje na objekat, tako da taj objekat mo`e biti uni{ten (pod

    pretpostavkom da nema drugih promenljivih koje na njega ukazuju.

    Proces izbacivanja objekata koji se u programu vi{e ne koriste se naziva skupljanjem otpada

    (garbage collection). Ovo skupljanje otpada se u Javi odvija automatski. To ipak ne zna~i da objekti

    istog trenutka kada se vi{e ne koriste i nestaju iz memorije, pa samim tim ta memorija ne mora da

    bude odmah na raspolaganju. U pitanju je proces koji nije pod va{om kontrolom, tako da o njemu

    ne treba mnogo brinuti.

  • 7/23/2019 Java Materijal (1)

    39/76

    39

    U primeru koji sledi smo pokazali kako se koristi klasa Sfera koju smo napravili.

    Primer:

    Datoteka SferaMain.java

    public class SferaMain {

    public static void main(String[] args) {

    System.out.println("Broj objekata je " + Sfera.getBrojac());Sfera lp = new Sfera(4.0, 0.0, 0.0, 0.0);

    System.out.println("Broj objekata je " + lp.getBrojac());

    Sfera lp1 = new Sfera(12.0, 1.0, 1.0, 1.0);

    System.out.println("Broj objekata je " + Sfera.getBrojac());

    System.out.println("Zapremina sfere lp je " + lp.zapremina()