Kreiranje novog objekta
Do sada ste u okviru ovog kursa radili sa promenljivima čiji je tip bio jedan od primitivnih tipova. Međutim, promenljive mogu da čuvaju i objekte. U tom slučaju, njihova inicijalizacija (početna dodela vrednosti) je nešto drugačija. Za sada ćete naučiti kako da koristite već definisane klase, dok će kreiranje novih klasa biti objašnjeno kasnije.
Kreiranje novog objekta vrši se pomoću operatora new na sledeći način:
String str = new String();
Random r= new Random();
Date datum = new Date (2007, 0, 1, 7, 30);
Dakle, naredba deklaracije sadrži prvo ime klase (tip), zatim ime promenljive koja će čuvati objekat, operator new i tzv. konstruktor klase, metod koji ima isto ime kao i sama klasa. Konstruktor je metod koji je definisan unutar definicije same klase, a pomoću koga se kreira objekat. On može biti bez ili sa određenim brojem argumenata. Prilikom njegovog pozivanja (kreiranja objekta) treba voditi računa o značenju ovih argumenata i njihovom broju, kako ne bi došlo do greške prilikom kompajliranja.
Jedna klasa može da ima više konstruktora, pa su tako moguće sledeće naredbe:
Date datum = new Date (); // trenutni datum i vreme
Date datum = new Date (2007, 0, 1, 7, 30); // 01.01.2007. 7:30
Date datum = new Date ("January 1 2007 7:30 AM"); // 01.01.2007. 7:30
Kao što vidite u primeru, moguće je kreirati objekat datum na nekoliko načina, tj. pomoću nekoliko konstruktora klase Date. Druga deklaracija koristi konstruktor koji ima pet argumenata koji predstavljaju godinu, mesec, dan, sate i minute. Treća deklaracija koristi konstruktor koji ima samo jedan argument, datum zapisan u prepoznatljivom formatu kao niska karaktera.
Dakle, da biste kreirali jedan objekat, neophodno je da koristite ključnu reč new i konstruktor klase čiji objekat kreirate. Jedina klasa čiji je objekat moguće kreirati bez upotrebe ključne reči new je klasa String.
Upravljanje memorijom
Upravljanje memorijom u Javi je dinamičko i automatsko. Kada kreirate novi objekat, Java mu automatski dodeljuje potrebnu količinu memorije za njegovo čuvanje.
Prilikom završetka rada sa objektom, nije potrebno nikakvo eksplicitno oslabađanje memorijskog prostora koji je taj objekat zauzimao. Java ima tzv. "garbage collector" koji upravlja memorijom iskorišćenih objekata. Garbage collector je poseban alat za pretraživanje ugrađen u Java okruženje koji traži objekte koji se više ne koriste u programu. Ukoliko ih nađe, on automatski uklanja te objekte i oslobađa memoriju.
Pristup metodama i atributima objekta
Kada je objekat kreiran, potreban nam je način da radimo sa njim, da mu dodeljujemo ili pročitamo određene osobine, da koristimo njegove metode i sl.
Pristup atributima i metodama objekta se vrši pomoću tzv. "tačka" ili "dot" notacije. Sa dot notacijom ste se već susreli u prethodnim lekcijama (System.out.println()).
Pogledajte sledeći primer:
1: import java.util.*; |
Klasa KojiJeDanasDan ispisuje poruku tipa "Danas je 8. dan 11. meseca 2006. godine". U liniji 5 kreiran je nov objekat datum klase Date. Korišćen je konstruktor bez argumenata, koji vraća objekat koji predstavlja trenutni datum i vreme. U linijama 6, 7 i 8 korišćeni su metodi getDate(), getMonth() i getYear() klase Date da bismo dobili pojedinačne vrednosti ovih atributa objekta datum. Linija 9 i 10 ispisuje poruku.
Ovde treba napomenuti sledeće. U klasi Date vrednost meseca je u rasponu od 0 do 11. Tako je mesec novembar predstavljen brojem 10, pa se zato u poruci ispisuje mesec + 1. Takođe godine su numerisane počevši od 1900. godine. Na primer, 1995. godina je predstavljena brojem 95. Zbog toga se u poruci koristi izraz godina + 1900.
Na sličan način je moguće i promeniti vrednost nekog atributa. Pogledajte sledeći primer koda. U njemu se koristi klasa Point paketa java.awt.
1: import java.awt.Point; |
Linija 4 prvo kreira objekat (instanca) klase Point sa koordinatama (10,10). Linije 5 i 6 čitaju vrednosti koordinata i ispisuju ih, dok linije 8 i 10 postavljaju nove vrednosti koordinata.
Kod promene vrednosti atributa treba biti pažljiv. Naime, kako će biti objašnjeno kasnije, postoje klasne i objektne (instancne) promenljive. Objektne promenljive čuvaju vrednost za jedan određeni objekat i njihova promena ne utiče na ostale objekte te klase. Klasne promenljive čuvaju vrednosti za čitavu klasu i njihova promena rezultuje promenom vrednosti određenog atributa za sve objekte te klase.
Prilikom poziva metoda, u zavisnosti kako je metod definisan, nekad će biti potrebno proslediti mu i argumente.
mojObjekat.prviMetod(arg1, arg2, arg3);
Argumenti se nalaze unutar zagrada i razdvajaju se zarezom. Poziv metoda mora da sadrži zagrade, čak iako nema argumenata (getDate()).
Atribut jednog objekta može biti neki drugi objekti, a takođe i jedan metod koji, po izvršavanju, kao rezultat može da vrati neki objekat. Ovi rezultujući objekti imaju svoje atribute i metode. Tada je moguće njihovo povezivanje pomoću dot notacije. Primer za to, sa kojim se često susrećemo, je naredba
System.out.println()
System klasa sadrži metode koje opisuju sam sistem. System.out je klasna promenljiva koja sadrži instancu klase PrintScreen koja ukazuje na standardni izlaz sistema. PrintScreen objekat ima println() metod koji ispisuje neku nisku na standardni izlaz.
Reference na objekat
Kada se dodeljuje objekat nekoj promenljivoj, ili kada se objekat prosleđuje kao argument nekog metoda, ono što se zaista prosleđuje jeste referenca na taj objekat, a ne on sam ili njegova kopija. Pogledajte sledeći primer:
1: import java.awt.Point; |
Peta linija deklariše dve promenljive tipa Point. Zatim se kreira jedan objekat (tacka1) sa koordinatama (100,100). U sedmoj liniji, naredbom tacka2 = tacka1 vrednost promenljive se dodeljuje promenljivoj tacka2. U stvari, ova naredba samo prosleđuje referencu do objekta tacka1, a ne ceo objekat (slično kao pokazivači u C-u). Promena koordinata promenljive tacka1 zato dovodi i do promene koordinata promenljive tacka2.
Konverzija primitivnih tipova i objekata
U Javi je moguće vrednost jednog tipa konvertovati u vrednost nekog drugog tipa. Rezultat ove konverzije je stvaranje nove vrednosti i objekta. Originalna vrednost ili objekat ostaju nepromenjeni.
Konvertovanje primitivnih tipova
Konvertovanje primitivnih tipova obično se odnosi na numeričke vrednosti. Vrednosti tipa boolean ne mogu da se konvertuju ni u jedan drugi primitivni tip.
Konvertovanje ima sledeću sintaksu
(typename) vrednost
Ukoliko konvertujete niži tip u viši (na primer, int u long), nije neophodno da to uradite eksplicitno. Promenljivoj tipa long možete da dodelite vrednost tipa int bez eksplicitnog konvertovanja. Međutim ukoliko konvertujete viši tip u niži, tada je neophodno korišćenje prethodne naredbe.
Konvertovanje objekata
Objekti jedne klase mogu biti konvertovani u objekte druge klase, ali sa jednim ograničenjem. Objekat možete da konvertujete samo u objekat njegove podklase ili nadklase, a ne u neku proizvoljnu (o podklasama i nadklasama biće reči kasnije). Slično kao i kod primitivnih tipova, i ovde nije neophodno da konvertujete objekat podklase u njegovu nadklasu.
Eksplicitno konvertovanje postiže se sledećom naredbom:
(imeklase) objekat
Konvertovanje primitivnih tipova u objekte i obrnuto
Primitivni tipovi i objekti su potpuno različiti u Javi i ne mogu biti konvertovani jedni u druge. Ipak, java.lang paket sadrži nekoliko specijalnih klasa koje odgovaraju primitivnim tipovima. Tako postoji klasa Integer koja odgovara primitivnom tipu int, Float za primitivni tip float, Boolean za boolean itd. Primetite da imena klase imaju veliko početno slovo.
Pomoću metoda koje definišu ove klase, moguće je kreirati objekte za vrednosti odgovarajućeg primitivnog tipa. Na primer:
Integer intObjekat = new Integer(24);
Ova naredba pravi objekat za celobrojnu vrednost "24". Moguće je i obrnuto, da od objekta klase Integer dobijemo vrednost tipa int. Ovo se postiže upotrebom metoda intValue() klase Integer. Na primer:
int ceoBroj = intObjekat.intValue();
Poređenje objekata
Poređenje objekata nije moguće pomoću standarnih oparatora poređenja (<, <=, > itd). Izuzetak su operatori == i !=. Međutim, rezultat ovakvog poređenja možda nije ono što biste očekivali. Operator == poredi da li operandi ukazuju na isto mesto u memoriji, a ne da li su objekti međusobno jednaki. Ovo drugo se postiže pozivanjem metoda definisanih unutar samih klasa koji vrše ovakva poređenja. Pogledajte sledeći primer:
1: class TestJednakosti { |
Pokrenite ovaj program i pogledajte rezultat. Linija 13 koristi operator == da uporedi da li su ova dva objekta ista, dok linija 14 koristi metod equals() klase String da uporedi da li je sadržaj dva objekta isti.
Određivanje klase objekta
Ukoliko je potrebno da u određenom trenutku odredite kojoj klasi pripada neki objekat obj, koristite sledeću sintaksu:
String ime = obj.getClass().getName();
Takođe, možete da koristite operator instanceof operator da utvrdite da li neki objekat pripada određenoj klasi. Na primer:
"Java" instanceof String // true
Point pt = new Point(10, 10);
pt instanceof String // false