Objektno orijentisano programiranje Java klase Definicija klase Klasa
Objektno orijentisano programiranje Java, klase
Definicija klase • Klasa se može shvatiti i kao novi tip – ona određuje koje vrednosti mogu dobiti promenljive (objekti) tog tipa i koje operacije se mogu vršiti nad njima • Definicija klase je jako jednostavna i može sadržati samo: atribute metode
Atributi u definiciji klase ● ● Atributi mogu biti proizvoljnog primitivnog tipa ili reference na objekte proizvoljne klase, uključujući i klasu koju upravo definišemo. Postoje 2 vrste atributa: – – statički (static) atribut – on je zajednički za sve objekte klase. Postoji samo jedna kopija tog atributa bez obzira na to koliko objekata te klase je kreirano, i ta kopija postoji čak i kada nije kreiran nijedan objekat te klase nestatički - svaki objekat klase poseduje svoju sopstvenu kopiju atributa. Ovakvi atributi daju objektima individualnost
Nestatički atributi ● ● ● Važno je shvatiti razliku između ova 2 tipa atributa Svaki objekat klase imaće svoju sopstvenu kopiju svakog od nestatičkih atributa koji se pojavljuju u definiciji te klase, i ti atributi imaće svoje sopstvene vrednosti, nezavisne od odgovarajućih vrednosti tih atributa u drugim objektima Nestatički atributi se u definiciji klase deklarišu na uobičajeni način: <tip> <ime> i eventualno se može zadati inicijalna vrednost
Statički atributi ● ● Data klasa imaće samo jednu kopiju svakog od statičkih atributa i one će biti zajedničke za sve objekte te klase. Svaki od ovih atributa postoji čak i kada nije kreiran nijedan objekat klase Deklarišu se navođenjem ključne reči static ispred <tip> Statički atributi se koriste da čuvaju podatke koji su zajednički za sve objekte klase Npr. brojač – koliko objekata klase je trenutno kreirano ( pošto je static, može se koristiti čak i kada nije kreiran nijedan objekat te klase, što je dobro )
Metodi u definiciji klase ● Opet, i ovde postoje 2 vrste: statički ( static ) – mogu se izvršavati čak i kada ne postoji nijedan objekat te klase nestatički – mogu se izvršavati samo za konkretne objekte klase
Statički metodi ● ● Pošto se statički metodi mogu pozivati i kada ne postoje konkretni objekti klase, oni ne mogu koristiti nestatičke atribute. Ukoliko se u kodu statičkog metoda referiše nestatički atribut, kompilacija neće proći. Na ovom mestu postaje jasno zašto metod main() od koga kreće izvršavanje aplikacije mora da se deklariše kao statički – pre startovanja aplikacije ne postoji nijedan objekat
Nestatički i statički metodi ● ● Iako su nestatički metodi specifični za objekte klase, postoji samo jedna kopija svakog od ovih metoda u memoriji i nju dele svi objekti te klase, jer bi bilo ekstremno skupo praviti kopiju svakog nestatičkog metoda za svaki objekat. Sav izvršni Java kôd mora biti unutar klase, ali za većinu funkcija opšte namene nije neophodna veza sa konkretnim objektom ( npr. računanje kvadratnog korena ili generisanje slučajnog broja ), pa se one definišu kao static. Dobri primeri statičkih metoda su matematičke funkcije implementirane u standardnoj klasi Math. Ovi metodi uopšte ne rade sa objektima klasa – operišu isključivo sa primitivnim tipovima
Pristup atributima i metodima ● ● Obično hoćemo da pristupamo atributima i metodima izvan klase u kojoj su deklarisani. Atribute i metode je moguće deklarisati i tako da im pristup izvan klase nije moguć, ali kasnije će biti reči o tome. Posebno ćemo razmotriti pristup statičkim i nestatičkim članovima ( atributima i metodima ) klase
Pristup statičkim članovima klase <ime_klase>. <član> ● Primer: double root. Pi = Math. sqrt(Math. Pi); ● Ukoliko postoji referenca na objekat klase, statičkom članu se može pristupati i sa: <referenca_na_objekat>. <član> ● ● Ovo je moguće jer svaki objekat uvek ima pristup svim statičkim članovima klase Imena statičkih članova klase mogu se import-ovati korišćenjem import deklaracija, a onda se ti članovi mogu koristiti bez kvalifikovanja imenom klase, prosto navođenjem njihovih imena
Pristup nestatičkim članovima klase ● Moguć je samo koristeći reference na konkretne objekte <referenca_na_objekat>. <član>
Definisanje klase ● ● ● class Ime. Klase { // članovi ( atributi i metodi ) } Konvencija je da imena klasa u Javi počinju velikim slovom ( ovde Ime. Klase ) Za atribute, kako statičke tako i nestatičke, se u definiciji klase mogu postaviti inicijalne vrednosti Ukoliko se ne navede inicijalna vrednost, prilikom kreiranja objekta biće pridružena default vrednost i to: 0 za numeričke tipove 'u 0000' za tip char null za reference na objekte i reference na nizove
Definisanje metoda ● ● Metodi su zapravo funkcije i tako se i definišu Tip vrednosti koju metod vraća može biti void, proizvoljan tip ili klasa Lokalne promenljive se ne inicijalizuju automatski, već se mora eksplicitno izvršiti njihova inicijalizacija (inače ne prolazi kompajliranje) Argumenti se prenose ”po vrednosti”, tj. prenose se lokalne kopije argumenata, pa tako je argument promenljiva primitivnog tipa, funkcija ne može promeniti njenu vrednost.
Prenošenje argumenata metodima ● Iako se mehanizam prenošenja argumenata po vrednosti primenjuje na sve tipove argumenata, efekat za objekte se razlikuje od onog za promenljive primitivnih tipova. Objekat se može promeniti jer promenljiva klasnog tipa sadrži referencu na objekat, a ne sam objekat. Kada se takva promenljiva prenese kao argument metoda, prenosi se kopija reference na objekat, a ne kopija samog objekta.
Final parametri ● ● ● Svaki parametar metoda može se navesti i kao final čime se sprečava da funkcija promeni njegovu vrednost, o čemu će kompajler voditi računa. Pošto se parametri prenose po vrednosti, final ima smisla samo za parametre koji su reference na objekte klasa Međutim, time se sprečava promena reference na objekat koja se prosleđuje metodu, a ne samog objekta
Definisanje statičkih metoda ● ● Doda se ključna reč static ispred definicije metoda Važno je zapamtiti da se unutar statičkih metoda ne mogu referisati nestatički atributi, jer se ovakvi metodi mogu pozivati i kada nije kreiran nijedan objekat klase, u kom slučaju i ne postoji nijedan nestatički atribut
Pristup atributima u metodu ● Nestatički metod može pristupati proizvoljnom atributu klase ( i statičkom i nestatičkom ) korišćenjem samo njegovog imena
Promenljiva this ● ● Svaki nestatički metod ima promenljivu koja se zove this koja predstavlja referencu na tekući objekat za koji je metod pozvan. Kompajler implicitno koristi this kada metod referiše nestatički atribut klase Možemo i sami napisati this. <atribut> Nije dobra praksa na taj način nepotrebno opterećivati kod. Međutim, postoje i situacije kada je neophodno eksplicitno koristiti this
Primer ● Kada izvršimo naredbu: double ball. Volume = ball. volume(); gde je ball objekat odgovarajuće klase, this u metodu volume() referisaće na objekat ball
this i nestatički metodi ● ● Kako postoji samo jedna kopija nestatičkog metoda u memoriji, bez obzira na to koliko objekata date klase postoji, promenljiva this omogućuje da ta jedna instanca metoda radi sa različitim objektima klase Prilikom svakog poziva nestatičkog metoda, promenljiva this se postavi da referiše na objekat za koji je metod pozvan i onda se kôd u metodu odnosi na članove upravo tog objekta
Eksplicitna upotreba this-a ● Imena promenljivih koje se deklarišu unutar metoda, lokalna su za taj metod. Dozvoljeno je koristiti imena lokalnih promenljivih, kao i imena parametara metoda koja su ista kao i imena atributa. U tom slučaju, neophodno je koristiti this za referisanje člana klase unutar metoda. Samo ime promenljive će se uvek odnositi na lokalnu promenljivu metoda, ne na atribut klase
Primer ● void change. Radius( double radius ){ this. radius = radius; } this. radius se odnosi na atribut, a radius na parametar metoda
Inicijalizacija atributa klase ● ● ● I statički i nestatički atributi se mogu inicijalizovati unutar definicije klase Neke stvari se ne mogu inicijalizovati jednim izrazom, npr. veliki niz koji želimo inicijalizovati vrednostima koje iziskuju neku vrstu izračunavanja To je posao za inicijalizacioni blok
Korišćenje inicijalizacionih blokova ● ● ● Inicijalizacioni blok je blok kôda između { i } koji se izvršava pri kreiranju objekta klase Postoje dve vrste inicijalizacionih blokova: Statički inicijalizacioni blok – ključna reč static i izvršava se jedanput, prilikom učitavanja klase. Može inicijalizovati samo statičke atribute klase Nestatički inicijalizacioni blok – izvršava se za svaki objekat koji se kreira i inicijalizuje nestatičke atribute klase Iako je moguće, normalno ne treba inicijalizovati statičke atribute nestatičkim inicijalizacionim blokom
Konstruktori ● ● Možemo imati više inicijalizacionih blokova i onda se oni izvršavaju onim redom kojim su navedeni u definiciji klase Iako su inicijalizacioni blokovi korisni, za kreiranje objekata potrebni su nam i konstruktori Uvek kada kreiramo objekat neke klase poziva se specijalna vrsta metoda, tzv. konstruktor Ukoliko ne definišemo nijedan konstruktor za našu klasu, kompajler će obezbediti podrazumevani konstruktor klase koji ne radi ništa
Konstruktori ● ● ● Primarna svrha konstruktora jeste da za objekat koji se kreira izvrši inicijalizaciju nestatičkih atributa Inicijalizacioni blokovi koji su eventualno definisani u klasi uvek se izvršavaju pre tela konstruktora Konstruktor ima 2 specifične osobine: nikada ne vraća vrednost ( ni void! ) uvek ima isto ime kao i klasa kojoj pripada
Konstruktori ● ● Konstruktor može imati proizvoljan broj parametara, uključujući i 0 ( bez parametara ) Podrazumevani konstruktor nema parametre
Podrazumevani konstruktor ● ● ● <ime_klase>() {} Nema parametre i ne radi ništa Ukoliko smo definisali nestatičke inicijalizacione blokove u klasi, oni se izvršavaju svaki put kada se izvršava i konstruktor, neposredno pre izvršavanja tela konstruktora Konstruktor se poziva kadgod kreiramo objekat Ukoliko sami napišemo bar jedan konstruktor, kompajler ne pravi podrazumevani konstruktor. Ako nam je i on potreban, moramo ga eksplicitno definisati
Kreiranje objekata klase ● ● ● Kada deklarišemo promenljivu tipa neke klase, ne poziva se konstruktor, jer se i ne kreira objekat. Npr. Sphere ball; // Deklarisanje promenljive Na ovom mestu kreira se promenljiva ball koja može da čuva referencu na objekat tipa Sphere, ako i kada kreiramo neki Setimo se da smo i kod klase String imali da su promenljiva i objekat na koji ona referiše različiti entiteti
Kreiranje objekata ● ● Da bismo kreirali objekat klase moramo koristiti ključnu reč new za kojom sledi poziv konstruktora Da inicijalizujemo ball referencom na objekat: ball = new Sphere(10. 0, 1. 0); Može i sve u jednom redu: Sphere ball = new Sphere(10. 0, 1. 0); // deklariše se promenljiva ball i definiše objekat // na koji ona referiše Kreiranje nove promenljive koja referiše na isti objekat Sphere my. Ball = ball; i dalje imamo jedan objekat, ali sada dve promenljive koje na njega referišu. Možemo imati koliko god takvih promenljivih koje referišu na isti objekat
Prenošenje objekta metodu ● ● Kada prenesemo objekat metodu, primenjuje se mehanizam prenošenja po referenci jer se metodu prenosi kopija reference na objekat sadržane u promenljivoj, a ne kopija samog objekta Zapamtiti da se ovo odnosi samo na objekte, ne i na promenljive primitivnih tipova!
Životni vek objekata ● ● Životni vek objekta određen je promenljivom koja čuva referencu na njega, pod pretpostavkom da postoji samo jedna takva Objekat na koji promenljiva referiše ”umire” kada se izađe iz opsega te promenljive, a to je na kraju bloka u kome je deklarisana Ako je nestatički atribut promenljiva koja referiše na objekat, objekat živi sve dok i taj nestatički atribut Ako postoji više promenljivih koje referišu isti objekat, objekat postoji sve dok postoji bar jedna od tih promenljivih
Životni vek objekata ● Sa ball = null; resetujemo promenljivu tako da više ne pokazuje na objekat. Ukoliko je to bila jedina promenljiva koja je referisala na taj objekat, on će biti uništen. Promenljiva ball, međutim nastavlja da postoji i može se koristiti da referiše na neki drugi objekat iste klase.
Garbage collector ● ● Uništavanje ”mrtvih” objekata vrši tzv. Garbage Collector. To se u Javi dešava automatski, ali ne znači da mrtvi objekti odmah nestaju iz memorije. To ni na koji način ne utiče direktno na naš program. Može da bude bitno jedino u situacijama kada su naši objekti ogromni ili kada odjednom kreiramo i osobađamo se velikog broja objekata. U tom slučaju možemo probati da zovemo statički metod gc() klase System da bi Java VM izvršila garbage collection System. gc(); Međutim, poziv gc-a može i da pogorša stvar i da uspori ceo taj proces
Definisanje i korišćenje klasa ● ● Imamo 2 izvorna fajla: Sphere. java koji sadrži definiciju klase Sphere Create. Spheres. java koji sadrži klasu Create. Spheres koja će implementirati main() metod od koga počinje izvršavanje programa Oba fajla treba da budu u istom direktorijumu, npr. Create. Spheres Iskompajliramo fajlove, a zatim pokrenemo Create. Spheres : javac Create. Spheres. java Create. Spheres Ako se svi izvorni fajlovi programa nalaze u tekućem direktorijumu, kompajliranje fajla koji sadrži definiciju main()-a će kompajlirati sve izvorne fajlove programa
Kompajliranje ● ● Po default-u. class fajlovi koje generiše kompajler smeštaju se u tekući direktorijum – direktorijum koji sadrži izvorne fajlove. Ako želimo da se oni generišu u nekom drugom direktorijumu, možemo koristiti opciju -d kompajlera, npr. javac -d C: classes Create. Spheres. java
Preklapanje (overloading) metoda ● ● ● Moguće je definisanje više metoda klase sa istim imenom i jedinstvenim skupom parametara. To se naziva preklapanjem metoda Ime metoda, zajedno sa tipovima njegovih parametara čini potpis metoda Potpis svakog metoda u klasi mora biti različit kako bi kompajler mogao u svakom trenutku da odredi koji metod pozivamo Tip povratne vrednosti metoda nema uticaja na potpis metoda Primeri: value. Of() metodi klase String – postoji po jedan za svaki primitivni tip podataka
Preklapanje konstruktora ● ● Konstruktori se mogu preklapati, kao i bilo koji drugi metod klase Konstruisanje objekata od različitih skupova inicijalnih podataka Kompajler odabira koji konstruktor će koristiti na osnovu prosleđenih argumenata Za potpis metoda bitan je broj i tip parametara, a ne njihova imena
Poziv konstruktora iz drugog konstruktora ● ● Jedan konstruktor klase može pozivati drugi konstruktor te klase u svojoj prvoj izvršnoj naredbi. Time se često može uštedeti na ponovnom pisanju koda. Za referisanje drugog konstruktora iste klase koristi se this kao ime metoda praćen odgovarajućim argumentima između zagrada
"kopi-konstruktor" ● ● Iznenađujuće često javlja se potreba za pravljenjem identične kopije objekta Ako kreiramo objekat klase Sphere sa: Sphere eight. Ball = new Sphere(10. 0, 0. 0); • Ako kasnije u programu želimo da kreiramo objekat new. Ball identičan objektu eight. Ball i napišemo Sphere new. Ball = eight. Ball; to neće biti ono što želimo, već će samo obe promenljive new. Ball i eight. Ball referisati na isti objekat. Kreira se nova promenljiva new. Ball, ali ne poziva se konstruktor i ne kreira se novi objekat • To se može postići dodavanjem novog konstruktora koji kao argument prima postojeći objekat klase Sphere i kopira vrednosti instancnih promenljivih objekta koji je prosleđen kao argument u odgovarajuće instancne promenljive novog objekta
Razumevanje paketa ● ● ● Paketi su fundamentalni za Java programe, pa je važno razumeti ih 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
Paketi ● ● 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
Paketi ● ● Svaka klasa u Javi je sadržana u nekom paketu, a ako se ne navede eksplicitno, naše klase se smeštaju u podrazumevani bezimeni paket Standardne Java klase su sadržane u paketima tako što se u jednom paketu nalaze klase koje su na neki način povezane
"Pakovanje" klasa ● ● Stavljanje klase u imenovani paket je jednostavno Samo je potrebno dodati package deklaraciju kao prvu liniju fajla koji sadrži definiciju klase Ispred ove linije mogu se naći jedino komentari ili prazne linije package deklaracija je oblika – package <ime_paketa> ;
"Pakovanje" klasa ● ● 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 metodima klasa koje se nalaze u istom paketu package Geometry; public class Sphere{ // detalji klase }
"Pakovanje" klasa ● ● 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 i struktura direktorijuma ● ● 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. Shapes 3 D, što znači da je Shapes 3 D poddirektorijuma Geometry Ime može biti proizvoljne složenosti, ali treba da odražava strukturu direktorijuma u koju je paket smešten
Kompajliranje paketa ● ● ● 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
Kompajliranje paketa ● 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 ProgGeometry , putanja do direktorijuma Geometry je C: Java Prog, a NE C: Java ProgGeometry 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
Pristup paketima ● 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 Pritom, na nama je da obezbedimo da. class fajlovi zaista budu sačuvani u direktorijumu paketa
Pristup paketima ● ● 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: My. Source; C: My. Packages" My. Program. 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
Korišćenje ekstenzija ● ● 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
Korišćenje ekstenzija
Ekstenzije ● ● ● • • 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
Dodavanje klasa iz paketa u program ● ● ● 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
Primer • • • import Geometry. Shapes 3 D. *; uključuje sve klase paketa Geometry. Shapes 3 D 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. Shapes 3 D. Sphere;
Paketi i imena u našim programima ● ● 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. Npr. klasa Sphere iz paketa Geometry. Shapes 3 D ima puno ime Geometry. Sphere 3 D. Sphere Ukoliko ne koristimo import deklaraciju, ovu klasu možemo koristiti navođenjem njenog punog imena
Importovanje statičkih članova klase ● ● ● 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*radius*radius; ● 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!
Wrapper klase za primitivne tipove ● ● Svaka od ovih klasa ima statički metod to. String() za konvertovanje vrednosti odgovarajućeg primitivnog tipa u String objekat Takođe, postoji ne-statički to. String() metod u svakoj klasi koji vraća String reprezentaciju objekta klase Postoje i metodi za konvertovanje iz String objekta u primitivni tip Npr. statički parse. Int() č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 Number. Format. Exception
Wrapper klase za primitivne tipove ● ● Svaka klasa takođe definiše i metod value() koji vraća vrednost enkapsuliranu objektom kao vrednost odgovarajućeg primitivnog tipa 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 )
Kontrola pristupa članovima klase ● ● ● 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" (access atributi )
Korišćenje pristupnih atributa ● ● 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
Korišćenje pristupnih atributa za klasu ● 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
Pristupni atributi za članove klase ● 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 )
Primer, klase u istom paketu
Primer, različiti paketi
Objašnjenje prethodnog slajda ● ● Da bi važile označene strelice, klasa Class 1 mora 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 Sub. Class 1, 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
Zadavanje pristupnih atributa ● ● 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čajeni izbor pristupnih atributa ● ● 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. accessor metodom klase
Accessor metodi ● Npr. public double get. X(){ 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*()
Mutator metodi ● ● Tako se nazivaju metodi koji dopuštaju menjanje vrednosti private atributa Njihova imena su obično oblika set*() Nova vrednost atributa se prosleđuje kao argument Npr. public void set. X(double input. X){ x = input. X; }
Prednost mutator metoda ● ● 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
Izbor pristupnih atributa ● ● • 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 ako imamo final atribute koji su verovatno korisni izvan klase, možemo ih deklarisati kao public 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
- Slides: 73