ao i u drugim programskim jezicima, elementi Jave ne postoje sami za sebe već me?usobno sara?uju formirajući jezik kao celinu. Me?utim, ova povezanost otežava posebno opisivanje pojedinih aspekata Jave. Č;esto rasprava o jednoj osobini podrazumeva da znate druge. Zbog toga u ovom poglavlju iznosimo kratak pregled nekoliko ključnih karakteristika Jave. Opisana materija daće vam dobru podlogu da pišete i razumete jednostavne programe. Većinu tema o kojima u poglavlju govorimo detaljnije ćemo obraditi u preostalim poglavljima prvog dela knjige.
Objektno orijentisano programiranje čini samu srž Jave. U stvari, svi Java programi su objektno orijentisani - to nije samo jedna od opcija, kakav je slučaj, na primer, u jeziku C++. Objektno orijentisano programiranje tako je čvrsto ugra?eno u Javu da morate razumeti njegove osnovne principe pre nego što napišete i najjednostavniji program. Prema tome, ovo poglavlje započinjemo objašnjavanjem teorijskih aspekata OOP-a.
Kao što znate, svi računarski programi se sastoje od dva elementa: naredaba i podataka. Štaviše, program može da bude koncepcijski organizovan oko naredaba ili oko podataka. Drugim rečima, neki programi su organizovani oko onoga "ko radi", a drugi oko onoga "sa čime se radi". Ovo su dva uzora za razvijanje programa. Prvi način predstavlja procesno orijentisan model (engl. process-oriented model). Prema ovom modelu program se definiše kao niz uzastopnih koraka (znači, kao skup naredaba). Procesno orijentisan model može se shvatiti i kao skup naredaba koje rade sa podacima. Proceduralni jezici, npr. jezik C, izuzetno uspešno koriste ovaj model. Me?utim, kao što je pomenuto u poglavlju 1, kada program postane veći i složeniji, ovaj pristup nailazi na teškoće.
Da bi se prevazišle teškoće nastale usložnjavanjem programa, smišljen je drugi pristup - objektno orijentisano programiranje (engl. object-oriented programming). Ovim pristupom program se organizuje oko podataka (tj. objekata) i oko skupa dobro definisanih načina pristupa ka tim podacima. Objektno orijentisan program karakterišu podaci koji upravljaju pristupanjem skupu naredaba. Uverićete se i sami da prepuštanje kontrole podacima donosi više organizacionih prednosti.
Bitan element objektno orijentisanih jezika jeste apstrakcija. Ljudi se sa složenim situacijama bore apstrahovanjem. Na primer, niko ne zamišlja automobil kao skup desetina hiljada pojedinačnih delova, već ga prihvata kao dobro definisan objekat koji se ponaša na jedinstven način. Ovakvo apstrahovanje omogućuje vam da sednete u automobil i obavite kupovinu ne opterećujući se složenošću mehanizma automobila. Na taj način možete da zanemarite detalje rada motora, prenosnog mehanizma i kočnica i da objekat koristite kao celinu.
Siguran način za snalaženje u apstrakcijama predstavlja korišćenje hijerarhijske klasifikacije. To vam dozvoljava da semantiku složenih sistema uredite po slojevima, razdvajajući ih na celine kojima se lakše upravlja. Gledajući spolja, automobil predstavlja jedinstven objekat. Kada u?ete u njega, vidite da se on sastoji od više podsistema: za upravljanje, za kočenje, za signalizaciju, za obezbe?ivanje putnika, za zagrevanje, za komunikaciju itd. Svaki od ovih podsistema je sastavljen od delova koji su još više specijalizovani. Na primer, ozvučenje se sastoji od radio-aparata, CD plejera i/ili kasetofona. Važno je da shvatite da vi upravljate složenim sistemom automobila (ili bilo kojim drugim složenim sistemom) koristeći hijerarhijsko apstrahovanje.
Hijerarhijsko apstrahovanje složenih sistema može se primeniti i na računarske programe. Podaci iz tradicionalnih procesno orijentisanih programa apstrahovanjem se mogu pretvoriti u sastavne objekte. Niz procesnih stupnjeva može da postane zbirka poruka izme?u dva objekta. Na taj način svaki od ovih objekata opisuje sopstveno jedinstveno ponašanje. Ove objekte možete smatrati posebnim celinama koje reaguju na poruke kojima im se saopštava da nešto urade. To je suština objektno orijentisanog programiranja.
Koncept orijentacije na objekte predstavlja srž Jave, baš kao što predstavlja osnovu ljudskog poimanja. Važno je da razumete kako se ove koncepcije ugra?uju u programe. Videćete da je objektno orijentisano programiranje moćan i prirodan uzor za pravljenje programa koji preživljavaju neizbežne promene u životu svakog važnijeg softverskog projekta, uključujući začetak, rast i starenje. Na primer, kad postignete da objekti budu dobro definisani, a pristup njima čist i pouzdan, glatko možete da odbacite ili zamenite delove nekog starijeg sistema.
Svi objektno orijentisani programski jezici obezbe?uju mehanizme za ostvarivanje objektno orijentisanog modela programiranja. Ti mehanizmi obuhvataju kapsuliranje, nasle?ivanje i polimorfizam. Pogledajmo pobliže šta oni znače.
Kapsuliranje (engl. encapsulation) predstavlja mehanizam koji povezuje naredbe i podatke sa kojima one rade, i oboje štiti od spoljnih uplitanja i zloupotreba. Kapsulirani kôd dobija "zaštitnu čauru" koja štiti naredbe i podatke od proizvoljnog pristupa izvan čaure. Pristupanje naredbama i podacima unutar čaure strogo se kontroliše pomoću dobro definisanih standarda. Da bismo ovu situaciju približili stvarnosti, razmotrimo ponašanje automatskog menjača u automobilu. Ovaj sistem kapsulira na stotine podataka o motoru, na primer, ubrzanje, zatim podatke o nagibu puta, kao i o položaju ručice menjača. Kao korisnik, vi možete da utičete na ovu složenu strukturu samo na jedan način: pomeranjem ručice menjača. Na ponašanje menjača ne možete da utičete pritiskajući migavce, na primer, ili pokrećući brisače. Shodno tome, ručica menjača jeste ono što predstavlja dobro definisan (u stvari, i jedini) način pristupa menjaču. Štaviše, ono što se doga?a unutar menjača ne utiče na objekte izvan njega. Na primer, menjanje brzina ne utiče na glavna svetla automobila! Pošto je automatski menjač kapsuliran, desetine proizvo?ača automobila ih ugra?uju onako kako im odgovara. Me?utim, sa gledišta vozača, svi oni rade jednako. Ista ideja može da se primeni i na programiranje. Moć kapsuliranog objekta ogleda se u tome što svako zna kako može da mu pristupi i stoga ga može koristiti bez obzira na princip rada - i bez bojazni od neočekivanih sporednih efekata.
Osnova kapsuliranja kod Jave jeste klasa. Mada ćemo o klasama detaljnije govoriti u nastavku knjige, potrebno je da na ovom mestu ukažemo na sledeće. Klasa (engl. class) definiše strukturu i ponašanje (podatke i naredbe) zajedničke za skup objekata. Svaki objekat odre?ene klase ima strukturu i ponašanje definisane klasom, baš kao da predstavlja repliku klase. Zbog ovoga se objekti ponekad nazivaju primercima ili instancama klase. Na taj način klasa predstavlja logičku konstrukciju; objekat predstavlja fizičku realnost.
Kada pravite klasu, definišete kôd i podatke koji je čine. Ovi elementi se jednim imenom nazivaju članovima klase (engl. class members). Podaci definisani klasom posebno se nazivaju članovi promenljive (engl. member variables) ili promenljive instanci (engl. instance variables). Procedure koje rade sa tim podacima nazivaju se članovi metode (engl. member methods) ili, jednostavno, metode (engl. methods). (Ako poznajete C ili C++, dobro je da znate da ono što Java programer naziva metodom, C/C++ programer naziva funkcijom.) U ispravno napisanom Java programu metode definišu način korišćenja promenljivih. To znači da su ponašanje i način pristupa klasi definisani metodama koje rade sa podacima instance.
Pošto je svrha klase da kapsulira složenost, postoje mehanizmi za skrivanje složenosti načina rada unutar klase. Svaka metoda ili promenljiva unutar klase može da bude privatna ili javna. Javni (engl. public) deo klase predstavlja sve što spoljni korisnici klase treba ili mogu da znaju. Privatnim (engl. private) metodama i podacima može da pristupi samo kôd klase. Kôd izvan te klase ne može da pristupi privatnoj metodi ili promenljivoj. Pošto privatne članove klase drugi članovi vašeg programa mogu da dosegnu samo preko javnih metoda klase, na taj način se obezbe?ujete od neodgovarajućih akcija. Naravno, ovo znači da javni deo treba da bude pažljivo oblikovan kako ne bi previše otkrivao zbivanja unutar klase (slika 2-1).
Nasle?ivanje (engl. inheritance) jeste proces kojim jedan objekat dobija svojstva drugog objekta. Nasle?ivanje je važno jer podržava koncepciju hijerarhijske klasifikacije (tj. odozgo nadole). Na primer zlatni retriver je deo klase pas, koja je deo klase sisar, koja je deo veće klase životinja. Bez postojanja hijerarhije, za svaki objekat bi se morale eksplicitno zadati sve njegove karakteristike. Me?utim, ako postoji nasle?ivanje, za objekat treba definisati samo one karakteristike koje ga čine jedinstvenim u klasi. Opšta svojstva objekat može da nasledi od roditelja. Na taj način, nasle?ivanje predstavlja mehanizam koji omogućuje da jedan objekat bude poseban slučaj nekog opštijeg objekta. Pogledajmo ovaj proces izbliza.
Većina ljudi smatra da je svet prirodno sačinjen od objekata me?usobno povezanih na hijerarhijski način, npr. životinja, sisara i pasa. Ako biste želeli da životinje opišete apstraktno, rekli biste da one imaju izvesne osobine, npr. veličinu, inteligenciju i vrstu skeletnog sistema. Æivotinje imaju i odre?ene aspekte ponašanja; one jedu, dišu i spavaju. Ovakav opis osobina i ponašanja predstavlja definiciju klase životinja.
Ako želite da definišete odre?eniju klasu životinja, npr. sisare, oni bi tako?e morali imati odre?enije osobine, npr. mlečne žlezde i tip zuba. Kažemo da su sisari potklasa (engl. subclass) životinja, a životinje su sisarima natklasa (engl. superclass).
Pošto su sisari samo uže definisane životinje, oni nasle?uju sve osobine životinja. Potklasa koja se nalazi duboko u hijerarhiji nasle?uje osobine svih svojih predaka u hijerarhiji klase.
Nasle?ivanje je povezano i sa kapsuliranjem. Ako klasa kapsulira neke osobine, onda će svaka potklasa imati te osobine ali i osobine kojima se potklasa izdvaja (slika 2-2). Ovo je ključna koncepcija koja omogućuje da složenost objektno orijentisanih programa raste linearnom, umesto geometrijskom progresijom. Nova potklasa nasle?uje sve osobine svih svojih predaka. Ona ne dolazi u dodir sa većinom ostalog koda u sistemu na nepredvidljiv način.
Polimorfizam (engl. polymorphism), reč grčkog porekla, znači "mnogo oblika" i predstavlja osobinu koja omogućava da se jedan način pristupa koristi za opštu klasu akcija. Specifičnost akcije biće odre?ena tačnom prirodom situacije. Razmotrimo stek (strukturu "poslednji koji u?e, prvi izlazi"). Možete da imate program kome su potrebne tri vrste steka: jedan za cele brojeve, drugi za brojeve u pokretnom zarezu, a treći za znake. Algoritam kojim se obrazuju stekovi uvek je isti, bez obzira na to što se u njima čuvaju različiti podaci. U jezicima koji nisu objektno orijentisani morali biste za svaki stek da napišete poseban skup naredaba u kojima bi se koristila različita imena. Me?utim, zbog postojanja polimorfizma, u Javi možete da definišete opšti skup naredaba za stekove koji će imati ista imena.
Uopšteno govoreći, koncept polimorfizma često se prikazuje frazom "jedan način pristupa, više metoda". Ovo znači mogućnost pravljenja opšteg načina pristupa za rad sa grupom srodnih aktivnosti. To pomaže smanjenju složenosti, omogućujući da se istim načinom pristupa zada opšta klasa akcija. Na prevodiocu je da odabere specifičnu akciju (tj. metodu) shodno situaciji. Programer ne mora ručno da bira. Potrebno je samo da zapamti i iskoristi opšti pristup.
Ako nastavimo priču sa psom, možemo reći da je pseće čulo mirisa polimorfno. Ako pas oseti mačku, on će zalajati i pojuriti za njom. Ako oseti svoju hranu, pas će početi da luči pljuvačku i otrčati do svoje posude. Isto čulo se koristi u obe situacije. Razlika je u tome šta se oseća tim čulom, tj. razlikuju se vrste podataka sa kojima radi pseći nos! Ista ova opšta ideja može da se primeni i na metode u Java programima.
Kada se primene na odgovarajući način, polimorfizam, kapsuliranje i nasle?ivanje stvaraju programsko okruženje koje podržava razvoj mnogo robusnijih i prilagodljivijih programa nego što omogućuje procesno orijentisan model. Dobro dizajnirana hijerarhija klasa predstavlja osnovu za ponovljeno korišćenje koda u čije ste razvijanje i proveravanje uložili vreme i trud. Kapsuliranje omogućuje da tokom vremena menjate unutrašnju konstrukciju ne remeteći kôd koji se oslanja na javni interfejs vaših klasa. Polimorfizam omogućuje da napravite čist, smislen, čitljiv i elastičan kôd.
Od dva primera iz stvarnog sveta koja smo koristili, automobil potpunije ilustruje snagu objektno orijentisanog dizajna. O psima je zabavno raspravljati kada govorimo o precima, ali automobil više liči na program. Svi vozači se oslanjaju na nasle?ivanje kada sedaju u različite vrste (potklase) automobila. Nije važno da li je u pitanju školski autobus, Mercedes sedan, Porše ili porodični kombi, svi vozači će uglavnom pronaći i umeti da koriste upravljač, kočnice i pedalu gasa. Nakon izvesnog krčanja zupčanika, većina vozača će shvatiti razliku izme?u običnog i automatskog menjača, jer svi u osnovi shvataju njihovu natklasu, prenosni mehanizam.
Ljudi se svakoga dana suočavaju sa kapsuliranim osobinama automobila. Kočnica i pedala gasa su standard za pristupanje neverovatno složenim mehanizmima, pa ipak su tako jednostavne da sa njima možete raditi i nogama! Način rada motora, vrsta kočnica i veličina guma nemaju uticaja na način na koji se suočavate sa definicijom klase pedala.
Treći atribut, polimorfizam, jasno odražava mogućnost proizvo?ača da uza suštinski isti automobil ponudi mnogobrojne opcije. Na primer, možete da dobijete sistem za kočenje koji ne blokira ili uobičajene kočnice, hidraulički ili običan volan, motor sa 4, 6 ili 8 cilindara. U svakom od ovih slučajeva i dalje ćete, da biste zaustavili automobil, pritiskati pedalu, okretati volan da biste negde skrenuli i pritiskati pedalu gasa kada budete želeli da putujete brže. Isti pristup se koristi za upravljanje nizom različitih proizvoda.
Kao što i sami vidite, primena kapsuliranja, nasle?ivanja i polimorfizma čini da se pojedinačni delovi preobraze u objekat zvan automobil. Isto važi i za računarske programe. Primenom principa objektno orijentisanog programiranja različiti delovi složenih programa mogu se povezati da bi obrazovali skladnu, robusnu, trajnu celinu.
Na početku ovog odeljka pomenuli smo da je svaki Java program objektno orijentisan. Tačnije, svaki Java program obuhvata kapsuliranje, nasle?ivanje i polimorfizam. Iako kratki programski primeri koje navodimo u ostatku ovog poglavlja, kao i u nekoliko narednih, možda ne prikazuju očigledno sve ove osobine, one su ipak tu. Videćete da su mnoge mogućnosti Jave u stvari delovi njenih ugra?enih biblioteka klasa koje opsežno koriste kapsuliranje, nasle?ivanje i polimorfizam.
Pošto smo razmotrili osnove objektno orijentisanog programiranja koji predstavljaju samu srž Jave, pogledajmo neke prave programe pisane u Javi. Počnimo prevo?enjem i izvršavanjem sledećeg kratkog primera. Videćete da to zahteva malo više posla nego što ste zamišljali.
Opis koji sledi oslanja se na standardni razvojni paket JDK (Java Developer's Kit) firme Sun Microsystems. Ukoliko koristite drugačije razvojno okruženje za Javu, možda ćete morati drugačije da prevodite i izvršavate Java programe. U tom slučaju, poslužite se odgovarajućim priručnikom koji ste dobili uz prevodilac.
U većini programskih jezika možete proizvoljno da izaberete ime datoteke sa izvornim kodom. To, me?utim, nije slučaj i u Javi. Prvo što u Javi treba da naučite jeste to da je veoma važno kakvo ćete ime dati datoteci sa izvornim kodom. U gornjem primeru ime datoteke sa izvornim kodom treba da bude Primer.java. Pogledajmo i zašto.
Datoteka sa izvornim kodom u Javi zvanično se naziva kompilatorska jedinica (engl. compilation unit). To je tekstualna datoteka koja sadrži jednu ili više definicija klasa. Prevodilac jezika Java zahteva da datoteka sa izvornim kodom ima nastavak .java. Primetićete da je nastavak dužine četiri znaka. To znači da vaš operativni sistem mora da podržava dugačka imena datoteka, pa DOS i Windows 3.1 ne mogu da podržavaju Javu. Me?utim, Windows 95/98 i Windows NT/2000 sa njom rade sasvim ispravno.
Ako pogledate program, primetićete da je ime klase koju on definiše tako?e Primer. To nije slučajno. U Javi sav kôd mora da bude smešten unutar klase. Prema konvenciji, ime te klase treba da odgovara imenu datoteke koja sadrži program. Treba da vodite računa i o tome da raspored velikih i malih slova u oba slučaja bude isti. Java razlikuje velika i mala slova. U ovom trenutku zahtev da ime datoteke odgovara imenu klase nema mnogo smisla. Me?utim, ta konvencija omogućuje da lakše održavate i organizujete svoje programe.
Kada želite da prevedete program Primer, pokrenite prevodilac javac, zadajući na komandnoj liniji datoteku sa izvornim kodom:
Prevodilac javac će napraviti datoteku Primer.class koja sadrži bajt kôd programa. Kao što smo ranije objasnili, bajt kôd je poluproizvod sa instrukcijama koje treba da izvrši interpretator. Dakle, prevodilac javac ne generiše kôd koji se odmah može izvršavati.
Da biste pokrenuli program, morate da iskoristite Javin interpretator, zvan java. To ćete uraditi tako što ćete interpretatoru proslediti klasu Primer, na sledeći način:
Kada se program izvrši, na ekranu dobijate sledeću poruku:
Ovo je jednostavan Java program.
Pri prevo?enju izvornog koda svaka klasa se smešta u posebnu datoteku koja nosi ime klase i nastavak .class. Zbog ovoga je dobro da izvornim datotekama dajete imena klasa koje one sadrže - ime izvorne datoteke će odgovarati imenu datoteke .class. Pri pokretanju Javinog interpretatora, vi mu, u stvari, prosle?ujete ime klase koju želite da prevede i izvrši. On će automatski potražiti datoteku zadatog imena sa nastavkom .class. Ako je prona?e, izvršiće kôd sadržan u zadatoj klasi.
Iako je program Primer.java sasvim kratak, on sadrži više ključnih karakteristika koje su zajedničke svim Java programima. Ispitajmo detaljnije svaki deo programa.
Ovo je komentar (engl. comment). Slično drugim programskim jezicima, Java omogućuje da u izvorni kôd unesete primedbe. Prevodilac će zanemariti sadržaj komentara. Komentar opisuje i objašnjava rad programa onome ko čita izvorni kôd. U ovom slučaju komentar opisuje program i podseća vas da datoteku sa izvornim kodom treba da snimite pod imenom Primer.java. Naravno, u stvarnim situacijama komentarima se objašnjava kako rade odre?eni delovi programa ili čemu služe odre?ene osobine.
Java podržava tri stila komentara. Komentar prikazan na početku programa naziva se višeredni komentar (engl. multiline comment). Ova vrsta komentara mora da počne oznakama /* i da se završi oznakama */. Sve što se nalazi izme?u ove dve oznake prevodilac će zanemariti. Kao što i samo ime kaže, višeredni komentar može da se proteže kroz više redova.
Iza komentara u programu sledi red koda:
U redu se pojavljuje rezervisana reč class, čime se najavljuje definisanje nove klase. Primer je identifikator (engl. identifier) koji predstavlja ime klase. Celokupna definicija klase, uključujući sve njene članove, nalaziće se unutar vitičastih zagrada ({ i }). Vitičaste zagrade u Javi upotrebljavaju se isto kao u jezicima C i C++. Trenutno nemojte previše da brinete o detaljima klase već samo obratite pažnju na to da se u Javi svaka programska aktivnost odvija unutar klasa. To je jedan od razloga zbog kojih su svi Java programi (barem delimično) objektno orijentisani.
Sledeći red programa predstavlja jednoredni komentar (engl. single-line comment):
Ovo je druga vrsta komentara koje podržava Java. Jednoredni komentar počinje znakovima // i završava se na kraju tekućeg reda. Programeri višeredne komentare po pravilu koriste za duže primedbe, a jednoredne za kratke opise.
Iza jednorednog komentara u našem programu sledi red koda:
Red počinje metodom main(). Kao što objašnjava prethodni komentar, ovim redom počinje izvršavanje vašeg programa. Izvršavanje svih Java aplikacija počinje pozivom metodi main(). (Isto je u jeziku C ili C++.) Tačno značenje svakog dela ovog reda još uvek ne možemo da objasnimo, pošto to zahteva detaljno razumevanje Javinog pristupa kapsuliranju. Me?utim, pošto će u većini primera iz prvog dela knjige postojati ovaj red, hajde da bacimo kratak pogled na njega.
Rezervisana reč public je specifikator pristupa (engl. access specifier) koji programeru omogućava da upravlja vidljivošću članova klase. Kada ispred člana klase stoji reč public, tada se tom članu može pristupiti i izvan klase u kojoj je član deklarisan. (Rezervisana reč private ima suprotno dejstvo: ona onemogućuje pristup članu izvan klase.) U ovom slučaju, metoda main() mora biti deklarisana kao public, pošto pri pokretanju programa mora biti pozvana izvan klase. Rezervisana reč static dozvoljava da metoda main() bude pozvana bez pravljenja posebne instance klase. To je neophodno, jer Javin interpretator poziva metodu main() pre nego što je stvoren ijedan objekat. Rezervisana reč void samo saopštava prevodiocu da metoda main() ne vraća nikakvu vrednost. Kasnije ćete videti da metode mogu da vraćaju vrednosti. Ako vas sve ovo pomalo zbunjuje, ipak ne brinite. O svemu ćemo detaljnije raspravljati u narednim poglavljima.
Kao što je rečeno, main() je metoda koja se poziva pri pokretanju Java aplikacije. Vodite računa o tome da Java razlikuje velika i mala slova. Main nije isto što i main. Treba da znate da će prevodilac prevesti i klase koje ne sadrže metodu main(). Me?utim, Javin interpretator nema načina da te klase izvrši. Dakle, ako ste uneli Main, umesto main, prevodilac će ipak prevesti vaš program. Me?utim, Javin interpretator će prijaviti grešku jer neće moći da na?e metodu main().
Metodama možete da prosledite podatke preko promenljivih koje su navedene u zagradi iza imena metode. Ove promenljive se zovu parametri. Č;ak i ako odre?enoj metodi nisu potrebni parametri, ipak ćete iza imena metode morati da upišete praznu zagradu. U metodi main() postoji samo jedan parametar, ali on nije jednostavan. String args[ ] deklariše parametar args, koji predstavlja niz instanci klase String. (Nizovi su zbirke sličnih objekata.) Objekti tipa String čuvaju znakovne nizove. U ovom slučaju, kada se program pokrene, u niz args biće smešteni eventualni argumenti uneti na komandnu liniju. Program iz našeg primera neće iskoristiti ove podatke, ali će to učiniti drugi programi o kojima govorimo kasnije.
Poslednji u redu je znak {. On ukazuje na početak tela metode main(). Sve naredbe neke metode moraju biti smeštene unutar vitičastih zagrada.
Još nešto: main() je samo polazna tačka interpretatora. Neki složen program imaće na desetine klasa, od kojih samo jedna treba da ima metodu main() da bi se program pokrenuo. Kada počnete da pravite aplete - Java programe koji se ugra?uju u čitače Weba - uopšte nećete koristiti metodu main(), pošto čitači Weba drugačije pokreću izvršavanje apleta.
Dole je prikazan sledeći red koda. Obratite pažnju na to da se on nalazi unutar deklaracije metode main().
Ova naredba na ekranu ispisuje reči "Ovo je jednostavan Java program.", a zatim prebacuje kursor u novi red. Ispisivanje se izvršava metodom println(). U ovom slučaju metoda println() ispisuje znakovni niz koji joj je prosle?en. Kasnije ćete videti da se metoda println() može iskoristiti i za prikazivanje drugačijih vrsta podataka. Red počinje sa System.out. Iako ovo ne možemo objasniti u nekoliko reči, ipak navedimo da System predstavlja prethodno definisanu klasu koja obezbe?uje pristupanje sistemu, dok je out tok izlaznih podataka povezan sa ekranom.
Kao što verovatno poga?ate, izlaz na konzolu (kao i unos sa nje) ne koriste se često u stvarnim Java programima i apletima. Pošto savremeno računarsko okruženje najčešće radi sa prozorima i grafikom, unos podataka preko konzole i izlaz podataka na nju uglavnom se koristi za jednostavne uslužne programe i u svrhu isprobavanja rada. Kasnije ćete naučiti kako da podatke prikazujete i na drugi način. Zasad ćemo se držati konzolnog ulaza i izlaza.
Obratite pažnju na to da se naredba println() završava tačkom i zarezom. Sve Javine naredbe se završavaju na takav način. Ako se programski red ne završava tačkom i zarezom, to znači da on, tehnički, ne predstavlja naredbu.
Prvi znak } u programu završava deklaraciju metode main(), a drugi definiciju klase Primer.
Promenljive su možda najznačajniji koncept programskih jezika. Možda znate da se promenljivom (engl. variable) naziva memorijska lokacija kojoj program može da dodeli vrednost. Vrednost promenljive može se menjati tokom izvršavanja programa. Sledeći program prikazuje kako se deklariše promenljiva i kako joj se dodeljuje vrednost. Osim toga, program ilustruje i nov način prikazivanja rezultata na konzoli. Kao što se naglašava u komentaru na početku programa, datoteku sa programom treba da nazovete Primer2.java.
|
Ovu datoteku nazovite "Primer2.java". |
|
broj = 100; // ovim promenljivoj broj dodeljujete vrednost 100 |
Kada izvršite ovaj kratak program, na ekranu ćete ugledati sledeći tekst:
Pogledajmo detaljnije kako je nastao ovakav rezultat. Prvi nov red u programu glasi:
U ovom redu se deklariše celobrojna promenljiva broj. Java (slično drugim jezicima) zahteva da promenljive deklarišete pre upotrebe.
Opšti način deklarisanja promenljive je:
tipPromenljive nazivPromenljive;
Ovde tipPromenljive označava vrstu deklarisane promenljive, a nazivPromenljive njeno ime. Ako želite da deklarišete više od jedne promenljive istog tipa, navedite njihova imena razdvojena zarezima. Java poznaje više vrsta promenljivih, uključujući cele brojeve, znakove i brojeve u pokretnom zarezu. Rezervisana reč int označava da je promenljiva celobrojna.
|
broj = 100; // ovim promenljivoj broj dodeljujete vrednost 100 |
promenljivoj broj dodeljuje se vrednost 100. Operator dodeljivanja u Javi je znak jednakosti.
Sledećom naredbom na ekranu se ispisuje znakovni niz "Ovo je broj:", iza koga sledi vrednost promenljive broj .
U ovoj naredbi znakom plus se vrednost promenljive broj nadovezuje na znakovni niz koji joj prethodi i tako dobijen novi niz ispisuje na ekranu. (U stvari, vrednost broj najpre se pretvara iz broja u svoj znakovni ekvivalent, a zatim se taj znakovni niz povezuje sa znakovnim nizom koji mu prethodi. Kasnije ćemo ovaj postupak detaljnije opisati.) Opisani pristup se može uopštiti. Pomoću operatora + možete da nanižete jedan za drugim koliko god želite elemenata u istoj naredbi println().
U sledećem redu promenljivoj broj se dodeljuje vrednost broj * 2. Slično većini drugih jezika, Java operaciju množenja označava operatorom *. Kada se ovaj red izvrši, promenljiva broj će imati vrednost 200.
Ovde imamo nekoliko novina. Najpre se koristi ugra?ena metoda print() za prikazivanje teksta "Vrednost broj * 2 je ". Iza ovog teksta kursor ne prelazi automatski u nov red. To znači da će sledeći tekst biti prikazan u istom redu na ekranu. Metoda print() radi isto što i metoda println(), osim što ne daje znak za prelazak u nov red. Pogledajmo sada poziv metodi println(). Primetićete da se promenljiva broj koristi po imenu. Na taj način, metode print() i println() mogu se koristiti za prikazivanje tekuće vrednosti bilo kog tipa promenljivih.
Iako ćemo se u poglavlju 5 detaljnije baviti upravljačkim naredbama, dve smo uveli i ovde, da bismo ih koristili za primere u poglavljima 3 i 4. One će pomoći i da prikažemo jedan važan aspekt Jave: blokove naredaba.
Naredba if radi veoma slično kao u bilo kom drugom jeziku. Štaviše, njena sintaksa je ista kao u jezicima C i C++. Evo primera njene najjednostavnije upotrebe:
Ovde uslov označava logički izraz. Ako je uslov tačan, naredba se izvršava. Ako je uslov netačan, naredba se preskače. Evo primera:
U ovom slučaju, ako broj sadrži vrednost koja je manja od 100, logički izraz je tačan (uslov je ispunjen) i izvršiće se naredba println(). Ukoliko broj sadrži vrednost veću od 100 ili jednaku 100, metoda println() se preskače.
U poglavlju 4 ćete videti da u Javi postoji mnogo operatora pore?enja koji se mogu koristiti u logičkim izrazima. Evo nekih od njih:
Obratite pažnju na to da se jednakost proverava pomoću dvostrukog znaka jednakosti.
Evo programa koji ilustruje naredbu if:
Rezultat rada ovog programa je:
Obratite pažnju na još nešto. Red
deklariše dve promenljive, x i y , koristeći više stavki razdvojenih zarezom.
Možda iz sopstvenog iskustva znate da je programska petlja važan deo skoro svakog programskog jezika. U tom pogledu ni Java nije izuzetak. U stvari, kao što ćete videti u poglavlju 5, Java podržava širok izbor programskih petlji. Možda je najdelotvornija petlja for. Ako poznajete C ili C++, obradovaće vas to što petlja for u Javi radi na isti način kao u ova dva jezika. Ako ne poznajete jezike C i C++, ipak ćete lako koristiti petlju for. Evo njene opšte sintakse:
for(inicijalizacija; uslov; korak) naredba;
U svom najčešćem obliku, parametrom inicijalizacija upravljačkoj promenljivoj petlje dodeljujete početnu vrednost. Uslov predstavlja logički izraz koji proverava da li treba izaći iz petlje. Ako je rezultat provere tačan, petlja for obavlja svoj sledeći ciklus. Ukoliko je rezultat netačan, petlja se završava. Izraz korak odre?uje kako se u svakom ciklusu petlje menja upravljačka promenljiva. Evo kratkog programa koji ilustruje upotrebu petlje for:
U ovom primeru x je upravljačka promenljiva petlje. Njena vrednost se na početku postavlja na nulu. Na početku svakog ciklusa petlje (uključujući i prvi), proverava se uslov x<10. Ako je rezultat provere tačan, izvršava se naredba println(), a zatim x uvećava za 1. Ovaj proces se ponavlja sve dok rezultat provere uslova ne postane netačan.
Zanimljivo je da u profesionalno pisanim Java programima gotovo nikada nećete videti korak petlje napisan kao u našem programu. Konkretnije, retko ćete videti sledeću naredbu:
Razlog leži u tome što Java ima specijalan operator za povećavanje vrednosti promenljive koji ovu operaciju obavlja efikasnije. Operator uvećanja je ++. (To jest, dva znaka plus, jedan do drugog.) Operator uvećanja povećava vrednost operanda za jedinicu. Pomoću operatora uvećanja, prethodna naredba se može napisati ovako:
Na taj način, naredba for iz našeg programa obično će biti napisana ovako:
Možete i sami ovo da isprobate. Videćete da će petlja raditi na potpuno isti način.
Java ima i operator umanjenja, --. Ovaj operator smanjuje vrednost operanda za jedinicu.
Java dozvoljava da u vitičastim zagradama grupišete dve ili više naredaba u tzv. blokove naredaba . Kada napravite blok naredaba, on postaje logička celina koja se može koristiti svuda kao jedinstvena naredba. Na primer, blok možete da upotrebite u naredbama if i for. Pogledajte sledeću naredbu if:
Ovde će, ukoliko je x manje od y, biti izvršene obe naredbe koje čine blok. Na taj način dve naredbe unutar bloka sačinjavaju logičku celinu i jedna od njih se ne može izvršiti bez druge. Prema tome, kad god želite da logički povežete dve ili više naredaba, obrazujte od njih blok.
Pogledajmo sledeći primer. U njemu se blok naredaba koristi u petlji for.
Rezultat izvršenja ovog programa biće sledeći:
U ovom slučaju, u petlji se izvršava blok naredaba, a ne samo jedna naredba. Zbog toga će se u svakom ciklusu petlje izvršavati tri naredbe. Ova tvrdnja se, naravno, vidi iz rezultata izvršenja programa.
Kasnije ćete videti da blokovi naredaba imaju i druga svojstva, odnosno namene. Me?utim, glavni razlog njihovog postojanja jeste pravljenje logički nerazdvojivih celina.
Pošto ste videli nekoliko kratkih Java programa, vreme je da preciznije opišemo sastavne elemente jezika Java. Java programi su sastavljeni od praznih mesta, identifikatora, komentara, literala, operatora, separatora i rezervisanih reči. Operatore opisujemo u sledećem poglavlju. Ostali elementi su nabrojani u nastavku.
Java je jezik koji neguje slobodnu formu pisanja. To znači da ne morate da sledite nikakva stroga pravila za uvlačenje redova. Na primer, program Primer možete ceo da napišete u jednom redu ili na bilo koji drugi način koji vam odgovara, ukoliko izme?u stavki koje već nisu razdvojene operatorom ili separatorom ostavite barem jedno prazno mesto. U Javi se pod praznim mestom podrazumeva razmak, razmak načinjen tabulatorom i prelazak u nov red.
Identifikatori se koriste za imena klasa, metoda i promenljivih. Identifikator može da bude bilo kakav opisni znakovni niz sastavljen od velikih i malih slova, brojeva, donje crte i znaka dolara. Identifikator ne sme da počne brojem da ne bi bio pomešan sa numeričkim literalom. Naglasimo opet da Java razlikuje velika i mala slova, tako da identifikator VREDNOST nije isto što i identifikator vrednost. Evo nekoliko ispravno napisanih identifikatora:
Konstantu u Javi pravite navodeći je doslovno. Evo nekoliko literala (doslovnih, neposredno zadatih vrednosti, engl. literal ):
Prvi literal u nizu odre?uje ceo broj, drugi odre?uje broj u pokretnom zarezu, treći je znak, a četvrti je znakovni niz. Literal možete da koristite svuda gde je vrednost njegovog tipa dozvoljena.
Ranije smo pomenuli da u Javi postoje tri vrste komentara. Dve vrste ste već upoznali: jednoredni i višeredni komentar. Osim njih, postoji i dokumentacioni komentar (engl. documentation comment). Ova vrsta komentara, koju objašnjavamo u dodatku A, koristi se za generisanje HTML datoteke u svrhu dokumentovanja programa. Dokumentacioni komentar počinje znacima /**, a završava se znacima */.
U Javi postoji nekoliko znakova koji služe za razdvajanje. Najčešći takav znak je tačka i zarez. Videli ste da on služi za završavanje naredaba. Separatori su prikazani u sledećoj tabeli:
Zasad u Javi postoji 48 rezervisanih reči (tabela 2-1). Uza sintaksu operatora i separatora, one predstavljaju definiciju jezika Java. Ove rezervisane reči ne mogu se koristiti za imena promenljivih, klasa ili metoda.
Tabela 2-1 Rezervisane reči Jave |
|||||
|---|---|---|---|---|---|
Reči const i goto su rezervisane ali se ne koriste. U danima stvaranja Jave rezervisano je i više drugih reči za potencijalnu buduću upotrebu. Me?utim, trenutna specifikacija Jave definiše samo rezervisane reči prikazane u tabeli 2-1.
Osim pomenutih rezervisanih reči, rezervisane su i vrednosti: true, false i null koje su definisane u Javi. Nemojte ove reči koristiti za imena promenljivih, klasa itd.
U jednostavnim programima koje smo prikazali u ovom poglavlju koristili smo Javine ugra?ene metode: print() i println(). Napomenuli smo da su ove metode članovi klase System koja je u Javi unapred definisana i automatski uključena u vaše programe. Gledajući šire, okruženje Jave se oslanja na više ugra?enih biblioteka klasa koje sadrže mnoge metode za podršku ulazno/izlaznim operacijama, radu sa znakovnim nizovima, radu u mreži i sa grafikom. Standardne klase tako?e obezbe?uju podršku za rad sa prozorima. Na taj način Java predstavlja kombinaciju samog jezika Java i standardnih klasa. Uskoro ćete se uveriti da biblioteke klasa obezbe?uju veliki deo funkcionalnosti Jave. Ako zaista želite da budete dobar Java programer, morate da proučite njene standardne klase. U prvom delu ove knjige objašnjavamo razne elemente standardnih biblioteka klasa. U drugom delu knjige detaljno su opisane sve biblioteke klasa.