JAVA PROGRAMIRANJE

1

1. Uvod

1. Uvod - kako početi programirati u JAVA jeziku
Cilj ovog poglavlja je napisati i pokrenuti jednostavnije Java programe. SADRŽAJ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. O predmetu. Programi i programski jezici. Neki jednostavni Java programi. Objekti i metode. Konstrukcija programa. Metoda System.out.println. Kako prevesti i pokrenuti java program. Pisanje Java programa. Kako raditi na računalu. Zadaci za prvo poglavlje.

1.

O predmetu

Sadržaj ovog predmeta je pisanje objektno orijentiranih programa u Java jeziku. Java je : • programski jezik • vrlo velika biblioteka programskih rutina • izvršna okolina za izvođenje programa. Java biblioteka programskih rutina sastoji se od tisuća klasa. Postoje klase za rad s datotekama, klase za rad s 3D grafikom, klase za pristup bazama podataka, animaciju web stranica, itd. Moglo bi se reći da se u bibliotekama nalazi veći dio onoga što će vam ikada zatrebati u programiranju. Možda ste se dosad susreli s JavaScript jezikom za web stranice. JavaScript nije Java jezik ! Ovaj predmet se zbog ograničenog broja sati ipak mora ograničiti na osnove jezika te na manji dio osnovnih klasa. Kao dodatnu literaturu možete koristiti knjige: 1. Beginning Java 2, SDK 1.4 Edition by, Ivor Horton ISBN:0764543652 Wrox Press 2003. 2. Java , Čukman, Tihomir , Alfej 3. Java: Programiranje za Internet i World Wide Web , Dario Sušanj, Znak, Zagreb, 1997. Ako dosad niste programirali bit će potrebno uložiti značajan trud u savladavanje gradiva. Java jezik zajedno s ogromnim bibliotekama namijenjen je profesionalnim programerima. Štoviše Java biblioteke se stalno proširuju i mijenjaju . Naučiti programirati u bilo kojem jeziku nije moguće bez praktičnog rada na računalu. Stoga je od vrlo velike važnosti da primjere sa satova pokušate realizirati na računalu tijekom vježbi. Ako ste dosad programirali u nekom programskom jeziku mogao bi vam prvi uvodni dio biti vrlo jednostavan. Međutim kako lekcije budu išle broj novih sadržaja i znanja će se povećavati. Potrudite se zadatke odraditi sami. Nemojte kopirati programski kod od kolega. Osim što varate nastavnika varate i sami sebe.

2

1. Uvod 2. Programi i programiranje

U ovome poglavlje prikazat ćemo jednostavni Java program i način kako ga pokrenuti na računalu. Za početak ćemo ponoviti glavne dijelove računala i njihova svojstva: 1. Memorija je dio računala u koji pohranjujemo informacije. Pohranjene informacije možemo pisati, brisati, obnavljati,... Informacije u memoriji su niz bitova dok na višoj razini predstavljaju brojeve, tekst, slike, glazbu,... 2. Uređaji za ulaz/izlaz (I/O). Informacije u računalo unosimo bilo tipkovnicom ili preko medija (disketa, CD-ROM ,mreža...). Informacije iz računala prikazujemo na ekranu ili pak šaljemo na neki od medija. 3. Procesor koji djeluje po instrukcijama programa. Program se sastoji od niza operacija koje procesor izvršava. To uključuje akcije poput izvršavanja proračuna, čitanja ili pisanja po memoriji, slanja podataka na izlazna sučelja procesora, ... Program se piše u notaciji koja se naziva programski jezik. Svako računalo (procesor) ima svoj programski jezik koji nazivamo strojni jezik (machine code). Taj jezik je dizajniran s fokusom na elementarne operacije koje se obavljaju nad hardverom računala. Radi se o jednostavnim operacijama poput pisanja ili čitanja iz memorije, aritmetičkim operacijama nad registrima procesora, itd. Iako je teoretski svaki program moguće napisati koristeći strojni jezik to je vrlo teško čak i za jednostavne programe. U praksi se gotovo sve programiranje izvodi u jezicima koji su prilagođeni programeru. Takvi jezici se nazivaju jezici visokog nivoa. Jezici koji se danas koriste u komercijalnoj upotrebi su C, C++,Java,C#,Perl,Phyton,Pascal(Delphi), Basic,Fortran.... Java jezik je jedan od najmlađih jezika. Prvi put se pojavio 1995. godine. Java 2 specifikacija jezika koju koristimo u ovom predmetu pojavila se 1998. Rekli smo da programeri pišu programe uglavnom koristeći programske jezike visokog nivoa, a da računala izvršavaju instrukcije strojnog jezika. Pitanje je što računalo radi s programom napisanim u jeziku visokog nivoa. Najčešći način je koristiti računalni program koji nazivamo prevodilac (compiler). Prevodilac prevodi program napisan u jeziku visokog nivoa u program sastavljen od strojnog jezika. Prevedeni program onda možemo pokrenuti na računalu. (U čemu se piše prevodilac ?) U slučaju Java jezika korišten je malo drukčiji pristup u kojem se u procesu pisanja Java koda do transformacije u računalu razumljiv kod koriste dva programa. Prvo se program koji je programer napisao u Javi, pomoću prevodioca prevodi u bytecode program. Bytecode je sličan strojnom jeziku, ali je neovisan o bilo kojem računalu. Bytecode program nije više čitljiv od strane programera. Njega čita i izvršava program koji se naziva Java virtual machine. Prednosti pristupa u dva koraka jest da se tako proizvode programi koji se ipak izvršavaju zadovoljavajućom brzinom te se Java okolina može brzo realizirati na bilo kojem računalu. Originalni Java program koji piše programer i kojeg prevodi prevodilac naziva se izvorni kod. Bytecode koji proizvodi prevodilac i interpretira Java virtual machine naziva se objektni kod.

Slika 1.1

Usporedba izvršavanja Java programa s tradicionalnim postupkom prevođenja

3

1. Uvod
Postoje brojne razvojne okoline u kojima je moguće pisati, prevoditi i izvršavati programe. Za potrebe ovog predmeta zadržat ćemo se na najjednostavnijem sustavu koji je ujedno i podloga i za druge kompleksnije razvojne okoline. Sustav se naziva Software Development Kit (SDK). Može se naći na stranicama java.sun.com Ove stranice održava kompanija Sun Microsystems koja je odgovorna za razvoj Jave. Verzija Java okoline u trenutku pisanja ovog teksta je 1.5. U ovom predmetu koristit ćemo prethodnu 1.4 verziju. Instalacija Java okoline se u najkraćim crtama obavlja na slijedeći način: • • • Pokreni Java 2 SDK installer (datoteka j2sdk-1_***-win.exe), odaberi mjesto instalacije i instaliraj. Dodaj u PATH varijablu operativnog sustava mjesto instalacije (npr. C:\jdk1.4.2\bin). Način dodavanja je ovisan korištenom operativnom sustavu. Provjeri (ukloni) CLASSPATH varijablu (-classpath command-line prekidač je bolji način).

Detaljniji (aktualniji) opis instalacije može se naći na stranicama java.sun.com.

3.

Primjeri jednostavnih Java programa

U Javi program iste funkcionalnosti kao C program koji ispisuje "Hello World!" izgleda ovako:

public class Hello { /* napiši jednostavnu poruku na ekran*/ public static void main(String[] args) { System.out.println(″Hello, World!″); } }
Ako niste vidjeli dosada neki Java program ovaj jednostavni program izgledat će vam konfuzno. Cilj ovih početnih sati predavanja je da vam se objasni struktura ovako jednostavnih programa. Svaki Java program sadrži naredbe (statements). Svaka naredba opisuje neku operaciju koju računalo treba izvršiti. Operacija može biti ispis neke informacije na ekranu, može biti neka računska operacija, provjera položaja miša na ekranu, itd. Računalo jednostavno izvršava naredbu po naredbu. U programu koji je gore napisan nalazi se samo jedna naredba: System.out.println("Hello, World!"); Kad se ta naredba izvrši na ekranu će se pojaviti slijedeći ispis:

Hello, World!

Java ima različite načine pisanja poruka po ekranu bilo da pišemo po prozoru, na web stranicu, itd. U ovome slučaju koristimo jednu Java metodu koja se naziva System.out.println. Rezultat izvršavanja bit će ispis poruke u najjednostavnijem obliku prozora kojeg nazivamo konzola (ili DOS prozor u Windows OS). Konzola dopušta samo jednostavan ispis teksta , redak po redak. Slijedi program s dvije naredbe koje su tiskane podebljano (ne koristimo podebljane fontove u Java programima).

public class Hello { /* napiši jednostavnu poruku na ekran*/ public static void main(String[] args) { System.out.println("Hello, World!"); System.out.println("See you later."); } }

4

out.out je objekt čiji je zadatak da primi poruku koju treba prikazati na ekranu.Out definirane su u klasama koje pripadaju Java bibliotekama. Razmotrimo naredbu koja ispisuje poruku: System. ažuriranja liste predmeta koje je student upisao. World!″).out.out. U isto vrijeme kad definiramo izgled objekata trebamo i definirati koje će se operacije izvršavati nad tim objektima. Možemo i kreirati objekte prema našim potrebama. pišemo program koji će pratiti koji su studenti na FESB-u prijavljeni na koji predmet. Klase String i System.1. 5 . itd. Možemo kreirati i svoje klase npr. Ostatak ovog jednostavnog programa može se promatrati kao pakiranje. operacije ispisa podataka o studentu na ekran. klasu Student i klasu Predmet. Objekti i Metode . Svaki objekt pripada klasi (class) koja specificira od kojih podataka se objekt sastoji i koje metode posjeduje. Njen puni naziv je: System. Što se tiče objekta student . System.println Ovaj naziv označava metodu println koja pripada objektu System. Zamislimo ga kao osobu kojoj dajemo što treba ispisati na ploči. */ public static void main(String[] args) { Naredbe } } Ne postoji ograničenje na broj naredbi u programu. Oba programa imaju formu: public class Hello { /* komentar. bit će nam potrebne operacije kreiranja objekta studenta. World!″ objektu System. a nakon toga u drugoj liniji See you later. World! . Npr. Sad ćemo se zadržati na opisu objekata koji su neizostavni dio svakoga pa i najjednostavnijeg Java programa.out. Dosad smo već vidjeli primjer metode. a drugi sami niz znakova ″Hello. Java cijelo vrijeme radi s objektima. Npr. Ovo pakiranje ćemo objasniti poslije. World!″). Println metoda je operacija koja se izvršava nad porukom. kaže: koristi println metoda za slanje poruke ″Hello. koji će je prikazati na ekranu.println(″Hello. Svaki objekt studenta sadržavat će određene podatke poput osobnih podataka studenta i liste upisanih predmeta. Gdje su tu objekti ? Poznavalac Java jezika vidjet će dva objekta.println(″Hello. Prvo će se na ekranu ispisati u jednoj liniji Hello. 4. Može ih biti na tisuće. World!″. Prvi je objekt System. Te operacije koje se izvršavaju nad objektom nazivaju se metode. Tada ćemo napisati takav program koji će pokretanjem: • • za svakog studenta kreirati jedan objekt studenta za svaki predmet također jedan objekt predmeta. svi nizovi znakova pripadaju klasi koja se naziva String. tako nam izraz: System. Uvod Kada pokrenemo ovaj program izvršit će se obje naredbe jedna za drugom.Out .out. Objekt predmeta može sadržavati naziv predmeta i druge podatke vezane za predmet. U Java biblioteci definirano je mnogo vrsta različitih objekata koje možemo koristiti u svojim programima.

(Bit će objašnjeno kasnije). Svaki tekst između /* i */ bit će tretiran kao komentar i Java će ga u potpunosti ignorirati. World! ″). odnosno nije korištena u programu. Ako napišemo bilo koji program u Javi i on će se sastojati od klasa. Strogo rečeno komentar je opcionalan.println(″Hello. {. Svaki metoda bilo da pripada objektu ili ne. sadrži određeni broj naredbi koje izvršavaju neku korisnu operaciju.instanci iste klase. ali u većim programima to je najefikasniji način da pomognemo razumijevanju programa. takvi podaci nazivaju se primitivni tipovi podataka. Java biblioteka je u potpunosti sastavljana od definicija klasa. Posebno je to bitno ako na programu radi više programera. Dio u zagradama. Uvod Koji je odnos klasa-objekt ? Kažemo da je objekt instanca od klase. System. } Ovo je tijelo (body) metoda. (U drugim računalnim jezicima imamo funkcije ili procedure) Analizirat ćemo korak po korak kompletnu metodu iz zadnjeg primjera: /* napiši jednostavnu poruku na ekran*/ public static void main(String[] args) { System.out. System. } Sastoji se od slijedećih dijelova: 1. 5. opisuje informaciju koja će biti proslijeđena metodu svaki put kad bude pozvan. Uvijek se sastoji od niza naredbi zatvorenih u vitičaste zagrade. Najjednostavniji tipovi podataka poput cjelobrojnih i brojeva u pokretnom zarezu tretiraju se nešto drugačije. (koko se koristi bit će objašnjeno poslije) 3. to je jednostavno poruka za onoga tko čita izvorni kod programa. 2. U ovom slučaju naziv metoda je riječ main koja se nalazi neposredno ispred zagrada.}. metode koja ne pripada nijednom određenom objektu. Pozivom ovog metoda izvršava se svaka od naredbi. Međutim preporuča se uvijek početi s komentarom koji ukratko kaže što radi metod koji slijedi. Program može kreirati više objekata . klasa je opis objekta napisan u kodu. Postoje samo nekoliko klasa kojima se ne definira objekt već su sastavljene samo od samostalnih metoda. Naziva se lista parametara. /* napiši jednostavnu poruku na ekran*/ Ovo je komentar koji opisuje što ni program trebao raditi. String[] args.println(″See you later. Definicija klase započinje s zaglavljem: public class Hello 6 . Možemo je promatrati kao kalup ili skicu prema kojoj se u tijeku izvršavanja programa kreiraju objekti. Ipak nije sve u Javi objekt. U dva gornja primjera u programu je definirana samo jedna jedina klasa nazvana Hello. Svaki program sastoji se od određenog broja definicija klasa.out.println(″Hello. public static void main(String[] args) Ovo predstavlja zaglavlje (heading) metode. { System. Oba programa sastoje se od jedne klase (Hello) koja se sastoji samo od jedne statičke metode tj. Jednostavno. Sve metode sastoje se od tri navedena dijela. Taj dio nazivamo specifikacijom. Kako je konstruiran program iz primjera Prethodni dio pokazao nam je da se Java programi sastoje od klasa.println(″See you later. Programi koji su navedeni kao primjer uklapaju se u tu tvrdnju. Gornji primjer je prejednostavan da bi specifikacija bila od veće koristi.. Većina klasa definira tipove objekata. static i void pokazuju Java prevodiocu način korištenja metoda main. ″).out. Svaka metod ima svoj naziv.out.1. Riječi public. ″). ali ipak na vrlo primitivan način. U navedenom primjeru ta je informacija ignorirana. World! ″).

klasa Hello metoda main public class Hello { public static void main(String[] args) { System. U našim primjerima klasa se sastoji od samo jednog člana.println metoda ima tu osobinu da ispisom teksta pomiče kursor na početak slijedeće linije. World!\nSee you later\n″) će ispisati Hello. World! ″). Za potrebe ove definicije se simboli valuta poput £ i $. World!”). znamenki i mora početi sa slovom.print. a naziv metode malim slovom. ″) 7. : System. što je metoda a što su naredbe. System. } 7 .out.out.println(”Hello. Ova metoda će ispisati niz znakova na konzolu (DOS prozor). koju svo već opisali. Ako želimo da kursor ostane na prethodnoj liniji koristit ćemo metodu System.println(″Hello.out.1.println(″See you later. Kako prevesti i pokrenuti Java program Pretpostavimo da želite izvršiti program iz prvog primjera: class Hello { /* napiši jednostavnu poruku na ekran*/ public static void main(String[] args) { System.out. Na slijedećoj slici prikazan je naš program koji se sastoji od dvije naredbe razdvojen okvirima koji nam pokazuju što je klasa. Metoda System. } } naredbe(izrazi) 6.″). Mjesto na ekranu na kojemu će se ispisati slijedeći znak označeno je na ekranu s malom treptajućom linijom nazvanom kursor. U ovome predmetu ćemo se nastojati strogo pridržavati navedene konvencije. World!″). Općenito bilo koji naziv u Javi (identifikator) sastoji se od slova. Drugi način određivanja kad želimo ispis u novoj liniji je korištenje para znakova \n u nizu znakova svaki put kad je potrebno da ispis krene u novu liniju. .out. i povlaka (‘_’) računaju kao slova.println je prva metoda iz Java biblioteke koji smo upotrijebili.println System.out. Npr. Ta će naredba imati isti rezultat kao i par naredbi: System.println(″See you later.out.print(″Hello. System. zatvorenim u vitičaste zagrade. nakon toga pomaknuti kursor u novu liniju gdje će ispisati See you later.out.out. System. Naziv println je skraćenica za ‘print line’. Duljina naziva nije ograničena. Uvod Zaglavlje je praćeno elementima koji sačinjavaju klasu. i nakon toga pomaknuti kursor na novu liniju. metode nazvane main.out.println(″Hello. Java programeri koriste konvenciju po kojoj naziv klase započinje velikim slovom. Općenito program se sastoji od jedne ili više definicija klasa od kojih svaka sadržava jednu ili više metoda. World! .

na kraju naredbe. Za prevođenje programa treba utipkati: javac Hello.java datoteci.class ekstenziju. Međutim . a drugi s DOS prozorom koji služi za interakciju s Java sustavom. A. Notepad. greška se može nalaziti i negdje prije ! Ako postoje greške kod prevođenja potrebno ih je otkloniti u editoru. npr. Ponekad iz poruke nije jasno odakle potječe greška i tada je potrebno pažljivo pregledati kod.class. Najčešće je poruka o grešci takva da je jednostavno naći mjesto u kodu gdje smo učinili pogrešku. Ukucajte program i pohranite ga u datoteku Hello. Notepad). Ako se vaš program sastoji od samo jedne klase potrebno ga je pohraniti u datoteku koja ima isti naziv kao i klasa uz dodanu ekstenziju ‘. A. možete ga pokrenuti u Java Virtual machine tipkanjem: java Hello Ne tipkajte . kako se naš jednostavni program sastoji od samo jedne klase nazvane Hello. Moguće je iz takvih editora pozvati i operacije prevođenja i izvršavanja. Poruke prevodioca i sve što će program ispisati odvija se također u ovome prozoru. U tom DOS prozoru prevodimo i izvršavamo program. Početnici često pogriješe tražeći grešku baš u liniji gdje je to prevodilac javio.java. C. 8 .java’. odbit će prevođenje i izvijestiti o pronađenim greškama.class datoteci. ali ovo je općeniti način koji radi na svim računalima. datoteku moramo nazvati Hello. Ako nema grešaka u programu prevodilac će proizvesti bytecode verziju vašeg programa u datoteci nazvanoj Hello. Možete koristiti bilo koji tekst editor za unos koda. Korisno je imati i neki sofisticiraniji Java editor npr. Ako prevodilac nađe greške poput tipkanja Class umjesto class ili izostavljanja znaka . JDK pretpostavlja da ste mislili na Hello.1.class. Takvi editori nam mogu omogućiti korisne funkcije poput sintaksnog naglašavanja ili automatskog uvlačenja teksta. Otvori DOS prozor i postavi trenutni direktorij na direktorij gdje je datoteka s programom.java. nakon otklanjanja grešaka ne zaboravite snimiti datoteku. Korištenje JDK za prevođenje programa u Hello. Korištenje JDK za pokretanje prevedene verzije programa koja se nalazi u Hello. To nazivamo greškom prevođenja (compiler error). B. JedPlus. Postoje i drugi načini koje ćemo obraditi na vježbama. Nakon što je prevodilac proizveo bytecode verziju programa Hello.java Ako dobijete poruku da sustav ne može naći javac (Java prevodilac) znači da ili nije pravilno postavljena PATH varijabla sustava ili nije instaliran JDK. Sve naredbe koje slijede tipkaju se u ovaj prozor. Uvod } Prvo morate biti pristupiti računalo na koje je instalirana podrška za Javu odnosno Java SDK. U ovome trenutku bit će otvorena dva prozora. Jedan s editorom (npr.class.

2 Pisanje programa. kao što je prije napisano držat ćemo se konvencije po kojoj se nazivi klasa pišu s početnim velikim slovom. Ako izostavite . klasu možemo nazvati HelloWorld. prevođenja i izvođenja programa pokazan je i na slijedećim slikama: Slika 1. Skoro svaka pogreška u pisanju će najvjerojatnije proizvesti grešku prilikom prevođenja ili prilikom izvođenja. Tada će ispisati poruku o grešci s podatkom gdje je program došao u izvođenju prije nego što je prekinut. U pisanju Java programa morate paziti na korištenje malih i velikih slova. To znači da ne možete utipkati Class ili CLASS na početku programa.out. Koliko grešaka pisanja možete vidjeti u ovome kodu ? prevodilac će javiti svaku od njih. U nekim slučajevima JVM neće moći izvršiti program do kraja. Prvo će je trebati detektirati. ispisTeksta. Proces pisanja. Ako želite modificirati ispis programa ili dodati još koju naredbu opet se trebate vratiti u prozor tekst editora. Uvod Ovaj se program nakon toga treba izvršiti i ispisati poruku u DOS prozoru. Takva greška naziva se run-time greška (run-time error) ili greška u izvršavanju (execution error). dobit ćete poruku o grešci u fazi prevođenja. napraviti modifikacije i nakon toga u DOS prozoru ponoviti postupak prevođenja i izvršavanja. svaki izraz koji koristi naredbu System. Npr.println mora završiti s . Npr. public Class Hello { /* Write a simple message on the screen. public static viod main(string[] args) 9 . prevođenje. Riječ class ima u Java programima specijalno značenje i jedna je od ključnih riječi (keywords) Java jezika. a metodu npr. a nakon toga korigirati. U tijeku izvođenja programa može nastati greška. Potrebno je točno pisati class. Pisanje koda Java programa Prvo pravilo pisanja bilo kojeg programa je: pišite pažljivije što god možete. Za razliku od nekih drugih programskih jezika Java razlikuje velika i mala slova (case sensitive). 8. java ima 47 ključnih riječi i sve se pišu malim slovima. a nazivi metoda malim slovima. Ako imamo nazive koji se sastoje od više spojenih riječi možemo početak slijedeće riječi pisati velikim slovom. izvršavanje.1. .

System. public class Hello{public static void main(String[] args){System.out.println(″See you later. To je prije svega dugotrajan proces jer je potrebno svaki put nakon ispravljene greške proći kroz faze prevođenja i izvršavanja.}} Iz ovoga je na prvi pogled teško ustanoviti da se program sastoji od jednog metoda koji sadrži dvije naredbe.out.″). 10 . ). } Sve dok ne spojite neke riječi poput classHello. Vidjet ćemo tijekom ovoga predmeta kako postupati s pojedinim elementima koda. ( println( } class main out. Zato je praznine uputno koristiti da bi se dobio jasniji kod. Ako ima više metoda unutar klase. Čak će se i slijedeći primjer pravilno prevesti: public Hello public static void (String[] args) { System.. Zbog svega navedenog nije se praktično oslanjati na prevodilac u otkrivanju grešaka. Npr. Prevodilac prema svemu navedenom je vrlo fleksibilan u korištenju razmaka i novih redova. To nazivamo uvlačenje koda (indentation). println ″Hello. ili ne razdvojite cla ss. World!″). stavljamo razmak između svake. Osim što je Java prevodilac razlikovanjem velikih i malih slova zna biti dosta nezgodan u drugim pogledima je vrlo liberalan.″). upotreba praznina i novih redova.out.″ ). Uvod { } ) Jedina greška koju prevodilac neće javiti je pogrešno pisanje unutar niza znakova See you latef.printline(″See you latef. Ta greška će biti očigledna tek nakon izvršavanja programa. ″See you later. Ako pogledate na originalni kod gore modificiranih programa. metoda main je pomaknuta tri mjesta unutar u odnosu na prethodni redak.out. World!″ System.println(″Hello. Slijedeći primjer bi se trebao prevesti bez greške iako je vrlo teško čitljiv: System. World!″). Osim urednosti koja omogućava razumijevanje koda. Međutim bilo tko bude čitao vaš program (i vi sami) poželjet će mnogo uredniji i jasniji kod. drugi rezultat je pisanje koda s manje grešaka. Međutim to više vrijedi za iskusne programere nego za početnike kojima će prevodilac često biti neprocjenjiva pomoć u otklanjanju pogrešaka. Primijetite i da vitičaste zagrade imaju konvenciju o smještaju.System. vidjet ćete da postoje neka pravila u pisanju. out. prevodilac se neće buniti.println('Hello.1. Uopće mu nije bitan prostorni raspored vašeg koda tj.

Stoga nastojte zadatke samostalno rješavati jer je to najefikasniji način za usvajanje gradiva. Kako rješavati zadatke Zadaci koji su navedeni na kraju svakog poglavlja prestavljaju zadatke koji će se javiti i na ispitu.println(″Vidimo se kasnije !″). Uvod 9. public static viod main(string[] args) { System.println('Alo. Dakle za prvo poglavlje otvorite direktorij P1.Podloga za rješavanje zadataka jeste sadržaj svakog poglavlja. tu ćete naći i dijelove izvornog koda koji će vam koristiti u rješavnju zadataka. Napišite program s nazivom klase ImeUOkviru.1.class .out. Svite!″). */ public static void main(String[] args) { System.class .out. 1. Na računalu na kojemu dobijete korisnički račun kreirajte direktorij JProg. Inicijali.class Gresnik. System. Hello. System. pisanje tri jednostavna programa. Ukucaj.out. ImeUOkviru. ukucajte ga sa svim pogreškama ! Zatim ispravite pogrešaka koliko možete i pokušajte natjerati program da radi kako bi trebao.class ImeUOkviru.println(″Ciao. } } 2."). Program treba ispisati vaše ime u okviru poput slijedećega: +--------+ | Ivan | +--------+ Uputa: nije svejedno kako ćete nazvati datoteku s kodom! 3.out.java.java 10. Zadaci za prvo poglavlje Za ovo poglavlja zadana su tri jednostavna problema tj. Unutar tog direktorija za svako poglavlja otvorite direktorij Pn gdje je n broj poglavlja.printline("Vikimo se kasnije. Svijete!").. prevedi i pokreni slijedeći Hello program koji ispisuje dvije linije na ekran: /* Autor: Ime Prezime */ class Hello { /* jednostavan ispis na ekran.java Inicijali. Gresnik. Kada završite poglavlje 1 unutar direktorija P1 trebali biste imati slijedeće datoteke: Hello. } } 11 .java . Štoviše. public Class Gresnik { /* Write a simple message on the screen.Ukucaj i pokreni slijedeći program te analiziraj pogreške koje će javiti prevodilac.

Pretpostavimo da idete kupovati na tržnici.5 kune. Čitanje ulaza korištenjem ConsoleReader objekta. Kupili ste 2 kg jabuka po 12 kuna. Cjelobrojne vrijednosti (integers).Brojevi i znakovni nizovi Poglavlje 2. Dodjeljivanje(assignments). SADRŽAJ 1. Koliko ste kuna potrošili. Međutim program će rasvijetliti nekoliko točaka u računanju s cijelim brojevima. 6. Varijable (variables). Java posjeduje slijedeće tipove primitivnih tipova podataka: ključna riječ byte short int long float double char bolean opis veličina cjelobrojni (integers) cijeli broj duljine jednog byte-a 8 bit-a bez predznaka cijeli broj duljine dva byte-a 16 bit-a bez predznaka Integer 32 bit-a bez predznaka Long Integer 64 bit-a bez predznaka brojevi u pokretnom zarezu (real numbers) jednostruka preciznost 32-bita dvostruka preciznost 64-bita ostali tipovi jedan znak 16-bita unicode znak boolean(logička vrijednost) true ili false 1. To uključuje upotrebu dvije vrste vrijednosti: brojevi i znakovni nizovi (strings). 8. Znakovni nizovi (strings). Najjednostavniji tipovi podataka. Takvi tipovi podataka nazivaju se primitivni tipovi podataka. 2.2. poglavlje. 4. 3kg krumpira po 2kune i 50lipa i 2 kg bresaka po 14 kuna. Brojevi u pokretnom zarezu (floating-point values). Brojevi i znakovni nizovi (strings) U prvom poglavlju pisali smo programe koji su samo ispisivali poruke na ekran. Cjelobrojne vrijednost (integers) U prvom poglavlju smo spomenuli da nisu svi podaci u Javi objekti. poput cijelih brojeva ili brojeva u pokretnom zarezu odstupaju od logike da sve treba biti objekt. U ovome poglavlju uvodimo nove izraze koje ćemo koristiti u metodama. Ovo poglavlje počinjemo primjerom upotrebe cijelih brojeva (integers). Nije potrebna snaga Jave na modernom računalu za izračunati navedeni primjer jer i napamet (ili bar uz pomoć papira i olovke) da se izračunati je ukupan račun 85. Zadaci za 2. 5. PRIMJER 1 public class Racun1 { /* Izracunaj ukupni racun za 2 kg jabuka po 12 kn 3kg krumpira po 2kn i 50lipa i 2 kg bresaka po 14 kn */ 12 . 3.

izraz 3+4∗5 znači isto kao i 3+ (4∗5).print na isti način na koji smo koristili kod ispisivanja znakovnih nizova."). Operator ostatka koristi se samo s cijelim brojevima. Primijetite da prve naredbe koriste print umjesto println što znači da ne pomiču kursor u novi red nakon ispisa. Ako ga koristimo s cijelim brojevima tada znači cjelobrojno dijeljenje . izraz se računa s lijeva nadesno. U ovome primjeru metoda sadrži tri naredbe. Npr. 2. Java će prijaviti run-time grešku. kada procesira složenije izraze Java se drži standardnog prioriteta operatora pa npr. Npr.Brojevi i znakovni nizovi public static void main(String[] args) { System.out. Ako Javi damo da izračuna izraz m%n gdje je n jednak nuli .out. Ako je napišemo s decimalnom točkom npr. Ovaj primjer koristi varijable tj.2. (−11) / 4 = −2. 4. npr. System. Program izračunava ukupan račun u dva odvojena koraka. Varijable Slijedeći primjer je druga verzija programa prvog primjera. 11 / 4 = 2. / .out. Primijetite da možemo ispisivati brojeve koristeći System. Racun je: naredba 1 59500 naredba 2 lipa. Npr.0 bit će tretirana kao broj u pokretnom zarezu.5 / 2 = 5. Računanja s njima su brža. 11%4 = 3 and (−11)%4 = −3. Kada se izračunava izraz sa više operatora istog prioriteta u nizu. 13 . naredba 3 Kada Java izvrši naredbu 2 . } } Poput svih primjera za ovo poglavlje program se sastoji od jedne klase koja sadrži samo jednu metodu main. Ove dvije vrste vrijednosti pohranjuju se u memoriji na različite načine. na kao 3/(4/5) što bi proizvelo grešku (Zašto?). Npr. izračunat će vrijednost slijedećeg aritmetičkog izraza: 2∗1200 + 3∗250 + 2*1400 i prikazati rezultat 59500.out.print(2∗1200 + 3∗250 + 2*1400).println(" lipa. naziv koji znači vrijednost. U Java programu slijedeći operatori mogu se koristiti u aritmetičkim izrazima: + − ∗ / % zbrajanje (addition) oduzimanje (subtraction) (koristi se i za minus predznak) množenje (multiplication) dijeljenje (division) ostatak (remainder) U Javi (i većini drugih programskih jezika višeg nivoa) brojevi su cjelobrojni ili brojevi u pokretnom zarezu (integers or floating-point numbers). koriste manje memorije i nisu podložni greškama zaokruživanja poput brojeva s pokretnim zarezom. Ako vrijednost napišemo bez decimalne točke . Uvijek trebamo koristiti cijele brojeve kad to možemo. Operator dijeljenja . Kad se izvrši tri metode će proizvesti dijelove linije na ekranu kako je to prikazano na slici ispod. 3/4/5 znači isto kao i (3/4)/5. System. 10.print("Racun je: "). u stvari ima dva značenja.25. 4 ona će biti tretirana kao cjelobrojna vrijednost. Ako se koristi s dva broja s pokretnim zarezom onda znači normalno dijeljenje.

Brojevi i znakovni nizovi PRIMJER 2 public class Racun2 { /* Izracunaj ukupni racun za 2 kg jabuka po 12 kn 3kg krumpira po 2kn i 50lipa i 2 kg bresaka po 14 kn */ public static void main(String[] args) { int total =2∗1200 + 3∗250 + 2*1400. System. U slijedećoj verziji programa broju kilograma pojedinog artikla dani su očiti nazivi jabuka. PRIMJER 3 public class Racun3 { /* Izracunaj ukupni racun za 2 kg jabuka po 12 kn 3kg krumpira po 2kn i 50lipa i 2 kg bresaka po 14 kn */ 14 .print(total%100). System. krumpir.print(total/100). Ukupan ispis na ekran bi trebao biti: Racun je: 59 kn i 50 lipa. System.out. U praksi upotrebljavaju se opisni nazivi koji odgovaraju ulozi varijable. ali u realnim primjerima mogu se postići značajne uštede.print((2∗1200 + 3∗250 + 2*1400)%100). Upotrebom varijable izbjegli smo dvostruko računanje ukupnog broja lipa. Izraz: System."). Riječ int na početku pokazuje da je tip vrijednosti koju varijabla total može pohraniti je cjelobrojna vrijednost. Ovaj primjer smo mogli realizirati i bez varijable s upotrebom slijedeće dvije naredbe: System.out.out. Usput . Za nazive varijabli možete koristiti bilo koji naziv koji već nije upotrebljen za nešto drugo. kaže: kreiraj varijablu total koja će sadržavati vrijednost izraza 2∗1200 + 3∗250 + 2*1400 (=59500).println(" lipa.print("Racun je: ").out. System. Izraz: System. U ovome slučaju je to 50.print(total%100). System. U ovako malom promjeru to je mala ušteda.2. } } Izraz: int total =2∗1200 + 3∗250 + 2*1400.print(" kn i "). Ovaj izraz se naziva deklaracija varijable (ili definicija varijable).print((2∗1200 + 3∗250 + 2*1400)/100). Radi se o cjelobrojnom dijeljenju čija je vrijednost 85 i ta će vrijednost biti ispisana. prihvaćena je konvencija da nazivi varijabli uvijek počinju s malim slovom.out. System. kaže: ispiši vrijednost naznačenu kao total/100.out.print(total/100). Drugi razlog upotrebe varijabli je da se jasno označe vrijednosti koje se koriste u računu tako da je jasnije što se u programu radi. kaže: ispiši ostatak dijeljenja total sa 100.out.out.out. breskva.

PRIMJER 4 public class Mjenjacnica1 { /* Preracunaj eure u kune */ public static void main(String[] args) { int eura = 110. Vrijednost int varijable može biti u području od −2147483648 do 2147483647."). System. To su razne konstante u programu za koje prije ili kasnije se zaboravi što znače. U slijedećem primjeru promijenit ćemo sadržaj varijable. System. int total = jabuka*1200 + krumpir*250 +breskva*1400. } } 15 . breskva = 2.print("Kuna: "). Ako su potreban veći opseg vrijednosti potrebno je umjesto int upotrijebiti long tip varijable. int centa = 55.println(" lipa.out. System. Kada je varijabla kreirana za nju se alocira prostor u memoriji gdje se potom može spremiti vrijednost varijable.out.out. System. krumpir = 3. Postoje i kraći tipovi cjelobrojnih varijabli short (16 bita) i byte (8 bita). } } Ovaj program daje izlaz isto kao i prethodni.out.print(total/100). Dodjeljivanje (Assignments) Kao što smo vidjeli. System. centa = 100*eura + centa.out.0751.print(kuna). Bitniji je opseg vrijednosti koji se može pohraniti u zadanu varijable. kao što je to u slučaju varijable total . Može biti zamijenjena drugom vrijednošću u tijeku izvršavanja programa. U programiranju postoji pojam "magični broj". double kuna = centa * 0. System. Npr.print(total%100).out. System.out. Količina memorije koja se alocira ovisi o tipu varijable. a opseg je od -9223372036854775808 do 9223372036854775807.print("Racun je: "). Vrijednost koja je sadržana u memoriji je dodijeljena varijabli. za tip varijable int.print(" kn i "). Taj tip zauzima 64 bita.Brojevi i znakovni nizovi public { int int int static void main(String[] args) jabuka = 2. 3. Upotreba varijabli omogućava bolje razumijevanje koda bilo vama ili nekome drugome koji će nakon vas modificirati kod. Ta vrijednost ne mora biti ista u tijeku izvršavanja programa. bit će alocirana 32 bita memorije. Format pohrane je rijetko važan programeru.2. svaka varijable ima naziv i odgovarajući dio memorije.

dakle double eura = 64.45. Vrijednost varijabli će biti potrebno dodijeliti kasnije u programu. kreirat će varijablu tipa int i dati joj naziv total. Kadgod Java obavlja dodjeljivanje ono se obavlja u dva koraka: (1) (2) Prvo se računa vrijednost s desne strane od znaka ‘=’. NAZIV može biti eura. a IZRAZ može biti 64. i dodijeli joj vrijednost centa *0. ali nije moguće mijenjati tip (type) varijable.2305 Izraz: pfeniga = 100*maraka + pfeniga. deklaracija (bez inicijalne vrijednosti) 16 . U međuvremenu nije moguće znati što sadrži varijabla total . Drugim riječima.2305 Konačan ispis je: Kuna: 830.0751. Nova vrijednost se koristi u slijedećem izrazu: double kuna = centa * 0. Zatim se ta vrijednost sprema u varijablu naznačenu s lijeve strana izraza Moguće je mijenjati vrijednost spremljenu u varijablu. Varijabla tipa double sadržava broj u pokretnom zarezu duple preciznosti i alocira 64 bita memorije. tipa double.Ovaj izraz mijenja vrijednost postojeće varijable. Izraz znači: kreiraj varijablu nazvanu eura . Kažemo da vrijednost varijable ‘nije definirana’.2. Nakon toga se izvršava slijedeći izraz: centa = 100*eura + centa. Npr. Moguće je deklarirati varijablu bez specificiranja njene inicijalne vrijednosti. Produkt će se izračunati u aritmetici pokretnog zareza i rezultat će biti 830. nazivamo dodjeljivanje vrijednosti . Ako Java izvrši slijedeći izraz: int total.Brojevi i znakovni nizovi Program započinje kreiranjem dviju varijabli nazvanih maraka i pfeniga koje su postavljene na određene iznose. i predstavlja naše prvo korištenje brojeva u pokretnom zarezu. TIP može biti double. Izraz znači: izračunaj vrijednost izraza 100*eura + centa. ovaj izraz će zamijeniti originalnu vrijednost pohranjenu u varijabli centa (=55 ) s ukupnim iznosom koji imamo izraženim u centima. Opći oblik deklaracije varijable je dakle: deklaracija (s inicijalnom vrijednosti) TIP NAZIV = IZRAZ . i pohraniti rezultat (11055) u varijablu centa. U njoj će biti neki bitovi koji su ostali u memoriji otprije.45.0751. ali neće spremiti nikakvu vrijednost u istu.

Naziv double je skraćenica za ‘double precision floating-point’. ∗= kada želimo pomnožiti varijablu s izrazom . npr.cos(x) Math. približno ±1. ili još kraće x++. Java sadržava niz metoda koje računaju širok opseg matematičkih funkcija koje koriste double vrijednosti. Kadgod koristite statičku metodu koja pripada klasi biblioteke potrebno je kao prefiks naziva metode staviti i naziv klase.sin(x) Math. x. to omogućava veoma velik opseg vrijednosti. U Javi tip double se najčešće koristi za brojeve u pokretnom zarezu. y. ali ima samo pola preciznosti tipa double te ekvivalentno manji opseg od oko ±3. dodjeljivanje NAZIV = IZRAZ. što izraženo preko preciznosti iznosi 15 značajnih znamenki. i dodjeljivanje inicijalnih vrijednosti varijablama x i z. Često je nekoj varijabli potrebno samo nadodati neku vrijednost i postoji skraćeno pisanje za takav tip operacije. itd. Slično za oduzimanje 1od x.exp(x) Math. int w. gdje je OP bilo koji binarni operator Jedan od najčešćih slučajeva promjene vrijednosti varijable je povećavanje za jedan.0. Brojevi s pokretnom zarezom (Floating-point) Naziv 'broj s pokretnim zarezom' proizlazi iz načina pohrane takvih brojeva u memoriji.2. pišemo x--. Sve su statičke metode (ne pripadaju nijednom objektu) iz klase Math koja se nalazi u Java biblioteci. Općenito izraz: x OP= y.Brojevi i znakovni nizovi TIP NAZIV. Java posjeduje i drugi tip za rad s brojevima s pokretnim zarezom koji se naziva float.tan(x) Math. Možemo pisati: x = x+1. Taj tip podataka zauzima samo 32 bita tako da predstavlja ekonomičnije korištenje memorije. Primjer: kreiranje varijabli w. 4. Npr. Može biti pisan i s eksponentom. y i z. za dodati 3∗jabuka varijabli total pisat ćemo slijedeći izraz: total += 3∗jabuka.56 ili 14. x = 1. Vrijednost tipa double zauzima 64 bita. Math.8×10308. Broj s pokretnim zarezom može se pisati s decimalnom točkom. 14. ekvivalentan je izrazu x = x OP y.56E-12. Slično možemo koristiti simbol −= kada želimo oduzeti vrijednost od varijable . 14. npr. z = 2.4×1038. Java omogućava deklaracije varijabli u kojima se istovremeno deklarira više varijabli odjednom. ili kraće x += 1.log(x) sinus od x cosinus od x tanges od x ex prirodni logaritam od x 17 .

ceil(x) najmanji cijeli broj ≥ x U svakoj od metoda parametar x je tipa double . Stavljanjem cast operatora ispred m kažemo Javi da konvertira vrijednost od m u ekvivalentnu double vrijednost. U tom slučaju Java će koristiti dijeljenje za brojeve s pokretnim zarezom. Izraz (double) naziva se cast operator. Npr. i bi primio vrijednost −4. Npr. Zatim će tu vrijednost konvertirati u 64-bitni broj u pokretnom zarezu (6) te ga spremiti u varijablu x.7 je 5. Razlog tome je da će za izračunavanje izraza m/n biti upotrijebljena cjelobrojna aritmetika. najbliži cijeli broj za 4.. (Upozorenje. Način kako to postižemo je upotreba int cast operatora: double x = 4.7 tada postaje cijeli broj 4.Brojevi i znakovni nizovi Math. vrijednost od x + 0.2. Što će biti rezultat izvršavanja slijedećeg izraza: double x = m/n. slijedeći izraz obavit će zaokruživanje pozitivnog broja x i pohraniti zaokruženu vrijednost u varijablu i : int i = (int) (x + 0.5.. int i = (int) x. Kad smo to učinili operator se sada odnosi na jednu double vrijednost i jednu int vrijednost. Odgovor je da će x biti postavljen na vrijednost 0.2. Da je x bio postavljen na −4. Npr. izračunat će m*n koristeći cjelobrojnu aritmetiku te rezultat privremeno spremiti kao 32-bitnu vrijednost odnosno cijeli broj 6.5 bit će 5. Kadgod se to dogodi Java će konvertirati cijeli broj u odgovarajući broj s pokretnim zarezom Razmotrite slijedeće izraze: int m = 3. a vrijednost od (int)(x + 0.floor(x) najveći cijeli broj ≤ x Math. int n = 4. Ne piši: int i = (int)x + 0.7. dakle dio koji ostane kad oduzmemo decimalni dio. broj u pokretnom zarezu 4. Potrebno je Javu uvjeriti da vrijednosti m i n tretira kao brojeve s pokretnim zarezom.5) bit će 5. Drugi način konvertiranja brojeva u pokretnom zarezu u cijele brojeve je zaokruživanje na najbliži cijeli broj. a rezultat je tipa double. Npr. ako je x jednak 4. Kada želimo konvertirati broj u pokretnom zarezu u cijeli broj postoje dva načina. double x = m∗n.7. Možemo to učiniti na slijedeći način: double x = ((double) m) / n. Kada Java bude izvršavala treći izraz.7. ) 18 .5). jer su oba operanda cjelobrojna Pretpostavimo da ipak želimo koristiti normalno dijeljenje brojeva s pokretnim zarezom.abs(x) apsolutna vrijednost od x Math. Java se neće buniti ako nađe vrijednost tipa int na mjestu gdje je predviđen tip double. Drugi izraz će konvertirati vrijednost od x u cijeli broj 4 i nakon toga pohraniti ga u varijablu i. Prvi je način da od broja s pokretnim zarezom uzmemo cijeli dio.

U ovome tečaju koristit ćemo jednu klasu nazvanu ConsoleReader.out ima pristup ekranu i može proslijediti na njega bilo koje brojeve ili stringove koje mu damo kao parametre. (Možemo ga i drukčije nazvati) ConsoleReader objekt posjeduje tri korisne metode: in. U Javi postoji takav objekt i naziva se System.in.round(x)). Čitanje ulaza korištenjem ConsoleReader objekta Primjeri koji su dosada obrađivani koriste za svoj račun vrijednosti koje je programer upisao u sam kod programa. Primijetite da se radi o deklaraciji varijable. Npr. Isto je točno kada čitamo s tipkovnice. Ako u njima želimo neke druge vrijednosti moramo ih mijenjati u kodu programa. Objekt System. program koji konvertira valute mogao bi prvo ispisati poruku da korisnik upiše iznos u markama. Kad je želimo koristiti u programu na početku programa napišemo: ConsoleReader in = new ConsoleReader(System. //će kreirati varijablu broj i pridružiti joj vrijednost koja se ukuca s tastature. 19 . To će biti cijeli broj koji korisnik utipka.out.in objektu koji je spojen na tipkovnicu. Posjeduje jednu metodu read koji će pročitati sve što korisnik upiše. Sve što je potrebno da bi se rezultat dodijelio varijabli tipa int je primjena (int) cast operatora : int i = (int) (Math.readInt() vraća int vrijednost. U ovom dijelu napisati ćemo takav program. Ova deklaracija kreira novi objekt tipa klase ConsoleReader koji može pristupiti System.in). in. 5. Dosada smo u primjerima prikazivali informacije na ekranu koristeći println i print metode koje pripadaju objektu System.round(x)kao rezultat vraća vrijednost tipa long. Nije teško konstruirati klasu s boljim setom metoda. Nažalost posjeduje veoma limitiran broj metoda.Brojevi i znakovni nizovi Kako bi bilo izvedeno zaokruživanje za negativne brojeve ? U zaokruživanju broja u pokretnom zarezu(i pozitivnih i negativnih) na najbliži cijeli broj možete koristiti i metodu iz Math klase: Math. ali ga je teško koristiti jer čita samo jedan karakter. Npr.readInt(). Ljepša alternativa je da ponovo napišemo programe tako da njihove ulazne vrijednosti unosimo koristeći tipkovnicu tijekom izvršavanja programa. Kad se izvrši ta naredba objekt koji nam je potreban odsad je prisutan u memoriji i njegove metode možemo pozivati koristeći njegov naziv in .2.readDouble(). U tom slučaju trebamo objekt koji je spojen na tipkovnicu i koji ima metode kojima možemo pristupiti znakovima koje kucamo na tipkovnici. izraz : int broj = in. zatim pročita ono što mu se upiše i na kraju ispiše rezultat. // vraća double vrijednost.round(x) To je zgodno rješenje osim što Math. U isto vrijeme kreira se varijabla in tipa ConsoleReader koja označava taj objekt.

int eura = in. PRIMJER 5 vraća string. String je jedan od najčešće korištenih tipova podataka u Javi. te uključivati bilo koji znak.out. ako unesete dva broja u jednu liniju ili ako unesete slova umjesto broja program će javiti run-time grešku. Čak možete imati i string bez karaktera. centa = 100*eura + centa. Nadalje ćemo se koristiti izrazom string.readInt(). Tada traži od korisnika da utipka vrijednosti maraka i pfeniga.println("Unesi iznose eura i centa").java. int centa = in. Prvo ćete primjer ukucati u datoteku s istim nazivom kao i klasa dakle Mjenjacnica2. System. Takav string nazivamo prazan string i zadaje se kao "". Npr. System.string. Prije pokretanja bilo kojeg programa koji koristi klasu ConsoleReader potrebno je da istu imate u istome direktoriju kao i program u kojem je koristite.print("Iznos u eurima ="). System.java. Ovo je nova verzija programa za preračun maraka u eure.2305 ConsoleReader objekt nije robustan. 6. automatski će je prevest. Pretpostavimo da želite koristiti primjer 5. U isti direktorij kopirajte i datoteku ConsoleReader.print("Kuna: "). koji je označen sa in. } } Na ekranu bi trebalo nakon svega pisati (ono što korisnik ukuca je ovdje naznačeno podebljano) Unesi Iznos Iznos Kuna: iznose eura i centa u eurima = 110 u centima = 55 830.out. 20 . Niz znakova (literal string) možemo napisati kao niz znakova zatvorenih u dvostruke navodnike poput slijedećeg: ″Jedan dan″ Literal stringovi mogu biti proizvoljne duljine. Tada prevedite i pokrenite Mjenjacnica2 na uobičajen način. System. Sastojat će se od znakova koje korisnik public class Mjenjacnica2 { /* Ucitaj iznos u markama i preracunaj u eure */ public static void main(String[] args) { ConsoleReader in = new ConsoleReader(System.in).Brojevi i znakovni nizovi in.out.print("Iznos u centima ="). Naredbe koje čitaju vrijednosti naznačene su podebljano (ne i u stvarnom kodu programa) .print(kuna). double kuna = centa * 0. System.readLine(). Kada Java prevodilac vidi da java koristi ConsoleReader klasu. Znakovni niz . // ukuca do kraja linije.0751. Započinje se kreiranjem ConsoleReader objekta.2.out.out.readInt().

.Brojevi i znakovni nizovi String može sadržavati kontrolne znakove (control characters). Ovaj način tretiranja String varijable znači da je sama varijabla uvijek iste veličine – dovoljno velika da sadrži vrijednost reference (adrese) Npr. Slijedi lista najznačajnijih kombinacija karaktera: \n \t \b \r \f \\ \′ \″ Npr. Koristi se i za uvođenje određenih karaktera u string poput " koji bi inače značio kraj stringa.out. automobil B M W Slika 2. ‘\’ se naziva escape karakter.print(″Jedan\ndan″). tabulatora. Ako želite uključiti kontrolni karakter u literalni string. napisat će ‘Jedan’ u jednu liniju te ‘dan’u slijedeću liniju..1. To je slično kao što svaka kuća u gradu ima svoju poštansku adresu Kad se izvrši gornji izraz izvrše se slijedeći koraci: (1) (2) (3) Kreira se varijabla nazvana automobil String ″BMW″ pohrani se u drugi dio memorije ! Referenca (adresa) gdje je string pohranjen dodijeli se varijabli automobil. Strelica od varijable prema stringu reprezentira činjenicu da varijabla sadrži referencu na lokaciju gdje je string pohranjen. Ako ispisujete string korištenjem System. Što se stvarno događa uključuje jednu vrlo bitnu osobinu rada s memorijom Svaka lokacija u memoriji ima svoju adresu (reference value or address). Rezultirajuće stanje u memoriji može se prikazati dijagramom na slici 1. izraz novi red (newline) tabulator – pomak (tab) nazad (backspace) return – pomak na početak slijedeće linije line feed – pomak na slijedeću liniju bez odlaska na početak \ znak ′ znak ″ znak System. nazvanu automobil kojoj dodjeljuje vrijednost "BMW". String automobil = ″BMW″.println metode i ako ta metoda naiđe na kontrolni karakter npr. . Ti znakovi znače stvari poput novog reda. na newline kontrolni karakter ona će tada pomaknuti kursor na novi red.out. potrebno je korištenje \ karaktera nakon kojega slijedi slovo. Nije ispravno da će ovaj izraz pohraniti string ″BMW″ na memorijsku lokaciju varijable automobil. ako kasnije izvršimo naredbu: 21 .2. Slijedi primjer izraza koji kreira novu varijablu tipa String. Ako želite pohraniti string da bismo ga koristili kasnije u programu koristit ćemo varijablu tipa String.

Razlika je u tome što će to biti referenca na neki drugi dio memorije koji sada sadrži drugi(duži) string ″Alfa Romeo″. ako je varijabli automobil dodijeljena referenca na string "BMW" onda će izraz ″Novi ″ + automobil + ″ je skup.println(″Novi ″ + automobil + ″ je skup. onda st1+ st2 znači string koji se sastoji od svih karaktera st1 nakon kojih slijede karakteri iz stringa st2. zagrade oko izraza total/100 i total%100 nisu potrebne jer Java primjeni pravilo da operatori / i % imaju veći prioritet od operatora +.print(" kn i ").out.″ Izrazi poput ovoga mogu se koristiti bilo gdje u programu gdje je potreban neki složeni izraz.out.print("Racun je: ").out. Primijetite da je Java uzela vrijednost iz varijable cijena i pretvorila je u string sa znamenkama pogodnim prikazu cijelih brojeva. Npr.out. Tada će izraz: ″Cijena novog ″ + automobil + ″ je ″ + cijena + ″ eura″. dakle istu količinu memorije.out. Npr. System. System. System.print(total/100). značiti string: ″Cijena novog BMW je 30000 eura″.″ znači string: ″Novi BMW je skup. varijabla automobil će nakon toga opet sadržavati vrijednost reference.println(" lipa. I u primjerima 2 i 3 mogli smo koristiti sličan način : Izraze: System. 22 .out.Brojevi i znakovni nizovi automobil = ″Alfa Romeo″. slijedeći izraz : System." ). će ispisati na ekranu ″Novi BMW je skup.println ("Racun je: "+ (total/100) + " kn i " + (total%100) + " lipa.″). Ako su st1 i st2 stringovi. System. Postoji jedan vrlo koristan operator koji se može primijeniti na stringove. Npr.2.out. cijena je cjelobrojna vrijednost koja sadrži vrijednost 30000.").print(total%100). Naziva se operator spajanja (concatenation) i označava se znakom ‘+’.″ Kako često trebamo ispisivati poruke koje sadrže i brojeve Java dopušta da se kombiniraju brojevi i stringovi korištenjem + operatora. Točnije. Mogli smo zamijeniti s jednim izrazom: System.

(n je prva pozicija koja nije uključena !). ali 21 je bolje. Tada izraz : st.in). System. Pretpostavimo da st označava string . Jedna od vrlo korisnih se naziva substring.out. Java koristi konvenciju da su karakteri unutar stringa numerirani s 0. U ovom slučaju taj objekt je označen nazivom korisnik.readInt() za čitanje broja godina.readInt(). (Korisnikov unos je podebljan. koliko imaš godina Ivica? 20 20 su lijepe godine . System. } } Ovo bi se trebalo pojaviti na ekranu kad se program pokrene. Metoda korisnik.substring(m. počevši od pozicije m i završavajući s pozicijom n-1. EXAMPLE 6 public class Prica { /* Pricaj s korisnikom.println ("Cao. onda izraz automobil. System. Također program starost korisnika i dodjeljuje ga varijabli godina.println ("Koliko imaš godina " + ime + "?"). Vidimo se kasnije Ivica! Stringovi imaju mnogo korisnih metode koje su vezane za njih. kako se zoveš? Ivica.out. Program čita korisnikovo ime i dodjeljuje ga varijabli ime. System.readLine(). */ public static void main(String[] args) { ConsoleReader korisnik = new ConsoleReader(System. M e r c e d e s 0 1 2 3 4 5 6 7 8 23 .print(godina + " su lijepe godine. 2. Program započinje konstrukcijom ConsoleReader objekta da bi mogao čitati što korisnik utipka.Brojevi i znakovni nizovi Slijedi program koji obavlja luckastu konverzaciju s korisnikom.n) daje novi string koji se sastoji od karaktera stringa st.out. Npr. String ime = korisnik.readLine() koristi se za čitanje imena ."). 1.println ("ali " + (godina+1) + " je bolje. … s lijeva nadesno.println ("Vidimo se kasnije " + ime + "!").2. Nakon toga koristi te dvije vrijednosti da bi konstruirao par rečenica koje će ispisati na ekran. int godina = korisnik.kako je to dolje pokazano.out.) Cao.out. "). ako varijabla automobil označava string ″Mercedes″.8) će dati string ″des″. kako se zoveš?"). System. a metoda user.substring(5. a da su m i n cjelobrojne vrijednosti.

toLowerCase() vraća string ″mercedes″ Daje string sa svim malim slovima pretvorenim u velika slova. a zatim će oba stringa biti spojena. U ovome slučaju string nastao iz zbroja je spojen s praznim stringom. U svakom primjeru st označava string. Ako je jedan string. Npr. Integer. ako varijabla rezultat sadrži vrijednost 142. ″Mercedes″. Ako se računa izraz koji sadrži više + operatora izraz se računa slijeva nadesno ! Ponovo razmotrimo izraz: ″Rezultat je ″ + 3 + 7 24 . onda izraz ″″ + rezultat će proizvesti string ″142″. Razmotrimo slijedeće izraze: ″Rezultat je ″ + 3 + 7 3 + 7 + ″ je rezultat″ na prvi pogled izgleda kao da želimo reći istu stvar. To radi jer Java koristi pravilo koje kaže da ako kombinirate string i broj pomoću operatora +.length() vraća vrijednost 8. tada će se dogoditi slijedeće: (1) Ako su x i y oboje stringovi onda će ih spojiti. Npr.println vidjet ćete da ćete dobiti sasvim nešto drugo. Potrebno je koristiti neki od slijedećih metoda. ″Mercedes″.UpperCase() Ako ste izračunali broj i želite ga pretvoriti u odgovarajući string sve što je potrebno je kombinirati prazni string i broj koristeći + operator. broj će biti konvertiran u string. U drugom smjeru nije tako jednostavno.2. Da biste predvidjeli što će se u ovakvim slučajevima potrebno je koristiti slijedeće pravila: Ako Java treba odrediti vrijednost izraza x+y gdje su x i y bilo brojevi ili stringovi.out.Brojevi i znakovni nizovi Navest ćemo još neke standardne metode koje možemo koristiti u radu sa stringovima. Npr.parseInt(st) vrijednost Double.length() Daje broj znakova u stringu ("duljina" stringa st) Npr. ″Mercedes″.toLowerCase() st. Daje string sa svim velikim slovima pretvorenim u mala slova.toUpperCase() vraća string ″MERCEDES″ st. Međutim ako ih ispišemo koristeći metodu System. st.parseDouble(st) odgovarajuću vrijednost. Ako string st predstavlja cjelobrojnu vrijednost ovo će dati odgovarajuću Ako string st predstavlja broj u pokretnom zarezu ovo će dati Na kraju ovog dijela još pokoje pravilo o kombiniranju brojeva i stringova korištenjem + operatora. a drugi broj onda će pretvoriti broj u string i spojiti ga s drugim stringom Ako su x i y oboje brojevi bit će zbrojeni.

Potrebno je unijeti i prevesti i izvršiti 4 zadatka. 4. Moje ime je Java. Ime može biti bilo koje. spojiti ga s prvim stringom i dati ″Rezultat je 3″. Zadatak (Koristi naziv klase i datoteke Aritmetika) Napiši program koji traži od korisnika da ukuca dva cijela broja i zatim ispiši: sumu razliku umnožak prosjek (double !) udaljenost (apsolutna vrijednost razlike) *1Koristi metodu Math. 1 euro = 7. Kako se ti zoveš ? Ivica Ivica ! Drago mi je što smo se upoznali. +−−+−−+−−+ | | | | +−−+−−+−−+ | | | | +−−+−−+−−+ | | | | +−−+−−+−−+ Učini to na način da kreiraš dvije string varijable za oba uzorka pa onda te varijable naizmjenično ispiši. Zatim će obraditi ″Rezultat je 3″ + 7. zatim učitati ime i nakon toga ispisati pozdrav.50 kn) Zadatak. Bok. i konačno dati string: ″Rezultat je 37″ Sad razmotri: 3 + 7 ″ je rezultat″ Ovaj put će Java prvo zbrojiti 3 i 7 i dati broj 10.2. (Koristi naziv klase i datoteke Upoznavanje) Napiši program koji će ispisati prva dva reda kao što je prikazano.Brojevi i znakovni nizovi Prvo što će Java obraditi je ″rezultat je ″ + 3. 1. Zadatak (Koristi naziv klase i datoteke Mjenjacnica) Napiši program koji učitava iznos u kunama i preračunava ih u eure (kurs npr. (Koristi naziv klase i datoteke Tablica) Napiši program koji će nacrtati tablicu na ekranu. Zatim će obraditi 10 + ″ je rezultat ″ i konačno dati: ″10 je rezultat ″ 7. 25 .. Pretvorit će broj 3 u string "3".abs za račun apsolutne vrijednosti 2. Zadaci za poglavlje 2 Za ove zadatke kreirajte direktorij P2 unutar direktorija JProg. Zadatak. Podebljan je upis od strane korisnika .

2.Brojevi i znakovni nizovi 26 .

Iako ih ne možete opipati Java objekti su isto tako realni. Što je to objekt? U ranim danima programiranja prvi programski jezici poput Fortrana dozvoljavali su programerima da rukuju s vrlo ograničenim skupom tipova podataka npr.out za slanje informacija na izlaz. koji su to mehanizmi koji stoje iza svih njegovih funkcija. Vi ste "korisnik" sata. a zatim ga koristi. Što je to objekt ? Postoje dva gledišta na objekt. Prvog programera nazvat ćemo "korisnik".3. Razlika u tome što dizajneru predstavlja objekt . S druge strane osoba koja je dizajnirala sat znat će sve što se događa unutra. C# pa čak i Visual Basica. . a drugo sa strane programera koji dizajner objekt. ConsoleReader za čitanje informacija s tipkovnice.. Programer koji je programirao objekt zna koje će se operacije izvršavati kad se te funkcije pozovu. Dizajneri će potrošiti dosta vremena pokušavajući konstruirati sat da bi vama omogućili korištenje uobičajenih funkcija sata. mobitel. Dizajn klase je dio programa koji nazivamo definicija klase. Java. te funkcije nazivamo sučelje (interface). 3. 4. promjenu vremena. 7. Što je to objekt ? Klasa student Više o klasama Reference na objekte (Objects References). Korisnik će na pitanje "Što je to objekt" odgovoriti s "Ne znam od čega se sastoji već mi je poznato njegovo sučelje i što mogu s njim učiniti". Međutim vidjeli smo na primjeru objekata tipa ConsoleReader da je taj objekt dizajnirao neki drugi programer. Ako je dobro dizajniran omogućavat će očitavanje vremena. U stvari dizajnirat ćemo pojedine objekte. Pogledajte na vaš sat(ako ga imate). Jedno sa strane programera koji koristi objekt. start-stop funkciju štoperice. Objekti i klase U prva poglavlja koristili smo nekoliko objekata: objekt koji se zove System. Sadržaj: 1. Ovo poglavlje bavi se konstruiranjem novih objekata. brojevi s pokretnim zarezom i nizovi brojeva. Objekti su se dokazali kao jedna od najznačajnijih inovacija u programiranju. automobil. Taj dio nazivamo implementacija objekta. Programer korisnik je upućen koje su funkcije pridružene pojedinoj vrsti objekata. 5. U ovom poglavlju pokušat ćemo objasniti kako objekti izgledaju sa stanovišta dizajnera objekata. 6. i String objekt. a drugog programera "dizajner" (možda je bolji naziv "konstruktor"). Nekih 10 godina kasnije programski jezik Simula 67 omogući je programerima definiranje vlastitih tipova podataka nazvanih objekti. a što predstavlja korisniku nije samo ograničena na Javu. vama kao korisniku nije potrebno poznavati što se događa unutar sata. cijeli brojevi. Dizajner će odgovoriti s: "Sastavljen je od varijabli i metoda koje međusobno djeluju da bi realizirale sučelje objekta. Većinom ćemo se baviti konstruiranjem objekta koji će sadržavati informacije o studentu. 2. Isto je točno za bilo koji uređaj npr. null vrijednost Identifikatori Zadaci 1. itd. a mi smo ga vrlo lako koristili. Objekti i klase 3. 27 . Danas predstavljaju osnovu programskih jezika poput C++.. Često se događa da isti programer prvo dizajnira objekt. Svi objekti koji se grade na osnovu istog dizajna pripadaju istoj klasi.

U ovome poglavlju nećemo pokušavati napisati kompletan program već ćemo se koncentrirati na dizajn objekata i to na objekt koji će sadržavati podatke za pojedinog studenta. Bit će potrebno omogućiti ispisivanje podataka o studentu na ekran. Da bismo održali jednostavnost primjera uključit ćemo ograničeni skup operacija: Bit će potrebno omogućiti mijenjanje godine studenta s 1 na 2 ili 2 na 3. Ako bismo dizajnirali sat. skup operacija koje sat treba izvoditi. U terminologiji ručnog sata.. npr. Postoje tri vrste članova. Klasa Student Zamislite da ćemo u Javi napisati program koji će u bazi podataka održavati podatke o svim studentima na ovome fakultetu. počeli bismo od ideje kako konstruirati sučelje tj. odnosno kako složiti stavi unutar objekta da se osigura tražena funkcionalnost. U ove članovi spremaju se informacije koje objekt sadrži. Program poput toga vjerojatno bi sadržavao mnogo različitih tipova objekata. Bit će potrebno kreirati nove objekte tipa Student. Dobivanje ostalih informacija zasad nećemo realizirati. Ova akcija će se normalno odvijati na kraju godine.. klasu koja predstavlja dizajn te vrste objekta nazvat ćemo Student. . Student objekt može sadržavati varijablu koje sadrži studentovo ime i drugu koja sadrži naziv programa studija. Da bismo razlikovali te varijable od varijabli koje smo definirali unutar metoda (u prošlom poglavlju). Npr. Metode. Svaki objekt u Javi sastavljen je od nekog broja odvojenih dijelova nazvanih članovi (members). Objekti i klase 2. Osigurat ćemo metodu prikaz koja će to činiti. • Varijable. vidjeli smo da ConsoleReader objekt ima metodu koja se naziva ReadInt koja koristi taj objekt da bi se dobila vrijednost koju je korisnik utipkao. Slično. ime. prvo u definiranju klase Student je odluka koje operacije će biti asocirane s objektom tipa Student. potrebno je odrediti kako će pojedine komponente biti raspoređene i povezane unutar kućišta da bi proizvele sat koji radi. Ovi članovi izvršavaju operacije na objektu (ili s objektom). Jedan o tipova bi sigurno bio onaj koji bi sadržavao podatke o pojedinom studentu. Npr.3. Bit će potrebno omogućiti promjenu programa studija (stupnja) Bit će potrebno omogućiti način da objekt vrati ime studenta kako bi program mogao ispitati kojemu studentu pripada odgovarajući objekt. Ova vrsta metoda nazivaju se metode instance (instance methods) kako bi ih razlikovali od statičkih metoda koje ne pripadaju nijednom objektu (više o statičkim metodama kasnije 28 . Svaki put kad bude kreiran bit će potrebno dati informacije o studentu. Za očekivat je i postojanje objekta koji bi predstavljao listu svih studenata u bazi podataka. Sad je vrijeme za definiciju klase student. program studija (stupanj) . Kada napišemo definiciju klase Student imat ćemo metodu uNovuGodinu koja će dodavati jedan na tekuću studentovu godinu. Nakon toga bismo radili na implementaciji sučelja. Skup vrijednosti koje sadrže varijable pojedinog objekta nazivaju se stanje (state) objekta. varijable koje pripadaju objektu nazivamo polja (fields) ili varijable instance (instance variables).

Svaki put kad pozovemo metodu svakome od tih parametara bit će dodijeljena vrijednost koju će moći koristiti tijekom izvršavanja metode. vidjet ćemo da počinju s riječju private koja znači da to metodu može pozvati korisnik objekta. Te varijable sadržavat će informacije koje su pohranjene u svakom objektu tipa Student. Kad je pozovemo bit će potrebno znati koji je novi naziv novog programa studija. Slijedeće dodjeljivanje će obaviti taj zadatak: 29 . Zbog toga ćemo odabrati tip podatka String . Neće biti nikakve razlike ako se sastoji od niza znakova umjesto od znamenaka. Godina studija. Cijela linija predstavlja deklaraciju varijable. private String programStudija. Ime. Riječ private određuje da se polju ne može direktno pristupiti izvan definicije klase Student. 3. private String idBroj. Pretpostavimo za sada 4 informacije (slaže se sa zahtjevima operacija navedenih prije. Kad smo odabrali polja koja će objekt sadržavati. 2 ili 3). 4. Prvo ćemo konstruirati metodu koja će se koristiti za promjenu studentovog programa studija. private String ime. Ovi članovi se koriste da bismo konstruirali objekte određene klase. Sad ćemo specificirati koje će članove posjedovati objekti tipa Student. Ime studenta i naziv programa studija također će biti tipa String. Nakon riječi private dolazi tip vrijednosti koje spremamo u polje te naziv polja. Prvo ćemo definirati polja (fields) . U klasu student uključit ćemo jedan konstruktor jer inače ne bi bilo moguće napisati program koji bi koristio objekte te klase. // ID broj Studenta. U definiciji metoda taj parametar nazvat ćemo jednostavno p.) 1. Java ignorira sve od // do kraja reda. Nazvat ćemo je setProgramStudija. Tijelo svakog parametra sastojat će se od niza izraza koji će izvršavati potrebne akcije. Npr. Općenito metoda može imati bilo koji broj parametara. U ovom slučaju potrebna je samo jedna akcija: novi naziv programa studija (dakle parametar p) potrebno je pohraniti u polje programStudija . private int godina. Konstruktori su vrlo slični metodama na mnogo načina. // studentovo ime. //Program studija. Potrebno je odabrati nazive za ta polja i odlučiti koji će se tip podataka koristiti. Polja u klasi su obično označena kao private. ID broj je u stvarnosti samo niz karaktera. (Kad dođemo do metoda asociranih sa objektom Student. 2. Naziv programa. Studentov ID. Ta dodatna informacija bit će parametar metode. ID broj može biti cijeli broj ili string. Godina studija bit će cjelobrojna vrijednost tipa int. Ako programer "korisnik" objekta napiše kod koji zove takvu varijablu prevodioc će javiti grešku prevodioca. // Godina studija // (1.3. sad trebamo napisati metode koje će izvršavati osnovne operacije pridružene objektu. Moguće je uključiti i inicijalnu vrijednost. Slijede definicije polja. Linije koje počinju s // su komentari koji objašnjavaju sadržaj svakog polja. Objekti i klase Konstruktori. setProgramStudija ima samo jedan parametar – naziv studentovog novog programa.

Tada ako programer želi postaviti za tog student program studija na npr. povecajGodinu je naziv metode. (String p) je lista svih parametara metode. void znači da metoda ne vraća nikakvu vrijednost. } Što kaže zaglavlje: public znači da se metoda može koristiti bilo gdje u programu. 30 . Pretpostavimo da je kreirao određeni objekt studenta i pridodijelit ga varijabli stud1 . U ovome slučaju tijelo metoda sastoji se samo od jedne naredbe. dakle i unutar klase i van definicije klase void kaže da metoda ne vraća nikakvu vrijednost. /* Povećaj godinu studija za jedan */ public void povecajGodinu() { godina++. U ovome slučaju radi se o samo jednom parametru koji je tipa String . Svaka od riječi ima značenje: public kaže da se metoda može koristiti bilo gdje u programu.setProgramStudija(”strojarstvo”). Slijedeće ćemo definirati metodu koja dodaje jedan na studentovu godinu studija. Rezultat će biti će polje objekta programStudija biti postavljeno na vrijednost ”strojarstvo”. } Kao obično počinjemo s komentarom što program radi. setProgramStudija je naziv metode. godina++. Ovaj naredba kaže: izvrši metodu setProgramStudija koja je asocirana s objektom stud1 (tipa Student) koristeći vrijednost parametra "strojarstvo".3. Slijedi kompletna metoda. Pretpostavimo da programer korisnik piše nekakav program u nekoj drugoj klasi odvojeno od klase student. Ovo je još jednostavnije jer metoda nema nikakvih parametara. Objekti i klase programStudija = p. Na kraju imamo tijelo metoda zatvoreno u vitičaste zagrade{…}. na strojarstvo može pisati naredbu: stud1. */ public void setProgramStudija(String p) { programStudija = p. Slijedi kompletna definicija metoda setProgramStudija: /* Promijeni programStudija u p. Cijelo tijelo je izraz koji dodaje jedinicu na polje godina. a naziva se d. Slijedeća linija je zaglavlje metoda .

} Zaglavlje znači: public kaže da se metoda može koristiti bilo gdje. Ona kaže: vrati vrijednost polja ime. i Java će ga pohraniti u varijablu st. */ public String getIme() { return ime. To je tip naredbe koji nismo dosada sreli. Pretpostavimo da imamo slijedeću naredbu: String st = stud1.getName() korišten na isti način kao što je korišteno npr. Zadnja metoda ispisuje na ekran sve informacije o studentu.3.Math. Van klase student slijedeći izraz može biti korišten za dodavanje jedinice na broj godine studenta. Math.povecajGodinu(). Tijelo metoda je jedna naredba: return ime. */ public void prikaz() 31 .5) double x = 1 . Podsjetite se da se toj varijabli ne može pristupiti direktno izvan klase jer je polje ime označeno kao private.getName() Metoda će biti pozvana za objekt stud1. Naziva se naredba vraćanja vrijednosti(return statement). Slijedeća metoda vraća ime koje je pohranjeno u objektu tipa Student. To znači da se ne prosljeđuje nikakva informacija metodu koji se poziva.5). Ovdje je kompletna metoda: /* Vrati studentovo ime. getIme je naziv metoda. Metodu smo nazvali getIme. Za razliku od dva prethodna metoda ovaj "vraća vrijednost". Primijetite da je stud1. Vrijednost se vraća na mjesto poziva metoda. (metoda nema parametara) Metoda će vratiti ime studenta.sqrt(1. () pokazuje da metoda nema parametara. Nazvat ćemo je prikaz /* Prikaži informacije o studentu na ekran. Koristimo opet objekt stud1 (klase Student) stud1. Java će kreirati varijablu st te nakon toga pozvati metodu stud1. Ovo se naziva vraćeni tip podatka (return type).getName(). Objekti i klase () pokazuje da nema parametara. String kaže da metoda vraća vrijednost tipa String.sqrt(1.

ime i naziv programa studija. pohraniti 1 u polje godina. pohraniti string im u polje ime . Objekti i klase { System. Konstruktor može imati bilo koji broj parametara. String im. Slijedi konstruktor: /* Kreiraj novog studenta sa zadanim ID brojem. 2.println ("Program studija: " + programStudija). 3. Primijetite da ne postoji ništa u tijelu konstruktora što indicira prvi korak stvaranja objekta. a to je objekt koji se njime kreira. System. godina = 1. Slijedi navedeni konstruktor iskorišten u stvaranju objekta tipa Student: Student stud1 = new Student(″9912345″. Konstruktor nema naznaku što vraća jer je očito što bi trebao vratiti. Potrebno ju je upotrijebiti svaki put kada s konstruktorom stvaramo novi objekt. 4. String p) { idBroj = id. */ public Student(String id. Ovo znači: prvo kreiraj varijablu nazvanu st koja će se odnositi na Student objekt.println ("Godina: " + godina). Ovaj ovdje ima tri: studentov ID broj. } Sa dana tri parametra konstruktor će: 1.out. 5. Java to radi automatski kada izvršava konstruktor. ime = im. programStudija = p. System. Svaka varijabla koja će označavati objekt tipa Student mora biti deklarirana kao varijabla tipa Student.out. imenom i programom studija Polje godina bit će postavljeno na 1. Ovdje je pretpostavljeno da će godina studija biti 1 kada je objekt kreiran.3. Primijetite upotrebu ključne riječi new. pohraniti string p u polje programStudija .out. ″Ivo Petrić″. ″strojarstvo″).out. Zatim kreiraj novi objekt tipa student s podacima naznačenim u listi parametara. U ovom slučaju konstruktor se zove Student.println ("Ime: " + ime).println ("Student ID: " + idBroj). Naposljetku treba napisati konstruktor koji će programer korisnik moći upotrijebiti za stvaranje novih objekata tipa Student. System. pohraniti string id u polje idBroj novostvorenog objekta.prikaz(). stvoriti novi objekt. (vrijedi za sve tipove objekata) 32 . } Zaglavlje pokazuje da metoda ne vraća nikakvu vrijednost i nema parametara pa će poziv metoda izgledati ovako: stud1. Konstruktor uvijek ima naziv identičan nazivu klase.

//Program studija. Objekti i klase S ovim smo kompletirali definiciju klase Student. System.println ("Godina: " + godina). // studentovo ime. } /* Vrati studentovo ime. PRIMJER1 /* Student objekt za studenta FESB-a */ { public class Student private String idBroj. private int godina.out.println ("Student ID: " + idBroj). System. Još ostaje dodati zaglavlje cijele klase. } /* Kreiraj novog studenta sa zadanim ID brojem. */ public void prikaz() { System. } /* Povećaj godinu studija za jedan */ public void povecajGodinu() { godina++.3.out.println ("Ime: " + ime). /* Promijeni programStudija u p. } /* Prikaži informacije o studentu na ekran. // Godina studija // (1.println ("Program studija: " + programStudija). private String ime. 2 ili 3). */ public void setProgramStudija(String p) { programStudija = p.out. U klasi su prvo stavljena polja iako redoslijed članova nije bitan. imenom i programom studija 33 . */ public String getIme() { return ime. private String programStudija. // ID broj Studenta. System.out.

*/ System. System. Na kraju se podaci o studentu ispišu na ekran. Poput programa iz prošlog poglavlja sastoji se od samo jedne statičke metode main . String i = in.println("Koje je ime studenta?"). Slijedi TestStudent klasa: PRIMJER 2 public class TestStudent { /* Učitaj podatke o studentu. /* Učitaj podatke o studentu i kreiraj objekt za njih. Metoda prvo čita informacije o studentu unesene preko tipkovnice.readLine(). Nakon toga povećava godinu studija za jedan.readLine().povecajGodinu(). Kako je konstruktor već postavio tu vrijednost na 1 sad bi trebala biti 2. Objekti i klase Polje godina bit će postavljeno na 1. Prikaži ne ekranu podatke objekta. Kreiraj objekt tipa student. programStudija = p.in).out. ime = im.println ("Koji je ID broj studenta?").setProgramStudija(″elektronika″). koristeći izraz: st.On je sam stavljen u klasu koju ćemo nazvati TestStudent. String im. Zatim se program studija promijeni s izrazom: st.3. String p) { idBroj = id.prikaz(). 34 . st. */ public static void main(String[] args) { /* Kreiraj ConsoleReader za učitavanje što korisnik tipka */ ConsoleReader in = new ConsoleReader(System.out. String n = in. } } Konačno jedan veoma jednostavan program koji će koristiti objekt tipa Student. */ public Student(String id. godina = 1. Nakon toga kreira objekt tipa Student koristeći konstruktor i varijablu st.

9912345 Koje je ime studenta? Ivo Petric Koji je program studija? Strojarstvo Student ID: 9912345 Name: Ivo Petric Program Studija: elektronika Godina: 2 3. Student st = new Student(i. Intepreter provjerava sve postojeće objekte i briše one objekte na koje ne upućuje niti jedna varijabla ili drugi objekt.println("Koji je program studija?").out. za uspješno pokretanje programa iz primjera 2 osim klasa iz biblioteka potrebne su još tri klase: TestStudent. st. Proces kreiranja objekata i izvršavanja metoda počinje unutar main metode. One će se obično nalaziti u tri datoteke nazvane: TestStudent. intepreter mora imati pristup definicijama svih objekata koje treba koristiti.java. st.3.println metodu. Kada pozovete intepreter s naredbom: java klasa gdje je klasa prevedena klasa (bytecode). ali neće se pozvati niti jedan izraz za njihovo uklanjanje. Objekti i klase System. Da bi uspješno upravljao s potrebnim objektima i metodama.java. Student.povecajGodinu(). bit će kreirani različiti objekti i bit će pozivane neke od njihovih metoda.out. } } Ovo se može pojaviti na ekranu tijekom izvođenja programa: Koji je ID broj studenta?").prikaz(). Objekte će ukloniti iz memorije interpreter u trenutku kad mu zatreba više memorije.) Ako intepreter nađe takvu metodu počet će izvršavati njene naredbe. Npr.n. /* Povećaj broj godine studija i prikaži informacije na ekranu.println(). Neke klase će napisati drugi programeri.java i ConsoleReader. System. poput PrintStream klase koja sadrži System. Student i ConsoleReader. U procesu prevođenja bit će dovoljno izvršiti naredbu 35 . Neke od tih klasa ćete i sami napisati. */ st.setProgramStudija(″elektronika″). Konstruktori će se koristiti za kreiranje objekata.readLine().out. Više o klasama U tijeku izvršavanja vaših Java programa. poput ConsoleReader klase.d). intepreter će poći do definicije klase i tražiti metodu sa zaglavljem public static void main(String[] a) (Naziv parametra može biti bilo koji naziv. Taj proces naziva se "odvoz smeća" (garbage collection). String d = in. Neke će biti napisane u Java biblioteci.

Napišite slijedeću naredbu: java TestStudent intepreter će doći do TestStudent klase i potražiti public. Druga klasa od koje se ne proizvode objekti. Razlog je da se korisniku klase koji ne poznaje u potpunosti rad klase ograniči mogućnost krive upotrebe klase. Dosad smo diskusiju o klasama u ovom poglavlju zasnivali na ideji da je definicija klase opis određenog objekta. static metodu s nazivom main. i sadržavao je samo jednu metodu main. Zaglavlje metode je bilo: public static void main(String[] a) Upotreba riječi static ovdje indicira da ova metoda nije asocirana s niti jednim objektom. Da bismo napravili program kompaktnijim moguće je staviti main metodu u klasu Student i izbjeći stvaranje TestStudent klase. Možete pristupiti samo public članovima objekta B. Ako je član neke klase označen kao public tada mu se pristupiti iz bilo koje metode (ili konstruktora) bilo gdje u programu. ali klase su ipak malo kompliciraniji pojam. a za kasnije ostaviti poboljšanje unutarnje funkcionalnosti klase poput ubrzanja i slično. U njihovim definicijama pojavljuje se ključna riječ static. Ako je ne nađe javit će odgovarajuću pogrešku i stati s interpretiranjem. Java omogućava da se izostavi riječ public ili private. S druge strane kad je implementirano sučelje klase ista se može isporučiti korisniku. Postoji niz razloga zbog kojih bi programer koji dizajnira klasu ograničio pristup drugome programeru svim poljima i metodama unutar klase. To je u određenoj mjeri i točno. U stvari kada se program pokrene ni jedan objekt tipa klase Hello neće biti kreiran ! Uloga ove klase je samo da omogući prikladno mjesto za main metodu. 36 . Drugi naziv je s engleskog neprevodiv – class fields and methods. Naravno treba paziti da se ne promijeni sučelje. Kada pogledate na programski kod koji opisuje različite članove klase vidjet ćete da definicija svakog člana počinje s ključnom riječi public ili private. ali je sačinjena od statičkih polja i metoda je Math klasa iz Java biblioteke funkcija. Takvi članovi klase poznati su kao statička polja i metode. Objekti i klase javac TestStudent.java Prevodioc će naći u klasi TestStudent reference ne dvije ostale klase i automatski ih prevesti.3. Članovi označeni s public sačinjavaju sučelje objekta (interface). Počeli smo poglavlje 1 s programom koji se sastojao od samo jedne klase (Hello). Slijedi primjer izraza koji koristi navedenu klasu: double x = Math. Ona sadrži metode koje računaju uobičajene matematičke funkcije poput sinusa i kosinusa. Ako je uspije pronaći pokušat će je izvršiti. Svaka klasa ima niz varijabli i metoda koje egzistiraju neovisno u bilo kojem određenom objektu. To znači da kada pišete definiciju klase A onda u nju ne možete uključiti izraze koji pozivaju članove klase B koji su označeni kao private . Tada ćete ukucati naredbu : java Student To će natjerati intepreter da u klasi Student traži main metodu. Tada će polje ili metoda biti tretirana kao da je public.sin(a). Ako je označen kao private onda mu se može pristupiti samo iz metoda koje su članovi iste klase.

Sve što znamo je da samo varijabla koja je npr. ″Perić. Vrijednost koja je pohranjena u st je vrijednost reference. dakle u ovom slučaju Math. Reference na objekte (Object References) U prethodnom poglavlju spomenuli smo da se vrijednosti poput cijelih brojeva i brojeva u pokretnom zarezu tretiraju na drukčiji način nego objekti. objekt se ne sprema u varijablu. Razmotrimo slijedeći kod: 37 .Pero″. Za njega će se rezervirati posebno mjesto u memoriji. U slučaju pozivanja statičkog metoda (koji nije asociran s niti jednim objektom) piše se ispred naziva metoda naziv klase. Jedna od različitosti je način na koji se pohranjuju u memoriji. Nemojte misliti da su to cijeli brojevi. Vrijednost varijable primitivnog tipa spremljena je u samoj varijabli.3.Pero Program: Elektronika Godina: 1 Kada pokrenemo Java program svaka vrijednost bit će ili primitivna vrijednost ili vrijednost reference. To vrijedi za vrijednosti pohranjene u varijablama. ″Elektronika ″). Ovaj postupak možemo vizualizirati na slijedeći način: (Pravokutnik pokazuje rezervirano mjesto u memoriji) n 5 Kako smo vidjeli u odjeljku o String klasi. Objekti i klase Dosad smo vidjeli da kada pozivate metodu koja pripada instanci neke klase da se prvo piše naziv objekta koji pokazuje na objekt neke klase. Nikad nećemo moći vidjeti stvarnu vrijednost reference. 4. Referenca je vrijednost koja jednoznačno određuje gdje je u memoriji lociran objekt (u ovom slučaju objekt tipa student). Kao i prije određeno mjesto u memoriji bit će alocirano za novu varijablu. i vrijednost 5 je spremljena na to mjesto u memoriji. vrijednosti vraćene pomoću metoda i vrijednosti proslijeđene kao parametri. Pretpostavimo da je izvršena slijedeća naredba: Student st = new Student(″1222″. U slijedećem dijagramu strelica od varijable st do objekta tipa Student znači da varijabla sadrži referencu na objekt. Nakon ovoga izraza 32 bita memorije su rezervirana za novu varijablu n. Međutim objekt koji se kreira u desnom dijelu izraza neće biti spremljen na mjesto varijable. st Student IDBroj: 1222 Ime: Perić. a ne sam objekt ? Ima. U ovom slučaju to je varijabla st . Postavlja se pitanje da li ima razlike u tome da varijabla sadrži referencu na objekt. Pretpostavimo da je izvršen slijedeći izraz: int n = 5. tipa Student može sadržavati referencu na objekt tipa Student.

Što će se prikazati na ekranu. st1. Prikazuju se detalji objekta na kojeg referencira st2 . Stoga je vrijeme da se počne misliti u terminima referenci. Druga bi naredba napravila kopiju istog objekta u st2. st2. Ovo će kreirati varijablu st1.prikaz(). Student st1 = new Student(″1222″. st2. Odgovor je da će to biti "Strojarstvo". 38 . Polje programStudija objekta na koji referencira varijable st1 mijenja se u string ″CS″.Pero″. ″Perić. st1. Obje varijable su reference na isti objekt.setProgramStudija(″Strojarstvo″). Da bi to znali moramo razmotriti liniju po liniju: 1. ″Elektronika″). ″Elektronika″). 2. Ova linija će kreirati varijablu st2 i dodijeliti joj vrijednost koja se nalazi u varijabli st1. Što će biti ispisano za programStudija. Tada bi postojala dva objekta tipa student. Student st2 = st1. u ovom slučaju referencu na objekt student koji je kreiran u prvom koraku. 3.3. 4. Treća bi promijenila polje programStudija u objektu st1 i ne bi promijenila objekt u st2.setProgramStudija(″Strojarstvo″). Primijetite da iako postoje dvije varijable samo je jedan Student objekt.Pero Program: Strojarstvo Godina: 1 Da se objekti spremaju u varijable (a nisu !) prva naredba bi spremila objekt Student u st1. Primjeri poput ovoga stalno se događaju u Java programiranju. Student st2 = st1. Četvrta naredba bi na kraju ispisala detalje objekta u st2.Pero″. ″Perić. uključujući originalni naziv studija "Elektronika".prikaz(). zatim objekt tipa Student koji će sadržavati zadane podatke te naposljetku u st1 bit će spremljena referenca na kreirani objekt. st1 Student st2 IDBroj: 1222 Ime: Perić. Objekti i klase Student st1 = new Student(″1222″.

) U Javi je pojam brojki i slova dosta širok. Još jedno mjesto gdje Java može uvesti vrijednost null je kod kreiranja objekta konstruktorom. Dakle poljima koja nisu inicijalizirana Java pridružuje pretpostavljene početne vrijednosti (default values).. Ako je polje neki broj onda će biti inicijaliziran na nulu.). Objekti i klase 5. potrebno je osigurati da se ne pokuša pristupati metodama koje pripadaju objektu na kojeg se odnosi varijabla st. To je ogroman skup znakova koji uključuje znakove većine svjetskih jezika. 6. return.. Ako ne specificiramo inicijalne vrijednosti za njih one će sadržavati null vrijednost.setProgramStudija(″Strojarstvo″). Ta vrijednost se označava sa null. Tako ta polja sadrže reference na mjesto gdje su stvarno u memoriji pohranjeni ti karakteri. Naravno. null vrijednost Ranije smo rekli da varijabli tipa student može biti pridružena samo referenca na objekt tipa Student. metode ili klase nazivamo identifikatori. 39 . ali to je regularan string kao i svi drugi. japansko.3. Naše tastature omogućavaju unos limitiranog skupa znakova. Java će izabrati sama početnu vrijednost. Ako se objekt s takvim ID brojem nađe vratit će se referenca na taj objekt. ili povlakom ( _ ) ostali znakovi mogu biti slova ili brojevi dužina nije ograničena ne mogu se koristiti ključne riječi kao identifikatori (poput class. Ako varijabla poput prijašnjeg primjera varijable st sadrži vrijednost null . int.. To je zbog toga što Java znakove čuva kao 16-bitne unicode vrijednosti. Što se događa kada ne specificirate inicijalnu vrijednost polja u objektu.. Pravila za pisanje identifikatora u Javi su sljedeća: mora početi s slovom ili oznakom valute ($. (varijabla st ne odnosi se u ovom slučaju na nikakav objekt) Npr. Za primjer gdje se vrijednost null može koristiti uzmimo pretraživanje baze gdje imamo metodu koja pretražuje cijelu bazu podataka o studentima i traži objekt s određenim ID brojem. Ako polje je referenca na objekt početna vrijednost će biti null. Slovo može biti korejsko. U primjerima smo preko argumenata konstruktora prenosili argumente koji su nam poslužili kao inicijalne vrijednosti za polja objekta. tri polja objekta Student su tipa String. grčko. slijedeća naredba neće biti izvršena: st. Identifikatori Nazivi koje koristimo u Java programima za varijable. Stringovi su objekti..£. Greška će biti indicirana kao NullPointerException. To je različito od onoga što se javlja s deklaracijama varijabli unutar tijela metoda. To ne znači da se radi o praznom stringu ! Varijabla može referencirati na prazan string . Postoji jedna vrijednost koja može biti pridružena svakoj varijabli koja inače sadržava vrijednost reference. Npr. ako varijabli st pridružimo objekt ta će se ista naredba bez problema izvršiti. Slijedi deklaracija koja kreira varijablu tipa Student i sprema u nju vrijednost null: Student st = null. To nije sasvim točno. Međutim što vratiti ako ne postoji objekt s tim ID brojem. Te varijable se ne inicijaliziraju automatski ! U njima je nepredvidljiva vrijednost ako ih sami nismo inicijalizirali. st ne referencira na nikakav kreirani objekt tipa Student te će Java intepreter javiti run-time pogrešku.. U tom slučaju bit će uobičajeno da ta metoda vrati vrijednost null. private.

Druga konvencija je da ako koristite nazive sastavljene od više riječi da svaku riječ poslije prve počinjete s velikim slovom npr.3. Objekti i klase Poput čvrstih pravila za identifikatore. ConsoleReader . Korisno je koristiti duge nazive jer se onda može iz toga vidjeti funkcionalnost varijable ili metode. Java programeri vole duge nazive pa Java biblioteka sadrži nazive poput GridBagLayoutManager i NoSuchElementException. readDouble. postoje i konvencije. 40 . Jedna je da nazivi varijabli. Te konvencije su tako širom prihvaćene da će vas ostali programeri čudno gledati ako ih se ne držite. a nazivi klasa počinju s velikim slovima. Međutim kod u cjelini postaje nečitljiviji. parametara i metoda počinju s malim slovima.

5 bodova. Na kraju trebat će modificirati konstruktor i ubaciti naziv mentora kao parametar. Objekti i klase 7.3. Metoda dodajBod(n) koja će dodati broj bodova na ukupan broj bodova koje student ima . 41 . Zadaci za poglavlje 3 Proširite klasu Student opisanu u odjeljku 3 tako da povećate količinu informacije koja je zapisana u svakom objektu tipa Student. Dodatni stavci bi trebali biti: ime studentovog mentora i broj bodova koje je stekao na osnovu polaganja ispita. Za svaki položeni ispit student dobiva 0. Proširena klasa treba osigurati i slijedeće operacije koje ćemo pozvati iz test programa: Metoda nazvana promijeniMentora(m) koja će promijeniti ime mentora u ime m. Inicijalna vrijednost broja bodova treba biti 0.

kada želimo kreirati neki grafički ispis. 4. Nakon toga će pretraživač započeti s izvršavanjem appleta. Korištenje grafike. Applet je Java program koji se izvršava unutar Web pretraživača. a Java klase koje se odnose na grafiku daju dobar primjer mnogih osobina Jave koje ćemo i dalje susretati na ovim predavanjima. 3. Koristite appletviewer. Kraće rečeno: napišite applet koji može iscrtavati grafiku. Jedini nedostatak ovoga pristupa je da appletviewer ne prikazuje ništa osim onoga što proizvede applet. uključujući i grafiku. Cijena koju treba platiti je da je potrebno uvest drugačiji način pokretanja programa nego što je to za programe koji nisu koristili grafiku. Grafika 4. To će moći jer sadržava vlastiti Java interpreter. Postoji određeni problem s ovim pristupom. ali nećemo se time baviti u ovim predavanjima. dakle nećemo se baviti kreacijom Web stranica. 8. zatim napisati malu Web stranicu koja samo sadržava link na applet. Dakle. ali predstavlja najjednostavniji način da vidimo što naš grafički program iscrtava. Postoje dva načina na koji se mogu pokrenuti Java programi: aplikacije i appleti. Ovaj program je dio SDK. Rješenje 2.class u kojoj će biti prevedeni Java applet kojega će izvršiti. Appletviewer ima prvenstvenu namjenu testiranja funkcionalnosti appleta. Zatim ćemo iskoristiti appletviewer za procesiranje Web stranice. Web stranica sastoji se od tekst datoteke koja koristi HTML notaciju. Bojanje likova. 5. Daljnja čitanja. ili Netscape pretraživača. 1. Nabavite plug-ni za pretraživač koji će omogućiti pokretanja Java 2 programa. napišite Web stranicu koja sadrži link na istu i zatražite od pretraživača da prikaže Web stranicu. Korištenje grafike 6. poput Internet Explorera . Kada Web pretraživač stavlja sadržaj stranice na ekran i ako ta stranica sadrži link na applet. Pojedini pretraživači ne izvršavaju Java 2 programe. 7. 10. preko drugih geometrijskih oblika pa sve do manipulacije s fotografijama u ovome poglavlju preći ćemo maji dio. Čitanje ulaza. pretraživač će odvojiti dio stranice odnosno područje prikaza (display area) gdje će applet moći prikazati bilo kakvu informaciju. To je u Javi moguće. To znači da su bili pokretani od strane Java SDK interpretera (java) i izvršavanje je započinjalo unutar main metode. Smajli. 2. Od tog skupa koji obuhvaća crtanja počevši od najjednostavnijih linija. Sadržaj: 1. Svi programi koje smo dosada analizirali bili su aplikacije. Pokrenut će bilo koji applet. Java 2 je omogućila mnogo bogatiji skup grafičkih operacija. Pisanje teksta. Boje. Grafika Rane verzije Jave omogućavale su veoma limitirane grafičke sposobnosti. Dva su načina da riješimo taj problem: Rješenje 1.4. Zadaci Grafika je tema koju je zgodno uključiti rano unutar predavanja o programiranju jer programeri vole raditi s grafikom. Applet koji crta linije. Sve što je potrebno znati o HTML za potrebe predavanja je slijedeće. 9. 42 . U toj datoteci bit će samo link na datoteku Prog. napisat ćemo applet koji crta grafiku u područje prikaza. Bilo da slabo prate napredovanje Jave ili namjerno ne podržavaju Javu. Ako bi aplikacija trebala proizvesti neku grafiku bilo bi potrebno da kreira grafički prozor. Drugi oblici. Sve aplikacije koje pišemo unutar ovih predavanja ispisivale su u prozor konzole (DOS prozor) koji je prikladan samo za ispisivanje karaktera.

metodu drawImage koju možemo koristiti za ispis kompletnih slika. a ne primitivni DOS prozor. drawString kojim možemo ispisivati tekst. Pretpostavimo da je line1 linija između dvije točke. Pretpostavimo da je g2 objekt tipa Graphics2D spojen na područje prikaza appleta. To je nešto slično kao System. Svaki od ovih geometrijskih oblika u Javi je reprezentiran kao klasa. Slijedeća naredba će prikazati liniju na ekranu: g2. Međutim Graphics2D objekt spojen je na područje prikaza appleta (visoka rezolucija). Applet koji crta linije Applet je također jedna Java klasa. Windows manager će prvi put pozvati tu metodu kad se područje prikaza pojavi na ekranu. Grafika <APPLET CODE="Prog. Da bismo kreirali liniju potrebno je specificirati koordinate njenih krajnjih točaka. U mnogim pogledima je nalik na klase koje smo koristili dosada. Zadatak paint metode je da isporuči (render) sadržaj u područje prikaza (nacrta linije. Drugi primjer kad je to potrebno je kad preko područja prikaza npr. Međutim razlikuje se od klasa koje smo dosada koristili u jednoj bitnoj stvari. Kada zatvorimo taj prozor opet će biti potrebno ponovo osvježiti sadržaj koji je dotada bio pokriven prozorom. Sastavljen je od polja. U tom slučaju sadržaj područja prikaza mora se ponovo iscrtati odnosno osvježiti. skrivanje(minimiziranje). kvadrata. Osvježavanje prikaza bit će potrebno npr. kad pomicanjem(skroliranjem) Web stranice područje prikaza izađe izvan vidljivosti pa se novim pomicanjem opet vrati na ekran. Također kad god bude bilo potrebno osvježiti sadržaj ekrana bit će pozvana metoda paint. Možemo ih spojiti npr. Graphics2D objekt posjeduje niz metoda kao npr. otvorimo prozor neke druge aplikacije. pravokutnike (rectangles).draw(line1). (Ako želite uštediti memoriju na raspolaganju je i Line2D. Windows manager je objekt koji održava prozore na ekranu. Pozicije su dane ka x i y koordinate i njihova orijentacija je slijedeća: (0. Također Graphics2D objekt posjeduje metode kojima se može zadati određena boja ili uzorak kojom će se crtati neki lik ili ispisivati tekst.). Da bi to napravili moramo koristiti jedan objekt koji nazivamo Graphics2D objekt.. elipse (uključujući i krugove) te dijelove elipsi tj. Posjeduje i metode kojima se može zadati neka grafička transformacija lika npr. Koristit ćemo 4 tipa: linije. oboji područja.. metoda i konstruktora.4.out objekt koji smo koristili za ispis karaktera u prozoru konzole.0) x y Područje prikaza 43 .class" WIDTH=300 HEIGHT=300> </APPLET> Osim linka navedena je i veličina područja prikaza koje će biti dodijeljeno appletu na korištenje: WIDTH=300 HEIGHT=300 2.Float ). Riječ Double pokazuje da se podaci o liniji pohranjeni ka 64-bitni broj s pokretnim zarezom. Postoje različiti geometrijski oblici koji mogu biti iscrtani ili obojani korištenjem Graphics2D objekta. Npr..Double. omogućavajući njihovo otvaranje. Jedna od metoda koje ćemo priskrbiti za windows manager je metoda paint. linija je reprezentirana objektom tipa Line2D. lukove (arcs).. Posjeduje najmanje jedna metoda koja je namijenjena da je koristi windows manager . napiše tekst . zatvaranje . rotacija. metodu draw koja može iscrtavati oblike poput kruga. Graphics2D objekt ne moraju biti spojeni samo na područje prikaza na ekranu. na printer ili na neko područje u memoriji (slika će biti pohranjena u memoriju). itd.

Problem je u tome što Java 2 treba pokretati i stare programe pisane za ranije verzije Jave.210).Double objekta nije isto što i njegovo prikazivanje na ekranu. Appleti koriste paint metode još iz najranijih dana Jave. davno prije nego što je Java 2 uvela Graphics2D objekte.4.Double line3 = new Line2D.210) (200.Double(100. ali daleko manje funkcionalnosti.150. proces ponovimo za ostale linije.210. Zatim ga iscrtamo korištenjem g2.y0) do (x1.100. označen s g2 ? Odgovor je da ga nećemo mi kreirati. Line2D. Zato je ostavljeno da Java kao parametar paint metode appleta očekuje Graphics objekt što ćemo morati napisati u zaglavlju paint metode: public void paint(Graphics g) 44 . Npr. Prvo kreiramo objekt koji predstavlja lijevu stranu trokuta tj. Prije je parametar paint metoda imala parametar koji je bio objekt tipa Graphics (bez 2D !).draw(line1).Double konstruktor koji ima koordinate krajnjih točaka linije kao parametre: Line2D.) Primijetite da kreiranje Line2D.y1) Kreira objekt koji predstavlja liniju od (x0. Taj objekt je bio sličan Graphics2D objektu. područje koje ima 300×300 piksela protezat će se otprilike na trećini ekrana. y0. Napisat ćemo paint metodu koja koristi prije navedene naredbe. Postavlja se pitanje kako ćemo kreirati Graphics2D objekt tj. Pretpostavimo da pišemo applet koji će samo crtati taj trokut. Grafika Koordinate se mjere u pikselima (pixel = picture element).Double line1 = new Line2D. x1 i y1 su double.Double(200.Double(150.200.210.y0. Line2D.100). Npr. Windows manager će kreirati taj objekt i proslijediti ga paint metodi kao parametar.y1).Double(x0.x1. želimo nacrtati slijedeći trokut na ekranu: (150.Double line2 = new Line2D. (Vrijednosti x0.100) (100. objekt tipa Line. g2. g2.210) Bit će potrebno koristiti slijedeće izraze. Ako napišete cjelobrojne koordinate Java će ih konvertirati u double.draw(line2). da bismo kreirali objekt linije koristit ćemo Line2D. Line2D. Taj objekt bit će prikazan na ekranu tek onda kad ga proslijedimo draw metodi Graphics2D objekta koja će ga iscrtati u području prikaza.draw(line3).210). g2. Postoji jedan mali tehnički problem na koji u svemu moramo paziti.100.draw metode.Double te ga dodijelimo varijabli line1.

g2.draw(line1).awt. Line2D. g2. U ostatku metoda g2 tretiramo kao Graphics2D objekt.100.Double(150. g2. Grafika Prevodioc se neće buniti što windows će manager proslijediti Graphics2D objekt kao parametar kad bude pozivao paint metodu ! To je zato što je Graphics2D objekt specijalni slučaj Graphics objekta. Obje verzije su ispravne.100).*.210).200.awt. import java.4. line3. Mogli smo pisati g2.draw(new Line2D. Morat ćemo napisati slijedeći izraz: Graphics2D g2 = (Graphics2D) g.210. PRIMJER 1 import java.Double line2 = new Line2D.Double(100. Line2D. Ovaj izraz kaže: kreiraj Graphics2D varijablu. Umjesto pisanja: Line2D.applet.*.100. Zaglavlje klase sadrži riječi extends applet. import java.Double(150.210).100.Double line1 = new Line2D. Prve tri linije pokazuju Java prevodiocu koje tri linije Java biblioteke će biti potrebne. i dodijeli joj objekt g za kojeg obećavamo da je Graphics2D objekt. 45 .Double line3 = new Line2D. } } Primijetite da bi se neke naredbe mogle sažetije pisati ako bismo izbjegli uvođenje pomoćnih varijabli line1. Tim pokazujemo prevodiocu da ta klasa definira applet.210.*.geom.200. Međutim prevodioc će se pobuniti ako počnemo objekt označen s g tretirati kao Graphics2D objekt. /* Applet koji prikazuje trokut . Potrebna je samo jedna klasa.200.draw(line2). */ public class Triangle extends Applet { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g.150.Double(200. Slijedi kompletan program koji će iscrtati trokut. Kastiranje (Graphics2D) je naše obećanje prevodiocu da je parametar stvarno Graphics2D objekt.Double(150.Double line1 = new Line2D.100. g2.210).draw(line3).210)). g2. line2 . Line2D.draw(line1).

Applet umjesto samo Applet. <APPLET CODE="Triangle. Upamtite.txt. Pretpostavimo da je ta datoteka nazvana Triangle. Grafika Da bismo pokrenuli ovaj program može biti korištena slijedeća tekstualna datoteka. Nakon što smo preveli Triangle. Možete otkucati sve u jednoj liniji ako tako želite).applet paketa.applet.class" WIDTH=300 HEIGHT=300> </APPLET> (Smještaj linija nije bitan.applet. Da nismo importirali java.applet klasu bili bismo prisiljeni koristiti puno ime java. 46 . Čim učinite nešto što će vratiti vidljivost appleta windows manager će odmah ponovo pozvati paint metodu i ponovo iscrtati sadržaj prozora. Prva linija primjera: import java. Java biblioteka je podijeljena u veći broj dijelova koji se nazivaju paketi ili packages. Pretpostavim da pokušate pokvariti sadržaj prozora tako da npr.java utipkajmo: appletviewer Triangle. Oznaka * pokazuje prevodiocu da očekuje upotrebu bilo koje klase iz navedenog paketa. pokrenete neki drugi program koji će prekriti applet prozor. Ona sadrži ključnu vezu s prevedenom Triangle klasom.txt i slijedeći prozor će se pojaviti na ekranu. Trokut se iscrtao zato što windows manager poziva paint metodu.applet .4.*. To je jedini razlog korištenja import naredbe. U primjeru se koristi samo jedna klasa iz java. kaže prevodiocu da će se koristiti paket koji se naziva java.

y.Double(x. a visina je h. Drugi oblici nova grafička biblioteka u javi 2 uključuje različite korisne grafičke oblike. Npr. a njegov radijus je r. (x.Double. (x. On uključuje veliki broj često korištenih klasa. Paket java. tada je to ekvivalentno elipsi koju definiramo preko pravokutnika sa gornjim lijevim kutom u (xc−r. Math i System.w.y) h w Slično vrijedi i za elipsu koja je definirana klasom Ellipse2D. (xc−r. Može biti kreirana slijedećim konstruktorom Ellipse2D. Jedan od njih je i pravokutnik.h) Gornji lijevi kut pravokutnika ima koordinate (x.Double(x. Nije potrebno importirati sve pakete Java biblioteke. paket java. yc−r) te širinom 2∗r i visinom 2∗r.Double objekta.yc) 47 .Double. međutim krug možemo nacrtati kao poseban slučaj elipse čija je širina jednaka visini. y. Njegova širina je w.awt.h) Pozicija i oblik elipse definiran je parametrima x. w i h. poput klasa. sadržan u klasi Rectangle2D. yc−r) r 2∗r (xc. U prethodnom primjeru koristili smo Graphics i Graphics2D klase. Pravokutnik možemo konstruirati pomoću slijedećeg konstruktora : Rectangle2D.geom omogućava upotrebu geometrijskih oblika poput Line2D.yc).y). Ako je centar kruga u (xc. String.) 3. Ovi parametri određuju pravokutnik koji sadržava elipsu i zadaju se isto kao i za pravokutnik.y) h w Ne postoji objekt koji bi bio rezerviran za definiciju kruga.w.awt paketu sadržane su mnoge grafičke klase.lang uključen je automatski. Grafika U java.y.4.

130) 80 20 80 50 (90. g2. Slijedi skica kamiona u području prikaza od 300×300.Double(70.180) (210. public class DrawVan extends Applet { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g.40)).80.100) 120 (170. Grafika 2∗r U slijedećem primjeri koristit ćemo linije. PRIMJER 2 import java. Prije nego počnemo pisati kod potrebno je pažljivo definirati položaj pojedinih likova.awt.Double(0. Ellipse2D.*.Double baseLine = new Line2D.160.40. import java.Double back = Rectangle2D.applet.120.40. g2. Za njega je kamion predstavljen kao dva pravokutnika plus dva kruga.*.draw(frontWheel). Rectangle2D.180) Slijedi applet koji će nacrtati ovu sliku.awt.300.*.130.Double backWheel = new Ellipse2D.Double(190.geom. import java.200). g2.draw(back). Slijedi prikaz kako bi se trebao vidjeti na ekranu: } } 48 .80).50).Double(50.4. Line2D.100.draw(back). g2.160. (0. Tu je još i linija ceste.0) (50. pravokutnike i elipse te nacrtati jedan mali kamion. g2.Double(170.Double back = new Rectangle2D.draw(backWheel).200. Rectangle2D.Double frontWheel = new Ellipse2D.40).draw(baseLine). Ellipse2D.

Kombiniranjem nultih vrijednosti crvene. miješanjem različitih uljanih boja dobivate sve tamnije boje slične crnoj. zelene i plave boje dobivamo crnu boju (Ovo je suprotno korištenju boja u tiskanju ili slikarstvu. onda upotrijebite slijedeći izraz prije korištenja draw metode: g2. Grafika 4. Ako npr. b) Kreiraj boju kombinirajući r količinu crvene.5f. Koristi se aditivni sustav boja.5 prevodioc će to shvatiti kao double vrijednost i javiti pogrešku. zelene i plave boje dobivamo bijelu boju. zelene i plave (red-green-blue = RGB). Međutim moguće je da promijenite boju kad god to zaželite. napisati 0. Možete definirati svoje boje specificiranjem količine tri osnovne boje : crvene. Od momenta kad je izvršena pa sve dok je ponovo ne izvršimo s drugom bojom kao argumentom. Klasa Graphics2D posjeduje setColor metodu koja će promijeniti boju u onu koju joj proslijedite kao parametar. ako želite da objekt g2 (klase Graphics2D) počne pisati crvenom bojom. Slijedi primjer definiranja žute boje: 49 . Kompletna lista boja navedena je kasnije. me]u njima je konstanta Colour. Boja Ako drugačije ne navedemo Graphics2D objekt će crtati crnom bojom. napišete 0. g količinu zelene i b količinu plave. Moramo pažljivo pisati te parametre. Objekt Color može predstavljati mnogo više boja nego standardnih 13. tu se koriste substraktivni sustavi. Boje su u Javi predstavljeni kao objekti tipa Color. Ove vrijednosti su brojevi u pokretnom zarezu s vrijednostima od 0 do 1 tipa float. njegovo osnovno svojstvo je da ako kombiniramo maksimalnu količinu crvene. Potrebno je specificirati da se radi o tipu float. Npr. tj.red koja predstavlja crvenu boju. Stoga. (konstanta je varijabla s fiksnom vrijednošću). sve što g2 bude prikazivao bit će obojeno crveno.4. Npr.setColor(Color. Klasa Color posjeduje konstruktor za kreiranje RGB boje Color(r. g.red). Klasa Color sadrži trinaest konstanti koje predstavljaju standardne boje.

0f 0.geom.awt. Metoda koju ćemo koristiti naziva se fill.0f 1. 0).0f 0. a gume su tamno sive boje.8f 0. 1. 1.black 0. slijedeće naredbe kreirat će mali krug i prikazat ga ispunjenog žutom bojom.Double(140.50.75f 1.0f.0f 0.7f 1.yellow).0f Color. g2.0f 0. import java.*.25f Color. g2. plave i zelene kao cijeli brojevi u rasponu od 0 do 255 ! Ako dakle napišete Color(1. public class PaintVan extends Applet { public void paint(Graphics g) 50 .0f Color.0f 1. (Ne pišite Color(1.5f 0. 1.5f 0.0f 1.0f Color.*.fill(sun).0f 0. Ellipse2D. Ako nijedna boja nije postavljena bit će upotrijebljena crna boja.gray 0.7f 1.magenta 1. Slijedeći primjer koristi istu tehniku za crtanje kamiona sličnog kao u primjeru 1.white 1.5f Color. import java. Pozivamo je na slijedeći način: g2.*.0f).fill(s) Koristi Graphics2D objekt referenciran s g2 za prikaz oblika s ispunjenog s trenutnom bojom pridruženoj g2.green 0.0f Color.0f 0. Npr. Linija ceste zamijenjena blijedo-plavom bojom.0f Objekt Graphics2D može se koristiti za bojanje unutrašnjosti likova poput pravokutnika ili elipse.yellow 1.0f Color.darkGray 0.0f Color.0f 0. 0. PRIMJER 3 import java. ali ne i ovdje ! Razlog je što Color klasa ima još jedan konstruktor s drukčijim parametrima koji su definirani kao cjelobrojni iznosi crvene. Grafika Color c = new Color(1.setColor(Color.0f 0. Točkovi su bijeli.75f 0.25f 0.20).lightGray 0.0f 5.75f Color. Primijetite da je potrebno iscrtati pozadinu prije kamiona. Normalno možete koristiti cijele brojeve na mjestu gdje se očekuje float vrijednost. zelene i plave od kojih se sastoje: Color. Slijedi lista 13 standardnih boja i količine crvene. Bojanje likova 0.0f 1.pink 1.applet. Java će pretpostaviti da koristite sasvim drugi konstruktor gdje ste specificirali neznatan iznos crvene i zelene i ništa plave te će rezultat biti skoro crna boja.0f Color. Bit će upotrijebljena boja koja je zadnja postavljena s metodom setColor.awt.0f 0. ali obojenog u crvenu boju.0f.cyan 0.0f 1.Double sun = new Ellipse2D.20. 0).orange 1.25f 0.4.0f Color.blue 0.

40. g2.170.setColor(Color. g2.setColor(Color. /* Paint the back wheel.fill (new Rectangle2D. */ g2. /* Paint the background.Double(70.setColor(Color.red).4.fill(new Ellipse2D. /* Paint the front wheel.fill(new Ellipse2D. g2.40.40)). g2.white). */ g2.20.160.20)).Double(170. */ Color paleBlue = new Color(0.75f.0f).white). 0. 1.170. g2. g2.20.setColor(paleBlue).Double(0. /* Paint the body of the van.20)).50)).0.fill(new Ellipse2D.setColor(Color.750f.Double(80.160.130.80)).80. Grafika { Graphics2D g2 = (Graphics2D) g.40)).Double(50.300)).setColor(Color. } } Slijedi obojani kamion: 51 . g2. g2. g2.fill(new Ellipse2D.100.fill(new Rectangle2D.darkGray). g2.120.Double(190.fill (new Rectangle2D.darkGray). */ g2.Double(200.300.

4. Grafika

6.

Pisanje teksta

Osim za crtanje i bojanje oblika, Graphics2D objekt može se koristiti za ispis teksta na ekranu. Prije nego što to pokušamo učiniti, potrebno je Graphics2D objektu naznačiti koji će font koristiti. Font je reprezentiran s objektom tipa Font . Koristimo slijedeći konstruktor za kreiranje Font objekta. Font(familija, stil, veličina) (family, style, size)

Parametar familija je string koji predstavlja naziv skupa srodnih fontova. Primjeri srodnih familija su Times Roman koji se koristi kao glavni font ovog teksta, i Courier koji se koristi za tekst programa. Ova rečenica je tiskana u Arial fontu. Slijedeća logički nazivi mogu se koristiti za familije fontova:

Serif SansSerif Monospaced Dialog DialogueInput
Parametar stil ima jednu od slijedećih vrijednosti koje naznačuju da li se koristi italic (zakošeno) ili bold (podebljano) pisanje:

Font.PLAIN Font.ITALIC Font.BOLD Font.ITALIC+Font.BOLD.
Parametar veličina je veličina fonta u točkama. To je visina karaktera mjerena u jedinci od 1/72 inča. Veličina točke od 1 približno odgovara jednom pikselu. Ova predavanja napisana su fontom veličine 12 i karakteri bi trebali biti visoki oko 1/6 inča. Jednom kada kreirate Font objekt, potrebno je Graphics2D objektu narediti da ga koristi. To činimo upotrebom slijedeće metode:

g2.setFont(f) Postavi Graphics2D objekt referenciran s g2 tako da koristi f za pisanje teksta.
Sve što preostaje je da se ispiše string na određeno mjesto na ekranu:

g2.drawString(text, x, y)
Koristi Graphics2D objekt g2 za ispis stringa text, počevši od pozicije (x,y) u području prikaza. x i y su of tipa int. (x je pozicija lijeve strane teksta, a y je visina na kojoj se nalazi bazna linija teksta.

Slijedeći primjer ilustrira upotrebu logičkih familija fontova . U svakom koraku Graphics2D objektu pridružujemo jedan logički font te pomoću tog fonta ispisujemo naziv familije. U svakom od slučajeva koristimo stil FONT.PLAIN te je veličina fonta jednaka 30. 0.
PRIMJER 4 import java.applet.*; import java.awt.*; public class Fonts extends Applet { final int SIZE = 30; public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g;

52

4. Grafika
Font font1 = new Font("Serif", Font.PLAIN, SIZE); g2.setFont(font1); g2.drawString("Serif", 50, 50); Font font2 = new Font("SansSerif", Font.PLAIN, SIZE); g2.setFont(font2); g2.drawString("SansSerif", 50, 100); Font font3 = new Font("Monospaced", Font.PLAIN, SIZE); g2.setFont(font3); g2.drawString("Monospaced", 50, 150); Font font4 = new Font("Dialog", Font.PLAIN, SIZE); g2.setFont(font4); g2.drawString("Dialog", 50, 200); Font font5 = new Font("DialogInput", Font.PLAIN, SIZE); g2.setFont(font5); g2.drawString("DialogInput", 50, 250);

}

}

Za slijedeći primjer korištenja ispisa teksta u primjeru 3 (koji crta obojani kamion) dodajte slijedećih pet naredbi na kraj paint metode.

/* nacrtaj logo na stranici kamiona */ Font f = new Font("Serif", Font.ITALIC, 25); g2.setFont(f); g2.setColor(Color.white); g2.drawString("Java",66,124); g2.drawString("Delivers",66,148);

53

4. Grafika

7.

Smajli

Grafički objekti koje smo koristili u ovom poglavlju, poput Line2D.Double objekta na neki način posjeduju pridruženi prikaz. Ovu ideju možemo dalje širiti. Ako bismo trebali napraviti grafički program za očekivat bi bilo da imamo niz Java objekata za koje bi trebalo realizirati prikaz na ekranu. U slijedećem primjeru ćemo napraviti jedan takav objekt. Definirat ćemo tip objekta koji predstavlja osobu. Nazvat ćemo je Person (osoba) klasa. Postoje mnogi atributi koje bismo mogli definirati za objekt tipa Person. U ovom slučaju upotrijebit ćemo samo jedan atribut koji će definirati raspoloženje osobe. To je vrijednost između 0 i 1 i nazvat ćemo je raspoloženje. Osoba s vrijednošću raspoloženje ode 1 je veoma raspoložena osoba. 0 znači da je u pitanju potpuno neraspoložena osoba. Jedna od operacija koje ćemo asocirati s objektom Person je crtanje lika osobe. To će raditi slijedeća metoda:

p.crtajLice(double x, double y, Graphics2D g2)

Nacrtaj sliku lica osobe reprezentirane s Person objektom referenciranog s varijablom p. Centar lica su koordinate x i y. Slika će se iscrtati pomoću Graphics2D objekta g2. Lice će biti jednostavno sa osmjehom proporcionalnim raspoloženju. Imat ćemo dva metoda koja će uticati na raspoloženje: p.oraspoloži() // Povećaj raspoloženje osobe za konstantan faktor. p.oneraspoloži() // Smanji raspoloženje osobe za konstantan faktor.

Konstruktor za kreiranje Person objekta: Person(double h) // Kreiraj Person objekt s ‘raspoloženje’ postavljenim na h. Prije same implementacije Person klase, slijedi paint metoda koji kreira Person objekt i mijenja mu raspoloženje nekoliko puta. Ova metoda crta lice osobe na tri različite lokacije u području prikaza appleta. PRIMJER 5 public void paint(Graphics g)

54

4. Grafika
{ Graphics2D g2 = (Graphics2D) g; Person kim = new Person(0.5); kim.crtajLice(60,60,g2); kim.oneraspoloži(); kim.crtajLice(150,150,g2); kim.oraspoloži(); kim.oraspoloži(); kim.oraspoloži(); kim.oraspoloži(); kim.crtajLice(240,240,g2);

}

Sada slijedi implementacija. Kako pretpostavljate , klasa Person sadržava jedno polje nazvano raspoloženje. Polje je tipa double, i sadrži vrijednost u opsegu od 0 do 1. Konstruktor postavlja to polje na vrijednost parametra. Metoda oneraspoloži množi vrijednost raspoloženja s konstantnim faktorom. Taj faktor se drži u varijabli nazvanoj factor. Tijelo metode sadrži samo jednu naredbu:

raspoloženje = factor*raspoloženje;
factor je postavljen unaprijed na 0.65. Bilo je jednostavnije pisati raspoloženje = 0.65*raspoloženje. Umjesto toga smo ipak smo definirali konstantu i dali joj naziv ‘factor’. Poslije ćemo lakše promijeniti njenu vrijednost na jednom mjestu nego na svim mjestima gdje je budemo koristili. Metoda oraspoloži izvodi slijedeći izraz:

raspoloženje = 1 - factor*(1 - raspoloženje);
Jedini 'teži' dio implementacije klase Person je implementacija metoda crtajLice. Svako lice sastojat će se od konture, lijevog oka desnog oka i osmjeha. Prva tri su Ellipse2D.Double objekti. Parametri korišteni u konstrukciji lica su izračunati koristeći vrijednosti x i y koji predstavljaju centar lica., radius koji je radijus lica, veličinaOka koji je dijametar svakog oka.

55

int type) Kreiraj sekciju elipse s gornjim lijevim kutom na (x.OPEN). širine w i visine h.Double. Sekcija je definiran početnim kutom start i drugim kutom extent. double h.Double. y-0.OPEN. Vrsta sekcije definirana je parametrom type. Varijabla osmjeh je deklarirana kao klasa tipa Shape. sekcija je polukrug.Double(double x.Double. ne kao Arc2D. Slijedi kompletna definicija klase Person 56 . y−0. radius. Slijedi jedan od njih: Arc2D. Ovaj objekt predstavlja dio elipse – sekciju.5*radius.5*radius. Ako pažljivije pogledate vidjet ćete da je osmjeh dio kruga s centrom u centru lica s duplo manjim radijusom od radijusa lica. double y. Interface Shape definira koje metode neki objekt treba posjedovati da bi se mogao referirati varijablom tog tipa. kraj sekcije kut 2 početak sekcije kut 1 Postoji više konstruktora koji su mogući za Arc2D Double objekt. Slijedi naredba za konstrukciju osmjeha: Shape osmjeh = new Arc2D.Double objekt.5*radius.y). Grafika (x−radius. Arc2D. y−radius) (x−0. 180*raspoloženje. Ako je raspoloženje jednako 1. Za kreirati samo dio sekcije koji se sastoji od krivulje (bez spojenih krajeva) parametar type treba postaviti na konstantu Arc2D.4. double start. double extent. 180+90*(1-raspoloženje).Double (x-0. Ako je raspoloženje 0 onda sekcija u potpunosti nestaje. 'Shape' je primjer Java sučelja (interface). radius. Arc2D. double w. Potrebno je specificirati kut koji predstavlja početak sekcije te kut koji predstavlja kut sekcije.3*radius) veličinaOka radius Konstrukcija osmjeha je kompliciranija jer moramo koristiti novi objekt iz java biblioteke tj. U stvari svaki geometrijski oblik koji se može nacrtati pomoću objekta Graphics može biti tipa Shape.

Double (x-0. veličinaOka.5*radius. private double factor = 0.65. radius 50.4.awt.y). 180*raspoloženje.*.geom. Centar lica je (x.awt. radius. 2*radius.5*radius. import java. y-radius.Double (x+0. Shape osmjeh = new Arc2D. Shape rightEye = new Ellipse2D. } /* Oneraspoloži osobu */ public void oneraspoloži() { raspoloženje = factor*raspoloženje. radius. double y.Double (x-radius. Shape leftEye = new Ellipse2D. */ public class Person { private double raspoloženje.3*radius.Double (x-0. y-0.5*radius-veličinaOka. 57 . y-0.5*radius. Grafika PRIMJER 5b import java. veličinaOka).3*radius. /* Person objekt predstavlja osobu s različitim nivoom raspoloženja raspoloženje. 180+90*(1-raspoloženje). Graphics2D g2) { double radius = 50. */ public void crtajLice(double x.*.factor*(1 .raspoloženje). veličinaOka. double veličinaOka = 10. } /* Nacrtaj lice osobe korištenjem Graphics2D objekta g2. 2*radius). Shape outline = new Ellipse2D. // Faktor korišten za povećanje ili smanjenje // raspoloženja osobe /* Oraspoloži osobu */ public void oraspoloži() { raspoloženje = 1 . veličinaOka). y-0.

g2.draw(osmjeh).4.showInputDialog (″Please enter your name. st. String reply = JOptionPane. g2. } /* Kreiraj osobu tj. Na osnovu unesenog broja konstruira se Person objekt s unesenim raspoloženjem. Gdje ubaciti izraz za prikaz dijaloga za unos početnog raspoloženja. Ova klasa realizira dialog koji sadrži poruku od korisnika te prostor za upis podataka.parseInt(st) ili Double. Pravo mjesto je metoda public void init() 58 .OPEN).Double. Kreirat ćemo ih korištenjem JOptionPane objekta. g2.parseDouble(st). objekt tipa Person s raspoloženjem postavljenim na h */ public Person(double h) { raspoloženje = h. Ovaj put program preko dijaloga pita korisnika da unese broj koji odgovara raspoloženju osobe. Slijedeća rečenica će uzrokovati pojavu dijaloga s porukom ‘Please enter your name. U primjeru 6 program opet crta smajlija.″).’ Dijalog će čekati da korisnik upiše niz znakova i pritisne OK (ili pritisne Enter). Koristit ćemo se sekundarnim prozorima koje ćemo nazvati dialog.draw(leftEye). Potrebno je da se dialog pojavi samo jednom prilikom pokretanja appleta. Nije dobro mjesto Paint metoda jer se ona izvršava svaki put kada windows manager osvježava prikaz na ekranu.draw(rightEye). } } 8.draw(outline). i onda ga konvertirajte korištenjem slijedećih metoda: Integer. Na kraju će uneseni string biti pridružen varijabli reply. g2. Prvo učitajte korisnikov upis kao string. Grafika Arc2D. Čitanje ulaza U appletima moramo unošenju podataka s tipkovnice pristupiti na različit način nego što smo to radili u dosadašnjim aplikacijama. To će izgledati ovako: Istu tehniku možete koristiti za unos brojeva.

Nismo mogli deklarirati varijablu tipa Person unutar metode Init ! PRIMJER 6 import java.applet. g2). } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g.0.ali samo jednom na početku izvršavanja appleta. } } Ovaj applet je napravljen za dimenzije područja prikaza od 300×300. 150. y. public void init() { String input = JOptionPane.4. fred. Moguće je u init metodi postaviti trajnu boju pozadine s: setBackground(Color.0. Probajte rastezati granice appleta i vidjet ćete da će ispis uvijek biti centriran. double h = Double. 59 . import java.crtajLice(x.awt. double y = getHeight()/2. */ public class DrawSmiley extends Applet { Person fred. Primijetite da je objekt tipa Person dodijeljen polju fred kojemu se kasnije pristupa u metodi paint. import javax.*. fred. Grafika Osim paint metode windows manager poziva i metodu init .swing. g2).*. Metoda getWidth() vratit će trenutnu širinu područja prikaza.) /* Čitaj 'raspoloženje' vrijednost i zatim nacrtaj lice.crtajLice(150. Stoga se u tu metodu mogu smjestiti naredbe koje su vezane za inicijalizaciju parametara appleta. Možete applet učiniti pametnijim tako da prvo provjeri dimenzije trenutne dimenzije područja prikaza.parseDouble(input). dok će metoda getHeight() vratiti trenutnu visinu.showInputDialog ("Koliko je osoba sretna?"). Dakle možete pisati slijedeće: double x = getWidth()/2.*. fred = new Person(h). // (Potrebno za JOptionPane klasu.blue).

: System.println. Grafika Ako želite vidjeti što applet čini u određenom trenutku možete ubaciti pozive metode System.java.out.java. To će ispisati poruku u DOS prozoru na uobičajen način. Zadaci Unesite i testirajte primjer 5. na početak paint metode i onda ćete u DOS prozoru vidjeti koliko često windows manager poziva paint metodu.txt 60 . a Html datoteku ImeApplet.println(″paint called″). Stavite npr.out.txt Napišite grafički program koji će zatražiti unos radijusa i zatim nacrtati krug s tim radijusom. Napišite grafički program koji će ispisati vaše ime u centru ekrana unutar plavog pravokutnika .4. a Html datoteku KrugApplet. Applet nazovite ImeApplet. 10. Applet nazovite KrugApplet.

*/ public static void main(String[] args) { ConsoleReader user = new ConsoleReader(System. Ispitivanje uvjeta 5. 7. 1. Simbol == koristi se za ispitivanje jednakosti pošto se = koristi za dodjeljivanja. 2. Izbor između različitih alternativa. Slijedi program koji koristi if naredbu . 3. 61 . else System.in). Izrazi za donošenje odluka U dosadašnjim programima svaki put se prilikom programa izvršavao isti niz izraza u redoslijedu kako su bili napisani. Program pita koliki je rezultat računske operacije 72 puta 84? Zatim čita korisnikov odgovor i sprema ga u varijablu odgovor. Ova naredba znači: Ako je vrijednost varijable odgovor jednaka 6048. Ta vrsta odluke se u Javi najčešće donosi pomoću if uvjetne naredbe. Ovaj program je poput većine primjera u ovom poglavlju aplikacija. Usporedba stringova. i onda provjeri odgovor. Izrazi za donošenje odluka. 6. Tip podataka boolean.out. SADRŽAJ 1. a ne applet. Slijedi primjer if uvjetne naredbe: if (odgovor == 6048) System.out.” Primijetite da je izraz odgovor == 6048 upotrijebljen za ispitivanje uvjeta ‘odgovor je jednak 6048’.println("Netočno!"). 4.5. inače prikaži poruku “Netočno. Nakon toga slijedi if naredba koja provjerava da li korisnik pravilno odgovorio na postavljano pitanje. Java poput svih programskih jezika omogućava pisanje programa koji samostalno odlučuju koji će se naredbe izvršiti. Blokovi i doseg varijabli Zadaci 5. if naredba s jednom granom. PRIMJER 1 public class Multi1 { /* Traži od korisnika da unese odgovor na pitanje koliko je 72 puta 84. prikaži poruku “Točno!”.println("Točno!"). ISPITIVANJE UVJETA Peto poglavlje sastoji se od brojnih primjera korištenja if uvjetnog izraza kojima biramo između dvije alternativne akcije.

IZRAZ-2. int odgovor = user. } } Opći oblik if naredbe dan je uokviren dolje. Dijagram toka prethodnog programa izgleda ovako: 62 . if naredba (s dvije grane) if (LOGIČKI-IZRAZ) IZRAZ-1 else IZRAZ-2 Koda Java izvršava ovu naredbu prvo provjerava da li je rezultat LOGIČKI-IZRAZ točno ili netočno. Ispitivanje uvjeta System. Naziv Logički izraz zamjenjuje bilo koji izraz čiji je rezultat “točno” ili “netočno” (true or false). Bilo koji izraz može se upotrijebiti umjesto IZRAZ-1 i IZRAZ-2. if (odgovor == 6048) System.println("Netočno!").out. je druga grana. čak i druga if naredba.println("Točno!").out. Za vizualizaciju događanja u programu koristit ćemo dijagram toka. IZRAZ-1se ponekad naziva prva grana.out. else System. Ako je netočno izvršit će IZRAZ-2. Ako je točno izvršit će IZRAZ-1.println("Koliko je 72 puta 84?").5.readInt().

Čak možete imati i blok bez i jedne naredbe poput {}. ans = user. Ispitivanje uvjeta Pokaži poruku “Koliko je 72 puta 84?” Postavi odgovor na broj koji je utipkao korisnik. Točan odgovor je 6048"). 63 . if (ans == 6048) System. a nekoliko kad nije. U tom slučaju možete zamijeniti UVJET-1 ili UVJET-2 (ili oboje) s blokom naredbi. i onda provjeri odgovor.readInt().out.println ("Opet netočno. int ans = user.out.println ("Netočno.out. if (ans == 6048) System. else System. System.out. Blok se može staviti na bilo koje mjesto u programu na kojem inače dolazi naredba.out.readInt(). PRIMJER 2 public class Multi2 { /* Traži od korisnika da unese odgovor na pitanje koliko je 72 puta 84. else { System.println("Koliko je 72 puta 84?"). */ public static void main(String[] args) { ConsoleReader user = new ConsoleReader(System.println ("Napokon točno").in).5.println("Točno!"). Slijedi primjer programa s blokom umjesto grane if naredbe (blok je prikazan podebljano). Još jednom pokušaj !"). Provjeri uvjet odgovor == 6048 točno Prikaži “Točno!” netočno Prikaži “Netočno” Ponekad je potrebno izvršiti nekoliko naredbi kad je uvjet zadovoljen. Blok (naredbi) je niz naredbi koje su zatvorene unutar vitičastih zagrada.

out. Ključna riječ return znači: završi s izvođenjem metode. Slijedi još jedan primjer u kojemu tražimo najmanji od četiri broja a. c = 3. Ovakva naredba ima isti efekt kao slijedeća if naredba. else {} Opći oblik if naredbe s jednom granom je: if naredba (s jednom granom) if (LOGIČKI-IZRAZ) IZRAZ Ako je LOGIČKI-IZRAZ točan tada će se izvršiti IZRAZ . if naredba s jednom granom Postoji kraća forma if naredbe u kojoj se izostavlja riječ else i druga grana. System. Inače je if naredba bez ikakvog efekta. Slijedi primjer: if (a < b) then System. d = 8. b = 10.print("Unesi broj: "). U slučaju da korisnik unese negativan broj program će ispisati poruku o grešci te izvršiti return naredbu.5.println(″Manja vrijednost je ″ + a).out. Ovo znači: ako je a manje od b tada prikaži poruku koja kaže da je manja vrijednost a inače čini ništa.b. if (a < b) then System.c. */ public static void main(String[] args) { ConsoleReader in = new ConsoleReader(System. u ovom slučaju programa.d i rezultat pohranjujemo u varijablu s.in). Slijedi primjer programa s if naredbom s jednom granom . if (b < s) s = b.readDouble(). Ispitivanje uvjeta } } } 2. if (c < s) s = c. Za misaonu vježbu pretpostavite slijedeće vrijednosti i odredite tijek izvršavanja: a = 5. s = a. PRIMJER 3 public class Sqrt { /* Pitaj korisnika da unese broj a zatim ispiši kvadratni korijen unesenog broja. if (d < s) s = d. double x = in.println(″Manja vrijednost je ″ + a). 64 . Program računa kvadratni korijen unesenog broja.out.

println ("Kvadratni korijen je " + Math. return naredba (ne vraća vrijednost) return. koja sadrži broj bodova.out.39 ocjena = 5 ocjena = 4 ocjena = 3 ocjena = 2 ocjena = 1 Pretpostavimo da imamo varijablu bodova. Ispitivanje uvjeta if (x < 0) { System. return.69 broj bodova 50 . Return naredba ima dva osnovna oblika: return naredba (vraća vrijednost) return IZRAZ. } } Primjeri korištenja programa: Unesi broj: 9. } System. Izbor između različitih alternativa Ponekad je potrebno napisati kod koji bira između 3 ili više alternativa. a ocjenu želimo pohraniti u varijablu ocjena.49 broj bodova 0 . Npr. Često se s greškama postupa na ovakav način tj. 65 . ispitivanjem s if naredbom te vraćanjem s naredbom return. broj bodova 70 .2 Kvadratni korijen je 3.5. else Postupaj s bodovima u području od 0 do 69. Druga se koristi unutar metoda koje ne vraćaju nikakvu vrijednost i znači samo kraj izvršavanja metode 3.03315017762062 Unesi broj: -3 Broj treba biti >=0.println ("Broj treba biti >= 0. To se može učiniti kombinacijom nekoliko if naredbi.").out.59 broj bodova 40 .sqrt(x)).100 broj bodova 60 . student ostvari određen broj bodova na ispitu od maksimalnih 100. Pseudo kod bi izgledao ovako: if (bodova >= 70) ocjena = ″5″. Znači: završi s izvršavanjem metode i vrati vrijednost danu s IZRAZ. Na osnovu toga treba izračunati ocjenu. Prva vrsta return naredbe koristi se unutar metoda koji vraćaju vrijednost.

Primijetite da je ovaj komad koda zapravo if naredba ! Slijedi kompletan program za proračun ocjene iz broja bodova: PRIMJER 4 public class Ocjena { /* Učitaj broj bodova u području od 0 do 100. else if (bodova >= 40) ocjena = "2".println("Ocjena = " + ocjena). if (bodova >= 70) ocjena = "5". System.in).5. } } Ovom tehnikom ispitujemo niz uvjeta i čim je jedan zadovoljen izvršavamo odgovarajuću akciju. int bodova = in. else if (bodova >= 60) ocjena = ″4″. else if (bodova >= 50) ocjena = "3". else Postupaj s bodovima u području od 0 do 49 Itd. i ispiši odgovarajuću ocjenu. */ public static void main(String[] args) { ConsoleReader in = new ConsoleReader(System. Dalje postupamo na sličan način: if (bodova >= 70) ocjena = ″5″. Na kraju slijedi kompletan izraz: if (bodova >= 70) ocjena = "5".out.readInt() String ocjena. else ocjena = "1".out.print("Unesi broj bodova "). else ocjena = "1". možemo koristiti drugu if naredbu. System. else if (bodova >= 60) ocjena = "4". else if (bodova >= 50) ocjena = "3". if (B1) else if else if : : else if S1 (B2) S2 (B3) S3 (Bn) Sn 66 . else if (bodova >= 40) ocjena = "2". Ispitivanje uvjeta Da bismo postupali s bodovima u području od 0 do 69. else Postupaj s bodovima u području od 0 do 59. else if (bodova >= 50) ocjena = ″3″. else if (bodova >= 60) ocjena = ″4″. poput slijedećeg: if (bodova >= 70) ocjena = ″5″. else if (bodova >= 60) ocjena = "4".

5. Ispitivanje uvjeta else T Blok dijagram ovakve if naredbe izgleda ovako: 67 .

upiši() Zapiši da je student s upisan. Možete kreirati varijablu tipa boolean i dodjeljivati im vrijednosti.: boolean ok = (x > 0). Npr. Ispitivanje uvjeta B1 netočno B2 netočno B3 netočno : Bn netočno točno točno točno S1 točno S2 S3 : Sn T 4. bit će potrebno učiniti još neke promjene u klasi student. a na false ako nije.ispiši() Zapiši da Student s nije upisan. Bit će postavljeno na true ako je student upisao predmete. Npr.5. Zajedno čine primitivni tip podataka koji u Javi nazivamo boolean. Dodat ćemo logički polje u koje ćemo bilježiti je li student upisao predmete tekuće godine. proširit ćemo Student klasu iz trećeg poglavlja. Dodat ćemo slijedeće metode: s. Tip podataka boolean Logički (boolean) izraz poput odgovor == 6048 izračunava se u jednu od slijedećih vrijednosti true (točno) and false(netočno). U mnogim pogledima ove vrijednosti se ponašaju poput drugih tipova vrijednosti kao npr. kao primjer korištenja logički vrijednosti. Polje je deklarirano na slijedeći način: private boolean jeUpisan. metode mogu poput vraćanja cjelobrojnih vrijednosti vraćati logičke vrijednosti. cjelobrojnih vrijednosti. Polje ćemo nazvati jeUpisan. 68 . s. Ove dvije vrijednosti nazivaju se logičke vrijednosti.

println ("Student ID: " + idBroj). boolean jeUpisan. } /* vrati true ako je student upisan inače vrati false */ public boolean jeliUpisan() { return jeUpisan.out. } /* Zabilježi da student nije upisan */ public void ispiši() { jeUpisan = false. int godina. Prva postavlja polje jeUpisan na true. String programStudija. inače vrati false.out. U metodi prikaz dodano je ispitivanje vrijednosti polja jeUpisan na osnovu koje se ispisuje ‘Upisan je’ ako je njegova vrijednost postavljena na true.println("Godina: " + godina). String ime. System. */ public void upiši() { jeUpisan = true.println(″Nije upisan. Konstruktor postavlja vrijednost polja jeUpisan na false. System. else System. ili ‘Nije upisan’ ako je false.out.println(″Upisan je. Slijedi primjer promijenjene Student klase. napravljene su još dvije promjene u klasi Student. /* Zabilježi da je student upisan. } 69 . System.jeliUpisan() vrati true ako je s upisan. Ispitivanje uvjeta s. if (jeUpisan) System.println ("Program studija: " + programStudija).″). PRIMJER 5 public class Student { private private private private private String idBroj.″).out.5. metode su vrlo jednostavne. } /* Prikaži detalje o studentu */ public void prikaz() { System. druga postavlja polje jeUpisan na false i treća vraća vrijednost polja jeUpisan. Metodi koji nisu mijenjani napisani su u skraćenom obliku.out.println("Ime: " + ime).out.

Ispitivanje uvjeta Definicije klasa setProgramStudija. rezultat je false. ime = nm. inače daje false. godina = 1.. Java također izračunava B1 || B2 na ‘lijeni način’ . prvo računa izraz B1 . 70 . (B1 i B2 su logički izrazi) operator B1 && B2 B1 || B2 ! B1 značenje B1 I B2 B1 ILI B2 NEGACIJA B1 Izraz B1 && B2 daje rezultat true ako su i B1 i B2 true. Operator = je najmanjeg prioriteta od dosad spomenutih. programStudija = prog. Java će izraz: n >= 0 && n< 10 || n >= 20 && n < 30 interpretirati kao: ((n>=0) && (n<20)) || ((n>=20) && (n<30)) Operator ‘not’ tj. Ako je B1 true tada B2 se ne računa ! (Zašto?) Operatori && i || su manjeg prioriteta od drugih operatora koje smo dosada sreli. jer neovisno o njemu cijeli izraz je false. je većeg prioriteta nego ostali operatori.5. jeUpisan = false. String nm. Stoga možemo izostaviti zagrade u već spomenutom primjeru: boolean ok = (x > 0). Kada Java izračunava izraz B1 && B2. */ public Student(String id. String prog) { idBroj = id. Kompleksnije logičke izraze formiramo korištenjem logičkih operatora. !. Ako je B1 false izraz B2 se ne izračunava. } } Kada pišemo logičke izraze možemo koristiti slijedeće relacijske operatore: == != < <= > >= jednako nije jednako manje od manje ili jednako veće veće ili jednako Ovi operatori se koriste između bilo koja dva izraza koji označavaju cjelobrojnu ili vrijednost u pokretnom zarezu. Izraz B1 || B2 bit će true ako najmanje jedan od B1 i B2 je true. povecajGodinu i getIme su nepromijenjene /* Kreiraj novog studenta sa zadanim ID brojem. Student početno nije upisan. Ako su i B1 i B2 vrijednosti false. imenom i programom studija Polje godina bit će postavljeno na 1.

out.out."). if(S1==S2){ System.readLine().equals("Dobro")) System. kako ide danas ?").5. System.println (″Ćao korisniče. a ne sadržaj stringova. } } Operator == se normalno ne koristi da bi se ispitalo da li su dva stringa ista. */ public static void main(String[] args) { ConsoleReader in = new ConsoleReader(System. PRIMJER 6 public class KakoSi { /* Pitaj korisnika “Kako je” i daj odgovarajući komentar. 5.equals(″cat″) Slijedi primjer jednostavnog programa koji testira sadržaj stringa na navedeni način.equals("Loše")) System.println ("Lijepo je čuti da nekom ide dobro. String S2 = “Isti smo”. program pokušava prepoznati što je korisnik utipkao te daje odgovarajuće odgovore. Svaki string (string je klasa) ima equals metodu koja se koristi da li string za kojeg smo pozvali metodu ima istu sekvencu karaktera kao i string koji je proslijeđen kao parametar. Znači. Promotrite slijedeći kod: String S1 = “Isti smo”. if (odgovor.in).println("Žao mi je. Slijedi primjer u kojemu testiramo da li se string referenciran s st odnosi na isti niz znakova koji su proslijeđeni kao parametar: st. valjda će biti bolje").println("Isti") } 71 . else if (odgovor. testira se da li obje reference pokazuju na isti string u memoriji.out. Ispitivanje uvjeta U slijedećem dijelu su primjeri upotrebe logičkih operatora. String odgovor = in.out. Razlog je što Java izraz: S1 == S2 gdje S1 i S2 referenciraju stringove interpretira na način da uspoređuje reference. Usporedba stringova Jedan od najčešće upotrebljavanih metoda koja vraća boolean vrijednost je metoda equals.

st1 je ″the dog″.Double(50. Program prepoznaje samo dva oblika.equalsIgnoreCase(st2) Ova metoda ne razlikuje velika i mala slova pa ako npr. else if (odgovor1.200. else color = null. program će spremiti null u varijablu color. else if (odgovor1.yellow. Slijedi primjer appleta koji na osnovu korisnikova unosa željenog oblika i boje iscrtava lik na ekranu. Kad smo postavili vrijednosti u varijable color i shape izvršit ćemo dvije slijedeće naredbe: if (color != null) g2. if (shape != null) g2. else shape = null. Slijedeći kod pita korisnika za oblik i rezultat sprema u varijablu shape.fill(shape). ‘zelena’ ili ‘% 7df&#yx!’. Program prepoznaje samo nazive ‘crvena’. if (odgovor2.equalsIgnoreCase("plava")) color = Color.50.200). Slijedi dio za unos i kreiranje boje: String odgovor1 = JOptionPane. Postoji još mnogo korisnih metoda vezanih za stringove koje možete pogledati u Java dokumentaciji.setColor(color).200).showInputDialog ("Koji oblik želite?").200.equalsIgnoreCase("krug")) shape = new Ellipse2D.equalsIgnoreCase("žuta")) color = Color. Prvo se traži naziv boje te se na osnovu unosa kreira odgovarajući objekt.println("Različiti") } Rezultat ispisa bit će "Različiti" jer varijable S1 i S2 referenciraju na različite stringove s istim sadržajem. Ako korisnik utipka bilo što drugo npr.50. ‘žuta’ i ‘plava’. Ispitivanje uvjeta else{ System. st1.Double(50.showInputDialog ("Naziv željene boje?").equalsIgnoreCase("kvadrat")) shape = new Rectangle2D. Korisna alternativa equals metodi je slijedeća metoda.equalsIgnoreCase("crvena")) color = Color.5.red. 72 .out. a st2 je ″The Dog″. String odgovor2 = JOptionPane. onda će metoda vratiti true.blue. else if (odgovor2. if (odgovor1.

Ako je program prepoznao lik onda će ga nacrtati. Ispitivanje uvjeta Ako smo unijeli prepoznatljivu boju Graphics2D objekt bit će postavljen na zadanu boju. bit će ostavljena njegova prethodna boja.5. a ako nismo . Slijedi kompletan program: 73 . inače ne.

geom. if (odgovor1. Ispitivanje uvjeta PRIMJER 7 // Applet koji vas pita za boju i oblik // te prikazuje unijeti oblik ispunjen sa zadatom bojom import import import import java.*. Postoje dva osnovna zadatka: 74 .200. } } Analizirajmo formu appleta. /* Prikaži obojani lik. */ if (boja != null) g2.200).awt.50. if (odgovor2.200).setColor(boja).fill(oblik). else oblik = null. else boja = null.red. java.equalsIgnoreCase("krug")) oblik = new Ellipse2D. java.yellow.equalsIgnoreCase("kvadrat")) oblik = new Rectangle2D.Double(50. else if (odgovor1.*. else if (odgovor2. private Shape oblik.*. javax.equalsIgnoreCase("žuta")) boja = Color.blue.showInputDialog ("Naziv željene boje?").awt.swing.Double(50.50. if (oblik != null) g2. public class Oblici extends Applet { private Color boja.showInputDialog ("Koji oblik želite?"). else if (odgovor1. String odgovor2 = JOptionPane. } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g.equalsIgnoreCase("crvena")) boja = Color.200.applet.*. public void init() { String odgovor1 = JOptionPane.5.equalsIgnoreCase("plava")) boja = Color.

equals("Računarstvo") || odgovor. Ako je korisnik zadovoljan s trenutnom vrijednošću onda utipka samo Return (Enter).out. Nazvat ćemo je edit. Za studentovo ime postupa se skoro na isti način. Slijedeća tri retka korisnik je unio nove podatke i potrebno ih je pohraniti u odgovarajuća polja. String odgovor = input. pita korisnika da li želi napraviti kakve promjene. i čeka korisnikov odgovor. ispitivanje sadržaja stringa obavlja se na slijedeći način: if (!odgovor. Ispitivanje uvjeta Korak 1. System. Korak 2. Ako želi s se odgovarajuće ažurira. Za program studija se postupa na malo drukčiji način.print("ID (" + idBroj +") " ). Unesi željenu boju i oblik. U slučaju prva dva retka korisnik je samo utipkao Enter i odgovarajuće vrijednosti su ostale iste. Drugi korak će se izvršavati svaki put kad bude potrebno osvježiti sadržaj područja prikaza. Za zadnji primjer u ovom poglavlju slijedi dodavanje još jedne metode u klasu Student. if (! odgovor. Korisnikov unos učitavamo pomoću ConsoleReader objekta. Koristit će equals metodu za usporedbu stringova i logičke operatore.println("Nepoznat program studija. Stoga je uključen u applet paint metodu. Metoda edit postupa s poljem jeUpisan opet na različit način.equals("Elektronika") || odgovor. S druge strane prvi korak treba biti izvršen samo jednom pa je uključen u init metodu. Umjesto ispisa stvarnog sadržaja ispisuje se ‘da’ ili ‘ne’ za indikaciju upisa studenta. Primjer mogućeg prikaza na ekranu prilikom izvršavanja metode edit: ID (9912345) Ime (Jure Antić) Program studija (Računarstvo) CS Godina (1) 2 Upisan? (Da) no Svaka se linija sastoji od naziva informacije i njene trenutne vrijednosti te podebljano ispisanog korisnikovog unosa. Metoda edit prikazuje redom vrijednost svakog polja.equals("Brodogradnja") ) programStudija = odgovor.equals("")) if (odgovor.out. Slijedi kod koji radi s ID brojem. Korisnik mora odgovoriti s ‘da’ or ‘ne’ ako želi napraviti promjenu u tom polju 75 .equals("Strojarstvo") || odgovor.readLine(). else System. s. Ako unese neki string metoda će pretpostaviti da se radi o novoj vrijednosti i spremiti je u odgovarajuće polje.edit(in) Prikazuje podatke o objektu s tipa Student.5. Naslikaj željeni lik u željenoj boji.").equals("")) idBroj = odgovor.

odgovor = input. if (! odgovor.print("ID (" + idBroj +") " ).print("Upisan? (da) ").readLine().equals("")) ime = odgovor.equals("Brodogradnja") ) programStudija = odgovor.equals("Strojarstvo") || odgovor. odgovor = input."). else System.print("Upisan? (ne) "). } public class TestStudent { /* Čita podatke o studentu i kreira odgovarajući Student objekt. System.equals("ne")) jeUpisan = false. if (! odgovor.equals("Elektronika") || odgovor.out.out.readLine().print("Godina (" + godina + ") ").print("Ime (" + ime + ") "). odgovor = input.out. System. odgovor = input. else System.5.out.out.out.equals("")) idBroj = odgovor. if (! odgovor. Ispitivanje uvjeta Slijedi potpuna metoda edit: PRIMJER 8 /* Editiraj studentove podatke */ public void edit(ConsoleReader input) { System. else System.print ("Program studija (" + programStudija + ") ").equals("Računarstvo") || odgovor. if (! odgovor.out. if (! odgovor.println("Odgovor nije razumljiv. if (jeUpisan) System.readLine().equals("da")) jeUpisan = true.println("Nepoznat program studija.parseInt(odgovor).equals("")) godina = Integer.").out.readLine(). else if (odgovor.readLine().equals("")) if (odgovor. String odgovor = input. 76 .equals("")) if (odgovor. System.

readLine().readLine().out.d).readLine(). System. System.in).println("Koji je program studija?"). System.out.5. Student st = new Student(i.println("Editiraj podatke studenta. String n = in. */ System.println("Koje je ime studenta?"). System. } } Slijedi što bi program mogao ispisivati (unos korisnika podebljano): Koji je ID broj studenta? 9912345 Koje je ime studenta? Jure Antić Koji je program studija? Računarstvo Editiraj podatke studenta. */ System.edit(in).println ("Koji je ID broj studenta?"). st. String d = in."). Ispitivanje uvjeta Zatim editira objekt Student te na kraju prikazuje sadržaj. /* Editiraj pa prikaži podatke studenta.out. System.println(). String i = in.out.println().out.println("Student podaci:"). */ public static void main(String[] args) { /* Kreiraj objekt tipa ConsoleReader za učitavanje podataka s tastature */ ConsoleReader in = new ConsoleReader(System.n. /* Kreiraj objekt Student. st. ID (9912345) 9912346 Ime (Jure Antić) Program studija (Računarstvo) Elektronika Godina (1) 2 Upisan (ne) da Student podaci: Student ID: 9912346 77 .prikaz().out.out.

} System.equals("")) { if (odgovor."). Blokovi i doseg varijabli Zapamtite da je blok sekvenca naredbi zatvorena u vitičaste zagrade.out. } else { System.″). 78 . čim Java napusti blok varijable iščezava tj. Java će to interpretirati na slijedeći način: 1.println("Odgovor nije razumljiv. Ovo je primjer tzv. Varijabla koju deklaracijom unutar bloka vrijedi samo unutar bloka. int y = 1. Ispitivanje uvjeta Ime: Jure Antić Program studija: Elektronika Godina: 2 Upisan. if (B1) { if (B2) S1 } else S2 Pravilo je da else tvori cjelinu s najbližim if-om.println(″x is nula.println(″x nije nula. Jedna je bitna stvar u radu s blokovima u Javi. else System.5.out. int y = 2.out. if (B1) { if (B2) S1 else S2 } a ne ovako: 2. oslobađa se memorija koja je za nju bila korištena.out. else if (odgovor. visećeg else. U ovim slučajevima preporučljivo je koristiti vitičaste zagrade ! Kod sa vitičastim zagradama: if (! odgovor. } 6.equals("ne")) jeUpisan = false. promotrite slijedeći primjer: if (x == 0) { System. U kodu programa postoji izraz slijedećeg oblika(ispitivanje polja programStudija): if (B1) if (B2) S1 else S2 Kojemu if pripada else.″).println(″y je ″ + y).equals("da")) jeUpisan = true.

2.out. Izuzetak su godine djeljive s 400 (npr.out. osim ako nije djeljiva s 100 (npr. 1980). Ispitivanje uvjeta Ovaj program će javiti pogrešku u toku prevođenja. Pošto smo tim referencama u Init metodi dodijelili objekte boje i oblika.println(″x je nula.println(″y je ″ + y). prethodni program ima više smisla (kompajlirat će se) ako ga preuredimo na slijedeći način: int y.java) koji čita tri broja u pokretnom zarezu i ispisuje najveći od njih: Npr: Unesi tri broja: 4 9 2. 79 .″).1582 (npr. Zadaci Napiši program (TriBroja. reference su trebale ostati sačuvane da bi objektima mogla pristupiti paint metoda. S druge strane.120). Ako točka leži unutar Kruga onda ispisuje poruku "Unutar kruga". } System. Objekt traje sve dok Java ne zaključi da se više ne upotrebljava. y = 1.5. Krugtest. if (x == 0) { System. a onda ispisati je li ili nije prestupna. varijabla deklarirana unutar bloka naziva se lokalna varijabla. varijabla y ne vrijedi izvan bloka u kojem je deklarirana. Provjera 1996 i 2000 su prestupne. polje objekta postoji sve dok postoji objekt kome pripada.. Što više programer je kreirao dvije posebne varijable y unutar posebnih blokova.println(″x nije nula. Godina s 366 dana naziva se prestupna godina. napiši program koji će korisnika pitati za godinu . Napiši applet (KrugTest. Činjenica da lokalne varijable vrijede samo dok se metod izvršava objašnjava nam zašto smo u primjeru 7 upotrijebili dva nova polja Color i Shape. Godina je prestupna ako je djeljiva s 4 (npr. 3. Dio programa u kojemu možemo koristiti određenu varijablu naziva se doseg (scope) te varijable. 1900 i 1999 nisu. ipak nije bila prestupna). y = 2. To znači da bi svaka varijabla deklarirana unutar metode trebala prestati s postojanjem nakon izlaska iz metode. 1900). 2000) koje su prestupne u svakom slučaju.out.txt (HTML) )koji crta krug radijusa 100 s centrom u (110. Taj proces nije nimalo jednostavan kako to pokazuje naziv garbage collection (odvoz smeća). 7.5 Najveći je broj 9.″).10. 1500.java. Nije bilo prestupnih godina prije uvođenja Gregorijanskog kalendara na dan 15. Tijelo metoda je također blok pa tako svaka varijabla koja je deklarirana unutar metode je lokalna varijabla. } else { System. Zatim traži od korisnika da unese koordinate neke točke. a ako leži vani poruku "Van kruga".

Ispitivanje uvjeta 80 .5.

Sign up to vote on this title
UsefulNot useful