Nasleđivanje, apstraktne klase, interfejsi i klasa Object Nasleđivanje Nasleđivanje Nasleđivanje (relacija (relacija “IS-A”, generalizacija-spec generalizacija-specijalizaci ijalizacija) ja) predstavlja predstavlja jedan od osno osnovnih vnih
koncepataa objektno-o koncepat objektno-orijent rijentisano isanogg programira programiranja. nja. Nasleđivan Nasleđivanje je podrazume podrazumeva va preuziman preuzimanje je svih atributa i metoda nadklase (klasa koja je nasleđena) i njihovo prenošenje u podklasu (klasa koja nasleđuje). Krajnji efekat je taj da podklasa poseduje sve karakteristike i ponašanja nadklase ali takođe mo!e da sadr!i i još neke karakteristike i ponašanje. "edan od osnovnih motiva nasleđivanja je izbegavanje izbegavanje redundanse u kodu (ponavljanja koda). Kod koji je napisan u nadklasi ne mora da se po pono novo vo piše piše u po podk dkla lasi si ve# ve# se auto automa mats tski ki pren prenos osii iz nadk nadkla lase se.. $v $voo vo vodi di ka ponovnom uporebljavanju ve! napisanog koda (“code reuse”) . %rafi&ko predstavljanje relacije nasleđivanja se vrši usmerenom linijom od podklase ka nadklasi. 'rh ove strelice predstavlja predstavlja prazan trougao i nalazi se kod nadklase dok se kod ove vrste relacije ne navodi kardinalnost jer je uvek jedan. j edan. rogramski jezik "ava dozvoljava samo jednosruko jednosruko nasleđivanje tj. podklasa mo!e da ima samo jednu nadklasu. nekim drugim objektno-orijentisanim programskim jezicima (npr. (npr. *++) je omogu#eno višestruko nasleđivanje ali se tu mo!e javiti konflikt ako dve ili više nadklasa sadr!e istoimenu metodu ili atribut. ,ada nije jasno koju metodu tj. atribut #e naslediti podklasa. Nasleđivanje se u "avi ozna&ava klju&nom re&i “e"ends”. $va re& se navodi pri deklaraciji klase odmah posle naziva klase a u njenom produ!etku sledi naziv klase koja se nasleđuje. class NazivNadklase { class NazivNadklase ... } class NazivPodklase extends class NazivPodklase extends NazivNadklase NazivNadklase { ... } Primer 1
Napraviti klasu Kalkulator . Ova klasa bi trebalo da ima: ● ● ● ● ● ●
Atribut pi koji koji ima početnu vrednost 3.14. Atribut e koji ima početnu vrednost 2.71. Metodu saberi koja koja sabira dva realna broja i vraća reultat. Metodu oduzmi koja koja oduima dva realna broja i vraća reultat Metodu pomnozi koja koja mno!i dva realna broja i vraća reultat. Metodu podeli koja deli dva realna broja i vraća reultat.
Napraviti klasu NaucniKalkulator koja koja nasle"uje klasu #alkulator i ima: ● Metodu izracunajObimKruga koja kao ulani parametar prima poluprečnik kru$a i vraća
●
obim kru$a. Metodu izracunajPovrsinuKruga koja koja kao ulani ulani paamet paametar ar prima prima polup polupre rečni čnikk kru$a kru$a i vraća povr%inu kru$a.
Napraviti klasu TestKalkulator koja kreira jedan objekat klase Nau&ni#alkulator i poiva sve nje$ove metode.
'lika 1: (rimer $ra)ičko$ prikaa nasle"ivanja Na sli&i * 'lika 'lika 1 + se mo!e videti kako se $ra)ički predstavlja nasle"ivanje. , ovom slučaju- klasa Nau&ni#alkulator *podklasa+ nasle"uje klasu #alkulator *nadklasa+. #lasa #alkulator ima dva atributa i četiri metode- dok klasa Nau&ni#alkulator ima dve svoje metode ali i sve atribute i metode i klase #alkulator. #alkulator.
class Kalkulator { class Kalkulator pi = = 3.14; double pi double e = 2.71; double saberi(double double saberi( double a, double b{ a, double b{ return a!b; return a!b; } a, double b{ double oduz"i(double double oduz"i( double a, double b{ a#b; return a#b; return } a, double b{ double po"$ozi(double double po"$ozi( double a, double b{ a%b; return a%b; return
} double podeli(double double podeli( double a, double b{ a, double b{ return a&b; return a&b; } } Nau'$iKalkulator extends Kalkulator { class Nau'$iKalkulator extends Kalkulator &&tribut pi "oze da se pozove )er )e dobi)e$ &&$asled)iva$)e" &&$asled)iva$) e" od klase Kalkulator. izra'u$a)*bi"Kru+a(double polupre'$ik{ double izra'u$a)*bi"Kru+a( double polupre'$ik{ polupre'$ik%2%pi pi; ; return polupre'$ik%2% return } double izra'u$a)Povrsi$uKru+a( double polupre'$ik{ izra'u$a)Povrsi$uKru+a(double polupre'$ik{ polupre'$ik%polupre'$ik%pi pi; ; return polupre'$ik%polupre'$ik% } } class estNau'$iKalkulator { class estNau'$iKalkulator "ai$(-tri$+/ ar+s { "ai$(-tri$+/ public static void Nau'$iKalkulator Nau'$iKalkulator $k = new Nau'$iKalkulator(; Nau'$iKalkulator(; &&Poziva$)e "etoda klase Nau'$iKalkulator ko)e su &&$apisa$e u to) klasi -0ste".out.pri$tl$(*bi" .pri$tl$(*bi" !$k.izra'u$a)*bi"Kru+a(; !$k.izra'u$a)*bi"Kru+a(; -0ste".out.pri$tl$(Povrsi$a .pri$tl$(Povrsi$a ! ! $k.izra'u$a)Povrsi$uKru+a(;
&&Poziva$)e "etoda klase Nau'$iKalkulator ko)e su &&$asled)e$e od klase Kalkulator -0ste".out.pri$tl$(2!3= .pri$tl$(2!3=!$k.saberi(2,3; !$k.saberi(2,3; -0ste".out.pri$tl$(2#3= .pri$tl$(2#3=!$k.oduz"i(2,3; !$k.oduz"i(2,3; -0ste".out.pri$tl$(2%3= .pri$tl$(2%3=!$k.po"$ozi(2,3; !$k.po"$ozi(2,3; -0ste".out.pri$tl$(2&3= .pri$tl$(2&3=!$k.podeli(2,3; !$k.podeli(2,3; } } #lasa Nau&ni#alkulator nasle"uje klasu #alkulator. #alkulator. Mo!e se videti da se ključna reč e/tends0 nalai odma posle naiva podklase i da se posle nje nalai naiv nadklase. , okviru metoda ira&u ira&unaj najObi Obim#r m#ru$a u$a0 0 i ira& ira&una unaj(o j(ovrsi vrsinu# nu#ru$ ru$a0 a0 se nalae nalae poivi poivi ka atribu atributu tu pi0pi0- %to je doo doovl vljen jeno o jer jer je taj taj atrib atribut ut nasl nasle" e"en en i klase klase #alk #alkul ulat ator or.. , okvi okviru ru mai main0 n0 meto metode de klas klasee est#al est#alkul kulato atorr se vidi vidi da je klasa klasa Nau&ni Nau&ni#al #alkul kulato atorr nasled nasledila ila i metode metode saber saberi0i0- odum odumi0i0pomnoi0 i podeli0- a da nisu morale da budu ekspli&itno napisane u okviru klase. Na taj način ne dolai do ponavljanja koda ovi metoda u obe klase.
etode iz nadklase se prenose u podklasu u originalnom obliku. eđutim &esta je situacija da se u podklasi zahteva da nasleđena metoda ima malo druga&ije ponašanje. tom slu&aju mogu#e je
napisati metodu sa istim zaglavljem (naziv povratna vrednost i ulazni parametri) ali koja #e da ima druga&ije ponašanje. $vaj postupak se naziva rede#inisanje meode (“overriding”) . Kada se u okviru podklase bude pozvala !eljena metoda izvrši#e se redefinisana verzija metode a ne originalna. a obzirom na to da su u suštini konstruktori specifi&na vrsta metoda mogu#e je redefinisati i konstruktor u okviru podklase. /ko redefinisana metoda ili konstruktor samo 0proširuju1 funkcionalnost originalne metode nadklase postoji mogu#nost da se u okviru redefinisane metode pozove originalna metoda a onda da se samo dopiše deo koda koji se odnosu na novu funkcionalnost. ozivanje metode ili konstruktora nadklase se vrši koriš#enjem klju$ne re$i “super” na slede#i na&in2 &&Poziva$)e ko$struktora $adklase &&ko)i $e"a para"etre super(; &&Poziva$)e ko$struktora $adklase &&ko)i i"a para"etre
super(...ulazni parametri...)3 &&Poziva$)e "etode $adklase super.$azivetode(...ulaz$i para"etri...; %ozivanje meoda ili konsrukora nadklase je opciono i ne mora se raditi svaki put ve# samo kada je neophodno. ri tome konsrukor nadklase se mo&e pozvai samo iz konsrukora podklase a naredba za poziv mora da bude na prvoj liniji koda konsrukora podklase . /ko
nadklasa ima eksplicitno definisan parametrizovani konstruktor a nema eksplicitno definisan neparametrizovani konstruktor onda podklasa mora da ima eksplicitno definisan konstruktor koji poziva neki konstruktor nadklase. 4itno je znati i to da se pri inicijalizaciji objekta uvek prvo poziva konstruktor nadklase (i njenih nadklasa) pa tek onda konstruktor podklase. Primer 2
Napraviti klasu Osoba koja ima: Atribut ime. (očetna vrednost ovo$ atributa je N0. • Atribut preime. (očetna vrednost ovo$ atributa je N0. • Atribut jmb$ *'trin$+ koji predstavlja matični broj. • #onstruktor koji kao ulani parametar prima ime- preime i jmb$ i postavlja vrednosti • od$ovarajući atributa samo aku su vrednosti sva tri parametra raličita od null. , suprotnom se ispisuje poruka o $re%&i na ekranu. Metodu ispisi koja na ekranu u tri reda ispisuje podatke o imenu- preimenu i jmb$ osobe. • Napraviti klasu Djak koja nasle"uje klasu Osoba i ima: • Atribut prose&naO&ena koji predstavlja prosečnu o&enu u %koli *npr. 4-+. #onstruktor koji kao ulani parametar prima ime- preime- jmb$ i prosečnu o&enu "aka i • postavlja vrednosti od$ovarajući atributa samo aku su vrednosti prva tri parametra raličita od null i ako je prosečna o&ena u rasponu od 1 do . , suprotnom se ispisuje poruka o $re%&i na ekranu. • 5ede)inisanu metodu ispisi koja na ekranu u četiri reda ispisuje podatke o imenu preimenu- jmb$ i prosečnoj o&eni "aka. Napraviti klasu Penzioner koja nasle"uje klasu Osoba i pretodno$ primera i ima: Atribut penija koji predstavlja inos koji penioner prima kao peniju *npr. 14266- •
•
•
dinara+. #onstruktor koji kao ulani parametar prima ime- preime- jmb$ i inos penije i postavlja vrednosti od$ovarajući atributa samo ako su vrednosti prva tri parametra raličita od null i ako je inos penije veći od nule. , suprotnom se ispisuje poruka o $re%&i na ekranu. 5ede)inisanu metodu ispisi koja na ekranu u tri reda ispisuje podatke o imenu- preimenu i inosu penije. Nije potrebno ispisati jmb$ penionera.
Napraviti klasu TestOsoba koja kreira po jedan objekat klase Osoba- jak i (enioner. odeliti osobi ime (era (eri&0 i matični broj 121266771670. odeliti "aku ime Mika 8ai&0matični broj 161666671670 i prosečnu o&enu .6. odeliti penioneru ime 9ika 9iki&0mati&ni broj 664471667;0 i peniju 23466.6 dinara.
class *soba { -tri$+ i"e = N; -tri$+ prezi"e = N; -tri$+ )"b+; *soba(-tri$+ i"e, -tri$+ prezi"e, -tri$+ )"b+{ if(i"e5=null 66 prezi"e5=null 66 )"b+5=null{ this.i"e = i"e; this.prezi"e = prezi"e; this.)"b+ = )"b+; } else -0ste".out.pri$tl$(reska; } ispisi({ void -0ste".out.pri$tl$(8"e !i"e; -0ste".out.pri$tl$(Prezi"e !prezi"e; -0ste".out.pri$tl$(9: !)"b+; } } class )ak extends *soba { double prose'$a*'e$a; )ak(-tri$+ i"e, -tri$+ prezi"e, -tri$+ )"b+, double prose'$a*'e$a{ &&Poziva se ko$struktor $adklase &&koris'e$)e" re'i super. super(i"e,prezi"e,)"b+; if(prose'$a*'e$a<= 66 prose'$a*'e$a=1 this.prose'$a*'e$a = prose'$a*'e$a; else -0ste".out.pri$tl$(reska5; } ispisi({ void &&Poziva$)e "etode ispisi $adklase &&(klase *soba ko)a 'e da uradi ispis
&&prva tri podatka i"e, prezi"e, )"b+. &&Na ova) $a'i$, kod se $e po$avl)a. super.ispisi(; &&8spis prose'$e o'e$e -0ste".out.pri$tl$(Prose'$a o'e$a !prose'$a*'e$a; } } class Pe$zio$er extends *soba { double pe$zi)a; Pe$zio$er(-tri$+ i"e, -tri$+ prezi"e, -tri$+ )"b+, double pe$zi)a { super(i"e, prezi"e, )"b+; if (pe$zi)a> this.pe$zi)a = pe$zi)a; else -0ste".out.pri$tl$(reska5; } ispisi({ void &&Ne vrsi se poziv "etodi ispisi &&$adklase )er o$a ispisu)e i )"b+ &&a to u ovo" slu'a)u $i)e potreb$o. -0ste".out.pri$tl$(8"e !i"e; -0ste".out.pri$tl$(Prezi"e !prezi"e; -0ste".out.pri$tl$(Pe$zi)a !pe$zi)a; } } class est*soba { public static void "ai$(-tri$+/ ar+s { *soba o = new *soba(Pera,Peri', 1212>>771>?7; )ak d) = new )ak(ika,@azi', 1>1>>>>71>7?,.>; Pe$zio$er p = new Pe$zio$er(Aika,Aiki', >B>BB4471>>7C,234>>.>; &&Poziva se "etoda ispisi klase *soba. o.ispisi(; &&Poziva se redeDi$isa$a "etoda ispisi &&klase )ak. d).ispisi(;
&&Poziva se redeDi$isa$a "etoda ispisi &&klase Pe$zio$er. p.ispisi(; } } < primera se mo!e uočiti nekoliko stvari. 'a obirom na to da klasa jak nasle"uje klasu Osoba- i da klasa Osoba ima ekspli&itno napisan parametriovani konstruktor- i klasa jak mora da ima ekspli&itno napisan konstruktor koji poiva konstruktor nadklase. Ovaj poiv se vr%i u prvoj liniji koda konstruktora klase jak kori%ćenjem reči super0 *linije koje sadr!e komentare se ne računaju kao kod+. Ovim se promovi%e ponovno kori%ćenje koda jer ori$inalni konstruktor vr%i postavljanje vrednosti a atribute ime0- preime0 i jmb$0. (rema tome- u konstruktor klase jak je bilo dovoljno dodati kod a proveru i unos prosečne o&ene. , klasi jak se rede)ini%e metoda ispisi0. 'a obirom na to da ori$inalna metoda *metoda ispisi0 klase Osoba+ već ispisuje na ekranu ime preime i jmb$- rede)inisana metoda poiva ovu ori$inalnu metodu a dodatno je napisan samo onaj deo koda koji se odnosi na ispis prosečne o&ene. 5ede)inisana metoda ispisi0i klase (enioner demonstrira slučaj u kojem nije potrebno povati ori$inalnu metodu. 5alo$ je taj %to se ne tra!i ispis vrednosti svi atributa već samo imena preimena i inosa penije.
'e# je navedeno da podklasa putem nasleđivanja dobija sve atribute i metode nadklase. ,o zna&i da podklasa ima sve elemente kao i nadklasa sa tim što mo!e imati i dodatne atribute i metode. 5rugim re&ima podklasa i nadklasa su donekle kompatibilne. 6bog toga je mogu!e promenljivoj ipa nadklase dodelii objeka podklase . $vo je kompaibilnos klasa . NazivNadklase ob)ekat1 = new NazivPodklase(;
/ko se promenljivoj tipa nadklase dodeli objekat podklase preko te promenljive se mogu pozivai samo meode nadklase iako je o, u su'ini, objeka podklase . /ko se !eli povratiti puna funkcionalnost stvorenog objekta potrebno je izvršiti eksplicitno konvertovanje u podtip (0class cast1) na slede#i na&in Nazivodklase objekat7 8 (Nazivodklase)(objekat9)3 otrebno je napomenuti i slede#u stvar2 pozivi metoda podklase preko promenljive tipa nadklase #e da akiviraju rede#inisane meode iz podklase (ako posoje), a ne originalne . Na ovaj na&in je u "avi omogu#en polimor#izam - pojava da se mo!e pristupati razli&itim tipovima podataka (klasama) preko zajedni&kog interfejsa (zajedni&ke nadklase). Primer 3
Napraviti klasu Vozilo koja ima: ● Atribut naiv čija je početna vrednost N0. ● Metodu postaviNaiv koja kao ulani parametar prima naiv voila i postavlja vrednost atributa naiv na tu vrednost. ● Metodu ispisi koja na ekranu ispisuje naiv voila.
Napraviti klasu TrkackoVozilo koja nasle"uje klasu voilo i ima: ● Atribut maksimalna=rina čija početna vrednost je 6.6. ● Metodu postaviMaksimalnu=rinu koja kao ulani parametar prima maksimalnu brinu i postavlja vrednost atributa maksimalna=rina na tu vrednost. ● 5ede)inisanumMetodu ispisi koja na ekranu ispisuje naiv voila i nje$ovu maksimalnu brinu. Napraviti klasu TestVozila koja kreira jedan objekat klase rka&ko>oilo- ali tako da bude dodeljen promenljivoj tipa >oilo. Naiv voila bi trebal oda bude Audi '; ?0. (ovati metodu a ispis i videti %ta se de%ava. (oku%ati sa unosom maksimalne brine od 36 km@. <vr%iti konvertovanje već postojeće$ objekta u objekat klase rka&ko>oilo- i dodeliti maksimalnu brinu pa ponovo ivr%iti ispis.
class Eozilo { -tri$+ $aziv = N; void postaviNaziv(-tri$+ $aziv{ this.$aziv = $aziv; } ispisi({ void -0ste".out.pri$tl$(Naziv vozila !$aziv; } } class rka'koEozilo extends Eozilo{ double "aksi"al$a:rzi$a = >.>; void postaviaksi"al$u:rzi$u(double "aksi"al$a:rzi$a{ this."aksi"al$a:rzi$a = "aksi"al$a:rzi$a; } ispisi({ void super.ispisi(; -0ste".out.pri$tl$(aksi"al$a brzi$a )e ! "aksi"al$a:rzi$a; } } class estEozilo { "ai$(-tri$+/ ar+s { public static void Eozilo v = new rka'koEozilo(; v.postaviNaziv(udi -C ; &&Ne "oze se pozvati "etoda
&&postaviaksi"al$u:rzi$u )er )e &&to "etoda podklase rka'koEozilo &&i $e posto)i u $adklasi Eozilo. &&v.postaviaksi"al$u:rzi$u(; &&Pozva'e se "etoda ispisi klase &&rka'koEozilo, a $e "etoda ispisi &&klase Eozilo. v.ispisi(; &&Ko$vertova$)e posto)e'e+ ob)ekta u &&klasu rka'koEozilo. rka'koEozilo tv = (rka'koEozilo(v; &&ek se sada "oze pozvati "etoda &&postaviaksi"al$u:rzi$u. tv.postaviaksi"al$u:rzi$u(3>; tv.ispisi(; } } , okviru main0 metode klase est>oilo se kreira jedan objekat klase rka&ko>oilo ali se dodeljuje promenljivoj tipa >oilo. Ove dve klase su me"usobno kompatibilne- pa je ovakvo dodeljivanje dovoljeno. edino o$raničenje koje se javlja je to da se sada objekat $leda kro )okus klase >oilo0 pa se ne mo$u poivati metode koje ne pripadaju ovoj klasi. (rema tome- poiv metode postaviMaksimalnu=rinu0 nije mo$uć. ek kada se ekspli&itno ivr%i konvertovanje već postojeće$ objekta u objekat klase rka&ko>oilo- mo$uće je povati i ovu metodu. (otrebno je dodati i to da se pri svakom poivu metode ispisi0 poiva rede)inisana metoda i klase rka&ko>oilo- a ne ori$inalna metoda ispisi0 klase >oilo.
lju$na re$ “#inal” ima svoje specifi&no zna&enje u kontekstu nasleđivanja. vaka klasa koja se ozna&i sa ovom re&i ne mo&e da se dalje nasleđuje j ne mo&e bii nadklasa .
final class NazivKlase { ... } &&Ni)e dozvol)e$o $asleFiva$)e pretGod$e klase &&'lass NazivKlase2 eHte$ds NazivKlase1 { && && ... && &&} adaci
*adaak +
Napraviti klasu ucniApara koja ima2 /tribut marka koji predstavlja naziv proizvođa&a aparata. • /tribut model koji predstavlja naziv modela aparata. • • /tribut ukljucen koji ima vrednost ,:; ako je aparat uklju&en a u suprotnom =;. Konstruktor koji kao ulazne argumente prima vrednosti za marku model i ukljucen (true ili false) i dodeljuje ih • atributima. 5odeljivanje se vrši isklju&ivo ako su unete vrednosti za marku i model razli&iti od null a u suprotnom se ispisuje poruka o grešci. etodu getarka koja vra#a trenutnu vrednost atributa marka. • etodu setarka koja kao ulazni parametar prima naziv proizvođa&a i postavlja vrednost atributa marka na tu • vrednost. /ko je uneta null vrednost ispisuje se poruka o grešci na ekranu. etodu getodel koja vra#a trenutnu vrednost atributa model. • etodu setodel koja kao ulazni parametar prima naziv modela i postavlja vrednost atributa model na tu • vrednost. /ko je uneta null vrednost ispisuje se poruka o grešci na ekranu. etodu ukljuci koja uklju&uje aparat tj. postavlja vrednost atributa ukljucen na ,:;. • etodu iskljuci koja isklju&uje aparat tj. postavlja vrednost atributa ukljucen na =;. • etodu ispisi koja na ekranu ispisuje poruku o marki i modelu aparata kao i to da li je aparat uklju&en. • Napraviti klasu elevizor koja nasleđuje klasu Kucni/parat i ima2 /tribut program koji predstavlja broj programa koji se trenutno prikazuje. o&etna vrednost za atribut program • je 9. Konstruktor koji kao ulazne argumente prima vrednosti za marku model ukljucen (true ili false) i program i • dodeljuje ih atributima. 5odeljivanje se vrši isklju&ivo ako su unete vrednosti za marku i model razli&iti od null i ako je broj programa između 9 i >? a u suprotnom se ispisuje poruka o grešci. etodu promenirogramNavise koja menja program na slede#i. /ko se na televizoru ve# pušta >?. program • program dobija vrednost 9. • etodu promenirogramNanize koja menja program na prethodni. /ko se na televizoru ve# pušta 9. program program dobija vrednost >?. etodu ispisi koja pored poruke o marki modelu i tome da li je uklju&en ispisuje i poruku o tome koji • program se trenutno prikazuje (redefinisati metodu ispisi klase Kucni/parat). Napraviti klasu adio koja nasleđuje klasu Kucni/parat i ima2 /tribut frekvencija koji predstavlja trenutnu frekvenciju koju pušta radio aparat (npr. @AB). o&etna vrednost • za ovaj atribut je @A.B. Konstruktor koji kao ulazne argumente prima vrednosti za marku model ukljucen (true ili false) i frekvenciju • i dodeljuje ih atributima. 5odeljivanje se vrši isklju&ivo ako su unete vrednosti za marku i model razli&iti od null i ako je frekvencija između @A.B i 9?@.? a u suprotnom se ispisuje poruka o grešci. etodu get
class Ku'$iparat {
-tri$+ "arka; -tri$+ "odel; boolean ukl)u'e$; Ku'$iparat(-tri$+ "arka, -tri$+ "odel, boolean ukl)u'e$ { if ("arka 5= null 66 "odel 5= null { this."arka = "arka; this."odel = "odel;
this.ukl)u'e$ = ukl)u'e$;
} else -0ste".out.pri$tl$(reska; } -tri$+ +etarka( { return "arka; } void setarka(-tri$+ "arka { if ("arka 5= null this."arka = "arka; else -0ste".out.pri$tl$(reska; }
-tri$+ +etodel( { return "odel; } void setodel(-tri$+ "odel { if ("odel 5= null this."odel = "odel; else -0ste".out.pri$tl$(reska; } void ukl)u'i({ ukl)u'e$ = true ; } void iskl)u'i({ ukl)u'e$ = false; } void ispisi({ -0ste".out.pri$tl$(arka !"arka; -0ste".out.pri$tl$(odel !"odel; if (ukl)u'e$ -0ste".out.pri$tl$(parat )e ukl)u'e$; else -0ste".out.pri$tl$(parat )e iskl)u'e$; }
} class elevizor extends Ku'$iparat { int pro+ra" = 1;
elevizor(-tri$+ "arka, -tri$+ "odel, boolean ukl)u'e$, int pro+ra" { super("arka, "odel, ukl)u'e$; if (pro+ra" =1 66 pro+ra" <= 4> this.pro+ra" = pro+ra"; else -0ste".out.pri$tl$(reska; } void pro"e$iPro+ra"Navise({ if (pro+ra" < 4> pro+ra"!!; else pro+ra" = 1; } void pro"e$iPro+ra"Na$ize({ if (pro+ra" 1 pro+ra"##; else pro+ra" = 4>; } void ispisi ({ super.ispisi(; -0ste".out.pri$tl$(re$ut$o )e puste$ !pro+ra"!. pro+ra";
} } class Iadio extends Ku'$iparat { double Drekve$'i)a = C7.;
Iadio(-tri$+ "arka, -tri$+ "odel, boolean ukl)u'e$, double Drekve$'i)a { super("arka, "odel, ukl)u'e$; if (Drekve$'i)a = C7. 66 Drekve$'i)a <= 1>C this.Drekve$'i)a = Drekve$'i)a; else -0ste".out.pri$tl$(reska; } double +etJrekve$'i)a( { return Drekve$'i)a; } void setJrekve$'i)a(double Drekve$'i)a { if (Drekve$'i)a = C7. 66 Drekve$'i)a <= 1>C this.Drekve$'i)a = Drekve$'i)a; else -0ste".out.pri$tl$(reska; } void ispisi({ if (ukl)u'e$ -0ste".out.pri$tl$(re$ut$a Drekve$'i)a )e ! Drekve$'i)a; else -0ste".out.pri$tl$(Iadio )e iskl)u'e$; }
} class estKu'$iparat { public static void "ai$(-tri$+/ ar+s {
Ku'$iparat k = new Ku'$iparat(PGilips,-2,true; elevizor t = new elevizor(@, @33,false, 2; Iadio r = new Iadio(-o$0,-I,false,CC.B; k.iskl)u'i(; t.ukl)u'i(; t.pro"e$iPro+ra"Navise(; r.ukl)u'i(; r.setJrekve$'i)a(1>.?; k.ispisi(; t.ispisi(; r.ispisi(; } } *adaak /
Napraviti klasu %roizvod koja ima2 /tribut naziv. • /tribut cena (npr. E>.B dinara). •
•
•
• •
• •
Konstruktor bez ulaznih argumenata koji postavlja vrednosti atributa naziv i cena na 0nepoznat1 i ?.? respektivno. Konstruktor koji kao ulazne argumente prima vrednosti za naziv i cenu i dodeljuje ih atributima samo ako uneti naziv nije null i ako je uneta cena ve#a od nule. suprotnom se ispisuje poruka o grešci a atributi dobijaju vrednosti 0nepoznat1 i ?.? respektivno. etodu getNaziv koja vra#a trenutnu vrednost atributa naziv. etodu setNaziv koja kao ulazni parametar prima naziv proizvoda i postavlja vrednost atributa naziv na tu vrednost. /ko je uneta null vrednost ispisuje se poruka o grešci na ekranu. etodu get*ena koja vra#a trenutnu vrednost atributa cena. etodu set*ena koja kao ulazni parametar prima cenu proizvoda i postavlja vrednost atributa cena na tu vrednost. /ko je uneta cena koja je jednaka ili manja od nule ispisuje se poruka o grešci na ekranu.
Napraviti klasu %re0ambeni%roizvod koja nasleđuje klasu roizvod i ima2 /tribut rok,rajanja koji predstavlja datum do kojeg je proizvod upotrebljiv. • Konstruktor bez ulaznih argumenata koji postavlja vrednosti atributa naziv cena i rok,rajanja na 0nepoznat1 • ?.? i trenutni datum. Konstruktor koji kao ulazne argumente prima vrednosti za naziv cenu i rok,rajanja i dodeljuje ih atributima • samo ako uneti naziv nije null ako je uneta cena ve#a od nule i ako se rok trajanja odnosi na datum koji je posle trenutnog. suprotnom se ispisuje poruka o grešci a atributi dobijaju vrednosti 0nepoznat1 ?.? i trenutni datum. Napraviti klasu es%roizvod koja kreira dva objekta klase rehrambeniroizvod. rvi objekat ima naziv 0hleb1 cenu E?.? dinara i rok trajanja do 09B.97.7??A.1. 5rugi objekat ima naziv 0senf1 cenu 97?.B dinara i rok trajanja koji isti&e istog dana kada je i proizveden. rvo objekat kreirati koriš#enjem konstruktora koji ima ulazne argumente a drugi koriš#enjem konstruktora koji nema ulazne argumente. Hspisati nazive i cene oba proizvoda na ekranu. e'enje.
class Proizvod {
-tri$+ $aziv; double 'e$a; Proizvod( { $aziv = $epoz$at; 'e$a = >.>; } Proizvod(-tri$+ $aziv, double 'e$a { if ($aziv 5= null 66 'e$a >{ this.$aziv = $aziv; this.'e$a = 'e$a; } else { this.$aziv = $epoz$at; this.'e$a = >; -0ste". out.pri$tl$(reska; } } double +etLe$a( { return 'e$a; } void setLe$a(double 'e$a { if ('e$a > this.'e$a = 'e$a; else -0ste".out.pri$tl$(reska; }
-tri$+ +etNaziv( { return $aziv; }
void setNaziv(-tri$+ $aziv { if ($aziv 5= null this.$aziv = $aziv; else -0ste".out.pri$tl$(reska; }
} import )ava.util.re+oria$Lale$dar; class PreGra"be$iProizvod extends Proizvod {
re+oria$Lale$dar rokra)a$)a; PreGra"be$iProizvod( { super(; this.rokra)a$)a = new re+oria$Lale$dar(; } PreGra"be$iProizvod(-tri$+ $aziv, double 'e$a, re+oria$Lale$dar rokra)a$)a { super($aziv, 'e$a; if (rokra)a$)a 5= null 66 rokra)a$)a.aDter( new re+oria$Lale$dar( this.rokra)a$)a = rokra)a$)a; else { this.rokra)a$)a = new re+oria$Lale$dar(; -0ste". out.pri$tl$(reska; }
} } import )ava.util.re+oria$Lale$dar; class estProizvod { public static void "ai$(-tri$+/ ar+s {
re+oria$Lale$dar datu" = new re+oria$Lale$dar(; datu".set(2>>7, 11, 1; PreGra"be$iProizvod p1 = new PreGra"be$iProizvod(Gleb, 3>.>, datu"; PreGra"be$iProizvod p2 = new PreGra"be$iProizvod(; p2.setNaziv(se$D; p2.setLe$a(12>.; -0ste".out.pri$tl$(Proizvod !p1.+etNaziv(; -0ste".out.pri$tl$(Le$a !p1.+etLe$a(; -0ste".out.pri$tl$(Proizvod !p2.+etNaziv(; -0ste".out.pri$tl$(Le$a !p2.+etLe$a(; } }
Apstraktne klase
'e# je re&eno da se metoda sastoji iz zaglavlja (povratna vrednost naziv ulazni parametri) i tela (kod koji obezbeđuje funkcionalnost). ovom poglavlju je navedeno da se atributi i metode prenose nasleđivanjem i da je jedan od osnovnih motiva nasleđivanja izbegavanje ponovnog pisanja nekog koda koji je zajedni&ki za više klasa. eđutim kako postupiti u onim situacijama kada je unapred poznato da #e klasa morati da sadr!i određene metode (sa ve# definisanim zaglavljem) ali implementacija tih metoda mo!e da varira u zavisnosti od nekih faktoraJ "ava sadr!i mehanizam apstraktnih klasa koje omogu#avaju rešavanje ovakvih problema. Apsrakne klase predstavljaju klase koje pored obi&nih metoda i atributa imaju i jednu ili više apstraktnih metoda. Apsrakne meode su one metode koje imaju samo deklaraciju ali ne i telo. lasa koja nasleđuje apsraknu klasu mora da implemenira sve apsrakne meode e klase ina&e i ona postaje apstraktna. 5eklaracija apstraktne klase se vrši koriš#enjem klju$ne re$i “absrac” . $va klju&na re& se mora napisati i na po&etku zaglavlja svake apstraktne metode u
okviru apstraktne klase a umesto tela metode se piše znak ta&ka-zarez (031). abstract class Nazivpstrakt$eKlase { tip_atributa1 $azivtributa1; ... tip_atributaN $azivtributaN; tip_povratne_vrednosti $azivetode1({ ...elo "etode 1... } ... tip_povratne_vrednosti $azivetodeN({ ...elo "etode N... } abstract tip_povratne_vrednosti $azivpstrakt$eetode1(; ... abstract tip_povratne_vrednosti $azivpstrakt$eetodeN(; }
'eoma je va!no napomenuti da se ne mo&e napravii objeka (insanca) apsrakne klase . :azlog je taj što bi poziv apstraktne metode vodio ka nedefinisanom ponašanju. lede#a naredba nije dozvoljena i bila bi prijavljena kao greška. Nazivpstrakt$eKlase pro"e$l)iva1 = new Nazivpstrakt$eKlase(;
a druge strane i ovde va!i kompatibilnost klasa pa je dozvoljeno promenljivoj koja je tipa apstraktne klase dodeliti objekat podklase (obi&ne "ava klase). Naziv/pstraktneKlase promenljiva9 8 ne NazivKlase()3 vaka apstraktna klasa predstavlja svojevrstan ugovor jer programer koji piše klasu koja nasleđuje apstraktnu klasu mora da implementira zadate apstraktne metode. odklasa zauzvrat nasleđivanjem dobija sve atribute i metode koje nisu apstraktne.
Primer !
Napraviti apstraktnu klasu aposleni koja ima: Atribut plata koji je realan broj. • Metodu $et(lata koja vraća trenutnu vrednost atributa plata. • • Apstraktnu metodu ira&unaj(latu koja ne vraća ni%ta- ali ima ulani ar$ument koji predstavlja broj sati koji je aposleni radio. Napraviti klasu Kancelarijski"adnik koja nasle"uje klasu 9aposleni i: 5ealiuje metodu ira&unaj(latu. Ova metoda postavlja vrednost atributa plata prema • )ormuli (8AA B 166 C =5OD'A<. Napraviti klasu #enadzer koja nasle"uje klasu 9aposleni i: 5ealiuje metodu ira&unaj(latu. Ova metoda postavlja vrednost atributa plata prema • )ormuli (8AA B 1666 C =5OD'A<. Napraviti klasu Testaposleni i kreirati po jedan objekat klase #an&elarijski5adnik i Menader. <ra&unati i ispisati plate oboji&e ako se na da je Menader radio 26 sati a kan&elarijski radnik 266 sati.
abstract class Aaposle$i { double plata; double +etPlata( { return plata; } abstract void izra'u$a)Platu (int bro)Msati; } class Ka$'elari)skiIad$ik extends Aaposle$i { void izra'u$a)Platu(int bro)Msati { plata = 1>> % bro)Msati; } } class e$adzer extends Aaposle$i { void izra'u$a)Platu(int bro)Msati { plata = 1>>> % bro)Msati; } } class estAaposle$i { "ai$(-tri$+/ ar+s { public static void
Ka$'elari)skiIad$ik k = new Ka$'elari)skiIad$ik(; e$adzer " = new e$adzer(; ".izra'u$a)Platu(2>; k.izra'u$a)Platu(2>>; -0ste".out.pri$tl$(Plata "e$adzera )e !".+etPlata(; -0ste".out.pri$tl$(Plata ka$'elari)sko+ rad$ika )e ! k.+etPlata(; } } #lasa 9aposleni je apstraktna. (ored atributa plata0 i metode $et(lata0 ona ima i apstraktnu metodu ira&unaj(latu0. 'a obirom na to da klase #an&elarijski5adnik i Menader nasle"uju klasu 9aposleni- one moraju da implementiraju apstraktnu metodu ira&unaj(latu0. (late menad!era i kan&elarijsko$ radnika se iračunavaju na dru$ačiji način- pa su i implementa&ije konkretni metoda ira&unaj(latu0 posebne a svaku klasu. adaci *adaak +
Napraviti apstraktnu klasu 1eomerijskoelo koja ima2 /tribut povrsina koji predstavlja površinu geometrijskog tela. • /tribut zapremina koji predstavlja zapreminu geometrijskog tela. • /pstraktnu metodu izracunajovrsinu koja nema ulazne argumente niti povratnu vrednost. • /pstraktnu metodu izracunaj6apreminu koja nema ulazne argumente niti povratnu vrednost. • etodu getovrsina koja vra#a trenutnu vrednost površine geometrijskog tela. re nego što mo!e da vrati tu • vrednost ova metoda mora da pozove metodu izracunajovrsinu da izracuna povrsinu. etodu get6apremina koja vra#a trenutnu vrednost zapremine geometrijskog tela. re nego što mo!e da vrati • tu vrednost ova metoda mora da pozove metodu izracunaj6apreminu da izracuna zapreminu. Napraviti klasu ocka koja nasleđuje klasu %eometrijsko,elo i ima2 /tribut duzinatranice koja predstavlja du!inu stranice kocke. • etode get5uzinatranice i set5uzinatranice. 5uzina stranice mora da bude broj ve#i od nule. Hspisati • poruku o grešci u slu&aju narušavnja ovog ograni&enja. :ealizovanu metodu izracunajovrsinu koja na osnovu du!ine stranice (atribut) postavlja vrednost atributa • povrsina po formuli povrsina 8 duzinatraniceLduzinatraniceLI. :ealizovanu metodu izracunaj6apreminu koja na osnovu du!ine stranice (atribut) postavlja vrednost atributa • zapremina po formuli zapremina 8 duzinatraniceLduzinatraniceLduzinatranice. Napraviti klasu vadar koja nasleđuje klasu %eometrijsko,elo i ima2 /tribut duzina koja predstavlja du!inu kvadra. • /tribut sirina koji predstavlja širinu kvadra. • /tribut visina koji predstavlja visinu kvadra. • $dgovaraju#e get i set metode za sva tri atributa. 5u!ina visina i širina moraju da budu brojevi ve#i od nule. • Hspisati poruku o grešci u slu&aju narušavnja ovih ograni&enja. :ealizovanu metodu izracunajovrsinu koja na osnovu du!ine visine i širine (atributi) postavlja vrednost • atributa povrsina po formuli povrsina 8 7L(duzinaLsirina)+7L(duzinaLvisina)+7L(sirinaLvisina). :ealizovanu metodu izracunaj6apreminu koja na osnovu du!ine visine i širine (atributi) postavlja vrednost • atributa zapremina po formuli zapremina 8 duzinaLsirinaLvisina. Napisati klasu es1eomerijski0ela koja kreira jedan objekat klase Kocka i jedan objekat klase Kvadar. ostaviti du!inu stranice kocke na 7B.Bcm. ostaviti du!inu širinu i visinu kvadra na vrednosti 7? 9? i E? respektivno. Hspisati površine i zapremine kocke i kvadra na ekranu. e'enje.
abstract class eo"etri)skoelo { double povrsi$a; double zapre"i$a; abstract void izra'u$a)Povrsi$u(; abstract void izra'u$a)Aapre"i$u(; double +etPovrsi$a( { izra'u$a)Povrsi$u(; return povrsi$a; } double +etAapre"i$a( { izra'u$a)Aapre"i$u(; return zapre"i$a; }
} class Ko'ka extends eo"etri)skoelo { double duzi$a-tra$i'e; double +etuzi$a-tra$i'e( { return duzi$a-tra$i'e; } void setuzi$a-tra$i'e(double duzi$a-tra$i'e { if (duzi$a-tra$i'e > this.duzi$a-tra$i'e = duzi$a-tra$i'e; else -0ste".out.pri$tl$(reska; } void izra'u$a)Povrsi$u( { povrsi$a = duzi$a-tra$i'e%duzi$a-tra$i'e%?; } void izra'u$a)Aapre"i$u( { zapre"i$a = duzi$a-tra$i'e%duzi$a-tra$i'e%duzi$a-tra$i'e; }
} class Kvadar extends eo"etri)skoelo { double duzi$a; double siri$a; double visi$a; double +etuzi$a( { return duzi$a; } void setuzi$a(double duzi$a { if (duzi$a > this .duzi$a = duzi$a; else -0ste".out.pri$tl$(reska; } double +et-iri$a( { return siri$a; }
void set-iri$a(double siri$a { if (siri$a > this.siri$a = siri$a; else -0ste".out.pri$tl$(reska; } double +etEisi$a( { return visi$a; } void setEisi$a(double visi$a { if (visi$a > this.visi$a = visi$a; else -0ste".out.pri$tl$(reska; } void izra'u$a)Povrsi$u( { povrsi$a = 2%(duzi$a%siri$a!2%(duzi$a%visi$a!2%(siri$a%visi$a; } void izra'u$a)Aapre"i$u( { zapre"i$a = duzi$a%visi$a%siri$a; }
} class esteo"etri)skiGela { public static void "ai$(-tri$+/ ar+s {
Ko'ka ko = new Ko'ka(; ko.setuzi$a-tra$i'e(2.; Kvadar kv = new Kvadar(; kv.setuzi$a(2>; kv.set-iri$a(1>; kv.setEisi$a(3>; -0ste".out.pri$tl$(Povrsi$a ko'ke )e !ko.+etPovrsi$a(; -0ste".out.pri$tl$(Aapre"i$a ko'ke )e !ko.+etAapre"i$a(; -0ste".out.pri$tl$(Povrsi$a kvadra )e !kv.+etPovrsi$a(; -0ste".out.pri$tl$(Aapre"i$a kvadra )e !kv.+etAapre"i$a(; } } *adaak /
Napraviti apstraktnu klasu 2ozilo koja ima2 /tribut marka koji predstavlja marku vozila. • /tribut model koji predstavlja model vozila. • $dgovaraju#e get i set metode za ova dva polja. Nedozvoljene vrednosti za ova dva polja su null tringovi. • slu&aju da se pokuša sa unosom ovih nedozvoljenih vrednosti potrebno je ispisati poruku o grešci na ekranu. /pstraktnu metodu da=iHdeoKopnu koja vra#a boolean vrednost koja ozna&ava da li vozilo mo!e da se kre#e • po kopnu. /pstraktnu metodu da=iHdeo'odi koja vra#a boolean vrednost koja ozna&ava da li vozilo mo!e da se kre#e po • vodi. /pstraktnu metodu da=iHdeo'azduhu koja vra#a boolean vrednost koja ozna&ava da li vozilo mo!e da leti. • etodu ispisi koja na ekranu ispisuje podatke o vozilu C marku model i da li ide po kopnu vodi ili vazduhu. • Napraviti klasu Auomobil koja nasleđuje klasu 'ozilo i ima2
• • •
Hmplementiranu metodu da=iHdeoKopnu koja uvek vra#a ,:; jer automobil mo!e da se kre#e po kopnu. Hmplementiranu metodu da=iHdeo'odi koja uvek vra#a =; jer automobil ne mo!e da se kre#e po vodi. Hmplementiranu metodu da=iHdeo'azduhu koja uvek vra#a =; jer automobil ne mo!e da leti.
Napraviti klasu Avion koja nasleđuje klasu 'ozilo i ima2 • Hmplementiranu metodu da=iHdeoKopnu koja uvek vra#a =; jer avion ne mo!e da se kre#e po kopnu. Hmplementiranu metodu da=iHdeo'odi koja uvek vra#a =; jer avion ne mo!e da se kre#e po vodi. • Hmplementiranu metodu da=iHdeo'azduhu koja uvek vra#a ,:; jer avion mo!e da leti. • • :edefinisanu metodu ispisi koja ispisuje na ekranu poruku o tome da je u pitanju avion i podatke o marki i modelu aviona. Napraviti klasu es2ozila koja kreira po jedan objekat klase /utomobil i /vion. /utomobil je marke ercedes model ;77? dok je avion 4oeing model A>A. Hspisati podatke o oba vozila na ekranu. e'enje.
abstract class Eozilo {
-tri$+ "arka; -tri$+ "odel; -tri$+ +etarka( { return "arka; } void setarka(-tri$+ "arka { if ("arka 5= null this."arka = "arka; else -0ste".out.pri$tl$(reska; } -tri$+ +etodel( { return "odel; } void setodel(-tri$+ "odel { if ("odel 5= null this."odel = "odel; else -0ste".out.pri$tl$(reska; } abstract boolean da@i8dePoKop$u(; abstract boolean da@i8dePoEodi(; abstract boolean da@i8dePoEazduGu(; void ispisi({ -0ste".out.pri$tl$(arka vozila !"arka; -0ste".out.pri$tl$(odel vozila !"odel; if (da@i8dePoKop$u( -0ste". out.pri$tl$(Eozilo "oze da ide po kop$u; if (da@i8dePoEodi( -0ste". out.pri$tl$(Eozilo "oze da ide po vodi; if (da@i8dePoEazduGu( -0ste". out.pri$tl$(Eozilo "oze da leti;
} } class uto"obil extends Eozilo { boolean da@i8dePoKop$u( { return true ; }
boolean da@i8dePoEazduGu( { return false; } boolean da@i8dePoEodi( { return false; }
} class vio$ extends Eozilo { boolean da@i8dePoKop$u( { return false; } boolean da@i8dePoEazduGu( { return true ; } boolean da@i8dePoEodi( { return false; } void ispisi({ -0ste".out.pri$tl$( pita$)u )e avio$; -0ste".out.pri$tl$(arka avio$a !+etarka(; -0ste".out.pri$tl$(odel avio$a !+etodel(; }
} class estEozila { public static void "ai$(-tri$+/ ar+s {
uto"obil a = new uto"obil(; a.setarka(er'edes; a.setodel(O22>; vio$ av = new vio$(; av.setarka(:oei$+; av.setodel(747; a.ispisi(; av.ispisi(; }
M Interfejsi Hnterfejsi predstavljaju korak dalje u odnosu na apstraktne klase. Kod interfejsa su sve meode apsrakne tj. nemaju telo ve# samo deklaraciju. 6bog toga se ispred metode u interfejsu &ak ni ne navodi klju$na re$ “absrac”. Kao i apstraktne klase ni interfejsi ne mogu da imaju pojavljivanja . ored toga što nemaju nijednu konkretnu metodu interfejsi ne mogu da imaju ni aribue ve! samo konsane . 5eklaracija interfejsa se vrši koriš#enjem klju$ne re$i “iner#ace” .
interface Naziv8$terDe)sa { tip_povratne_vrednosti $azivetode1(; ... tip_povratne_vrednosti $azivetodeN(; }
Hntefejs je koncept uz pomo#u koga se razdvaja speci#ikacija meoda (deklaracija) od nji0ove implemenacije . vaka klasa koja implementira interfejs obavezno mora da sadr&i implemenacije svi0 njegovi0 meoda. "edna klasa mo!e istovremeno da implementira više interfejsa i to se ozna&ava uz pomo# klju$ne re$i “implemens” . class NazivKlase implements Naziv8$terDe)sa1,Naziv8$terDe)sa2... { ... }
ogu#e su &ak i situacije u kojima klasa nasleđuje neku drugu klasu i istovremeno implementira jedan ili više interfejsa. class NazivKlase1 extends NazivKlase2 implements Naziv8$terDe)sa1, Naziv8$terDe)sa2... { ... }
"oš je potrebno napomenuti i to da metode koje implementiraju metode iz interfejsa moraju da budu javne jozna$ene klju$nom re$i “public” (više o paketima i nivoima pristupa u narednom poglavlju). Hako interfejsi nisu klase u uobi&ajenom smislu i kod njih va&i kompaibilnos ipova . kontekstu interfejsa to zna&i da se promenljivoj koja je tipa nekog interfejsa uvek mo!e proslediti objekat bilo koje klase koja nasleđuje taj interfejs. Naravno u tom slu&aju se mogu pozivati samo one metode koje se nalaze u interfejsu. Primer $
Napraviti inter)ejs %utomatNovca&nter'ejs koji ima: Metodu uloiNova& koja ne vraća ni%ta- a ima kao ulani ar$ument inos koji se !eli uneti • *npr. 123-4 din+. Metodu podi$niNova& koja ne vraća ni%ta- a ima kao ulani ar$ument inos koji se !eli • podići *npr. 123-4 din+. Napraviti klasu %utomatNovca koja implementira inter)ejs AutomatNov&a
•
•
•
•
Atribut stanje koji predstavlja količinu nov&a koja se nalai u automatu. (očetno stanje je 26666.6 din.
Napraviti klasu Test%utomatNovca koja pravi po jedan objekat klase AutomatNov&a i NapredniAutomatNov&a i ula!e u prvi 3666 din- a i dru$o$ podi!e . dinara.
public interface uto"atNov'a8$terDe)s { uloziNova'(double iz$os; public void podi+$iNova' (double iz$os; public void } public class uto"atNov'a implements uto"atNov'a8$terDe)s{ double sta$)e = >>>.>; uloziNova'(double iz$os{ public void if (iz$os > sta$)e != iz$os; else -0ste".out.pri$tl$(reska; } podi+$iNova'(double iz$os{ public void if (iz$os > 66 sta$)e = iz$os sta$)e #= iz$os; else -0ste".out.pri$tl$(reska; } ispisi({ void -0ste".out.pri$tl$( auto"atu i"a )os !sta$)e! di$ara; } } public class Napred$iuto"atNov'a { double sta$)e = 2>>>>.>; public void uloziNova'(double iz$os{
if (iz$os > { if (iz$os <= 2>>>> sta$)e != iz$os; else -0ste".out.pri$tl$(aksi"al$i iz$os! ko)i se "oze uplatiti )e 2>>>> di$ara; } else -0ste".out.pri$tl$(reska; } podi+$iNova'(double iz$os{ public void if (iz$os > 66 sta$)e = iz$os{ if (iz$os <= 1>>>> sta$)e #= iz$os; else -0ste".out.pri$tl$(aksi"al$i iz$os! ko)i se "oze podi'i )e 1>>>> di$ara; } else -0ste".out.pri$tl$(reska; } ispisi({ void -0ste".out.pri$tl$( auto"atu i"a )os !sta$)e! di$ara; -0ste".out.pri$tl$( aksi"al$i iz$os ko)i se "oze uplatiti )e 2>>>> di$ara ; -0ste".out.pri$tl$( aksi"al$i iz$os ko)i se "oze podi'i )e 1>>>> di$ara ; } } public class estuto"atNov'a { "ai$(-tri$+/ ar+s { public static void uto"atNov'a a = new uto"atNov'a(; a.uloziNova'(3>>>; Napred$iuto"atNov'a $a = new Napred$iuto"atNov'a(; $a.podi+$iNova'(BBBB; a.ispisi(; $a.ispisi(; } } #lase AutomatNov&a i NapredniAutomatNov&a implementiraju inter)ejs AutomatNov&a
Napraviti interfejs SluzbaNabavke koji ima2 etodu dodaj:obu koja ne vra#a ništa a kao ulazni argument prima broj komada određenog proizvoda koji je • potrebno dodati. Napraviti interfejs Sluzba%rodaje koji ima2 etodu prodaj:obu koja ne vra#a ništa a kao ulazni argument prima broj komada određenog proizvoda koji je • potrebno prodati. Napraviti klasu %rodavnica koja implementira interfejse luzbaNabavke i luzbarodaje i ima2 /tribut brojroizvoda koji predstavlja koliko ima komada određenog proizvoda u prodavnici.o&etna vrednost • za ovaj atribut je ?. Hmplementiranu metodu dodaj:obu koja kao ulazni argument prima broj komada određenog proizvoda koji je • potrebno dodati i dodaje ga na brojroizvoda. 5odavanje se vrši samo ako je vrednost ulaznog argumenta ve#a od nule a u suprotnom se ispisuje poruka o grešci. Hmplementiranu metodu prodaj:obu koja kao ulazni argument prima broj komada određenog proizvoda koji je • potrebno prodati i oduzima ga od atributa brojroizvoda. rodaja se vrši samo ako je vrednost ulaznog argumenta ve#a od nule i ako ima dovoljno proizvoda u prodavnici a u suprotnom se ispisuje poruka o grešci. etodu ispisi koja ispisuje koliko ima proizvoda u prodavnici. • Napraviti klasu Skladise koja implementira interfejs luzbaNabavke i ima2 /tribut stanjeNakladistu koji predstavlja koliko ima komada određenog proizvoda u prodavnici.o&etna • vrednost za ovaj atribut je 9???. Hmplementiranu metodu dodaj:obu koja kao ulazni argument prima broj komada određenog proizvoda koji je • potrebno dodati i dodaje ga na stanjeNakladistu. 5odavanje se vrši samo ako je vrednost ulaznog argumenta ve#a od nule a u suprotnom se ispisuje poruka o grešci. etodu skiniatanja koja kao ulazni argument prima broj komada određenog proizvoda koji je potrebno • skinuti sa stanja i oduzima ga od atributa stanjeNakladistu. kidanje sa stanja se vrši samo ako je vrednost ulaznog argumenta ve#a od nule i ako ima dovoljno proizvoda u skladištu a u suprotnom se ispisuje poruka o grešci. Napraviti klasu 3obavljac koja ima2 etodu izvrsiHsporuku koja kao ulazni argument dobija interfejs luzbaNabavke i broj proizvoda koji je • potrebno isporu&iti. Hsporuka robe se vrši pozivom metode dodaj:obu interfejsa luzbaNabavke sa brojem proizvoda kao ulaznim argumentom. Napraviti klasu es%rodavnica koja kreira po jedan objekat klase rodavnica kladiste i 5obavljac. Hspisati koliko ima proizvoda u prodavnici a onda dodati robu (9?? komada) u prodavnicu koriš#enjem metode izvrsiHsporuku klase 5obavljac. otom je potrebno dodati robu (B?? komada) u skladište koriš#enjem metode izvrsiHsporuku klase 5obavljac. onovo ispisati koliko ima proizvoda u prodavnici. e'enje.
public interface -luzbaNabavke { public void doda)Iobu(int koli'i$a;
} public interface -luzbaProda)e { public void proda)Iobu(int koli'i$a;
} public class Prodav$i'a implements -luzbaProda)e, -luzbaNabavke { int bro)Proizvoda = >; public void proda)Iobu(int koli'i$a { if (koli'i$a > 66 bro)Proizvoda = koli'i$a bro)Proizvoda #= koli'i$a; else -0ste".out.pri$tl$(reska;
} public void doda)Iobu(int koli'i$a { if (koli'i$a > bro)Proizvoda != koli'i$a; else -0ste".out.pri$tl$(reska; } public void ispisi({ -0ste".out.pri$tl$( prodav$i'i i"a ! bro)Proizvoda! proizvoda; }
} public class -kladiste implements -luzbaNabavke { int sta$)eNa-kladistu = 1>>>; public void doda)Iobu(int koli'i$a { if (koli'i$a > sta$)eNa-kladistu != koli'i$a; else -0ste".out.pri$tl$(reska; } public void ski$i-a-ta$)a(int koli'i$a { if (koli'i$a > 66 sta$)eNa-kladistu = koli'i$a sta$)eNa-kladistu #= koli'i$a; else -0ste".out.pri$tl$(reska; }
} public class obavl)a' {
&&*vako $apisa$a "etoda izvrsi8sporuku o"o+u'ava klasi obavl)a' &&da vrsi isporuku bilo kakvo) prodav$i'i t). skladistu. 9edi$o )e &&bit$o da ta prodav$i'a t). klasa ko)o" se predstavl)a i"ple"e$tira &&i$terDe)s -luzbaNabavke. public void izvrsi8sporuku(-luzbaNabavke $, int koli'i$a{ $.doda)Iobu(koli'i$a; } } public class estProdav$i'a {
&&*vo )e pri"er kako ista "etoda "oze da opsluzu)e vise klasa ako &&se koriste i$terDe)si. Kada i$terDe)si $e bi bili koris'e$i, &&"orale bi da se u okviru klase obavl)a' $apisu dve "etode &&izvrsi8sporuku ko)e bi, u susti$i, radile isto sa"o bi )ed$a &&bila zaduze$a za klasu -kladiste a dru+a za klasu Prodav$i'a. public static void "ai$(-tri$+/ ar+s{ Prodav$i'a p = new Prodav$i'a(; obavl)a' d = new obavl)a'(; -kladiste s = new -kladiste(; p.ispisi(; &&etodi izvrsi8sporuku se &&ob)ekat klase Prodav$i'a &&-luzbaNabavke. *$da se u &&i$terDe)sa -luzbaNabavke
"oze kao ulaz$i ar+u"e$t proslediti )er ova klasa i"ple"e$tira i$terDe)s okviru "etode izvrsi8sporuku preko poziva "etoda doda)Iobu klase Prodav$i'a.
d.izvrsi8sporuku(p, 1>>; &&etodi izvrsi8sporuku se "oze kao ulaz$i ar+u"e$t proslediti &&ob)ekat klase -kladiste )er ova klasa i"ple"e$tira i$terDe)s &&-luzbaNabavke. *$da se u okviru "etode izvrsi8sporuku preko &&i$terDe)sa -luzbaNabavke poziva "etoda doda)Iobu klase -kladiste. d.izvrsi8sporuku(s, >>; p.ispisi(; } } *adaak /
Napraviti apstraktnu klasu 4uzicki5redjaj koja ima2 /tribut ukljucen koji ima vrednost ,:; ako je uređaj ukljucen a =; ako nije. • /tribut jacina,ona koji predstavlja ja&inu tona na uređaju. :aspon vrednosti za ovaj atribut je od ? do >?. • o&etna vrednost je ?. etodu ukljuci koja uklju&uje uređaj. • etodu iskljuci koja isklju&uje uređaj. • • etodu pojacaj,on koja poja&ava ton za 9 (ako je ton bio B posle poziva metode ima vrednost I). oja&avanje tona se vrši samo ako je ton manji od >?. etodu smanji,on koja smanjuje ton za 9 (ako je ton bio B posle poziva metode ima vrednost >). manjivanje • tona se vrši samo ako je ton ve#i od ?. /pstraktnu metodu ispisi koja ništa ne vra#a a nema ni ulaznih argumenata. • Napraviti interfejs adioomponena koji ima2 etodu promenitanicu koja ne vra#a ništa ali ako ulazni argument prima novu frekvenciju radio stanice. • Napraviti interfejs 63omponena koji ima2 etodu pustiesmu koja ne vra#a ništa ali kao ulazni argument prima broj pesme na *5-u koji je potrebno • pustiti. Napraviti klasu 4uzickiSub koja nasleđuje klasu uzickiredjaj implementira interfejse :adioKomponenta i *5Komponenta i ima2 /tribut frekvencija koji predstavlja trenutnu frekvenciju radio stanice. o&etna vrednost za ovaj atribut je @A.B. • /tribut brojesme koji predstavlja broj pesme sa *5-a koju muzi&ki stub trenutno pušta. • /tribut ukljucen:adio koji ima vrednost ,:; ako muzi&ki stub trenutno pušta muziku sa radija a ina&e • =;. /tribut ukljucen*5 koji ima vrednost ,:; ako muzi&ki stub trenutno pušta muziku sa *5-a a ina&e • =;. Hmplementiranu metodu promenitanicu koja uklju&uje radio komponentu muzi&kog stuba (postavlja vrednost • atributa ukljucen:adio na ,:;) isklju&uje *5 komponentu (postavlja vrednost atributa ukljucen*5 na =;) i postavlja vrednost atributa frekvencija na unetu vrednost. 5odeljivanje nove vrednosti za frekvenciju se vrši samo ako je uneta frekvencija u rasponu @A.B-9?@.?. suprotnom potrebno je dodeliti frekvenciju @A.B. Hmplementiranu metodu pustiesmu koja uklju&uje *5 komponentu muzi&kog stuba (postavlja vrednost • atributa ukljucen*5 na ,:;) isklju&uje radio komponentu (postavlja vrednost atributa ukljucen:adio na =;) i postavlja vrednost atributa brojesme na unetu vrednost. 5odeljivanje nove vrednosti za broj pesme se vrši samo ako je uneti broj u rasponu 9 do 79. suprotnom potrebno je pustiti prvu pesmu sa *5-a. Hmplementiranu metodu ispisi koja na ekranu ispisuje poruku o tome da li je muzi&ki stub uklju&en. /ko jeste • metoda ispisuje i poruku o tome koja je trenutna ja&ina tona. ored toga ova metoda bi trebalo da ako je uklju&ena radio komponenta muzi&kog stuba ispiše frekvenciju radio stanice a ako je uklju&en *5 broj pesme koja se trenutno pušta. /ko stub nije uklju&en ne ispisuje se ništa drugo osim poruke da je isklju&en. Napraviti klasu es4uzickiSub koja kreira jedan objekat klase uzickitub uklju&uje ga poja&ava ton za 7 podešava frekvenciju radija na @@.G i ispisuje na ekranu podatke o muzi&kom stubu. e'enje.
public abstract class uzi'kired)a) {
boolean ukl)u'e$; int )a'i$ao$a = >; void ukl)u'i({ ukl)u'e$ = true ; } void iskl)u'i({ ukl)u'e$ = false; } void po)a'a)o$({ if ()a'i$ao$a < 4> )a'i$ao$a!!; } void s"a$)io$({ if()a'i$ao$a > )a'i$ao$a##; } abstract void ispisi(;
} public interface IadioKo"po$e$ta { void pro"e$i-ta$i'u(double Drekve$'i)a;
} public interface LKo"po$e$ta { void pustiPes"u (int bro)Pes"e;
} public class uzi'ki-tub extends uzi'kired)a) implements IadioKo"po$e$ta, LKo"po$e$ta { double Drekve$'i)a = C7.; int bro)Pes"e; boolean ukl)u'e$Iadio; boolean ukl)u'e$L; public void pro"e$i-ta$i'u(double Drekve$'i)a { ukl)u'e$Iadio = true; ukl)u'e$L = false; if (Drekve$'i)a = C7. 66 Drekve$'i)a <=1>C.> this.Drekve$'i)a = Drekve$'i)a; else this.Drekve$'i)a = C7.;
} public void pustiPes"u(int bro)Pes"e { ukl)u'e$L = true ; ukl)u'e$Iadio = false; if (bro)Pes"e = 1 66 bro)Pes"e <= 21 this.bro)Pes"e = bro)Pes"e; else this.bro)Pes"e = 1; } void ispisi( {
if (ukl)u'e${ -0ste". out.pri$tl$(uzi'ki stub )e ukl)u'e$; -0ste". out.pri$tl$(9a'i$a to$a )e !)a'i$ao$a; if (ukl)u'e$Iadio -0ste". out.pri$tl$(kl)u'e$ )e radio i pusta sta$i'u $a ! Drekve$'i)a! z; if (ukl)u'e$L -0ste".out.pri$tl$(kl)u'e$ )e L i pusta ! bro)Pes"e!. pes"u; } else -0ste".out.pri$tl$(uzi'ki stub )e iskl)u'e$;
} } public class estuzi'ki-tub { public static void "ai$(-tri$+/ ar+s {
uzi'ki-tub "s = new uzi'ki-tub(; "s.ukl)u'i(; "s.po)a'a)o$(; "s.po)a'a)o$(; "s.pro"e$i-ta$i'u(CC.B; "s.ispisi(; } }
Klasa Object Klasa 7bjec je, u 8avi, nadklasa svi0 klasa . Hako se ni u jednoj "ava klasi eksplicitno ne navodi ovo nasleđivanje ono je uvek prisutno. rirodna posledica toga je da promenljiva ipa 7bjec mo&e da primi insancu bilo koje druge 8ava klase (kompatibilnost tipova). $vo mo!e da bude izuzetno korisno u onim situacijama kada nije unapred poznato kog #e tipa biti neka promenljiva ili ulazni parametar (pogledati 0euals1 metodu dalje u tekstu). Klasa $bject nije ni apstraktna klasa ni interfejs ve# obi&na klasa sa konkretnim atributima i metodama. narednih nekoliko pasusa #e detaljno biti objašnjene samo dve metode koje se &esto koriste2 0totring1 i 0euals1. Hdeja metode “oSring” je da vrati vrednosti svih atributa klase spojene u jedan tring. Na ovaj na&in se lako i brzo mo!e prikazati unutrašnje stanje svakog objekta na ekranu. originalnoj formi ova metoda vra#a samo tring sa nazivom klase i memorijskom adresom objekta koji je pozvao metodu. 5rugim re&ima da bi metoda 0totring1 bila korisna porebno ju je rede#inisai tako da vra#a tring sa vrednostima odgovaraju#ih atributa konkretne klase u kojoj se nalazi. 6aglavlje ove metode je uvek isto i glasi2 public -tri$+ to-tri$+(
etoda “e9uals” je zamišljena tako da poredi dva objekta iste klase i vra#a 0true1 ako su jednaki a 0false1 ako nisu. "ednakost dva objekta iste klase zavisi od toga o kojoj klasi se radi2 dva automobila su 0jednaka1 ako imaju istu registraciju dve osobe su 0jednake1 ako imaju isti mati&ni broj itd. svojoj originalnoj formi ova metoda poredi memorijske lokacije oba objekta i smatra ih jednakim ako se nalaze na istoj poziciji u memoriji. li&no kao i sa 0totring1 metodom i 0euals1
metodu je potrebno redefinisati da bi vršila upoređivanje na pravi na&in. $va metoda je ve# koriš#ena u prethodnim primerima kada je bilo potrebno porediti dve tring vrednosti. :edefinisana varijanta 0euals1 metode iz klase tring poredi dve tring vrednosti slovo po slovo i vra#a 0true1 ako su jednaki a 0false1 ako nisu. 6aglavlje 0euals1 metode glasi ovako2 public boolean eQuals (*b)e't o
o!e se videti da metoda kao ulazni parametar ima objekat tipa $bject. $vo je i dobro i loše. 5obro je zbog toga što se metodi mo!e proslediti objekat bilo koje klase kao ulazni parametar ($bject je nadklasa svih klasa) pa je ovakvo zaglavlje odgovaraju#e za bilo koju klasu. =oše je zbog toga što se pre bilo kakve provere uneti objekat mora eksplicitno konvertovati u odgovaraju#i tip. Kada se govori o konvertovanju tipova potrebno je napomenuti i da postoji operator kojim se mo!e proveriti koje je klase neki objekat. pitanju je “insanceo#” operaor. lede#i izraz vra#a 0true1 ako je objekat zaista te klase a 0false1 ako nije. ob)ekat instanceof NazivKlase
Ota se zapravo dobija koriš#enjem ove dve metodeJ $ne bi trebalo da poslu!e kao konvencija tj. orijentir pri programiranju2 ako se !ele uporediti dva objekta potrebno je pozvati 0euals1 metodu a ako se !eli na ekranu ispisati unutrašnje stanje nekog objekta potrebno je pozvati 0totring1 metodu. Primer (
Napraviti klasu Knjiga koja ima: • Atribut naslov. Atribut autor koji sadr!i ime i preime autora. • Atribut <'=N koji predstavlja jedinstveni identi)ikator knji$e *'trin$+. • Metode $etNaslov- $etAutor i $et<'=N koje vraćaju vrednosti od$ovarajući atributa. • Metode setNaslov- setAutor i set<'=N koje kao ulane parametre dobijaju nove vrednosti a • od$ovarajuće atribute i postavljaju i. 5ede)inisanu metodu to'trin$ klase Obje&t koja vraća jedan 'trin$. Ovaj 'trin$ sadr!i • podatke o knjii: naslov- autor i <'=N u od$ovarajući tekst. 5ede)inisanu metodu eEuals klase Obje&t koja kao ulani ar$ument prima objekat klase • Obje&t- ali se smatra da će se aista unositi objekti klase #nji$a. Ova metoda vraća true ako je vrednost atributa <'=N jednaka <'=N knji$e koja je uneta kao ulani ar$ument. , suprotnom- metoda vraća )alse. Napraviti klasu TestKnjiga koja kreira dva objekta klase #nji$a. (rva knji$a je
public class K$)i+a { -tri$+ $aslov; -tri$+ autor; -tri$+ 8-:N; public -tri$+ +etutor( { return autor;
} setutor(-tri$+ autor { public void if (autor 5= null this.autor = autor; else -0ste".out.pri$tl$(reska; } public -tri$+ +et8-:N( { return 8-:N; } set8-:N(-tri$+ isb$ { public void if (isb$ 5= null 8-:N = isb$; else -0ste".out.pri$tl$(reska; } public -tri$+ +etNaslov( { return $aslov; } public void setNaslov(-tri$+ $aslov { if ($aslov 5= null this.$aslov = $aslov; else -0ste".out.pri$tl$(reska; } public -tri$+ to-tri$+({ return Naslov R!$aslov!R utor !autor! 8-:N !8-:N; } &&SeQualsS "etoda poredi dva ob)ekta iste klase i vra'a true &&ako su )ed$aki a Dalse ako $isu. public boolean eQuals (*b)e't o{ &&*vako se vrsi ko$vertova$)e ('ast iz klase *b)e't u &&klasu K$)i+a. Ko$vertova$)e )e "o+u'e sa"o ako se kao &&ulaz$i ar+u"e$t zaista u$ese ob)ekat klase K$)i+a. ko &&se u$ese ob)ekat bilo ko)e dru+e klase, "etoda 'e da && preki$e sa rado" i po)avi'e se +reska. K$)i+a k = (K$)i+a(o; if (8-:N.eQuals(k.+et8-:N( return true; else return false; } } public class estK$)i+a { public static void "ai$(-tri$+/ ar+s { K$)i+a k1 = new K$)i+a(; k1.setNaslov(8stori)a lepote; k1.setutor("berto Oko; k1.set8-:N(>#234#?7; K$)i+a k2 = new K$)i+a(; k2.setNaslov(8stori)a ruz$o'e;
k2.setutor("berto Oko; k2.set8-:N(>#?7#CB>; if (k1.eQuals(k2 -0ste". out.pri$tl$(K$)i+e su iste; else -0ste".out.pri$tl$(K$)i+e $isu iste; -0ste".out.pri$tl$(k1.to-tri$+(; -0ste".out.pri$tl$(k2.to-tri$+(; &&o+lo )e i ovako )er bi se "etoda &&Sto-tri$+S auto"atski pozvala &&-0ste".out.pri$tl$(k1; &&-0ste".out.pri$tl$(k2; } } adaci *adaak +
Napraviti klasu 4onior koja ima2 /tribut marka • /tribut model • /tribut velicina;krana koji predstavlja du!inu dijagonale ekrana u in&ima (npr. 9A1). • $dgovaraju#e get i set metode za ova tri atributa. Nedozvoljene vrednosti za marku i model su null tringovi a • za dijagonalu svi brojevi manji od 97. slu&aju unosa ovih nedozvoljenih vrednosti potrebno je ispisati poruku o grešci na ekranu. :edefinisanu metodu totring klase $bject koja vra#a jedan tring. $vaj tring sadr!i sve podatke o monitoru2 • marka model i dijagonala uz odgovaraju#i tekst. :edefinisanu metodu euals klase $bject koja kao ulazni argument prima objekat klase $bject ali se smatra • da #e se zaista unositi objekti klase onitor. rvo potrebno je proveriti da li je zaista unet objekat klase onitor pa ako nije ispisati poruku ogrešci na ekranu i vratiti false. /ko jeste unet objekat klase onitor ova metoda vra#a true ako su vrednosti atributa marka model i dijagonala jednaki marki modelu i dijagonali monitora koji je unet kao ulazni argument. suprotnom metoda vra#a false. Napraviti klasu es 4onior koja kreira dva objekta klase onitor. rvi je amsung model Fncaster 9B9n sa dijagonalom 9B1 a drugi je onF model P sa dijagonalom 9A1. roveriti da li je u pitanju isti monitor i ispisati poruku o tome. Nakon toga ispisati podatke o svakom monitoru na ekranu. e'enje.
public class o$itor {
-tri$+ "arka; -tri$+ "odel; int di)a+o$ala; public int +eti)a+o$ala( { return di)a+o$ala; } public void seti)a+o$ala(int di)a+o$ala { if (di)a+o$ala = 12 this .di)a+o$ala = di)a+o$ala; else -0ste".out.pri$tl$(reska; } public -tri$+ +etarka( { return "arka; }
public void setarka(-tri$+ "arka { if ("arka 5= null this."arka = "arka; else -0ste".out.pri$tl$(reska; } public -tri$+ +etodel( { return "odel; } public void setodel(-tri$+ "odel { if ("odel 5= null this."odel = "odel; else -0ste".out.pri$tl$(reska; } public -tri$+ to-tri$+({ return arka "o$itora !"arka! odel !"odel! i)a+o$ala !di)a+o$ala; } public boolean eQuals (*b)e't o{ &&*peratoro" i$sta$'eoD se proverava da li ulaz$i ar+u"e$t &&o zaista sadrzi ob)ekat klase o$itor. if (o instanceof o$itor{ o$itor " = (o$itor(o; if ("arka.eQuals(".+etarka( 66 "odel.eQuals(".+etodel( 66 di)a+o$ala == ".+eti)a+o$ala( return true; else return false; } else { -0ste". out.pri$tl$(reska; return false; }
} } public class esto$itor { public static void "ai$(-tri$+/ ar+s {
o$itor "1 = new o$itor(; "1.setarka(-a"su$+; "1.setodel(-0$'aster 11$; "1.seti)a+o$ala(1;
o$itor "2 = new o$itor(; "2.setarka(-o$0; "2.setodel(T-; "2.seti)a+o$ala(17; if ("1.eQuals("2 -0ste". out.pri$tl$( pita$)u )e isti "o$itor; else -0ste".out.pri$tl$( pita$)u su razli'iti "o$itori;
-0ste".out.pri$tl$("1; -0ste".out.pri$tl$("2; } } *adaak /
Napraviti klasu 7soba koja ima2 /tribut ime. o&etna vrednost ovog atributa je 0N1. • /tribut prezime. o&etna vrednost ovog atributa je 0N1. • /tribut "4% koji predstavlja mati&ni broj predstavljen kao tring.. • $dgovaraju#e get i set metode za ove atribute. Nedozvoljene vrednosti za ime i prezime i "4% su null • tringovi. slu&aju prekora&enja bilo kog od ovih ograni&enja potrebno je ispisati poruku o grešci. :edefinisanu metodu totring klase $bject. $va metoda bi trebalo da vra#a tring koji sadr!i vrednosti imena i • prezimena osobe kao i odgovaraju#i tekst uz to. • :edefinisanu metodu euals klase $bject koja kao ulazni argument prima objekat klase $bject ali se smatra da #e se zaista unositi objekti klase $soba. rvo potrebno je proveriti da li je zaista unet objekat klase $soba pa ako nije ispisati poruku ogrešci na ekranu i vratiti false. /ko jeste unet objekat klase $soba ova metoda vra#a true ako su vrednosti atributa ime prezime i "4% jednaka imenu prezimenu i "4% unete osobe a u suprotnom false. Napraviti klasu es7soba koja kreira dva objekta klase $soba. 5odeliti i jednoj i drugoj osobi ime 0era eri#1 i "4% 09?9?G@?A9??E>1pa proveriti i ispisati poruku o tome da li je u pitanju ista osoba. Nakon toga ispisati podatke o prvoj osobi. e'enje.
public class *soba {
-tri$+ i"e = N; -tri$+ prezi"e = N; -tri$+ 9:; public -tri$+ +et8"e( { return i"e; } public void set8"e(-tri$+ i"e { if (i"e 5= null this .i"e = i"e; else -0ste".out.pri$tl$(reska; } public -tri$+ +et9:( { return 9:; } public void set9:(-tri$+ )"b+ { if ()"b+ 5= null 9: = )"b+; else -0ste".out.pri$tl$(reska; } public -tri$+ +etPrezi"e( { return prezi"e; } public void setPrezi"e(-tri$+ prezi"e { if (prezi"e 5= null this.prezi"e = prezi"e; else -0ste".out.pri$tl$(reska; } public -tri$+ to-tri$+({ return 8"e osobe )e !i"e!; Prezi"e osobe )e !prezi"e! 9: !9:; } public boolean eQuals (*b)e't o{ if (o instanceof *soba{ *soba os = (*soba(o; if (i"e.eQuals(os.+et8"e( 66 prezi"e.eQuals(os.+etPrezi"e( 66 9:.eQuals(os.+et9:( return true; else return false; } else{ -0ste". out.pri$tl$(reska;