Loading documents preview...
PREDMET: ČAS I NEDELJA:
OBJEKTNO-ORIJENTISANO PROGRAMIRANJE 4 NEDELJA
Paketi
su fundamentalni za Java programe Paketi su implicitno u organizaciji standardnih klasa i naših programa i oni određuju koja imena možemo koristiti za klase, kao i atribute i metode koje one sadrže, Paket predstavlja jedinstveno imenovanu kolekciju klasa.
Imena
klasa jednog paketa neće se mešati sa imenima klasa nekog drugog paketa jer se imena klasa paketa kvalifikuju imenom tog paketa.
Npr. puno ime klase String iz paketa java.lang je java.lang.String
Ako
bismo definisali svoju klasu sa istim imenom, String, korišćenje imena String odnosilo bi se na tu našu klasu, dok bismo se standardnoj klasi String morali obraćati sa java.lang.String
Svaka
klasa u Javi je sadržana u nekom paketu Standardne Java klase su sadržane u paketima tako što se u jednom paketu nalaze klase koje su na neki način povezane
Stavljanje
klase u imenovani paket je jednostavno, Samo je potrebno dodati package deklaraciju kao prvu liniju fajla koji sadrži definiciju klase, package
deklaracija je oblika package ;
Način grupisanja međusobno vezanih klasa i interfejsa
Način organizovanja klasa u grupe
Paketi sadrže klase povezane zajedničkom svrhom
Paketi
su korisni iz sledećih razloga:
Omogućavaju
organizaciju klasa u jedinice (units) Smanjuju problem konflikta naziva Omogućavaju bolju zaštitu Mogu se koristiti za identifikaciju klasa
Paketi mogu sadržati druge pakete Svaki nivo predstavlja malo određenije grupisanje klasa Biblioteka klasa u Javi sadržana je u paketu nazvanom java io, net, util, swing i awt
Mehanizmi korišćenja klase koja je u nekom paketu: Klase
iz java.lang paketa su automatski dostupne Korišćenje klase iz drugog paketa Korišćenje klasa iz uvezenih paketa (komanda import)
Da bi se pozvala klasa iz drugog paketa mora se koristiti pun naziv klase naziv_paketa.naziv_klase npr:
java.awt.Font
Korisno je za klase koje se koriste jednom ili dva puta u celom programu
Komandom import se uvoze klase iz paketa • • • •
Uvoz individualne klase (import java.awt.Font) Uvoz celog paketa klasa (import java.awt.*) Neophodno je navesti svaki nivo hijerarhije (import java.awt.image.*) import se nalazi na vrhu datoteke pre definicije klase
Ako
želimo da klasa paketa bude dostupna i izvan njega, potrebno je deklarisati klasu koristeći ključnu reč public u prvoj liniji definicije klase
Ukoliko
ispred definicije klase ne postoji ključna reč public, definicija te klase je dostupna samo metodama klasa koje se nalaze u istom paketu
Svaka
klasa koju hoćemo da uključimo u paket Geometry mora sadržati istu package deklaraciju na početku i svi fajlovi koji sadrže definicije klasa tog paketa moraju se sačuvati u direktorijumu koji ima isto ime kao i paket, dakle Geometry.
Takođe,
metode i konstruktore unutar public klase treba definisati kao public ako hoćemo da budu dostupni izvan paketa.
Paketi
su usko povezani sa strukturom direktorijuma u kojoj se čuvaju. Možemo generisati .class fajl za neku klasu iz paketa u drugom direktorijumu, ali taj direktorijum takođe mora imati isto ime kao i paket. Ime paketa može biti složeno, npr. Geometry.Shapes3D, što znači da je Shapes3D poddirektorijum direktorijuma Geometry. Ime može biti proizvoljne složenosti, ali treba da odražava strukturu direktorijuma u koju je paket smešten.
Korišćenjem
JDK pod Windows-om. Putanja do direktorijuma paketa mora biti eksplicitno naznačena kompajleru pomoću vrednosti koja se postavlja za CLASSPATH čak i kada tekući direktorijum sadrži paket. Najjednostavniji način za postavljanje CLASSPATH-a je navođenjem opcije -classpath pri pozivu kompajlera.
Putanja do direktorijuma paketa je putanja do direktorijuma koji sadrži direktorijum paketa, i prema tome, ne uključuje sam taj direktorijum, npr. ako smo izvorne fajlove za klase paketa Geometry smestili u direktorijum sa putanjom C:\Java Prog\Geometry, putanja do direktorijuma Geometry je C:\Java Prog, a NE C:\Java Prog\Geometry javac -classpath "C:\Java Prog" Line.java putanju je neophodno smestiti među dvostruke navodnike jer sadrži beline javac -classpath "C:\Java Prog" *.java // svi izvorni fajlovi
Ako
su nam .class fajlovi u originalnom direktorijumu paketa postoje 2 opcije:
putanja do paketa se mora pojaviti u stringu kojim se postavlja CLASSPATH environment promenljiva koristiti -classpath opciju u komandnoj liniji kada se poziva kompajler ili interpreter
Ako
se odlučimo za CLASSPATH promenljivu, ona treba da sadrži putanje samo do naših, ne i do standardnih paketa
-classpath
primer:
javac -classpath ".; C:\MySource; C:\MyPackages" MyProgram.java "."
označava tekući direktorijum (potrebno je navesti je i kod kompajliranja – inače neće biti pronađen izvorni fajl, i kod izvršavanja – inače ćemo dobiti poruku da main() metod nije nađen
Kontrola
pristupa članovima klase izvan te klase, tj. iz metoda neke druge klase Znamo da možemo referisati proizvoljan statički član klase u okviru kôda statičkog metoda te iste klase, dok nestatički metod klase može referisati proizvoljni član te iste klase Što se tiče dostupnosti članova klase drugim klasama, stvari su malo komplikovanije. Tu u igru ulaze "pristupni atributi“.
Razmotrimo
najpre klase koje se nalaze u istom paketu. Unutar datog paketa, svaka klasa ima direktan pristup imenima klasa iz tog paketa, za deklarisanje promenljivih i zadavanje tipova parametara metoda, ali atributi i metodi članovi te druge klase ne moraju nužno biti dostupni. Njihova dostupnost kontroliše se pristupnim atributima.
Imenu
klase iz jednog paketa može se pristupiti iz klase drugog paketa, jedino ako je klasa kojoj se želi pristupiti deklarisana kao public. Klasama koje nisu deklarisane kao public može se pristupati samo iz klasa koje se nalaze u istom paketu
Postoje
4 mogućnosti:
bez pristupnog atributa – dopušten pristup iz metoda proizvoljne klase iz istog paketa public – dopušten pristup iz metoda proizvoljne klase (ne nužno iz istog paketa ), sve dok je klasa čiji je to član deklarisana kao public private – dostupan samo iz metoda unutar klase. Nikakav pristup izvan klase protected – dopušten pristup iz metoda proizvoljne klase istog paketa i iz proizvoljne potklase ( ne nužno iz istog paketa )
Odgovarajuća
ključna reč (public, private, protected) se doda na početak deklaracije člana Radi lakšeg praćenja kôda, dobro je grupisati deklaracije članova sa istim pristupnim atributom
Uobičajeno
je da instancne promenljive ( nestatički atributi ) budu private tako da im se ne može direktno pristupati, niti se mogu direktno menjati izvan klase. Jedini način da im se pristupi ili da se njihove vrednosti promene jeste pomoću metoda iste klase Ukoliko je potrebno pristupiti vrednostima private atributa izvan klase, to se postiže tzv. pristupnom (accessor) metodom klase
Najčešće, atributi u public klasi treba da budu private, a metodi koji će se pozivati izvan klase public.
Izuzeci: za klase paketa koje nisu public, a time nisu dostupne izvan paketa, konvencija je dozvoliti drugim klasama paketa direktan pristup atributima metode klase koje će interno koristiti samo drugi metodi iste klase treba definisati kao private u klasama poput Math koja je samo kontejner za korisne funkcije i standardne vrednosti podataka, sve treba da bude public
•
Nakon uvođenja potklasa, još neke stvari se moraju uzeti u obzir
Da
bi važile označene strelice, klasa Class1mora biti definisana kao public. Ako klasa nije definisana kao public, nijedna klasa iz drugog paketa neće biti u mogućnosti da joj pristupi Iz potklase SubClass1, koja je u drugom paketu nije moguće pristupiti članovima bez pristupnog atributa, a takođe ni private članovima – njima ni pod kojim okolnostima nije moguće pristupiti izvan klase u kojoj su definisani
Drugi
način da učinimo svoje pakete dostupnim nakon što smo ih kompajlirali jeste korišćenjem ekstenzija Ekstenzije su .jar fajlovi smešteni u ext direktorijumu koji se kreirao prilikom instalacije JDK-a
Klase i paketi iz .jar arhiva koje smo smestili u ext direktorijum biće automatski dostupni pri kompajliranju Java programa. Kada kreiramo .jar fajl za paket moramo dodati .class fajlove zajedno sa strukturom direktorijuma koja odgovara imenu paketa – ne možemo dodati samo .class fajlove arhivi Primer: želimo da arhiviramo paket Geometry. Pod pretpostavkom da smo kompajlirali paket i da tekući direktorijum sadrži direktorijum paketa, arhiva se može kreirati sledećom komandom: jar cvf Geometry.jar Geometry\*.class
• •
kreiraće arhivu Geometry.jar i u nju dodati sve .class fajlove iz direktorijuma Geometry Potrebno je još samo iskopirati ovu .jar arhivu u ext direktorijum i paket će postati dostupan svakom programu
Ako
su definisane sa ključnom rečju public, možemo dodati proizvoljnu ili sve klase iz imenovanog paketa kodu našeg programa korišćenjem import deklaracija U programu zatim možemo referisati klase koje smo učinili dostupnim import deklaracijama samo navođenjem njihovih imena import deklaracije se navode na početku fajla
•
•
•
import Geometry.Shapes3D.*; uključuje sve klase paketa Geometry.Shapes3D Sada možemo referisati proizvoljnu public klasu iz paketa navođenjem samo njenog imena Obično je bolje "importovati" samo klase paketa koje naš kôd koristi, npr. za klasu Sphere import Geometry.Shapes3D.Sphere;
Unutar
jednog paketa možemo davati imena klasama bez brige da li ta imena već postoje negde izvan paketa Java tretira ime paketa kao deo imena klase, zapravo kao njegov prefiks.
Mogu se importovati imena statičkih članova klase iz imenovanog paketa u naš program Ti statički članovi se zatim mogu koristiti prosto navođenjem njihovih nekvalifikovanih imena npr. import static java.lang.Math.PI; ... return 4.0/3.0*PI;
importovanje svih statičkih članova klase Math: import static java.lang.Math.*;
BITNO: import statičkih članova klase nije moguć za klase koje se nalaze u default – bezimenom paketu. Paket mora imati ime!
Npr.
public double getX(){ return x; }
• Na ovaj način vrednost atributa postaje dostupna svuda, ali se može menjati samo unutar klase • Accessor metodi se obično zovu get*()
Tako
se nazivaju metode koje dopuštaju menjanje vrednosti private atributa Njihova imena su obično oblika set*() Nova vrednost atributa se prosleđuje kao argument Npr. public void setX(double inputX){ x = inputX; }
Zašto
koristiti public metod da bismo menjali vrednost private atributa kada možemo jednostavno da ga učinimo public? Glavna prednost korišćenja mutator metoda jeste što je moguće vršiti proveru nove vrednosti i sprečiti pridruživanje neodgovarajućih vrednosti atributima
Svaka od ovih klasa ima statički metod toString() za konvertovanje vrednosti odgovarajućeg primitivnog tipa u String objekat
Takođe, postoji ne-statički toString() metod u svakoj klasi koji vraća String reprezentaciju objekta klase
Postoje i metode za konvertovanje iz String objekta u primitivni tip Npr. statički parseInt() član klase Integer prihvata String reprezentaciju celog broja kao argument i vraća ekvivalentnu vrednost tipa int. U slučaju da konverzija nije moguća, izbacuje se izuzetak tipa NumberFormatException
AUTOBOXING
vrednosti primitivnih tipova:
automatske konverzije iz primitivnog u odgovarajući klasni tip (vrši ih kompajler kada okolnosti to dopuštaju)
• UNBOXING kompajler će takođe raditi i inverzne konverzije (referencu na objekat wrapper klase primitivnog tipa u vrednost koju on enkapsulira)