Professional Documents
Culture Documents
Java 2
Java 2
Java, 2. as
Eclipse
environment (IDE) za brzi razvoj Java programa. Editovanje, kompajliranje, buildovanje, debugg-ovanje i online help su integrisani u jedan GUI.
Eclipse
Eclipse se moe pokrenuti na proizvoljnoj platformi sa Java VM. Moe se download-ovati sa www.eclipse.org Pre instaliranja Eclipse, mora se instalirati JDK http://java.sun.com
Eclipse, perspektiva
Nakon pokretanja, otvara se Workspace Launcher prozor workspace je zapravo direktorijum u koji se smetaju fajlovi naeg projekta Perspektiva sadri editore i poglede (views) U jednom prozoru moe postojati jedna ili vie perspektiva Otvaranje perspektive : Window Open Perspective Java
Eclipse, editori
Na povrini predvienoj za editor moe biti otvoren vei broj editora, a oni se mogu razmestiti tako da se vidi sadraj svakog od njih Sa jednog na drugi otvoreni editor moe se prei npr. pomou preice Ctrl+F6 ili strelicama iz toolbar-a. Window Reset Perspective ureuje layout kao u prvobitnom stanju
Eclipse, pogledi
Odreeni pogled se moe prikazati izborom iz Window Show View menija Perspektivom je odreeno koji pogledi se mogu videti i oni su ponueni u Show View podmeniju
Eclipse
File New Project Java project , Next Ukucati ime projekta u polje Project name Create project in workspace Use project folder as root for sources and class files Finish
U Package Explorer pogledu izabrati projekat U toolbar-u kliknuti na dugme New Java Package ili izabrati New Package iz kontekst menija U polje Name ukucati ime novog paketa Finish
U Package Explorer pogledu izabrati novi paket Kliknuti na dugme New Java Class u toolbar-u Proveriti da se u polju Source Folder nalazi ime projekta i u polju Package ime naeg paketa U polje Name uneti ime klase public static void main(String[] args) Finish Automatski se otvara editor za dodavanje koda nove klase
Na kod se dinamiki kompajlira dok kucamo Crvene vijugave linije u editoru ukazuju na eventualne greke Za pokretanje programa :
sauvamo promene odemo u Package Explorer pogled desnim klikom na klasu projekta koja implementira main() metod (....java) pozivamo kontekst meni izaberemo Run As Java Application
Pokretanje klase iz Package Explorer-a kao Java aplikacije koristi default podeavanja za pokretanje odabrane klase i ne dozvoljava navoenje argumenata komandne linije. Za navoenje ovih argumenata, koristiti padajui meni Run iz toolbar-a i izabrati Run... Otvara se dijalog u kome se izabere tab Arguments i ukucaju argumenti u polje Program arguments (argumente razdvojiti belinama) Run
Eclipse, debugger
Omoguuje postavljanje breakpoint-a i izvravanje programa liniju po liniju. Mogu se pratiti i menjati vrednosti promenljivih kao i posmatrati koji metodi se pozivaju za vreme izvravanja programa Breakpoint se moe postaviti na neku liniju duplim klikom na vertikalni ruler du leve ivice editora, ispred te linije Pojavljuje se puna plava taka na tom mestu
Eclipse, debugger
Debugger se zaustavlja kada doe do breakpoint-a Pokreemo debugger desnim klikom na klasu, a zatim izaberemo Debug As Java Application Pojavljuje se prozor koji nas pita da li da otvori Debug perspektivu. Kliknuti na Yes. Naredna linija koju debugger treba da izvri naznaena je zelenom bojom Kako nastaviti? resume, suspend, terminate, step into, step over, step return, run to line iz Run menija ili toolbar-a
Eclipse, debugger
Vrednosti promenljivih prikazane su u Variables pane Da bismo promenili vrednost promenljive, desnim klikom na nju, pa izborom Change Value otvara se dijalog u kome moemo da unesemo novu vrednost promenljive Kada zavrimo rad sa debugger-om, moemo otvoriti Java perspektivu sa Window Open Perspective Java
Klasa Character
Da bismo mogli da piemo: char symbol='a'; if(isUpperCase(symbol)) isLowerCase(symbol); na poetku treba navesti: import static java.lang.Character.*;
Bez toga, morali bismo da piemo i ime klase ispred imena metoda, npr.
Nizovi
Nizovska promenljiva i niz na koji se ona odnosi su odvojeni entiteti Memorija koja se alocira za nizovsku promenljivu uva referencu na niz, ne sam niz. Sam niz je poseban entitet koji e biti negde drugde u memoriji Nismo u obavezi da kreiramo niz kada deklariemo nizovsku promenljivu. Moemo najpre kreirati nizovsku promenljivu i kasnije u nju smestiti referencu na odreeni niz
int[] niz; int niz[]; Niz tek treba da se definie. Na ovom mestu nije alocirana memorija za sam niz Ova promenljiva je prosto lokacija u memoriji koja moe da uva referencu/pokaziva na niz Za kreiranje samog niza mora se zadati njegov tip i koliko e elemenata sadrati int [] niz; kae da je tip nizovske promenljive int []
Definisanje niza
Nakon to smo deklarisali nizovsku promenljivu, moemo definisati niz na koji e ona referisati:
niz = new int[10]; // Definise niz od 10 integer-a Ova naredba kreira niz koji e sadrati 10
vrednosti tipa int, i smeta referencu na niz u promenljivu niz Mogue je i jednom naredbom deklarisati nizovsku promenljivu i definisati niz tipa int koji e sadrati 10 celih brojeva:
int[] niz = new int[10];
Definisanje niza
Kljuna re new ukazuje na to da se alocira nova memorija za niz, a int[10] odreuje da kapacitet te memorije treba da bude dovoljan za 10 promenljivih tipa int Kada se niz kreira ovako, elementi niza se automatski inicijalizuju na podrazumevane vrednosti, a to su:
0 za numerike vrednosti false za boolean '\u0000' za char null za objekte
Duina niza
to je broj elemenata koje niz sadri length atribut ( a ne metod! ) objekta koji predstavlja niz Npr. niz.length ( za na niz imae vrednost 10 ) Ovaj atribut se moe koristiti za kontrolisanje for petlje koja obrauje elemente niza Ukoliko promenimo broj elemenata niza ovo polje se automatski aurira
Indeks mora biti tipa int ( ukoliko je long mora se izvriti eksplicitno kastovanje u int ) niz[0] - prvi element niza niz Java proverava da li su vrednosti indeksa koje koristimo validne. Ako nisu, izbacuje izuzetak tipa IndexOutOfBoundsException
Nizovska promenljiva
Nizovska promenljiva je odvojena od niza koji referie. Na raznim mestima u programu moemo koristiti nizovsku promenljivu za uvanje referenci na razliite nizove. Npr.
int[] niz = new int[10];
... niz = new int[50]; To je sada novi niz, potpuno odvojen od prethodnog. Prethodni niz od 10 elemenata se odbacuje.
Inicijalizacija nizova
int[] niz={2,3,5,7,11,13,17}; int[] niz=new int[100]; // automatska inicij. na 0 niz[0]=2; niz[1]=3; double[] data = new double[50]; for(int i=0; i<data.length; i++) data[i]=1.0;
Metod fill() definisan u klasi Arrays iz paketa java.util moe se koristiti za inicijalizaciju niza import java.util.Arrays; Arrays.fill(data, 1.0); // popunjava sve elemente niza data jedinicom Prvi argument ime niza koji treba popuniti Drugi argument vrednost Ovaj metod radi za sve vrednosti primitivnih tipova
fill() metod
long[] value = even; Onda nizovske promenljive even i value referiu na isti niz
Obrada nizova
double average = 0.0; double[] uzorci = new double[50]; for(int i=0; i<uzorci.length; i++){ uzorci[i]=100.0*Math.random(); average += uzorci[i]; } average /= uzorci.length;
average /= uzorci.length; Petlja iterira kroz vrednosti svih elemenata tipa double niza uzorci. Promenljivoj value se pridruuje jedna po jedna vrednost elemenata niza
Ovakva for-petlja slui za obradu celog niza Za obradu dela niza i dalje se mora koristiti standardna for-petlja Collection-based for petlja ne obezbeuje pristup elementima u svrhu postavljanja njihovih vrednosti Za promene vrednosti elemenata niza koristi se standardna for-petlja
Nizovi nizova
Primer obrade: for(int i=0; i<temperatura.length; i++) for(int j=0; j<temperatura[i].length; j++)
temperatura[i][j]=(float)(45.0*Math.random()-10.0);
String-ovi
U Javi, stringovi su objekti klase String, koja se nalazi u paketu java.lang String literal je niz karaktera pod dvostrukim navodnicima Ovo je String literal - konstantan objekat klase String String-ovi se interno uvaju kao Unicode karakteri
String promenljiva je promenljiva koja uva referencu na objekat klase String String promenljiva se deklarie na isti nain kao i promenljive primitivnih tipova. Takoe, moe se inicijalizovati pri deklarisanju, to je generalno dobra ideja. String mojString = Moj string; mojString = Drugi string; Sam String objekat je razliit od promenljive koju koristimo da na njega referiemo
String
String objekti su nepromenljivi. To znai da se ne moe menjati string koga taj objekat predstavlja. String string; // deklaracija, bez inicijalizacije Ukoliko program pokua da koristi promenljivu koja nije inicijalizovana, dobiemo greku pri kompajliranju String string = null; // String promenljiva koja // ne referise na string
Nizovi String-ova
String[] imena=new String[5]; String[] boje={crvena,zuta,plava};
Konkatenacija ( operator + ) kao rezultat se generie potpuno nov String objekat, razliit od String objekata koji su operandi Operator + se takoe koristi i za sabiranje, ali ako je bar jedan od operanada String objekat ili String literal, kompajler e interpretirati operaciju kao konkatenaciju stringova i konvertovae objekat koji nije String objekat u String
Stringovi operacije
Ako npr. String promenljiva koja se koristi kao 1 od operanada za + sadri null , ona se automatski konvertuje u string null Moe se koristiti i operator += // kombinovanje stringa i integer-a mojString = pedeset pet je + 5 + 5 ; System.out.println(mojString); // pedeset pet je 55
String-ovi
// kombinovanje integer-a i stringa mojString = 5 + 5 + je deset; System.out.println(mojString); // 10 je deset ZATO? Asocijativnost + je sleva nadesno i to je razlog to je 5+5 55 u prvom primeru, a 10 u drugom
toString()
Konverzija primitivnih tipova u tip String zapravo se vri korienjem statikog metoda toString() standardne klase koja odgovara tom primitivnom tipu Svaki od primitivnih tipova ima definisanu ekvivalentnu, tzv. wrapper, klasu: byte Byte, short Short, int Integer, long Long, float Float, double Double, boolean Boolean, char Character
toString()
Kadgod se vrednost nekog od primitivnih tipova pojavi kao operand za +, a drugi operand je String objekat, kompajler prosleuje vrednost primitivnog tipa metodu toString() definisanom u odgovarajuoj wrapper klasi. Metod toString() vraa String ekvivalentan vrednosti. Sve se to deava automatski pri konkatenaciji stringova operatorom +.
valueOf()
Metod klase String Kreira String objekat od vrednosti proizvoljnog primitivnog tipa String doubleString = String.valueOf(3.14159); valueOf() je statiki metod klase String Zato se poziva sa String.valueOf() Kao argument moe primiti literal ili promenljivu proizvoljnog primitivnog tipa
Poreenje stringova
String promenljiva i string koji ona referie se razlikuju Izraz string1 == string2 ne poredi same stringove, ve reference na stringove Za takvo poreenje, moe se koristiti metod equals(), koji je definisan za objekte tipa String Npr. string1.equals(string2) equals() vri case-sensitive poreenje Postoji i equalsIgnoreCase() metod
Stringovi, operacije
Metodima startsWith() / endsWith() koji kao argument primaju String, moemo izvriti casesensitive proveru da li string poinje / zavrava se stringom koji je dat kao argument metoda. String string1 = Ovo je string; string1.startsWith(Ovo) // true string1.endsWith(string) // true
compareTo(String)
Analogon strcmp() iz C-a Poredi objekat String za koji je pozvan, sa String argumentom koji mu prosleujemo i vraa int koji je negativan, ako je String objekat manji od argumenta, 0 ako su jednaki, a pozitivan inae. Zapravo, vri se poreenje Unicode reprezentacija odgovarajuih karaktera stringova
String-ovi, operacije
charAt() - prima int argument, indeks traenog karaktera. Ukoliko pokuamo da koristimo indeks manji od 0 ili vei od indeksa poslednjeg karaktera stringa, bie izbaen izuzetak tipa StringIndexOutOfBoundsException Za odreivanje duine stringa poziva se metod length() nad String objektom. Primetimo da se kod nizova pristupa atributu length.
Konvertovanje
toLowerCase(), toUpperCase() konvertuju String u mala, odnosno velika slova i vraaju referencu na konvertovani String text = text.toLowerCase();
Pretraga Stringova
indexOf(), lastIndexOf() metodi Postoji nekoliko verzija ovih metoda koje omoguuju traenje pojedinanog karaktera ili podstringa koji se zadaje kao (prvi) argument indexOf() trai od poetka stringa, unapred, dok lastIndexOf() trai unatrag, poev od kraja stringa Vraaju odgovarajui indeks, ako je traenje uspelo, a -1 inae
Pretraga Stringa
Postoji varijacija prethodna 2 metoda koja ima i drugi argument. Njime se odreuje pozicija od koje treba poeti pretraivanje Ako se kao drugi argument prosledi negativna vrednost, metod indexOf() pretrauje ceo string, od poetka Vano je proveriti da li je vraena vrednost indeksa -1 pre njegovog korienja za indeksiranje Stringa!
indexOf(int ch) indexOf(int ch, int index) indexOf(String str) indexOf(String str, int index) I analogno za metod lastIndexOf() Metod startsWith() takoe ima verziju sa drugim argumentom, koji predstavlja poziciju od koje poinje potraga za datom sekvencom karaktera
Izdvajanje podstringova
Prva izdvaja podstring koji se sastoji od svih karaktera poev od datog indeksa, pa do kraja stringa
String place = Palm Springs;
Druga omoguuje da izdvojimo podstring zadavanjem indeksa prvog karaktera podstringa i prvog karaktera iza poslednjeg karaktera podstringa
String segment = place.substring(7,11); // ring
Metod replace() koristi se za zamenu odreenog karaktera drugim kroz string. Prima dva argumenta:
Metod toCharArray() Kreira niz tipa char i vraa referencu na njega String text = To be or not to be ; char[] textArray = text.toCharArray(); Mogue je izdvojiti i podstring kao niz karaktera metodom getChars(). Potrebno je kreirati dovoljno veliki niz u koji e se upisati rezultat i on se prosleuje kao jedan od argumenata metoda. Metod zahteva 4 argumenta
Statiki metod copyValueOf() klase String Kreira String objekat od niza tipa char[] Char[] textArray = { 'T', 'o', ' ', 'b', 'e' }; String text = String.copyValueOf(textArray); String text = new String(textArray); // poziv konstruktora U Javi stringovi se ne zavravaju sa '\0'!
Druga verzija metoda copyValueOf() moe kreirati podstring od podskupa elemenata niza. Ona zahteva 2 dodatna argumenta za odreivanje indeksa prvog karaktera niza koji se izdvaja i broj karaktera koji se izdvaja String text = String.copyValueOf(textArray,9,3); Postoji i konstruktor klase String koji radi isto: String text = String(textArray,9,3);
String objekti se ne mogu menjati Java ima jo dve klase koje enkapsuliraju stringove: StringBuffer i StringBuilder Objekti obe ove klase mogu se direktno menjati Obe klase omoguuju iste operacije, ali StringBuffer objekti su bezbedni za korienje od strane veeg broja niti, a StringBuilder nisu Niti su nezavisni izvrni procesi unutar programa koji se mogu konkurentno izvravati
String,StringBuffer,StringBuilder?
Ako smo sigurni da e naim promenljivim stringovima pristupati samo jedna nit, treba da koristimo StringBuilder objekte jer e operacije nad njima biti bre nego nad StringBuffer objektima StringBuffer i StringBuilder objekte treba koristiti kada se stringovi esto transformiu dopisuju, briu ili menjaju podstringovi stringa. Ako uglavnom imamo statike stringove koje tu i tamo treba da nadoveemo, String objekti su najbolji izbor
StringBuffer objekat sadri blok memorije, tzv. bafer koji moe, a ne mora, sadrati string, a ako ga sadri, string ne mora zauzimati ceo bafer. Tako, duina stringa u StringBuffer objektu moe biti razliita od duine odgovarajueg bafera Duina bafera je tzv. kapacitet StringBuffer objekta Metod length() odreuje duinu stringa koji je sadran u objektu
Kada kreiramo StringBuffer objekat od postojeeg stringa, kapacitet e biti duina stringa + 16 I kapacitet i duina su izraeni u Unicode karakterima ( => 2 bajta) Kapacitet StringBuffer objekta nije fiksiran. On se automatski menja da bi se prilagodio stringu proizvoljne duine. Takoe, moe se zadati inicijalno kapacitet pri kreiranju objekta.
Metod ensureCapacity() omoguuje da promenimo default kapacitet objekta. Minimalni kapacitet koji nam je potreban zadajemo kao argument metoda aString.ensureCapacity(40); /* ako je trenutni kapacitet objekta aString manji od 40, alocirae se novi, vei bafer, ali ne nuno kapaciteta 40. Kapacitet e biti vei od: argumenta metoda u ovom sluaju 40 i (2 puta trenutni kapacitet + 2)
Metod setLength() Kada uveamo duinu objekta, dopisuju se '\u0000' karakteri na postojei string Uobiajenije je smanjenje duine, u kom sluaju se vri odsecanje stringa. Karakteri koji se odseku sa kraja stringa ovom operacijom bivaju izgubljeni. Ako se ponovo povea duina na prethodnu, novi karakteri bie '\u0000'
Duina je svojstvo stringa kojeg objekat sadri, dok je kapacitet svojstvo bafera Metod setLength() ne utie na kapacitet objekta osim ako se duina postavi na veu od kapaciteta. U tom sluaju, kapacitet e se poveati tako da se prilagodi novoj duini stringa Ako se zada negativna duina, bie izbaen izuzetak tipa StringIndexOutOfBoundsException
Metod append() omoguuje dodavanje stringa na kraj postojeeg stringa smetenog u StringBuffer objektu StringBuffer aString = new StringBuffer(prvi); aString.append( drugi); // prvi drugi Duina stringa se uveava za duinu stringa koji smo dodali StringBuffer bString = aString.append( drugi); // sada u aString i bString pokazuju na isti objekat
Operator '.' koji koristimo za izvravanje odreenog metoda na objektu, asocijativan je sleva nadesno U jednoj naredbi mogue je pisati vie operacija append StringBuffer string = new StringBuffer(); string.append(Prvi).append( drugi);
Dopisivanje podstringa
Druga verzija metoda append() dodaje deo String objekta StringBuffer objektu. Jo 2 argumenta:
indeks prvog karaktera String objekta koji e se nadovezati ukupan broj karaktera koji e biti nadovezani
StringBuffer buf = new StringBuffer(Hard); String aString = Waxworks; buf.append(aString,3,4); // Hard work
Nadovezivanje
Jo jedna verzija omoguuje nadovezivanje podskupa elemenata niza tipa char 2 dodatna argumenta:
Indeks prvog elementa koji se nadovezuje Ukupan broj elemenata koji se nadovezuju
1 argument string koji traimo, a metod vraa indeks poslednje pojave stringa ili -1 ako string nije pronaen ( indeksiranje kree od 0 ) Jo jedan argument indeks u baferu odakle treba da pone pretraivanje
Metod replace() Menja uzastopni niz karaktera datim stringom String kojim zamenjujemo moe sadrati vie karaktera od stringa koji se menja 3 argumenta:
Prva 2 tipa int: poetni indeks u baferu i 1 iza kraja podstringa koji treba zameniti Trei: tipa String i to je string koji treba ubaciti
Primer
StringBuffer phrase = new StringBuffer(one two three four); String substring = two; String replacement = twenty; int position = phrase.lastIndexOf(substring); phrase.replace(position, position+substring.length(), replacement); // za dobijanje vrednosti indeksa karaktera koji je neposredno iza // poslednjeg karaktera podstringa, samo dodamo duinu podstringa // na indeks njegovog poetka
Umetanje String-ova
Metod insert() Prvi argument odreuje indeks u objektu gde treba umetnuti prvi karakter Mnoge verzije insert() metoda prihvataju drugi argument nekog od tipova koje prihvata i metod append() U svakom sluaju, string ekvivalentan drugom argumentu umee se poev od indeksa datog prvim argumentom
charAt() i getChars()
rade na isti nain kao istoimeni metodi klase String setCharAt() - ovim metodom moe se promeniti pojedinani karakter StringBuffer objekta
2 argumenta: indeks karaktera koji se menja i kojim karakterom se menja deleteCharAt() - brisanje pojedinanog karaktera
objekta sa pozicije date argumentom delete() - brisanje nekoliko karaktera ( indeks prvog karaktera koji se brie, indeks karaktera neposredno iza poslednjeg koji se brie )
reverse() i toString()
reverse() - obre sekvencu karaktera u StringBuffer objektu toString() - kreira novi String objekat i inicijalizuje ga stringom sadranim u StringBuffer objektu Kompajler intenzivno koristi toString() i append() metode da bi implementirao konkatenaciju String objekata
Primer
String saying = Many + hands + make ; kompajler to implementira ovako: String saying = new StringBuffer().append(Many).append( hands).append( make).toString();