Professional Documents
Culture Documents
4 - Predavanje - Paketi - Standardne Klase - Omotaci Prostih Tipova - Nabrojivi Tip
4 - Predavanje - Paketi - Standardne Klase - Omotaci Prostih Tipova - Nabrojivi Tip
2017
Objektno orijentisano projektovanje
Sadržaj
Paketi ....................................................................................................................................................... 3
Ugrađene klase ........................................................................................................................................ 5
Klasa String .......................................................................................................................................... 6
Klasa StringBuffer ................................................................................................................................ 8
Klasa Random .................................................................................................................................... 10
Klasa Math ......................................................................................................................................... 11
Klasa System ...................................................................................................................................... 13
Klasa Scanner..................................................................................................................................... 13
Omotači prostih tipova.......................................................................................................................... 14
Klasa Character .................................................................................................................................. 14
Klasa Boolean .................................................................................................................................... 15
Omotači numeričkih tipova ............................................................................................................... 15
Automatsko pakovanje i raspakivanje............................................................................................... 15
Nabrojivi tipovi ...................................................................................................................................... 16
Literatura: .............................................................................................................................................. 18
2
Objektno orijentisano projektovanje
Paketi
Paketi u Javi služe da se klase organizuju u grupe i da se razreši konflikt oko
imenovanja klasa. Paketi su po svojoj strukturi vrlo slični folderima:
Definisanje paketa se izvršava tako što se kao prva naredba Javine izvorne datoteke
stavi službena reč package iz koje treba da sledi naziv paketa:
package imePaketa;.
U jednom paketu može biti definisan proizvoljan broj klasa i sve one bi po pravilu
trebale da budu u posebnom fajlu ali u okviru jednog foldera (koji se isto zove kao i paket).
Ukoliko treba da se definiše potpaket, tada on mora da se nađe (organizuje) u podfolderu
(koji nosi isto ime kao i potpaket) (slika 1). Na taj način može da se ide proizvoljno u dubinu
sa sa definicijom podnivoa paketa.
3
Objektno orijentisano projektovanje
onome što je označeno kao public može se pristupiti direktno iz bilo koje tačke
programa,
ono što je označeno kao private nevidljivo je izvan svoje klase,
kada za član nije naznačen specifikator pristupa onda je član vidljiv i za klase i za
potklase istog paketa -to je podrazumevani nivo pristupa,
ako je član označen kao protected onda će biti vidljiv i izvan svog paketa ali samo
direktnim potklasama.
Sama klasa može da ima samo dva nivoa pristupa: podrazumevani (kada se ne
naglasi) i public. Ako ima podrazumevani onda može da je dostupna samo u okviru istog
paketa, a ako ima public onda može da joj pristupi bilo ko.
javaaplikacija1.javaaplikacija11.Potklasa pdk;
pdk=new javaaplikacija1.javaaplikacija11.Potklasa();
4
Objektno orijentisano projektovanje
Bilo bi nepraktično kada bi se ovaj način koristio svaki put kada je potrebno da se
upotrebi klasa. Zbog toga je uvedena mogućnost da se klasa uveze. I više, može da se uveze i
ceo paket. Da bi se uvezla klasa ili paket koristi se službena reč import:
import paket1[[.paket2]...].imeklase|*;
Ukoliko umesto imena klase stoji * onda će biti uvezen ceo paket. Na primer:
Sa
import java.util.Date
uvozi se klasa Date koja se nalazi u potpaketu util paketa java. Nakon toga,
klasa Date može da se koristi samo navođenjem njenog imena
Date datum=new Date();
Sa
Import java.io.*;
Uvozi se kompletan paket java.io i sve klase definisane u tom paketu mogu da
se koriste samo navođenjem njenog imena.
Situacija kada se uvezu dva različita paketa u okviru kojih postoji klase sa istim
imenom se razrešava navođenjem punog imena klase mada se prevodilac neće buniti sve
dok se ne pozove takva klasa.
Ugrađene klase
Biblioteka klasa je kolekcija klasa koje mogu da se koriste prilikom razvoja programa.
Standardna Javina biblioteka klasa je deo Javinog razvojnog okruženja. Sve standardne
Javine klase čuvaju se u jednom od više imenovanih potpaketa (u neimenovanom
podrazumevanom paketu ih nema) paketa java. Klase su grupisane po funkciji mada
postoje i preklapanje nekih paketa. Klase koje se najčešće koriste (String, Scanner, ArrayList,
Math,...) treba da se znaju po imenu a one koje se ređe koriste treba da se znati kako da se
lociraju (u kom paketu da se traže). Prilikom rada sa ugrađenom klasom treba znati njen
interfejs (imena i opisi javnih polja, konstruktora i metoda, tipovi povratnih vrednosti i
parametara konstruktora i metoda) ali ne i implementaciju. Interfejs svih klasa u nekoj
biblioteci klasa čini API (Application Programming Interface).
5
Objektno orijentisano projektovanje
Klasa String
Ovo je sintaksa koja važi samo za stringove .Treba naglasiti da svaki literal između znaka
navoda predstavlja objekat tipa String. Elementi stringa su tipa char – svaki karakter
oivičen apostrofima. Kada se jednom napravi objekat klase String on više ne može da se
menja. Međutim, to ne predstavlja nikakvo ograničenje jer i dalje, na tako napravljeni
objekat, mogu da se primene sve operacije namenjene znakovnim nizovima samo što,
ukoliko dođe do bilo kakve promene, stvara se novi objekat tipa String koji sadrži tu
promenu.
1: package klasastring;
2: public class KlasaString {
3: public static void main(String[] args) {
4: String string="Java";
5: String string1=new String();
6: System.out.println("Prvi string: "+string1);
7: System.out.println("--------------------------------------");
8: String string2=new String(string);
9: System.out.println("Drugi string: "+string2);
10: System.out.println("--------------------------------------");
11: char niz[]={'K','l','a','s','a',' ','S','t','r','i','n','g'};
12: String string3=new String(niz);
13: System.out.println("Treci string: "+string3);
14: System.out.println("--------------------------------------");
15: String string4=new String(niz,4,5);
16: System.out.println("Četvrti string: "+string4);
17: System.out.println("--------------------------------------");
18: byte ascii[]={65,66,67,68,69};
19: String string5=new String(ascii);
20: System.out.println("Četvrti string: "+string5);
21: }
22: }
6
Objektno orijentisano projektovanje
run:
Prvi string:
--------------------------------------
Drugi string: Java
--------------------------------------
Treci string: Klasa String
--------------------------------------
Četvrti string: a Str
--------------------------------------
Četvrti string: ABCDE
--------------------------------------
BUILD SUCCESSFUL (total time: 1 second)
Slika 2: Primer upotrebe konstruktora u klasi String
Neke od metoda ponuđenih u klasi String su prikazane kroz primer koji se nalazi na
slici 3.
1: package klasastring;
2: public class KlasaString {
3: public static void main(String[] args) {
4: String s1="Volim",s2="PROGRAMIRAM",s3=" ";
5: String recenica=s1+s3+"da"+s3+s2+'.';
6: String konverzija="Sada je "+1+2.0+" sati";
7: System.out.println(recenica);
8: System.out.println(konverzija);
9: System.out.println("--------------------------------------")
10: System.out.println(recenica.toLowerCase());
11: System.out.println(recenica.length());
12: System.out.println(recenica.substring(9));
13: System.out.println(recenica.substring(5,8));
14: System.out.println("--------------------------------------");
15: String pomstring="Volim da ";
16: String velikaslova=pomstring.concat("programiram.").toUpperCase();
17: System.out.println(velikaslova);
18: System.out.println("--------------------------------------");
19: if(velikaslova.equals(recenica)) System.out.println("Stringovi "+recenica+ " i "+velikaslova+"
20: su isti.");
21: else System.out.println("Stringovi "+recenica+ " i "+velikaslova+" nisu isti.");
22: if(velikaslova.equalsIgnoreCase(recenica)) System.out.println("Stringovi "+recenica+ " i " +
23: velikaslova +" su isti.");
24: else System.out.println("Stringovi "+recenica+ " i "+velikaslova+" nisu isti.");
25: System.out.println("--------------------------------------");
7
Objektno orijentisano projektovanje
Klasa StringBuffer
8
Objektno orijentisano projektovanje
znak ili niz znakova i objekat će se automatski proširiti. Konstruktori klase StringBuffer
su sledećeg oblika:
StringBuffer()
StringBuffer(int veličina)
StringBuffer(String niz)
StringBuffer (CharSequence znakovi)
1: package klasastringbuffer;
2: public class KlasaStringBuffer {
3: public static void main(String[] args) {
4: StringBuffer string=new StringBuffer();
5: System.out.println("String napravljen pomoću konstruktora StringBuffer() je:");
6: System.out.println(string);
7: System.out.println("Njegova dužina je:"+string.length());
8: System.out.println("Njegov kapacitet je:"+string.capacity());
9: System.out.println("-------------------------------------");
10: StringBuffer string1=new StringBuffer("Zdravo");
11: System.out.println("String napravljen pomoću konstruktora StringBuffer(String niz) je:");
12: System.out.println(string1);
13: System.out.println("Njegova dužina je:"+string1.length());
14: System.out.println("Njegov kapacitet je:"+string1.capacity());
15: System.out.println("-------------------------------------");
16: char niz[]={'A','n','a','l','i','z','a',' ','m','r','e','ž','a'};
17: String pom=new String(niz);
18: StringBuffer string2=new StringBuffer(pom.subSequence(5, 11));
19: System.out.println("String napravljen pomoću konstruktora StringBuffer(CharSequence
20: znakovi) je:");
21: System.out.println(string2);
22: System.out.println("Njegova dužina je:"+string2.length());
23: System.out.println("Njegov kapacitet je:"+string2.capacity());
24: System.out.println("-------------------------------------");
25: string2.append("ža");
26: System.out.println(string2);
27: string2.insert(2, "Računarska");
28: System.out.println(string2);
29: string2.delete(0, 2);
30: System.out.println(string2);
31: string2.replace(0,10,"Društvena");
32: System.out.println(string2);
33: string2.reverse();
34: System.out.println(string2);
35: }
9
Objektno orijentisano projektovanje
36: }
run:
String napravljen pomoću konstruktora StringBuffer() je:
Metode koje su korišćene služe za prikazivanje dužine stringa (redovi 7:, 13: i 22:),
kapacitet stringa (veličina rezervisanog prostora za string) (redovi 8:, 14: i 23:), dopisivanje
sadržaja na kraj stringa (red 25:), umetanje sadržaja u string (red 27:), izbacivanje dela
sadržaja iz stringa (red 29:), zamena dela sadržaja drugim nizom znakova (red 31:) i
izokretanje redosleda znakova u stringu (red 33:).
Klasa Random
Random()
Random(long seme)
U prvom slučaju generator brojeva kao seme uzima tekuće vreme a u drugom slučaju
korisnik sam zadaje klicu. Metode klase Random date su u tabeli 2 a program sa nekim
primerima upotrebe klase Random dat je na slici 5.
10
Objektno orijentisano projektovanje
Metoda Opis
double nextDouble() vraća sledeći slučajan broj tipa double
float nextFloat() vraća sledeći slučajan broj tipa float
double nextGaussian() vraća sledeči normalno raspodeljeni slučajni broj
int nextInt() vraća sledeći slučajan broj tipa int
int nextInt(int n) vraća sledeći slučajan broj tipa int u intervalu od 0 do n-1
long nextLong() vraća sledeći slučajan broj tipa long
void setSeed(long novoseme) zadaje novo seme
1: package slucajnibrojevi;
2: import java.util.Random;
3: public class SlucajniBrojevi {
4: public static void main(String[] args) {
5: Random slucajan=new Random();
6: boolean slbool=slucajan.nextBoolean();
7: System.out.println("Slucajni boolean: "+slbool);
8: int slucajniint=slucajan.nextInt();
9: System.out.println("Slucajni int: "+slucajniint);
10: slucajniint=slucajan.nextInt(20)+1;
11: System.out.println("Slucajni int u intervalu od 1 do 20: "+slucajniint);
12: double sldouble=slucajan.nextDouble();
13: System.out.println("Slucajni double: "+sldouble);
14: byte niz[]=new byte [10];
15: slucajan.nextBytes(niz);
16: for(byte x:niz) System.out.print (x+" ");
17: System.out.println();
18: }
19: }
run:
Slucajni boolean: true
Slucajni int: -497401823
Slucajni int u intervalu od 1 do 20: 17
Slucajni double: 0.6639042337907692
26 65 -66 -16 -125 -74 56 117 -32 -67
BUILD SUCCESSFUL (total time: 1 second)
Slika 5: Program SlucajniBrojevi.java i rezultat izvršenja
Klasa Math
metoda opis
static double sin(double arg) vraća sinus ugla arg zadatog u radijanima
static double cos(double arg) vraća kosinus ugla arg zadatog u radijanima
11
Objektno orijentisano projektovanje
metoda opis
static double tan(double arg) vraća tangens ugla arg zadatog u radijanima
static double asin(double arg) vraća ugao u radijanima čiji je sinus arg
static double acos(double arg) vraća ugao u radijanima čiji je kosinus arg
static double atan(double arg) vraća ugao u radijanima čiji je tangens arg
static double atan2(double x,double y) vraća ugao u radijanima čiji je tangens x/y
static double sinh(double arg) vraća hiperbolički sinus ugla arg
static double cosh(double arg) vraća hiperbolički kosinus ugla arg
static double tanh(double arg) vraća hiperbolički tangens ugla arg
static double cbrt(double arg) vraća kubni koren od arg
static double exp(double arg) vraća e na stepen arg
static double log(double arg) vraća prirodni logaritam od arg
static double log10(double arg) vraća dekadni logaritam od arg
static double log1p(double arg) vraća prirodni logaritam od arg+1
static double pow (double y, double x) vraća y podignut na stepen x
static double sqrt (double arg) vraća kvadratni koren broja arg
static int abs (int arg) vraća apsolutnu vrednost broja arg (tipa int)
static long abs (long arg) vraća apsolutnu vrednost broja arg (tipa long)
static float abs (int arg) vraća apsolutnu vrednost broja arg (tipa float)
static double abs (double arg) vraća apsolutnu vrednost broja arg (tipa double)
static double ceil (double arg) vraćanajveći ceo broj jednak ili veći od arg
static double floor (double arg) vraćanajmanjii ceo broj jednak ili manji od arg
static int max(int x, int y) vraća veći od brojeva x i y (tipa int)
static long max(long x, long y) vraća veći od brojeva x i y (tipa long)
static float max(float x, float y) vraća veći od brojeva x i y (tipa float)
static double max(double x, double y) vraća veći od brojeva x i y (tipa double)
static int min(int x, int y) vraća manji od brojeva x i y (tipa int)
static long min(long x, long y) vraća manji od brojeva x i y (tipa long)
static float min(float x, float y) vraća manji od brojeva x i y (tipa float)
static double min(double x, double y) vraća manji od brojeva x i y (tipa double)
static double rint(double arg) vraća ceo broj najbliži broju arg
vraća broj tipa int koji predstavlja arg zaokružen
static int round(float arg)
naviše do najbližeg celog broja
vraća broj tipa long koji predstavlja arg
static long round(float arg)
zaokružen naviše do najbližeg celog broja
static float ulp(float arg) vraća ulp od arg (tipa float)
static double ulp(double arg) vraća ulp od arg (tipa double)
static double IEEEremainder(double x,
vraća ostatak deljenja x sa y
double y)
static double random() vraća pseudoslučajan broj između 0 i 1
static double toRadians(double arg) konvertuje arg iz stepena u radijane
static double toDegrees(double arg) konvertuje arg iz radijana u stepene
static float signum(float arg) funkcija signum (znak) za argument tipa float
static double signum(double arg) funkcija signum (znak) za argument tipa double
12
Objektno orijentisano projektovanje
metoda opis
vraća dužinu hipotenuze trougla sa katetama
static hypot(double stranica1, stranica 2)
stranica1 i stranica2
Klasa System
Klasa System sadrži skup statičkih metoda i promenljivih. Standardni ulazni i izlazni
tok kao i tok za greške iz Javinog izvršnog sistema čuvaju se u promenljivima in, out i err.
Klasa Scanner
Klasa Scanner čita formatiran ulaz i pretvara ga u binarni oblik. Ova klasa može da
se koristi između ostalog i za čitanje ulaza sa konzole i to će u ovom trenutku biti fokus.
Podatak koji stigne preko tastature može da se dodeli određenoj promenljivoj.
Uopšte uzev, objekat tipa Scanner čita leksleme iz izvora zadatog u trenutku
njegovog pravljenja (u slučaju tastature, radi se o standardnom ulazu koji je označen sa
System.in). Lekslema je svaka znakovna struktura koja ima neko značenje odnosno
odgovara nekom regularnom izlazu koji definiše format podataka. Što se tiče klase
Scanner, lekslema je deo ulaza ograničen skupom graničnika koji podrazumevano čini
razmak. Međutim, metodom useDelimiter() graničnik može i da se menja.
Između ostalog, X može biti neki od sledećih tipova: String, boolean, integer, byte,
long, short, double, float. Interesantna je i metoda hasNext() koja ispituje da li
uopšte ima podatka na ulazu, bez obzira na tip.
1: package klasascanner;
2: import java.util.Scanner;
3: public class KlasaScanner {
4: public static void main(String[] args) {
5: Scanner konzola=new Scanner(System.in);
6: int brojac=0; double zbir=0;
7: System.out.println("Unesite niz brojeva (za kraj upisati \"kraj\"" );
8: System.out.println("Brojeve razdvajati kosom crtom (/)" );
9: konzola.useDelimiter("/");
13
Objektno orijentisano projektovanje
10: while(konzola.hasNext())
11: {if(konzola.hasNextDouble()){zbir+=konzola.nextDouble();++brojac;}
12: else {String kraj=konzola.next();
13: if(kraj.equalsIgnoreCase("kraj")) break;
14: else
15: {System.out.println("Pogrešan format podataka");return;}
16: }
17: }
18: System.out.println("Srednja vrednost unetih brojeva iznosi "+zbir/brojac);
19: }
20: }
run:
Unesite niz brojeva (za kraj upisati "kraj")
Brojeve razdvajati kosom crtom (/)
15/16.2/-11.3/0.8/-4.7/kraj/
Srednja vrednost unetih brojeva iznosi 3.2
BUILD SUCCESSFUL (total time: 26 seconds)
run:
Unesite niz brojeva (za kraj upisati "kraj")
Brojeve razdvajati kosom crtom (/)
12/15/16/end/
Pogrešan format podataka
BUILD SUCCESSFUL (total time: 14 seconds)
Unesite niz brojeva (za kraj upisati "kraj")
Brojeve razdvajati kosom crtom (/)
1
2
6/
Pogrešan format podataka
BUILD SUCCESSFUL (total time: 10 seconds)
Slika 6: Program KlasaScanner.java i rezultat izvršenja za različite kolekcija ulaza
Klasa Character
gde je ch znak koji će biti omotan. Da bi se dobio znak sadržan u objektu tipa Character
treba pozvati metodu charValue() koja će da vrati enkapsuliran znak.
14
Objektno orijentisano projektovanje
Klasa Boolean
U prvom slučaju logička vrednost mora biti true ili false. U drugom slučaju
ukoliko je argument koji se prosleđuje znakovni niz „true“ ili „TRUE“ vrednost objekta koji
se stvara će biti true u svim ostalim slučajevima biće false.
byte byteValue()
double doubleValue()
float floatValue()
int intValue()
long longValue()
short shortValue()
Svi omotači tipova redefinišu i metodu toString() koja vraća vrednost objekta u
ekvivalentni znakovni niz. To, na primer, omogućava da se ispiše numerička vrednost
metodom println() a da ne mora pre toga da se konvertuje u njegov prosti tip.
15
Objektno orijentisano projektovanje
1: package automatskopakovanjeiraspakivanje;
2: public class AutomatskoPakovanjeIRaspakivanje {
3: public static void main(String[] args) {
4: Integer obj=100;
5: String string1=obj.toString();
6: Double broj= new Double(string1);
7: float fl=12.12f;
8: Float of=fl;
9: double zbir=obj+broj+fl+of;
10: System.out.println(zbir);
11: String string2="TAcno";
12: Boolean tacno=new Boolean(string2);
13: if(tacno) System.out.println("Tacno ");
14: else System.out.println("Netacno ");
15: }
16: }
run:
224.23999977111816
Netacno
BUILD SUCCESSFUL (total time: 1 second)
Slika 7: Primer automatskog pakovanja i raspakivanja osnovnih tipova
Nabrojivi tipovi
Java dozvoljava definisanje nabrojivog tipa koji se onda može koristiti za deklarisanje
promenljivih. Deklaracija nabrojivog tipa mora da obuhvati sve moguće vrednosti
promenljive tog tipa koje bira korisnik. Na primer, sledeća deklaracija stvara nabrojivi tip:
Nabrojivi tipovi čuvaju tip-ne može se dodeliti vrednost drugačija od one navedene u
deklaraciji. Svaka vrednost nabrojivog tipa uskladištebna je kao kao celobrojni podatak koga
zovemo rednim brojem, pozicijom ili indeksom. Tako prva navedena vrednost nabrojivog
tipa ima numeričku vrednost 0, druga ima 1 i tako dalje. Međutim, nije moguće dodeliti
16
Objektno orijentisano projektovanje
numeričku vrednost promenljivoj nabrojivog tipa čak i u slučaju ako se ona poklapa sa
indeksom te stavke. Identifikatori nabrojivog tipa (u gor navedenom primeru PIK, KARO,
HERC, TREF) zovu se konstante nabrojivog tipa. Svaka od njih je implicitno deklarisana kao
javan i statičan član klase BojaKarata
Deklaracija nabrojivog tipa predstavlja poseban tip klasnog tipa i svaka promenljiva
tog tipa je objekat. To znači da nabrojiv tip može imati konstruktore, metode i promenljive
instanci.
Zadatak1
Proučiti i ostale metode iz klase StringBuffer, naročito one koje se odnose na
umetanje/brisanje/pretragu znakova u stringu i pronalaženje sekvence znakova u datom
stringu. Da li se radi o posebnim metodama ili preklopljenim?
Zadatak 2
Proučiti sledeće standardne klase: Date, Calendar, GregorianCalendar, TimeZone.
17
Objektno orijentisano projektovanje
Zadatak 3
Pronaći koja je klasa zadužena za formatiran izlaz.
Literatura:
1. Herbert Schildt, Java™ J2SE™ 5 Kompletan priručnik, Mikroknjiga, 2006.
2. Rogers Cadenhead, Laura Lemay, Java™ 6 naučite za 21 dan, Kompjuter
biblioteka,2009.
18