java materijal

Upload: daniel-dimitrov

Post on 30-May-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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!");

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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);

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    10/76

    10

    //manje ili jednako

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

    System.out.println(" i

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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:

  • 8/14/2019 Java Materijal

    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;

  • 8/14/2019 Java Materijal

    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;

  • 8/14/2019 Java Materijal

    16/76

  • 8/14/2019 Java Materijal

    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 {

  • 8/14/2019 Java Materijal

    18/76

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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);}

    }

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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);

  • 8/14/2019 Java Materijal

    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{

  • 8/14/2019 Java Materijal

    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");

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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);

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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();

  • 8/14/2019 Java Materijal

    32/76

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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

  • 8/14/2019 Java Materijal

    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;

    }

  • 8/14/2019 Java Materijal

    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;

    }

  • 8/14/2019 Java Materijal

    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;

  • 8/14/2019 Java Materijal

    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.

  • 8/14/2019 Java Materijal

    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());

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

    }

    }

    Klasa Sfera je ista kao u prethodnom primeru, a u datoteci SferaMain.java smo dali klasu koja

    kreira instancu klase Sfera i poziva neke njene metode.

    Preklapanje metoda

    U klasi mo`ete da defini{ete vi{e metoda sa istim imenom, ali sa razli~itim argumentima. Takvi

    metodi se nazivaju preklopljenim metodima.

    Preklopljene metode se me|usobno moraju da razlikuju po broju ili tipu argumenata. Ne mogu se

    razlikovati samo po povratnom tipu.

    Primer za preklopljene metode mogu biti metodi append, klase StringBuffer, koje smo ve} koristili.

    Vi{estruki konstruktori

    Kao i obi~ne metode, tako se i konstruktori mogu da preklapaju. Preklopljeni konstruktori se koristekada je potrebno da instancu klase napravite na osnovu razli~itih ulaznih parametara.

    Ako pogledamo klasu Sfera, u njoj mo`emo da imamo jedan podrazumevani konstruktor (bez

    argumenata) i konstruktor koji smo ve} napravili (sa argumentima za radijus i koordinate ta~ke).

    Primer: Konstruktori iz klase Sfera

    // podrazumevani konstruktorSfera(){

    radijus = 1.0;

    xCentar = 0.0;

    yCentar = 0.0;

    zCentar = 0.0;brojac++;

    }

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

    radijus = rad;

    xCentar = x;

    yCentar = y;

    zCentar = z;

    brojac++;

    }

    Prilikom kreiranja instanci klase Sfera kompajler odre|uje koji }e konstruktor pozvati na osnovu

    tipa argumenata koje ste zadali.Sfera lp = new Sfera(); // podrazumevani konstruktor

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

  • 8/14/2019 Java Materijal

    40/76

  • 8/14/2019 Java Materijal

    41/76

    41

    }

    // izracunavanje duzine linije

    double length()

    {

    return start.distance(end); // koristi se metod klase Tacka

    }

    // Linija se konvertuje u string

    public String toString()

    {

    return "(" + start + "):(" + end + ")";

    }

    // presek dve linije

    Tacka intersects(final Linija Linija1)

    {

    Tacka lokalnaTacka = new Tacka(0, 0);

    double num =

    (this.end.y - this.start.y)*(this.start.x - Linija1.start.x) -

    (this.end.x - this.start.x)*(this.start.y - Linija1.start.y);

    double denom =

    (this.end.y - this.start.y)*(Linija1.end.x - Linija1.start.x) -

    (this.end.x - this.start.x)*(Linija1.end.y - Linija1.start.y);

    lokalnaTacka.x = Linija1.start.x + (Linija1.end.x -

    Linija1.start.x)*num/denom;

    lokalnaTacka.y = Linija1.start.y + (Linija1.end.y -

    Linija1.start.y)*num/denom;

    return lokalnaTacka;

    }

    }

    Klasa Geometrija (Geometrija.java):

    public class Geometrija {

    public static void main(String[] args)

    {

    // Kreiraju se dve tacke i prikazuju se

    Tacka start = new Tacka(0.0, 1.0);

    Tacka end = new Tacka(5.0, 6.0);

    System.out.println("Napravljene su dve tacke " + start + " i " + end);

    // Kreiraju se dve linije i prikazuju se

    Linija Linija1 = new Linija(start, end);

    Linija Linija2 = new Linija(0.0, 3.0, 3.0, 0.0);

    System.out.println("Napravljene su dve linije " + Linija1 + " i " +

    Linija2);

    // Presek

    System.out.println("Presek je " + Linija2.intersects(Linija1));

    // Pomera se krajnja tacka linije 1 i prikazuje se novi presek

    end.move(1.0, -5.0);

    System.out.println("Novi presek je " + Linija1.intersects(Linija2));

    }

    }

  • 8/14/2019 Java Materijal

    42/76

    42

    U klasi Tacka postoje dva ~lana (x i y koordinata tacke). U ovom trenutku postoje dva konstruktora,

    jedan koji tacku pravi na osnovu para koordinata i drugi koji pravi novi objekat Tacka, na osnovu

    postoje}eg.

    U klasi smo definisali i metodu toString(), koja preklapa metodu toString() nasle|enu iz klase

    Object. Ako klasa ima ovu metodu, onda se u prilikom {tampanja pomo}u operatora + (spajanje

    stringova) mo`e koristiti objekat ove klase.

    U klasi Linija smo liniju definisali preko dva objekta klase Tacka, {to je i prirodno.

    U metodu za izra~unavanje preseka, smo koristili parametarske jedna~ine du`i (x=x1 + (x2-x1)t i

    y=y1+(y2-y1)s).

    Rekurzija

    Metode koji smo do sada koristili se pozivaju iz drugih metoda. Proces u kome metoda poziva samu

    sebe se naziva rekurzijom. U rekurzivnom metodu mora da postoji i neka logika koja }e prekinuti

    poziv metode, jer bi u suprotnom dobili beskona~ane pozive.

    U primeru koji sledi je data rekurzivna metoda koja ra~una stepen zadate ceoblrojne vrednosti. To

    zna~i da se ra~una xn.

    public class Stepen {

    public static void main(String[] args)

    {

    double x = 5.0;

    System.out.println(x + " na 4 je " + power(x,4));

    System.out.println("7.5 na 5 je " + power(7.5,5));

    System.out.println("7.5 na 0 je " + power(7.5,0));

    System.out.println("10 na -2 je " + power(10,-2));

    }

    // Dize se x na n-ti stepen

    static double power(double x, int n){

    if(n > 1)

    return x*power(x, n-1); // rekurzivni poziv

    else if(n < 0)

    return 1.0/power(x, -n); // Negative power of x

    else

    return n == 0 ? 1.0 : x; // Ako je n 0 vraca se 1, u suprotnom se vraca

    x

    }

    }

    Ako je n pozitivan broj, ve}i od 1, metoda power poziva samu sebe, ali sa ulaznim parametrom

    smanjenim za 1. Ovo se ponavlja sve dok stepen ne dobije vrednost 0, u kom slu~aju se prekida

    rekurzija.

    Rekurzivni metodi su veoma zahtevni po pitanju resursa i vremena. Zbog toga treba da se pozivaju

    samo kada je to neophodno. Navedeni primer bi se mnogo lak{e realizovao putem petlje. Na taj

    na~in bi se izvr{avao mnogo efikasnije. Rekurzije najvi{e primene imaju kod struktura podataka

    kao {to je stablo ili liste.

    Paketi

    Sve klase u Javi su organizovane u pakete. Paketi u Javi su sli~ni direktorijumima (fasciklama) koji

    se koriste za organizaciju podataka na disku. I klase koje smo do sada koristili se nalaze u paketima,

    ali do sada na to nismo obra}ali pa`nju.

    Sve standardne klase koje postoje u Javi su tako|e organizovane u pakete. Klase koje smo do sada

    koristili (String, StringBuffer) se nalaze u paketu java.lang. Ovaj paket nije potrebno nazna~avati u

  • 8/14/2019 Java Materijal

    43/76

    43

    kodu, jer je on automatski dostupan u svim programima. Postoje i drugi standardni paketi, ali se oni

    uglavnom moraju eksplicitno uklju~iti u kod.

    Pakovanje klase se izvodi tako {to se u datoteku u kojoj se nalazi klasa na po~etku doda iskaz za

    pakovanje. Ovaj iskaz mora biti prvi u toj datoteci.

    package Proba;

    public class Sfera

    Prethodni iskaz ka`e da je klasa Sfera pripadnik paketa Proba. U jednom paketu mo`e biti vi{e

    klasa. Klju~na re~ public u definiciji klase ukazuje na to da se klasi Sfera mo`e pristupiti i iz drugih

    paketa i klasa u programu. Ako se prilikom definicije klase ne navede klju~na re~ public, onda se

    toj klasi mo`e pristupati samo iz metoda klasa koje se nalaze u istom paketu.

    Paketi su povezani sa strukturom direktorijuma na kome se nalaze dato