Java on laajalti käytetty oh­jel­moin­ti­kie­li, ja sen ai­nut­laa­tui­set omi­nai­suu­det ovat rek­ry­toi­jil­le hyvin tuttuja. Siksi Java-kielen eri osa-alueista kysytään usein haas­tat­te­lun al­ku­vai­hees­sa. Olemme koonneet listan kym­me­nes­tä Java-ke­hit­tä­jil­le usein kysytystä ky­sy­myk­ses­tä ja lisänneet niihin myös vas­tauk­set.

Tässä ar­tik­ke­lis­sa on yh­teen­ve­to ky­sy­myk­sis­tä, joita sinulle saatetaan esittää Java-ke­hit­tä­jän työ­haas­tat­te­lus­sa. Riippuen roolin edel­lyt­tä­mäs­tä am­mat­ti­ko­ke­muk­ses­ta, jotkut ky­sy­myk­set voivat olla yk­si­tyis­koh­tai­sem­pia. Joskus ylemmän tason roolien haas­tat­te­luis­sa esitetään ti­lan­tei­ta, joissa on tar­koi­tuk­sel­li­sia virheitä tai jotka ovat selvästi har­haan­joh­ta­via, jotta voidaan testata hakijan teknistä osaamista. Siksi on tärkeää val­mis­tau­tua haas­tat­te­luun huo­lel­li­ses­ti.

Kysymys 1: Mitkä ovat Javan eri­tyis­piir­teet ja mitä etuja oh­jel­moin­ti­kie­li tarjoaa?

Java on tehokas ja laajalti käytetty kieli, mikä on tehnyt siitä suositun oh­jel­moin­ti­kie­len op­pi­mi­seen. Useat ai­nut­laa­tui­set omi­nai­suu­det tekevät Javasta erottuvan, eri­tyi­ses­ti sen käyt­tö­ta­vois­sa. Javan keskeinen etu on, että sen koodi voi toimia useilla käyt­tö­jär­jes­tel­mil­lä ilman muutoksia.

Tämän jous­ta­vuu­den mah­dol­lis­taa Java Virtual Machine, joka varmistaa, että kehitys ja so­vel­luk­set eivät ole ra­joi­tet­tu­ja tiettyyn alustaan, vaan koodia voidaan käyttää useilla alus­toil­la. Tämä takaa ohjelmien joustavan ja tehokkaan toiminnan eri lait­teil­la.

Toinen Java-kielen etu on Garbage Col­lec­to­rin tarjoama au­to­maat­ti­nen muistin hallinta, joka yk­sin­ker­tais­taa muis­ti­re­surs­sien hallintaa ja vähentää mah­dol­li­sia virheitä. Lisäksi Java-kielen laajat stan­dar­di­kir­jas­tot, jotka si­säl­tä­vät monia valmiita toi­min­to­ja, no­peut­ta­vat so­vel­lus­ten ke­hit­tä­mis­tä.

Ob­jek­ti­suun­tau­tu­nee­na oh­jel­moin­ti­kie­le­nä Java, kuten muutkin tämän luokan kielet, erottuu edukseen, koska oh­jel­mis­to­kom­po­nen­tit voidaan mallintaa helpommin ja koodia voidaan käyttää uudelleen tois­tu­vas­ti.

Kysymys 2: Miten Java kä­sit­te­lee mo­ni­pe­rin­töä?

Pe­ri­aat­tees­sa Java ei tue luokkien mo­ni­pe­rin­tää. Tämä tar­koit­taa, että luokat voivat periä vain yhdestä luokasta. Mo­ni­pe­rin­tö voi vaikuttaa ne­ga­tii­vi­ses­ti ob­jek­ti­suun­tau­tu­neen oh­jel­moin­nin koodiin, ja tunnettu ongelma on ti­mant­tion­gel­ma.

Vaikka mo­ni­pe­rin­tö ei ole mah­dol­lis­ta Java-luokille, tämä voidaan ratkaista ra­ja­pin­to­jen avulla. Koska Java-luokka voi toteuttaa useita ra­ja­pin­to­ja, se voi periä toi­min­to­ja eri lähteistä. Tämä tehtävä varmistaa, että toiminnot on mää­ri­tel­ty selkeästi ja mo­ni­pe­rin­töön liittyvät ongelmat eivät voi ilmetä.

Kysymys 3: Mikä on ero ab­strak­tin luokan ja ra­ja­pin­nan välillä Java-kielessä?

Sekä ab­strak­te­ja luokkia että ra­ja­pin­to­ja käytetään Java-kielessä ab­strak­tien tyyppien mää­rit­te­le­mi­seen, jotka voidaan sitten toteuttaa muissa luokissa. Niiden välillä on mer­kit­tä­viä eroja, eri­tyi­ses­ti pe­rin­tä­sään­tö­jen osalta:

  • Perintö: Java-kielessä luokka voi periä vain ab­strak­tis­ta luokasta. Ab­strak­tit luokat eivät puo­les­taan voi suorittaa mo­ni­pe­rin­töä, mikä tar­koit­taa, että tätä varten on to­teu­tet­ta­va useita ra­ja­pin­to­ja.
  • Luok­ka­suh­de: Koska luokka voi periä vain ab­strak­tis­ta luokasta, ab­strak­tien luokkien käyttö sopii hyvin “on” -suh­tei­siin, kun taas ra­ja­pin­nat sopivat paremmin “voi” -suh­tei­siin.
  • Konk­reet­ti­suus: Abstrakti luokka voi sisältää ab­strak­te­ja (to­teut­ta­mat­to­mia) ja konk­reet­ti­sia (to­teu­tet­tu­ja) metodeja sekä ins­tans­si­muut­tu­jia. Sen sijaan ra­ja­pin­nat voivat mää­ri­tel­lä vain ab­strak­te­ja metodeja ja vakioita. Kaikki ra­ja­pin­nan metodit ovat impli­siit­ti­ses­ti ab­strak­te­ja ja julkisia.
  • Toi­min­nal­li­suus: Ab­strak­tit luokat pe­rus­tu­vat yhteisen to­teu­tuk­sen ja­ka­mi­seen (ja useiden ra­ja­pin­to­jen to­teut­ta­mi­seen). Ra­ja­pin­nat puo­les­taan on suun­ni­tel­tu mää­rit­te­le­mään tiettyjä toi­min­to­ja, jotka sitten to­teu­te­taan eri luokissa.

Kysymys 4: Mikä on ero ins­tans­si­muut­tu­jien ja pai­kal­lis­ten muut­tu­jien välillä?

Ins­tans­si­muut­tu­jien ja pai­kal­lis­ten muut­tu­jien pää­asial­li­nen ero on niiden laa­juu­des­sa ja elin­kaa­res­sa. Ins­tans­si­muut­tu­jat ovat pää­asias­sa luokan sisällä olevan objektin omi­nai­suuk­sia. Pai­kal­li­set muuttujat edustavat vä­liai­kai­ses­ti luotuja arvoja tietyssä laa­juu­des­sa.

Ins­tans­si­muut­tu­jat

  • Ins­tans­si­muut­tu­jat ovat muuttujia, jotka on mää­ri­tel­ty luok­ka­ta­sol­la, me­ne­tel­mien, kon­struk­to­rien ja lohkojen ul­ko­puo­lel­la.
  • Jo­kai­sel­la luokan ob­jek­til­la on oma kopionsa ins­tans­si­muut­tu­jas­ta.
  • Ins­tans­si­muut­tu­jia käytetään luokan ins­tans­sin kautta. Arvot voivat vaihdella luokan kunkin objektin välillä.

Pai­kal­li­set muuttujat

  • Pai­kal­li­set muuttujat mää­ri­tel­lään metodin, kon­struk­to­rin tai lohkon sisällä. Niiden voi­mas­sao­lo rajoittuu tähän mää­ri­tel­tyyn alueeseen.
  • Nämä muuttujat on alus­tet­ta­va ni­men­omai­ses­ti ennen käyttöä, ja ne ovat olemassa vain koo­di­loh­kon suo­ri­tuk­sen ajan.
  • Ne eivät ole näkyvissä sen koo­di­loh­kon ul­ko­puo­lel­la, jossa ne on mää­ri­tel­ty.

Kysymys 5: Mitä termit JVM, JDK ja JRE tar­koit­ta­vat ja miten ne eroavat toi­sis­taan?

Vaikka nämä termit voivat näyttää sa­man­kal­tai­sil­ta ly­hen­net­ty­nä, niiden taustalla olevat tehtävät ja laajuus Java-kielessä ovat täysin erilaiset.

Java-vir­tu­aa­li­ko­ne (JVM)

  • Java Virtual Machine (JVM) on vir­tu­aa­li­ko­ne, joka toimii ra­ja­pin­ta­na Java-ohjelman ja sen taustalla olevan lait­teis­ton tai käyt­tö­jär­jes­tel­män välillä ja suorittaa Java-bit­ti­koo­dia.
  • JVM on erittäin tärkeä, koska se on ajo­ym­pä­ris­tö, joka voi suorittaa samaa bytecode-koodia eri käyt­tö­jär­jes­tel­mis­sä, edel­lyt­täen että se on käy­tet­tä­vis­sä ky­sei­sil­lä alus­toil­la. Tämä edistää mer­kit­tä­väs­ti Java-oh­jel­moin­ti­kie­len siir­ret­tä­vyyt­tä.
  • Tämä siir­ret­tä­vyys on mah­dol­lis­ta, koska Java-kääntäjä kääntää Java-läh­de­koo­din by­te­koo­dik­si, jonka JVM sitten tulkitsee.

Java-ke­hi­tys­pa­ket­ti (JDK)

  • Java De­ve­lop­ment Kit (JDK) on kattava ke­hi­tys­pa­ket­ti, joka sisältää erilaisia Java-so­vel­lus­ten ke­hit­tä­mi­seen tar­koi­tet­tu­ja työkaluja. Se sisältää työkaluja so­vel­lus­ten luomiseen, kään­tä­mi­seen ja virheiden kor­jaa­mi­seen.
  • JDK sisältää Java-kääntäjän, Java Virtual Machine (JVM) -vir­tu­aa­li­ko­neen, Java-vir­heen­kor­jaa­jan ja Java-pro­fii­loin­ti­työ­ka­lun.
  • Näiden työ­ka­lu­jen lisäksi JDK sisältää suuren määrän ennalta mää­ri­tel­ty­jä luokkia ja ra­ja­pin­to­ja usein käy­te­tyil­le toi­min­noil­le, jotka ovat käy­tet­tä­vis­sä Java API:ssa tai Java-luok­kir­jas­tos­sa.

Java-ajo­ym­pä­ris­tö (JRE)

  • Java Runtime En­vi­ron­ment (JRE) tarjoaa su­pis­te­tun ym­pä­ris­tön, jossa Java-so­vel­luk­sia voidaan suorittaa.
  • JRE sisältää Java Virtual Machine (JVM) -vir­tu­aa­li­ko­neen ja Java API-so­vel­lus­liit­ty­män, jotka molemmat ovat vält­tä­mät­tö­miä so­vel­lus­ten käyn­nis­tä­mi­sek­si ja suo­rit­ta­mi­sek­si.
  • Ke­hi­tys­työ­ka­lut, kuten Java-kääntäjä, eivät sisälly JRE:hen, joten sen asentaa yleensä lop­pu­käyt­tä­jä.

Kysymys 6: Mitä ovat Java-kielen ke­räys­luo­kat ja mihin niitä käytetään?

Java-kielessä termi ko­koel­ma­luok­ka viittaa yleensä luokkiin, jotka ovat osa Java Col­lec­tions Framework-kehystä. Tämä kehys tarjoaa stan­dar­doi­dun tavan tallentaa, jär­jes­tel­lä ja käsitellä ob­jek­ti­ryh­miä. Se koostuu eri­lai­sis­ta ra­ja­pin­nois­ta ja tie­to­ra­ken­tei­den konk­reet­ti­sis­ta to­teu­tuk­sis­ta.

Ko­koel­ma­luok­kia käytetään eri tar­koi­tuk­siin:

  • Tietojen jär­jes­tä­mi­nen: Ne mah­dol­lis­ta­vat tietojen tehokkaan jär­jes­tä­mi­sen luet­te­loi­hin, jouk­koi­hin tai kart­toi­hin.
  • Tietojen käsittely: Ne tarjoavat me­ne­tel­miä ele­ment­tien li­sää­mi­seen, pois­ta­mi­seen ja et­si­mi­seen.
  • Yleinen oh­jel­moin­ti: Yleisten tyyppien käyttö ko­koel­ma­luo­kis­sa mah­dol­lis­taa uu­del­leen­käy­tet­tä­vän ja tyyp­pi­tur­val­li­sen koodin luomisen.
  • Al­go­rit­mit: Kehys sisältää myös al­go­rit­me­ja, jotka toimivat da­ta­ra­ken­teis­sa (esim. lajittelu tai haku).

Kysymys 7: Mikä on ero == ja equals() välillä Java-kielessä?

== ja equals() ovat kaksi erilaista me­ka­nis­mia tai ope­raat­to­ria, joita käytetään objektien ver­tai­luun:

  • Ope­raat­to­ri == vertaa objektien viitteitä, ei niiden si­säl­tö­ar­vo­ja. Kun sitä käytetään objektien kanssa, == tarkistaa, viit­taa­vat­ko molemmat viitteet samaan objektiin (eli samaan muis­tia­lu­ee­seen). Sen sijaan pri­mi­tii­vis­ten tie­to­tyyp­pien (esim. char, int tai byte) kanssa ope­raat­to­ri vertaa arvoja.
  • Ope­raat­to­ril­la equals() voit verrata objektien sisältöä ja määrittää, ovatko objektit samat, vaikka ne olisivat eri muis­ti­pai­kois­sa. Ole­tuk­se­na equals() toimii kuten ==, perimällä viit­tei­den ver­tai­lu­lo­gii­kan Object-luokasta. Se on kuitenkin yleensä ohi­tet­ta­va käyttäjän mää­rit­tä­mis­sä luokissa, jotta mer­ki­tyk­sel­li­nen sisällön vertailu on mah­dol­lis­ta.

Kysymys 8: Mihin kon­struk­to­rei­ta käytetään?

Kon­struk­to­rit ovat luokassa olevia erityisiä me­ne­tel­miä, joita käytetään objektien ins­tan­soin­tiin ja alus­ta­mi­seen. Kon­struk­to­rien neljä pää­teh­tä­vää ovat:

  • Objektin alus­ta­mi­nen: Kon­struk­to­rei­ta käytetään en­si­si­jai­ses­ti objektin aset­ta­mi­seen kel­vol­li­seen ja alus­tet­tuun tilaan heti sen luomisen jälkeen. Att­ri­buu­tit alus­te­taan ja tar­vit­ta­vat resurssit varataan.
  • Pa­ra­met­rien vä­lit­tä­mi­nen: Kon­struk­to­rit voivat hyväksyä pa­ra­met­re­ja luo­dak­seen erilaisia luokkien ins­tans­se­ja, joilla on vaih­te­le­via omi­nai­suuk­sia, jolloin voidaan luoda objekteja, joilla on tiettyjä att­ri­buut­tien arvoja.
  • Koodin hallinta: Kon­struk­to­rien käyttö parantaa koodin luet­ta­vuut­ta, koska objektien alus­ta­mi­nen voidaan suorittaa suoraan kon­struk­to­ris­sa. Tämä myös yk­sin­ker­tais­taa koodin ylläpitoa, koska alus­tus­lo­gii­kan muutokset on tehtävä vain yhdessä paikassa.
  • Perintö: Kon­struk­to­rit ovat tärkeässä roolissa pe­rin­tä­hie­rar­kias­sa. Johdettu luokka kutsuu tyy­pil­li­ses­ti pe­rus­luo­kan kon­struk­to­ria kä­sit­te­le­mään sen alus­tuk­sen ennen oman alus­tuk­sen­sa suo­rit­ta­mis­ta.

Kysymys 9: Java käyttää useita erilaisia merk­ki­jo­no­tyyp­pe­jä. Mitkä ne ovat ja miten ne eroavat toi­sis­taan?

Java-kielessä merk­ki­jo­no­tyyp­piä edustaa luokka java.lang.String. Tämä luokka on en­si­si­jai­nen tapa esittää merk­ki­jo­no­ja. Se tarjoaa myös erilaisia vaih­toeh­to­ja merk­ki­jo­no­jen kä­sit­te­lyyn ja muok­kaa­mi­seen:

  • String­Buil­der: Tätä luokkaa käytetään muo­kat­ta­vien merk­ki­jo­no­jen te­hok­kaa­seen luomiseen Java-kielessä. Toisin kuin muut­tu­ma­ton String-luokka, se sallii muutokset ilman uuden ins­tans­sin luomista.
  • Merk­ki­jo­no: Tämä viittaa merk­ki­jo­noi­hin, jotka on kir­joi­tet­tu kak­sois­lauseen­merk­kei­hin, esi­mer­kik­si "Nice to see you!". Ident­ti­set merk­ki­jo­not jakavat yhden ins­tans­sin merk­ki­jo­no­poo­lis­sa muistin käytön op­ti­moi­mi­sek­si.
  • Merk­ki­jo­no-objektit: Nämä voidaan luoda uutena ins­tans­si­na käyt­tä­mäl­lä avain­sa­naa new, esi­mer­kik­si new string ("Nice to see you!"). Instanssi luodaan si­säl­lös­tä riip­pu­mat­ta.
  • String­Buf­fer: Kuten String­Buil­der, tämä luokka luo muo­kat­ta­via merk­ki­jo­no­ja. Tärkein ero on, että String­Buf­fer on säi­kei­tur­val­li­nen, kun taas String­Buil­der ei ole.

Kysymys 10: Mikä ero on throw ja throws välillä?

Java-kielessä avain­sa­no­ja throw ja throws käytetään molemmat poik­keus­ten kä­sit­te­le­mi­seen. Tästä sa­man­kal­tai­suu­des­ta huo­li­mat­ta ne pal­ve­le­vat eri tar­koi­tuk­sia ja niitä käytetään eri yh­teyk­sis­sä:

  • throw käytetään poik­keuk­sen ma­nu­aa­li­seen heit­tä­mi­seen. Ke­hit­tä­jät voivat käyttää tätä poik­keuk­sen luomiseen ja sen vä­lit­tä­mi­seen kut­su­vil­le oh­jel­mil­le.
  • Sen sijaan throws osoittaa, että menetelmä pystyy heit­tä­mään tietyn poik­keuk­sen. Sitä käytetään me­ne­tel­män ju­lis­tuk­ses­sa mää­rit­te­le­mään, mitä poik­keuk­sia menetelmä ei voi käsitellä, vaan ne vä­li­te­tään kut­su­jal­le kä­si­tel­tä­vik­si, jolloin koodi voi reagoida tilanteen mu­kai­ses­ti. 6dff27b7a6034cd684b6e2d27255e1c1
Siirry pää­va­lik­koon