Professional Documents
Culture Documents
9
Nijedna od ovih reci nije kljucna rec u Javi. Delete, exit i next su operacije koje
se izvrsavaju prilikom izvrsenja koda, main je predefinisana metoda, a null je
podrazumevana vrednost za tip String kao i za reference na objekte.
11.Sta ako se napise static public void umesto public static void?
Program se normalno kompajlira i normalno pokrece.
15.Sta je konstruktor?
Konstruktor je mehanizam slican metodi, ali se ipak malo razlikuje. Konstruktor
se mora zvati kao i klasa ciji je konstruktor i ne zadaje mu se nikakv tip
povratne vrednosti. Konstruktor inicijalizuje novo kreirani objekat i poziva se u
vreme kreiranja objekta. Mozemo imati vise konstruktora za neku klasu i to je
preklapanje konstruktora. Konstruktor iste klase mozemo pozvati sa
this(argumenti), a konstruktor direktne natklase sa super(argumenti).
Podrazumevani konstruktor kreira Java Compiler samo u slucaju da mi nismo
napisali nijedan konstruktor.
28.Sta je nasledjivanje?
Nasledjivanje je pojava kod izvodjenja klasa gde imamo izvedenu klasu koje je
zapravo vrsta osnovne klase sa nekim svojim dodatnim specificnostima.
Izvedena klasa ce naslediti sva polja i metode od osnovne klase nestaticke, a
pored doga moze imati i svoja polja i metode. Nasledjivanje omogucava da se ne
kuca dva puta isti kod i koristi se kod redefinisanja klasa i dalje za polimorfizam.
56.Sta je apstrakcija?
Apstrakcija je proces skrivanja implementacionih detalja i izlaganja korisniku
samo funkcionalnosti koje on moze da koristi. Nrp on zna potpis metode tj. sta
radi i kako moze da je pozove, bez da on zna kako ta metoda radi.
62.Sta je interface?
Interface je nalik na klasu sa ovim razlikama: Pocinje kljucnom recju interface
umesto class i ranije je mogao da ima samo static final variable tj. staticke
kontstante i apstraktne metode. Medjutim u novijim verzijama kao sto je Java8
dozvoljeno je da interfejs moze da ima i konkretne podrazumevane metode kao i
staticke metode, ali te staticke nisu ove sto su apstraktne. Kada napravimo
podrazumevanu metodu u interfejsu nju ne moramo da redefinisemo, ali
mozemo. (Svrha je da se izbegne modifikacija svih postojecih klasa koje
implementiraju taj interfejs dodavanjem nove metode u interfejs a ne u svaku
klasu pojedinacno) . Takodje je dozvoljeno je da interfejs ima i static metode ali
ne ove apstrakt nego posebno staticke metode . Te staticke metode se pozivaju
ImeInterfejsa.imeMetode(argumenti) To je kao obicna funkcija, posto Java nema
funkcije samo metode, pa je Static metoda zamena za funkciju. I polja i metode
imaju podrazumevani modifikator pristupa public i ne moze se napisati nijedan
drugi. Koristi se da bi se obezbedila potpuna apstrakcija kao i delimicno resio
problem zabrane visestrukog nasledjivanja za klase u Javi. Objekti tipa Interface
se ne mogu instancirati bas kao ni objekti apstraktnih klasa. Klasa moze da
nasledi samo jednu klasu, ali moze istovremeno i da implementira vise
interfejsa. Klasa koja implementira neki interfejs mora da implementira sve
njegove apstraktne metode, inace je i sama apstraktna klasa. Interfejs ne moze
da ima konstruktor. Moze postojati referenca tipa Interfejsa koja moze da
referise objekte klasa koje implementiraju taj interfejs. Tada mogu da se
pozivaju samo te metode pomocu te reference,kojima je pravo pristupa
obezbedjeno ali posto je to interfejs uvek je public za njegova polja i metode.
Ne moze da se pristupa ostalim poljima i metodama iz te klase.
Interfejs moze biti izveden iz drugog interfejsa, u tom slucaju klasa koja
implementira izvedeni interfejs mora implementirati sve njegove apstraktne
metode, ukljucujuci i one koje je nasledio izvodjenjem. Ukoliko se ne navede
pristup podrazumevano je paketski. Interfejs je jedan od nacina kako da
uvedemo neke konstante u veci broj klasa, tako sto cemo ih staviti u neki
interfejs, a onda ce sve one implementirati taj interfejs.
69.Sta je paket?
Paket predstavlja skup klasa, interferjsa i podpaketa koji se nalaze u okviru tog
paketa. Koriscenjem paketa regulisu prava pristupa odnosno zastita pristupa,
kao i jednistvenost imena. Postoje vec napravljeni Javini paketi sa nekim
predefinisanim stvarima i korisnicki paketi koje mi pravimo dok radimo.
118.Sta je gc()?
To je metoda u Sistemskoj klasi koja se sa System.gc() koristi da se posalje JVM
predlog da odradi Garbage Collection, ali ni to nije garancija da ce se to i odraditi
1.Sta je multithreading?
Visenitnost je mehanizam kada u okviru jednog procesa imamo vise niti koje se
istovremeno izvrsavaju. Ukoliko imamo procesor sa jednim jezgrom to zapravo
znaci da ce vise tih niti da dele procesorsko vreme, a ukoliko imamo procesor sa
vise jezgara onda ce se dve ili vise niti zaista istovremeno izvrsavati u
paraleli.Prednosti visenitnog programiranja su visestruke:
Efikasnije je od viseprocesnog programiranja jer nema gubljenja vremena.
Promena konteksta izmedju niti je laksa od promene konteksta izmedju procesa.
Niti se izvrsavaju u okviru istog procesa i nad istim adresnim prostorom.
Niti su lakse za rad od procesa, jer je nit zapravo deo procesa.
2.Sta je nit?
Nit je deo procesa koji ima svoj tok izvrsavanja i svoj stack frame.
12.Sta je sinhronizacija?
Sinhronizacija je mehanizam za kontrolu pristupa deljenom resursu od strane
vise niti istovremeno. Ona se koristi se da bi se sprecilo utrkivanje niti i
nekonzistentnost rezultata.
17.Sta je deadlock?
Deadlock je situacija kada su dve niti zaglavljene i svaka ceka na resurse koje
treba da joj omoguci ona druga nit.Prva nit je zaglavljena i ne moze da nastavi
dok joj druga nit ne obezbedi resurse, a druga nit je zaglavljena i ne moze da
nastavi dok joj prva nit ne obezbedi resurse.
Interfejsi
Postoji tri vrste interfejsa:Funkcionalni, Klasicni i Marker interfejsi.
Marker interfejsi su npr Cloneable i Serializable itd. Oni imaju neke posebne
namene i prazni su unutra. Klasicni interfejsi imaju vise metoda, to su interfejsi
koje mi pravimo. Funkcionalni interfejsi su samo sa jednom metodom i oni su
zamenjeni lambda izrazima.
Vrste programiranja
Postoje tri vrste programiranja: proceduralno, objektno i funkcionalno.
Proceduralno programiranje je ono sto pisemo npr u Cu i Pascalu.
Objektno programiranje je ono sto pisemo u C++,Javi itd.
Funkcionalno programiranje je na primer u Scali.
ista klasa da da da da
potklasa u ne da da da
istom paketu
klasa iz istog ne da da da
paketa koja
nije potklasa
potklasa iz ne ne da da
drugog paketa
klasa iz drugog ne ne ne da
paketa koja
nije potklasa
Kreiranje objekta
Kutija k1;
ovo ne pravi objekat vec referencu na objekat koja ima vrednost null
k1=new Kutija(10,20,30);
ovo pravi objekat rezervise prostor i poziva konstruktor te klase
Kutija k2=k1;
ne pravi novi objekat vec samo jos jednu referencu koja ce da ukazuje na isti
objekat koji je kreiran.
k1=null;
sad referenca k1 ne ukazuje ni na sta tj ima vrednost null, a k2 i dalje na kutiju
Podrazumevani konstruktor se pravi i poziva samo u slucaju da nije nijedan
drugi napravljen.
Deklarisanje promenljive
Deklarisanje promenljive u Javi podrazumeva navodjenje tipa promenljive i
imena promenljive i opciono joj se moze dodeliti vrednost prilikom deklaracije.
Naravno vrednost koja joj se dodeljuje mora biti odgovarajuceg tipa koji je
naveden inace ce se prijaviti greska. Deklarisanje promenljive je dozvoljeno
unutar bilo kog bloka ili metode i to se ne mora uraditi na pocetku vec na bilo
kom mestu unutar bloka, ali onda je promenljiva vidljiva ne od pocetka bloka
vec tek od mesta gde je deklarisana i ako probamo da je prvo upotrebimo pa
onda da je deklarisemo prijavice gresku. Opseg vazenja je do kraja tog bloka, tj.
metode. Promenljive ne cuvaju svoje vrednosti izmedju dva poziva neke metode
vec im je zivotni vek samo jedan poziv metode. Takodje ukoliko u for petlji na
primer napisemo deklaraciju i inicijalizaciju neke lokalne promenljive, ona ce se
deklarisati i inicijalizovati posebno u svakoj iteraciji te for petlje. Ukoliko imamo
dva bloka gde je drugi ugnezden u prvi nije dozvoljeno da u ugnezdenom imamo
deklaraciju promenljive koja se isto zove kao neka iz spoljasnjeg bloka.
Nasledjivanje u Javi
● Iz jedne klase se moze izvesti vise klasa, ali jedna klasa ne moze biti
izvedena iz vise klasa. Klasa iz koje je izvedena neka druga klasa moze se
koristiti potpuno samostalno, a ta izvedena klasa moze postati natklasa za
neku drugu iz nje izvedenu klasu.
● Objekat izvedene klase ce sadrzati svoju kopiju svih nestatickih polja iz
osnovne klase i nasledice sve njene nestaticke metode, ali ce moci
direktno da pristupi samo onima koji nisu private.
● Referencu tipa osnovne klase mozemo staviti da ukazuje na objekat tipa
izvedene klase, ali ce pomocu nje moci da se pristupi samo onim poljima i
metodama koje postoje u osnovnoj klasi, naravno ako im je dozvoljen
pristup. Pomocu te reference nece moci da se pristupi poljima i metodama
izvedene klase, tj. videce samo svoja polja i metode iz osnovne klase.
● Rezervisana rec super se koristi iz izvedene klase za pristup poljima i
metodama u osnovnoj klasi, naravno samo kada je taj pristup dozvoljen,
a takodje se koristi i za poziv konstruktora natklase iz konstruktora
izvedene klase.
● Kada imamo hijerarhiju izvodjenja A->B->C i pozovemo konstruktor za C
pri kreiranju objekta tipa C, pozvace konstruktor za B, pa ce on pozvati
konstruktor od A.Ukoliko bilo kod od njih nema podrazumevani
konstruktor vec neki konkretan konstruktor, ocekivace se da prosledimo
potrebne parametre. Ako ih ne prosledimo prijavice nam gresku za to.
SINGLETON
Prektni uzorak singleton je objektni uzorak kreiranja koji obezbedjuje da klasa
ima samo jedan objekat i daje globalni pristup tom objektu. Za neke klase je
vazno obezbediti da imaju samo jedan objekat.Obicna globalna promenljiva
obezbedjuje globalan pristup ali ne brani vise objekata. U ovom resenju klasa je
sama odgovorna za jedinstvenost objekta.
Uzorak treba koristiti kada :
-mora postojati tacno jedan objekat klase
-on mora biti pristupacan klijentima preko svima poznate tacke pristupa
-klasa treba da bude prosiriva izvodjenjem
-da klijenti mogu da koriste objekat izvedene klase bez potrebe da modifikuju
svoj kod
Singleton nije Thread safe odnosno podrazumevano nije obezbedjen kontrolisani
pristup od strane vise niti istovremeno istom deljenom resursu koji je u ovom
slucaju ovaj single_instance koji se i dohvata. Moze se desiti da vise niti udju u
metodu i vise njih prodju ovaj deo gde je ispitivanje na null i svima bude
null==true i onda vise njih naprave vise instanci i time sruse koncept singletona.
To se moze obezbediti da se ne desava tako sto metoda getInstance stavimo da
bude synchronized ali time se dosta usporava rad.
Moze se staviti umesto toga synchronized blok nakon if-a u metodi ali se onda
moze desiti da vise njih prodju kroz null==true i onda pregaze stari kreirani
objekat novim tako da bi se onda i
unutar synchronized bloka moralo staviti takodje provera uslova sa if
null==true.
Takodje se mora dodati volatile modifikator uz sigle_instance jer kreiranje novog
objekta nije atomicna operacija sastoji se iz nekoliko koraka i moze se desiti da
je objekat polu kreiran tada vec nije null nego nesto drugo a druga niti pita da li
je null vidi nije null i pokusa da dohvati to polu kreirano pa da se to spreci.
class Singleton {
private static volatile Singleton single_instance = null;
protected Singleton(){
…..
}
public static Singleton getInstance(){
if (single_instance == null){
synchronized (this){
if (single_instance == null)
single_instance = new Singleton();
return single_instance;
}
}
}
Niti
Niti koje rade nad razlicitim skupovima podataka su retke, jer su obicno niti koje
se izvrsavaju u paraleli tj. bore za procesorsko vreme u slucaju jednog procesora
niti koje pripadaju istom procesu pa se izvrsavaju nad istim adresnim prostorom
tj. nad istim skupovima podataka.
Ako dve niti mogu da citaju i modifikuju isti skup podataka dolazi do utrkivanja
takozvani race hazard i moze doci do nekonzistentnosti. Zbog toga moramo
obezbediti sinhronizaciju odnosno da samo jedna nit istovremeno moze da
pristupa jednom deljenom resursu ukoliko je rec o sihnronizovanoj metodi.
Klasa niti mora da nasledi klasu Thread ili da implementira interface Runnable.
U oba slucaja treba da se redefinise run metoda. Nit se pokrece sa pozivom
metode start() koja ce pokrenuti izvrsavanje metode run(). Ukoliko se direktno
pozove run() ta metoda ce se izvrsiti kao obicna metoda i nece doci do promene
konteksta izmedju niti.Kada se metoda run() izvrsi time se i nit zavrsila i ne
mozemo dva puta pokrenuti istu nit. Metod run() ne moze da baca izuzetke.
Bolje je implementirati interface Runnable jer ukoliko se nasledjuje klasa Thread
onda se ne moze naslediti nijedna druga klasa istovremeno.Kada se kreira
objekat te klase koja implementira Runnable onda se on prosledi konstruktoru
klase Thread kao npr new Thread(nit1).start(); gde je nit1 objekat klase koja
implementira interface Runnable.
Metodom isAlive() vraca podatak da li je nit za koju je pozvana ova metoda
zavrsila izvrsavanje ili ne.
?Objekat tekuce niti moze se dohvatiti statickom metodom currentThread();
Nit moze sama sebe da uspava na odredjeno vreme pomocu metoda sleep(ms);
Metodom interrupt() se izaziva izlazak iz stanja sleep ili wait i baca se izuzetak
InterruptedException, a ukoliko je niti normalno radila ona i nastavlja normalno
da radi samo postavlja Interrupt fleg na true.
Nit moze da se zaustavi i da ceka da nastavi izvrsavanje tek kada se neka druga
niti izvrsi. To postizemo pozivajuci metodu join() za tu neku nit koja treba da se
izvrsi, pre nego sto tekuca nit nastavi sa izvrsavanjem.
y.m2(); x.m2();
Uzajamno blokiranje se desava na primer kada imamo dve niti A i B koje se
konkuretno izvrsavaju. Ako prvo krene da se izvrsavava niti A i ne blokira se
nigde jer su svi uslovi ok u napisanim sinhronizovanim metodama ok , pa se
onda izvrsi niti B i ne blokira se nigde jer su svi uslovi u napisanim
sinhronizovanim metodama ok onda nema deadlocka, ali mi nismo sigurni da li
ce se tako izvrsiti, jer to je samo jedna od mogucih opcija. Medjutim moguce je
da nit A krene da se izvrsava i onda se blokira na nekom uslovu u okviru
sinhronizovane metode m1 objekta x. Ona ce cekati na notify koji treba da se
posalje iz x.m2() iz niti B. Medjutim nakon napustanja procesora od strane niti
A, procesor dobije nit B i ona krene da izvrsava sinhronizovanu metodu m1 za
objekat y i blokira se na nekom uslovu. Sada Nit B napusti monitor i ceka na
notify signal koji treba da se posalje iz y.m2() iz Niti A. Dakle i niti A i nit B ne
mogu da nastave sa radom, jer obe cekaju na uslove koje treba da oslobodi ona
druga nit. Ovo se naziva deadlock i odgovornost je programera da se ovo ne
desi.Java nece sama uociti da moze da dodje do deadlocka niti nam prijaviti to.
Ispisace prvo redom rezultate deljenja sa 5,4,3,2,1 pa kad dodje do nule onda
ce generisati izuzetak i ispisace message, a zatim ce se izvrsiti finally blok pa ce
se ispisati poruka iz finally bloka, a onda ce se ispisati text.