Java on laialt kasutatav prog­ram­mee­ri­mis­keel ja selle uni­kaal­sed omadused on töö­and­ja­tele hästi teada. Seetõttu küsitakse intervjuu alguses sageli küsimusi Java erinevate aspektide kohta. Oleme koostanud nimekirja kümnest Java-aren­da­ja­tele sageli esi­ta­ta­vast kü­si­mu­sest ja lisanud ka vastused neile.

Käesolev artikkel annab ülevaate või­ma­li­kest kü­si­mus­test, mida teile võib arendaja töö­in­terv­juul Java kohta esitada. Sõltuvalt ame­ti­ko­hale nõutavast töö­ko­ge­mu­sest võivad mõned küsimused olla ük­sik­as­ja­li­ku­mad. Mõnikord esi­ta­takse kõrgemate ame­ti­kohtade in­terv­juu­des stse­naa­riume, mis si­sal­da­vad tahtlikke vigu või on selgelt eksitavad, et testida kan­di­daadi tehnilisi teadmisi. Seetõttu on oluline in­terv­juuks hästi ette val­mis­tuda.

Küsimus 1: Millised on Java eripärad ja milliseid eeliseid pakub see prog­ram­mee­ri­mis­keel?

Java on võimas ja laialt kasutatav keel, mis on muutnud selle po­pu­laar­seks prog­ram­mee­ri­mis­kee­leks. Mitmed uni­kaal­sed omadused teevad Java eriliseks, eriti selle ka­su­ta­mis­viisi poolest. Java peamine eelis on see, et selle koodi saab kasutada eri­ne­va­tes ope­rat­sioo­ni­süs­teemi­des ilma muu­da­tus­teta.

Selline paind­lik­kus on võimalik tänu Java Virtual Machine’ile, mis tagab, et arendus ja ra­ken­da­mine ei ole piiratud konk­reetse plat­vormiga, või­mal­da­des koodi kasutada mitmel plat­vor­mil. See tagab prog­rammide paindliku ja tõhusa töötamise eri­ne­va­tel seadmetel.

Java teine eelis on Garbage Col­lec­tori poolt pakutav au­to­maatne mä­lu­hal­dus, mis liht­sus­tab mälu res­surs­side haldamist ja vähendab või­ma­likke vigu. Lisaks kiirendab Java ula­tus­li­kud stan­dard­tee­gid, mis si­sal­da­vad paljusid valmis funkt­sioone, ra­ken­duste aren­da­mist.

Ob­jek­to­rien­tee­ri­tud prog­ram­mee­ri­mis­kee­lena paistab Java, nagu ka teised selle ka­te­goo­ria keeled, silma sellega, et tark­va­ra­kom­po­nente on lihtsam mo­del­lee­rida ja koodi saab korduvalt taas­ka­su­tada.

Küsimus 2: Kuidas Java käsitleb mit­me­kord­set pärimist?

Põ­hi­mõt­te­li­selt ei toeta Java klasside mit­me­kord­set pä­ran­da­mist. See tähendab, et klassid saavad pärandada ainult ühest klassist. Mit­me­kordne pä­ran­da­mine võib ob­jek­to­rien­tee­ri­tud prog­ram­mee­ri­mises koodile ne­ga­tiiv­selt mõjuda, tuntud prob­lee­miks on tee­mant­prob­leem.

Kuigi Java-klassides ei ole mit­me­kordne pärimine võimalik, saab seda probleemi lahendada liideste abil. Kuna klass võib Java-s rakendada mitut liidest, saab see pärida funkt­sioone eri­ne­va­test al­li­ka­test. See ülesanne tagab, et funkt­sioo­nid on selgelt mää­rat­le­tud ja mit­me­kordse pä­ri­mi­sega seotud probleeme ei teki.

Küsimus 3: Mis vahe on Java abst­rakt­sel klassil ja liidesel?

Java-s ka­su­ta­takse abst­rakt­seid klasse ja liideseid abst­rakt­sete tüüpide mää­rat­le­miseks, mida seejärel saavad rakendada teised klassid. Nende vahel on olulisi erinevusi, eriti pä­ri­mis­ees­kir­jade osas:

  • Pärimine: Java keeles võib klass pärida ainult abst­rakt­sest klassist. Abst­rakt­sed klassid ei saa omakorda teostada mit­me­kord­set pärimist, mis tähendab, et selleks tuleb rakendada mitu liidest.
  • Klasside suhe: Kuna klass saab pärida ainult abst­rakt­selt klassilt, sobib abst­rakt­sete klasside ka­su­ta­mine hästi „on” suhete jaoks, samas kui liidesed sobivad paremini „võib” suhete jaoks.
  • Konk­reet­sus: Abst­raktne klass võib sisaldada abst­rak­teid (ra­ken­da­mata) ja konk­reet­seid (ra­ken­da­tud) meetodeid ning võib omada ka instantsi muutujaid. Seevastu liidesed võivad de­fi­nee­rida ainult abst­rak­teid meetodeid ja konstante. Kõik liidese meetodid on imp­litsiit­selt abst­rakt­sed ja avalikud.
  • Funkt­sio­naal­sus: abst­rakt­sed klassid tuginevad ühise rakenduse ja­ga­misele (ja mitme liidese ra­ken­da­misele). Liidesed on aga mõeldud konk­reet­sete funkt­sioo­nide dek­la­ree­ri­miseks, mis seejärel ra­ken­da­takse eri­ne­va­tes klassides.

Küsimus 4: Mis vahe on instantsi muu­tu­ja­tel ja lo­kaal­se­tel muu­tu­ja­tel?

Instantsi muutujate ja kohalike muutujate peamine erinevus seisneb nende ulatuses ja elueas. Instantsi muutujad on peamiselt klassi objektide omadused. Kohalikud muutujad esindavad ajutiselt loodud väärtusi kindlas ulatuses.

Instantsi muutujad

  • Instantsi muutujad on muutujad, mis on dek­la­ree­ri­tud klassi tasandil, väl­jas­pool meetodeid, konst­ruk­to­reid ja plokke.
  • Igal klassi objektil on oma instantsi muutuja koopia.
  • Instantsi muu­tu­ja­tele pääseb ligi klassi instantsi kaudu. Väärtused võivad klassi iga objekti puhul erineda.

Kohalikud muutujad

  • Kohalikud muutujad dek­la­ree­ri­takse meetodi, konst­ruk­tori või ploki sees. Nende kehtivus on piiratud selle mää­rat­le­tud alaga.
  • Need muutujad tuleb enne ka­su­ta­mist sel­ge­sõ­na­li­selt init­sia­li­see­rida ja need ek­sis­tee­rivad ainult koo­dib­lokki täitmise ajal.
  • Need ei ole nähtavad väl­jas­pool koo­dib­lokki, kus need dek­la­ree­riti.

Küsimus 5: Mida tä­hen­da­vad terminid JVM, JDK ja JRE ning kuidas need üks­tei­sest erinevad?

Kuigi need terminid võivad lü­hen­da­tuna sarnased tunduda, on nende aluseks olevad ülesanded ja ulatus Java raames põ­hi­mõt­te­li­selt erinevad.

Java vir­tuaal­ma­sin (JVM)

  • Java Virtual Machine (JVM) on vir­tuaal­ma­sin, mis toimib liidesena Java programmi ja aluseks oleva riistvara või ope­rat­sioo­ni­süs­teemi vahel, täites Java baitkoodi.
  • JVM on oluline, kuna see on käi­vi­tus­kesk­kond, mis suudab täita sama baitkoodi eri­ne­va­tel ope­rat­sioo­ni­süs­teemi­del, tin­gi­mu­sel et see on vas­ta­va­tel plat­vormi­del kät­te­saa­dav. See aitab oluliselt kaasa Java üle­kan­ta­vu­sele.
  • See üle­kan­ta­vus on võimalik tänu Java kom­pi­laa­to­rile, mis tõlgib Java läh­te­koodi bait­koo­diks, mida JVM seejärel in­terp­re­tee­rib.

Java aren­dus­komp­lekt (JDK)

  • Java De­ve­lop­ment Kit (JDK) on terviklik aren­dus­pa­kett, mis koondab erinevaid tööriistu, mis aitavad Java-ra­ken­duste aren­da­misel. See sisaldab tööriistu ra­ken­duste loomiseks, kom­pi­lee­ri­miseks ja veapa­ran­da­miseks.
  • JDK sisaldab Java kom­pi­laa­to­rit, Java vir­tuaal­ma­si­nat (JVM), Java veapa­ran­da­jat ja Java pro­fii­lija.
  • Lisaks nendele töö­riis­ta­dele sisaldab JDK suurt hulka eel­mää­rat­le­tud klasse ja liideseid sageli ka­su­ta­ta­vate funkt­sioo­nide jaoks, mis on saadaval Java API-s või Java klas­si­raa­ma­tu­ko­gus.

Java-käi­vi­tus­kesk­kond (JRE)

  • Java Runtime En­vi­ron­ment (JRE) pakub vä­hen­da­tud keskkonda, kus saab käivitada Java-rakendusi.
  • JRE sisaldab Java Virtual Machine’i (JVM) ja Java API-d, mis on mõlemad vajalikud ra­ken­duste käi­vi­ta­miseks ja käi­ta­miseks.
  • Aren­dus­va­hen­did, nagu Java kom­pi­laa­tor, ei kuulu JRE-sse, seega ins­tal­livad need ta­va­li­selt lõpp­ka­su­ta­jad.

Küsimus 6: Mis on Java ko­gu­mi­klas­sid ja milleks neid ka­su­ta­takse?

Java keeles viitab termin „ko­gu­mi­klass” ta­va­li­selt klas­si­dele, mis kuuluvad Java Col­lec­tions Fra­meworki. See raamistik pakub stan­dar­di­see­ri­tud viisi objektide rühmade sal­ves­ta­miseks, or­ga­ni­see­ri­miseks ja ma­ni­pu­lee­ri­miseks. See koosneb eri­ne­va­test lii­des­test ja and­me­st­ruk­tuu­ride konk­reet­se­test ra­ken­dus­test.

Ko­gu­mis­klasse ka­su­ta­takse mit­me­su­gus­tel ees­mär­ki­del:

  • Andmete or­ga­ni­see­ri­mine: või­mal­da­vad andmeid tõhusalt or­ga­ni­see­rida ni­me­kir­ja­desse, ko­gu­mi­tesse või kaar­ti­desse.
  • Andmete ma­ni­pu­lee­ri­mine: need pakuvad meetodeid ele­men­tide li­sa­miseks, eemal­da­miseks ja ot­si­miseks.
  • Üldine prog­ram­mee­ri­mine: Üldiste tüüpide ka­su­ta­mine ko­gu­mik­klas­si­des võimaldab luua taas­ka­su­ta­ta­vat ja tüü­bi­kind­lat koodi.
  • Algo­rit­mid: raamistik sisaldab ka algoritme, mis töötlevad and­me­st­ruk­tuure (nt sor­tee­ri­mine või otsimine).

Küsimus 7: Mis vahe on Java keeles numbritel == ja equals()?

== ja equals() on kaks erinevat meh­ha­nismi või ope­raa­to­rit, mida ka­su­ta­takse objektide võrd­le­miseks:

  • Operaator == võrdleb objektide viiteid, mitte nende sisu väärtusi. Objekti puhul kont­rol­lib ==, kas kaks viidet osutavad samale objektile (st kas nad viitavad samale mä­lu­piir­kon­nale). Seevastu pri­mi­tiiv­sete and­me­tüü­pide puhul (nt char, int või byte) võrdleb operaator väärtusi.
  • Ope­raa­toriga equals() saab võrrelda objektide sisu, et kindlaks teha, kas objektid on samad, isegi kui need asuvad eri­ne­va­tes mä­lu­piir­kon­da­des. Vaikimisi käitub equals() nagu ==, pärides viite võrd­le­mise loogika klassist Object. Siiski tuleb seda ta­va­li­selt kasutaja määratud klassides ümber kirjutada, et või­mal­dada sisulist sisu võrd­le­mist.

Küsimus 8: Milleks ka­su­ta­takse konst­ruk­to­reid?

Konst­ruk­to­rid on klassi sees olevad spet­siaal­sed meetodid, mida ka­su­ta­takse objektide ins­tant­siee­ri­miseks ja init­sia­li­see­ri­miseks. Konst­ruk­to­rite neli peamist ülesannet on:

  • Objekti alg­sea­dis­ta­mine: Konst­ruk­to­reid ka­su­ta­takse peamiselt selleks, et viia objekt kohe pärast loomist keh­ti­vasse ja alg­sea­dis­ta­tud olekusse. Alg­sea­dis­ta­takse at­ri­buu­did ja eral­da­takse vajalikud ressursid.
  • Pa­ra­meet­rite edas­ta­mine: Konst­ruk­to­rid võivad vastu võtta pa­ra­meetreid, et luua klassi erinevaid instantsi erinevate oma­dus­tega, või­mal­da­des luua objekte spet­sii­fi­liste atribuudi väär­tus­tega.
  • Koodi haldamine: Konst­ruk­to­rite ka­su­ta­mine parandab koodi loetavust, kuna objekti init­sia­li­see­ri­mine saab toimuda otse konst­ruk­to­ris. See liht­sus­tab ka koodi hooldust, kuna init­sia­li­see­ri­mise loogika muudatusi tuleb teha ainult ühes kohas.
  • Pärimine: Konst­ruk­to­rid mängivad olulist rolli pä­ri­mis­hierar­hias. Tuletatud klass kutsub ta­va­li­selt baas­klassi konst­ruk­tori, et käsitleda selle init­sia­li­see­ri­mist enne omaenda init­sia­li­see­ri­miste tegemist.

Küsimus 9: Java kasutab mitmeid erinevaid string-tüüpe. Millised need on ja kuidas nad üks­tei­sest erinevad?

Java-keeles esindab string-tüüpi klass java.lang.String. See klass on peamine viis mär­gi­jadade esin­da­miseks. Samuti pakub see mit­me­su­gu­seid võimalusi stringide ma­ni­pu­lee­ri­miseks ja tööt­le­miseks:

  • String­Buil­der: Seda klassi ka­su­ta­takse Java-s muu­de­ta­vate stringide tõhusaks loomiseks. Erinevalt muu­tu­ma­tust String-klassist võimaldab see teha muudatusi ilma uut instantsi loomata.
  • String-literaal: See viitab ka­he­kord­sete ju­tu­mär­ki­dega kir­ju­ta­tud mär­gi­jada­dele, näiteks "Nice to see you!". Identsed string-li­te­raa­lid jagavad ühte instantsi string-poolis, et op­ti­mee­rida mälu ka­su­ta­mist.
  • String-objektid: Neid saab luua uue ins­tant­sina, kasutades märksõna new, näiteks new string ("Nice to see you!"). Instants luuakse sõl­tu­ma­tult sisust.
  • String­Buffer: Nagu String­Buil­der, loob ka see klass muu­de­ta­vaid stringe. Peamine erinevus on selles, et String­Buffer on thread-safe, String­Buil­der aga mitte.

Küsimus 10: Mis eristab throw throws?

Java keeles ka­su­ta­takse märksõnu throw ja throws mõlemat erandite kä­sit­le­miseks. Sar­na­susest hoolimata on neil erinevad eesmärgid ja neid ka­su­ta­takse eri­ne­va­tes kon­teks­ti­des:

  • throw ka­su­ta­takse erandite käsitsi te­ki­ta­miseks. Arendajad saavad seda kasutada erandite te­ki­ta­miseks ja nende edas­ta­miseks kutsuvale prog­ram­mile.
  • Seevastu throws näitab, et meetod on võimeline tekitama konk­reetse erandit. Seda ka­su­ta­takse meetodi dek­la­rat­sioo­nis, et täp­sus­tada, milliseid erandeid meetod ei saa käsitleda, vaid edastab need kä­sit­le­miseks kutsujale, või­mal­da­des koodil vastavalt rea­gee­rida.
Go to Main Menu