Java je široko upo­ra­bljan pro­gram­ski jezik, zato so njegove edin­stve­ne lastnosti dobro znane ka­dro­vskim delavcem. Zato se v začetnih fazah razgovora pogosto za­sta­vlja­jo vprašanja o različnih vidikih Jave. Sestavili smo seznam desetih naj­po­go­stej­ših vprašanj za raz­vi­jal­ce Jave in dodali odgovore na vsako od njih.

Ta članek ponuja pregled mo­re­bi­tnih vprašanj, ki vam jih lahko zastavijo o Javi na razgovoru za delovno mesto raz­vi­jal­ca. Glede na raven stro­kov­nih izkušenj, ki se zahtevajo za delovno mesto, so lahko nekatera vprašanja po­drob­nej­ša. Včasih se na raz­go­vo­rih za višja delovna mesta pred­sta­vi­jo scenariji, ki vsebujejo namerne napake ali so očitno za­va­ja­jo­či, da se preizkusi tehnično znanje osebe, ki se poteguje za delovno mesto. Zato je pomembno, da ste na razgovor dobro pri­pra­vlje­ni.

Vprašanje 1: Katere so po­seb­no­sti Jave in kakšne prednosti ponuja ta pro­gram­ski jezik?

Java je zmogljiv in široko upo­ra­bljan jezik, zaradi česar je postal pri­lju­bljen pro­gram­ski jezik za učenje. Java se odlikuje po več edin­stve­nih la­stno­stih, zlasti po načinu uporabe. Ključna prednost Jave je, da se njen kod lahko izvaja na različnih ope­ra­cij­skih sistemih brez kakršnih koli sprememb.

To pri­la­go­dlji­vost omogoča Java Virtual Machine, ki za­go­ta­vlja, da razvoj in uporaba nista omejena na določeno platformo, kar omogoča uporabo kode na več plat­for­mah. To za­go­ta­vlja, da programi delujejo pri­la­go­dlji­vo in učin­ko­vi­to na različnih napravah.

Druga prednost Jave je av­to­mat­sko upra­vlja­nje po­mnil­ni­ka, ki ga za­go­ta­vlja Garbage Collector, kar po­e­no­sta­vlja upra­vlja­nje po­mnil­ni­ških virov in zmanjšuje po­ten­ci­al­ne napake. Poleg tega obsežne stan­dar­dne knjižnice Jave z mnogimi vnaprej pri­pra­vlje­ni­mi funk­ci­ja­mi po­spe­šu­je­jo razvoj aplikacij.

Kot objektno usmerjen pro­gram­ski jezik se Java, podobno kot drugi jeziki v tej ka­te­go­ri­ji, odlikuje po tem, da je mogoče pro­gram­sko opremo lažje mo­de­li­ra­ti, kodo pa večkrat ponovno uporabiti.

Vprašanje 2: Kako Java obravnava večkratno dedovanje?

Načeloma Java ne podpira več­kra­tne­ga dedovanja razredov. To pomeni, da lahko razredi dedujejo samo iz enega razreda. Večkratno dedovanje lahko negativno vpliva na kodo v objektno usmer­je­nem pro­gra­mi­ra­nju, znana težava pa je diamantni problem.

Čeprav večkratno dedovanje ni mogoče za razrede v Javi, se to lahko reši z uporabo vmesnikov. Ker lahko razred v Javi im­ple­men­ti­ra več vmesnikov, lahko deduje funk­ci­o­nal­no­sti iz različnih virov. Ta dodelitev za­go­ta­vlja, da so funkcije jasno opre­de­lje­ne in da ne more pride do težav z več­kra­tnim de­do­va­njem.

Vprašanje 3: Kakšna je razlika med ab­strak­tnim razredom in vmesnikom v Javi?

V Javi se za opre­de­li­tev ab­strak­tnih tipov, ki jih lahko nato im­ple­men­ti­ra­jo druge razrede, upo­ra­blja­jo tako ab­strak­tni razredi kot vmesniki. Obstajajo pomembne razlike, zlasti kar zadeva pravila dedovanja:

  • Dedovanje: V Javi lahko razred deduje samo iz ab­strak­tne­ga razreda. Ab­strak­tni razredi pa ne morejo izvajati več­kra­tne­ga dedovanja, kar pomeni, da je za to treba im­ple­men­ti­ra­ti več vmesnikov.
  • Razmerje med razredi: Ker lahko razred deduje samo iz ab­strak­tne­ga razreda, je uporaba ab­strak­tnih razredov primerna za razmerja »je«, medtem ko so vmesniki bolj primerni za razmerja »lahko«.
  • Kon­kre­tnost: Ab­strak­ten razred lahko vsebuje abstrakte (ne­im­ple­men­ti­ra­ne) in konkretne (im­ple­men­ti­ra­ne) metode ter lahko ima tudi spre­men­ljiv­ke instance. Nasprotno pa vmesniki lahko de­fi­ni­ra­jo le abstrakte metode in konstante. Vse metode v vmesniku so im­pli­ci­tno abstrakte in javne.
  • Funk­ci­o­nal­nost: Abstrakte razrede temeljijo na skupni im­ple­men­ta­ci­ji (in im­ple­men­ta­ci­ji več vmesnikov). Vmesniki pa so zasnovani za de­kla­ri­ra­nje spe­ci­fič­nih funkcij, ki se nato im­ple­men­ti­ra­jo v različnih razredih.

Vprašanje 4: Kakšna je razlika med spre­men­ljiv­ka­mi instance in lokalnimi spre­men­ljiv­ka­mi?

Glavna razlika med spre­men­ljiv­ka­mi instance in lokalnimi spre­men­ljiv­ka­mi je v njihovem obsegu in ži­vljenj­ski dobi. Spre­men­ljiv­ke instance so predvsem lastnosti objekta znotraj razreda. Lokalne spre­men­ljiv­ke pred­sta­vlja­jo začasno ustvar­je­ne vrednosti v določenem obsegu.

Instance spre­men­ljiv­ke

  • Instance spre­men­ljiv­ke so spre­men­ljiv­ke, de­kla­ri­ra­ne na ravni razreda, zunaj metod, kon­struk­tor­jev in blokov.
  • Vsak objekt razreda ima svojo kopijo spre­men­ljiv­ke instance.
  • Do spre­men­ljivk instance se dostopa prek instance razreda. Vrednosti se lahko raz­li­ku­je­jo za vsak objekt razreda.

Lokalne spre­men­ljiv­ke

  • Lokalne spre­men­ljiv­ke so de­kla­ri­ra­ne znotraj metode, kon­struk­tor­ja ali bloka. Njihova ve­ljav­nost je omejena na to de­fi­ni­ra­no območje.
  • Te spre­men­ljiv­ke morajo biti pred uporabo izrecno ini­ci­a­li­zi­ra­ne in obstajajo le za čas izvajanja kodnega bloka.
  • Zunaj kodnega bloka, v katerem so bile de­kla­ri­ra­ne, niso vidne.

Vprašanje 5: Kaj pomenijo izrazi JVM, JDK in JRE in kako se med seboj raz­li­ku­je­jo?

Čeprav se ti izrazi v skrajšani obliki zdijo podobni, so njihove osnovne naloge in obseg v Javi bistveno različni.

Java Virtual Machine (JVM)

  • Java Virtual Machine (JVM) je virtualni stroj, ki služi kot vmesnik med programom Java in osnovno strojno opremo ali ope­ra­cij­skim sistemom, ki izvaja Java bajtni kod.
  • JVM je ključnega pomena, ker lahko kot izvedbeno okolje izvaja isti bajtni kod na različnih ope­ra­cij­skih sistemih, če je na voljo na po­sa­me­znih plat­for­mah. To znatno prispeva k pre­no­slji­vo­sti Jave.
  • To pre­no­slji­vost omogoča Java pre­va­jal­nik, ki prevaja Java izvorno kodo v bajtni kodo, ki jo nato in­ter­pre­ti­ra JVM.

Java razvojni komplet (JDK)

  • Java De­ve­lop­ment Kit (JDK) je celovit razvojni paket, ki združuje različna orodja, ki pomagajo pri razvoju Java aplikacij. Vključuje orodja za ustvar­ja­nje, pre­va­ja­nje in od­pra­vlja­nje napak v apli­ka­ci­jah.
  • JDK vsebuje Java pre­va­jal­nik, Java Virtual Machine (JVM), Java raz­hro­šče­val­nik in Java profiler.
  • Poleg teh orodij JDK vključuje tudi veliko število vnaprej določenih razredov in vmesnikov za pogosto upo­ra­blja­ne funkcije, ki so na voljo v Java API ali Java razredni knjižnici.

Java Runtime En­vi­ro­nment (JRE)

  • Java Runtime En­vi­ro­nment (JRE) za­go­ta­vlja omejeno okolje, v katerem je mogoče izvajati Java apli­ka­ci­je.
  • JRE vsebuje Java Virtual Machine (JVM) in Java API, ki sta potrebna za zagon in izvajanje aplikacij.
  • Razvojna orodja, kot je Java kom­pi­la­tor, niso vključena v JRE, zato ga običajno namestijo končni upo­rab­ni­ki.

Vprašanje 6: Kaj so razredi zbiranja v Javi in za kaj se upo­ra­blja­jo?

V Javi izraz »zbirka razredov« običajno označuje razrede, ki so del okvira Java Col­lec­ti­ons Framework. Ta okvir za­go­ta­vlja stan­dar­di­zi­ran način shra­nje­va­nja, or­ga­ni­zi­ra­nja in upra­vlja­nja skupin objektov. Se­sta­vljen je iz različnih vmesnikov in kon­kre­tnih izvedb po­dat­kov­nih struktur.

Razredi zbiranja se upo­ra­blja­jo za različne namene:

  • Or­ga­ni­za­ci­ja podatkov: omogočajo učin­ko­vi­to or­ga­ni­za­ci­jo podatkov v seznamih, nizih ali ze­mlje­vi­dih.
  • Ma­ni­pu­la­ci­ja podatkov: Za­go­ta­vlja­jo metode za dodajanje, od­stra­nje­va­nje in iskanje elementov.
  • Generično pro­gra­mi­ra­nje: Uporaba ge­ne­rič­nih tipov v razredih zbirke omogoča ustvar­ja­nje ponovno uporabne in tipsko varne kode.
  • Algoritmi: Okvir vsebuje tudi algoritme, ki delujejo na po­dat­kov­nih struk­tu­rah (npr. raz­vr­šča­nje ali iskanje).

Vprašanje 7: Kakšna je razlika med == in equals() v Javi?

== in equals() sta dva različna mehanizma ali ope­ra­ter­ja, ki se upo­ra­blja­ta za pri­mer­ja­vo objektov:

  • Operator == primerja reference objektov, ne pa njihove vsebinske vrednosti. Pri uporabi z objekti == preveri, ali obe referenci kažeta na isti objekt (tj. ali se nanašata na isto območje po­mnil­ni­ka). Nasprotno pa pri pri­mi­tiv­nih po­dat­kov­nih tipih (npr. char, int ali byte) operator primerja vrednosti.
  • Z equals() lahko pri­mer­ja­te vsebino v objektih, da ugotovite, ali so objekti enaki, tudi če so na različnih mestih v po­mnil­ni­ku. Privzeto se equals() obnaša kot == in prevzame logiko pri­mer­ja­ve referenc iz razreda Object. Vendar pa ga je običajno treba prepisati v razredih, ki jih določi uporabnik, da se omogoči smiselna pri­mer­ja­va vsebine.

Vprašanje 8: Za kaj se upo­ra­blja­jo kon­struk­tor­ji?

Kon­struk­tor­ji so posebne metode znotraj razreda, ki se upo­ra­blja­jo za instanco in ini­ci­a­li­za­ci­jo objektov. Štiri glavne naloge kon­struk­tor­jev so:

  • Ini­ci­a­li­za­ci­ja objekta: Kon­struk­tor­ji se upo­ra­blja­jo predvsem za to, da objekt takoj po ustvar­ja­nju postavijo v veljaven in ini­ci­a­li­zi­ran stanje. Atributi se ini­ci­a­li­zi­ra­jo in dodelijo se potrebni viri.
  • Prenos pa­ra­me­trov: Kon­struk­tor­ji lahko spre­je­ma­jo parametre za ustvar­ja­nje različnih primerov razreda z raz­lič­ni­mi la­stnost­mi, kar omogoča ustvar­ja­nje objektov s spe­ci­fič­ni­mi vre­dnost­mi atributov.
  • Upra­vlja­nje kode: Uporaba kon­struk­tor­jev izboljša ber­lji­vost kode, saj se ini­ci­a­li­za­ci­ja objekta lahko izvede ne­po­sre­dno v kon­struk­tor­ju. To tudi po­e­no­sta­vi vzdr­že­va­nje kode, saj je spremembe v logiki ini­ci­a­li­za­ci­je treba opraviti le na enem mestu.
  • Na­sled­stvo: Kon­struk­tor­ji imajo pomembno vlogo v hi­e­rar­hi­ji na­sled­stva. Izpeljana razred običajno pokliče kon­struk­tor osnovnega razreda, da obdela njegovo ini­ci­a­li­za­ci­jo, preden izvede lastne ini­ci­a­li­za­ci­je.

Vprašanje 9: Java uporablja več različnih vrst nizov. Katere so te vrste in kako se med seboj raz­li­ku­je­jo?

V Javi je tip niza pred­sta­vljen s klaso java.lang.String. Ta klasa je primarni način za pred­sta­vi­tev nizov znakov. Ponuja tudi različne možnosti za ma­ni­pu­la­ci­jo in obdelavo nizov:

  • Strin­gBu­il­der: Ta razred se uporablja za učin­ko­vi­to ustvar­ja­nje spre­men­lji­vih nizov v Javi. Za razliko od ne­spre­men­lji­ve­ga razreda String omogoča spremembe brez ustvar­ja­nja nove instance.
  • Nizovni literal: To se nanaša na nize znakov, ki so zapisani v dvojnih na­re­ko­va­jih, na primer "Nice to see you!". Identni nizovni literali si delijo en primer v nizovnem bazenu, da se op­ti­mi­zi­ra uporaba po­mnil­ni­ka.
  • Nizi: Ti se lahko ustvarijo kot nova instanca z uporabo ključne besede new, na primer kot new string ("Nice to see you!"). Instanca se ustvari neodvisno od vsebine.
  • Strin­gBu­ffer: Podobno kot Strin­gBu­il­der ta razred ustvarja spre­men­lji­ve nize. Glavna razlika je, da je Strin­gBu­ffer varen za niti, Strin­gBu­il­der pa ne.

Vprašanje 10: Kaj razlikuje throw od throws?

V Javi se ključni besedi throw in throws upo­ra­blja­ta za obrav­na­va­nje izjem. Kljub tej po­dob­no­sti imata različne namene in se upo­ra­blja­ta v različnih kon­te­kstih:

  • throw se uporablja za ročno sprožitev izjeme. Raz­vi­jal­ci lahko to uporabijo za ge­ne­ri­ra­nje izjeme in njeno po­sre­do­va­nje klicnemu programu.
  • Nasprotno pa throws označuje, da je metoda sposobna sprožiti določeno izjemo. Uporablja se v de­kla­ra­ci­ji metode, da se določi, katere izjeme metoda ne more obdelati, ampak jih namesto tega posreduje kli­ca­te­lju za obdelavo, kar omogoča, da se koda ustrezno odzove.
Go to Main Menu