Professional Documents
Culture Documents
Pitanja Oop2 k1 Ir-Si
Pitanja Oop2 k1 Ir-Si
-Формирање хијерархије пакета само омогућава финије, прегледније груписање класа. Не рачунајући то,
потпакет је као посебан пакет, у односу на натпакет, а самим тим и у односу на други потпакете истог пакета.
Самим тим – имена типова могу бити једнака.
-Приликом позивања конструктора наткласе у конструктору поткласе, super( ) или super(arg1,arg2,…argN), или
ради приступања наслеђеном подобјекту наткласе, најчешће уколико је неко поље или метода наткласе
сакривена именом поља/методе поткласе. super.a=5, b = super.m( ), ….
-Параметри се, суштински, увек преносе по вредности. Код примитивних типова се вредност копира на стек, а
код класних се вредност показивача (адресе) копира на стек, па је то, принципијелно, пренос по референци, јер
се не копира цео објекат. Уколико је потребан пренос по референци примитивних типова (да би се сам
параметар могао променити), могу се користити омотачке класе.
-Деструктори нису потребни, јер се сакупљач ђубрета (garbage collector – GC) бави деалокацијом меморије.
Недостатак се компензује методом public void finalize( ), коју ће GC позвати непосредно пре уништења објекта
(постоји у класи Object, али је потребно преоптеретити да би се прилагодила сопственој употреби). Разлог је
ослобађање заузетих ресурса (али не меморије, него, рецимо, затварање отвореног фајла, или прекид мрежне
конекције, итд).
С обзиром да се не зна када ће метода finalize( ) бити позвана, а уколико је неопходно ослободити неке
необјектне ресурсе у конкретном тренутку, неопходно је написати засебну методу која би могла бити позвана,
било експлицитно, било из методе finalize( ).
-За класу није могуће (и нема смисла), јер је смисао апстрактне класе да нека изведена класа имплементира њене
методе, што, уколико се стави final, неће бити могуће. Из истог разлога се то не може учинити за методу, јер је
надјачавање апстрактне методе подразумевано, а ако ставимо final, то неће бити могуће.
-У језику Јаvа се низови сматрају објектима, док то није случај у језику C++.У језику С++ се декларисањем низа
издваја простор за њега (с обзиром да низови могу да буду и статички, на стеку), док се у језику Java тек
алоцирањем простора на хипу (пошто објекти могу бити само динамички) заузима простор за низ, и поред тога,
у недостатку иницијализације, аутоматски се иницијализује нулама (0, `\0`, false, null), док су у С++ почетне
вредности су случајне. У језику Java постоји аутоматска провера граница низа, приликом индексирања, и десиће
се изузетак у случају индекса ван опсега, а притом, могуће је у сваком тренутку открити дужину низа, помоћу
length поља. Ни једну од претходно наведених функционалности, језик С++ не поседује.
8) Акосу у следећимфајловимадефинисанекласе A и B:
9) Кадакласутребаписатикао final?
-Када желимо да спречимо даље извођење из те класе. Њене методе ће аутоматски све бити коначне, па самим
тим нема ни редефинисања метода, и понашање класе се не може даље мењати, без обзира на стварни тип
објекта.
-Статички блокови се извршавају приликом пуњења класе у меморију: заузме се меморија потребне величине за
сва статичка поља класе (нестатичка се занемарују), сви бајтови заузете меморије се попуњавају нулама (0, `\0`,
false, null), и на крају се постављају вредности статичких поља са иницијализаторима на израчунате вредности
наведених израза , и извршавају се статички иницијализациони блокви по редоследу навођења у дефиницији
класе (не једни па други, него редом, како се наилази у дефиницији класе). Нестатичка поља и иницијализатори
се прескачу.
-Нестатички блокови се извршавају у току стварања нових објеката: заузме се меморија потребне величине у
динамичкој зони меморије, сви бајтови заузете меморије се попуњавају нулама (0, `\0`, false, null), затим се
постављају вредности поља са иницијализаторима на израчунате вредности наведених израза и извршавају се
иницијализациони блокови по редоследу навођења у дефиницији класе (не једни па други, него редом, како се
наилази у дефиницији класе), и на крају се извршава тело одговарајућег конструктора.
-import P.X – увози се само Р.Х, и може се користити без ознаке пакета (уколико не постоји друго Х на месту
увожења)
-Могуће је, у циљу забране да се праве објекти те класе, али да се обезбеде основне функционалности, које би
изведене класе даље допуњавале и проширивале. Понекад има смисла да се за појам издвоји засебна класа, за
неке функционалности које сам по себи има, али без неких додатних функционалности и особина, које су
специфичне од подврсте до подврсте, нема смисла да постоји као објекат.
-Основа је – интерпретативан код, односно превођење изворног кода у бајткод (bytecode), који ће
интерпретирати Јавина виртуелна машина (Java Virtual Machine), коју сваки рачунар поседује. Имплементација
JVM зависи од конкретне платформе, али интерфејс према бајткоду остаје исти. Један бајткод ће се идентично
интерпретирати на произвољној JVM , дакле - JVM је стандардизована.
14) Којајеосновнаразликаизмеђуначинакреирањаобјекатанајезицима C++ и Java?
-C++ дозвољава креирање објеката на стеку, док Java то дозвољава искључиво у динамичкој зони меморије.
-Приступаће се пољу основне класе, зато што је референца типа основне класе. Да су у питању методе, у време
извршавања би се открило на који тип указује референца, и одговарајућа метода би била позвана
(полиморфизам важи за методе, не и за поља).
-Статички угнежђени типови служе као механизам структурирања типова, док унутрашње класе омогућавају
посебан однос између њихових објеката и објеката спољашње класе. Код статички угнежђених класа се могу
непосредно користити само статички чланови окружујуће класе, док је за нестатичке потребан конкретан
објекат. Могу садржати статичке и нестатичке чланове. Објекат унутрашње класе је увек повезан са једним
објектом окружујуће класе – окружујућим објектом. Унутар унутрашње класе се пољима спољашње класе
(статичким и нестатичким) може приступати непосредно, само именовањем.Унутрашња класа не сме да садржи
статичке чланове, изузев финалних статичких поља иницијализованих константним изразом.
-поље х, метода m је у изведеној класи: void m( ) { super.x = 5; }. Претпоставка је да право приступа у основној
класи није приватно, иначе му се свакако не може приступити. Статичком члану се може приступити: Osnovna.x,
што је и препорука за статичке чланове, иако се и статичком члану може приступити преко super
-*.class фајлови садрже бајткод (bytecode), који се мора интерпретирати помоћу Јавине Виртуелне Машине (Java
Virtual Machine – JVM).Интерпретирање бајткода је ефикасно, и платформски независно, али је ипак мање
ефикасно од *.ехе. Са друге стране, *ехе не мора да буде интерпретиран, јер је већ у машинском коду који рачунар
директно може да чита. Међутим, *.ехе је платформски зависно, и неће се извршавати исто (или уопште) на
платформама за које није специфично писан. У .class фајлове се не могу поткрасти вируси са стране, јер то JVM
може да исконтролише, док *.ехе не може бити исконтролисан од стране рачунара.
-За поља: вредност се сме доделити само једном, најчешће приликом иницијализације
-Уништавање: у С++ може доћи до цурења меморије и висећих показивача, јер је програмер одговоран за
деалокацију меморије. У језику Java – питање 5)
-Кад год је у питању final, private, static везивање је статичко, јер је немогуће динамички надјачати методу са тим
модификатима. Дакле (а) не (б) не (ц) не
25)Далисеможедогодитидасенекиобјекатнакојипоказујенекареференцауклониодстранесакупљачађубре
та (garbage collector)? Зашто?
-Могу, зато што је заштићено право приступа „више“ од пакетског права приступа, па све методе из датог пакета
имају приступ пољу. (приватно , пакетско, заштићено, јавно – свако следеће је мање ограничавајуће)
-Намењен је динамичкој провери компатибилности типова (у време извршавања). Резултат је логичког типа.
classOsnovna{ }
classIzvedena extends Osnovna{ }
Osnovna o = new Izvedena();
Osnovna o2 = new Osnovna();
boolean t = o instanceofOsnovna;//true, IzvedenaimasvefunkcionalnostiOsnovne
boolean t2 = o instanceofIzvedena;//true, referenca o pokazujena tip Izvedena
boolean t3 = o2 instanceofOsnovna;//true, jeste tip Osnovna
boolean t4 = o2 instance of Izvedena;//false, Osnovnanemasvefunkcionalnosti
//Izvedene
Бинарни оператор instanceofомогућава проверу безбедности конверзије наниже (downcast).
- Могу. Језик Javaкористи Unicode(UTF-16) скуп, где се карактери представљају са 16 бита (за разлику од ASCII
скупа знакова у традиционалним језицима), па омогућава представљање имена и на, између осталих, ћирилици
-Име пакета мора бити јединствено, стога: ако се пакети користе унутар организације, треба именовати пакете
користећи интерни арбитар имена. Ако се користе широм света, сугестија је користити Интернет домене
инверзним редом, нпр package rs.ac.bg.etf.X. Препорука за развојна окружења је да целокупан код пакета буде у
истом фолдеру, а да се име фолдера користи за име пакета
-Добре стране су да компајлер наглашава ако не постоји руковалац за тај изузетак, и приморава програмера да
обради тај изузетак, док код непроверених то није случај, и постоји вероватноћа да програмер заборави да
обради неки изузетак. Лоше стране су да се евентуални нови изузеци морају додавати на више места, мора се
пазити и на све потенцијалне изузетке које могу бацити све методе које се позивају унутар те методе, обавезни
су try-catch-finally блокови и на местима где не би били потребни, мора се унапред размишљати о свим
потенцијалним изузецима.
-intје примитиван тип, док је Integerкласни тип – омотачка класа за примитиван тип int, и омогућава употребу
вредности примитивног типа тамо где се очекује објекат.
-метода finalize( ) може направити референцу на мртав објекат, и самим тим га „оживети“. С обзиром да се она
позива само једном, то се само једном може и десити. Да се не би створио проблем висећих показивача, објекат
не буде деалоциран, и тиме се „оживи“. Међутим, много боље је – уколико је сам објекат потребан, клонирати га,
и клон преузима стање објекта, а објекат може да буде адекватно деалоциран, као што је иницијално и требало
да се деси.
1. дефинисатиреференцутипаинтерфејса I i;,
2. проследитиреференцунаинтерфејс I каопараметарнекојметоди,
3. створитиобјекаттипаинтерфејсапомоћу new I()?
*Једино када се finally не извршава је када се позове System.exit( ), или JVM пукне.
-Први начин: имплементација интерфејса Runnable, тачније, њене методе void run( )
-Други начин: стварање објекта типа Thread, који представља имплементацију интерфејса Runnable , и који има
имплементацију методе void run( ),мада она не ради ништа, док се не каже другачије.
-Бајткод је резултат превођења кода на језику Java. Он није конкретан машински код, већ неки међукод, и не
може га директно рачунар читати, већ је неопходна Јавина Виртуелна Машина (Јаva Virtual Machine – JVM) да га
интерпретира. Пошто је, обично, интерпретација бајткода спорија од покретања .ехе фајла, који је већ
интерпретиран у машински код, убрзавање се постиже са JIT – just-in-time compilation (dynamic translation). Део
по део кода се преводи у току интерпретирања, уместо да се преведе цео код, па тек онда покрене.
-имплементирати (празан) интерфејc Cloneable, и надјачавање методе clone( ), која постоји у класи Object.
-Не, зато што се не може инстанцијализовати, тј направити објекат интерфејса, и он не може садржати
нестатичка поља која би требало иницијализовати, евентуално, у конструктору. Интерфејс је питање уговора, а
не имплементације, и не брине се око тога како ће се објекат створити, и сл, него само шта може да ради.
43) Штаозначава: (1) this.a, (2) this(a), (3) super.a и (4) super(a)?
-Апстрактна класа сме да има и нестатичка поља и имплементације појединих (чак и свих метода), док интерфејс
сме да садржи само static final поља, и чисте декларације (не сме да има имплементације – дефиниције метода). У
пракси – свака класа која имплементира интерфејс мора да имплементира сваку методу, док класе наслеђене из
апстрактне морају да дефинишу само одређене (то би била предност апстрактних класа).
-Локална класа је унутрашња класа која је дефинисана у блоку неке методе окружујуће класе. Најчешће је
дефинисана у самом телу, мада може да буде и у неком угнежђеном блоку. Једина разлика анонимне и локалне
класе је у непостојању имена код прве, дакле, анонимна класа мора бити локална класа.
46) Накојојидејисезаснивадобрапреносивостпрограмаписанихнајезику Java?
-На идеји превођења кода у платформски независтан бајткод(bytecode), који није машински код, и рачунар не
може директно да га чита.Уместо тога, сходно платформи, интерпретира га Јавина Виртуелна Машина (Java
Virtual Machine – JVM).
47) Какотребапројектоватикласукојанеомогућаваклонирањењенихобјеката, а
подржаваклонирањеобјекатаизведенихкласа?
-Класа не имплементира интерфејс Cloneable, али обезбеђује заштићен clone ( ) метод, који клонира њена поља
коректно. (уколико Оbject.clone( ) не задовољава).
48) Далисеизанонимнекласеможеприступатиформалнимаргументима и
локалнимпроменљивамаокружујућефункције?
-Може им се приступити само ако се декларишу као final, и то ако су декларисани пре класе.
-Интерфејс може да садржи само static final атрибуте, јер у супротном би било захтевано складиштење у
меморију, што се коси са дефиницијом интерфејса.
- void m( ) throws E2; све друго ће се косити са једном или другом декларацијом из интерфејса
-clanза несакривене чланове окружујуће класе, Spolja.clanза сакривене статичке чланове спољашње класе,
Spolja.this.clan за сакривене нестатичке чланове спољашње класе (мада може и за статичке, али није
препоручено. Може и за несакривене, али нема потребе).