Luokkaa ja rajapintaa käytetään molemmat uusien viitetyyppien luomiseen. Luokka on kokoelma kenttiä ja metodeja, jotka toimivat kentillä. Rajapinnassa on täysin abstrakteja metodeja eli metodeja, joilla ei ole ketään. Rajapinta on syntaktisesti samanlainen kuin luokka, mutta luokan ja rajapinnan välillä on merkittävä ero, joka on se, että luokka voidaan instantioida, mutta rajapintaa ei voida koskaan instantioida.
Oppikaamme siis lisää eroja luokan ja rajapinnan välillä alla olevan vertailukaavion avulla.
Sisältö: Class Vs Interface
- Vertailukaavio
- Määritelmä
- Keskeiset erot
- Johtopäätös
Vertailukaavio
Vertailun perusta | Luokka | Interface |
---|---|---|
Basic | Luokkaa instantioidaan objektien luomiseksi. | Liittymää ei voi koskaan instantioida, koska metodit eivät pysty suorittamaan mitään toimintoa kutsuttaessa. |
Sana | Luokka | Liittymä |
Käyttömahdollisuuksien määrittely | Luokan jäsenet voivat olla yksityisiä (private), julkisia (public), tai suojattuja (protected). | Liittymävälinteen jäseniä ovat aina julkisia. |
Metodit | Luokan metodit määritellään suorittamaan tietty toiminto. | Liitännän metodit ovat puhtaasti abstrakteja. |
Toteuta/laajenna | Luokka voi toteuttaa minkä tahansa määrän rajapintoja ja laajentaa vain yhden luokan. | Liitännäisrajapinta voi laajentaa useampia rajapintoja, mutta se voi toteuttaa vain yhden luokkansa. |
Konstruktori | Luokalla voi olla konstruktoreita muuttujien alustamiseksi. | Liitännäisellä ei voi koskaan olla konstruktoria, koska siinä ei ole juuri yhtään muuttujaa alustettavaksi. |
Luokan määritelmä
Luokka on tärkeimpiä asioita Java-ohjelmoinnissa Ilman luokkia ei java-ohjelmaa voi toteuttaa. Luokka luo viitetyyppejä ja näitä viitetyyppejä käytetään objektien luomiseen. Luokalla on allekirjoitus ja runko. Luokan allekirjoituksessa on luokan nimi ja tieto, joka kertoo, onko luokka periyttänyt toisen luokan. Luokan rungossa on kenttiä ja metodeja, jotka toimivat näillä kentillä. Luokka luodaan avainsanalla class. Katsotaan, miten luokka julistetaan.
class class_name{/*fields...methods*/}
Kun luokka instantioidaan, jokainen luotu objekti sisältää kopion kentistä ja metodeista mukanaan. Luokan sisällä ilmoitetut kentät ja jäsenet voivat olla staattisia tai ei-stattisia. Staattisten jäsenten arvo on vakio jokaiselle objektille, kun taas ei-staattiset jäsenet alustetaan jokaisessa objektissa eri tavalla sen vaatimuksen mukaan.
Luokan jäsenillä on pääsymääritteet, jotka päättävät jäsenten näkyvyyden ja saavutettavuuden käyttäjälle tai aliluokille. Käytön määritteet ovat public, private ja protected. Luokka voi periytyä toisesta luokasta käyttäen käyttöoikeusspesifikaattoria, joka päättää yläluokan (peritty luokka) jäsenten näkyvyyden alaluokassa (perivä luokka). Näin luokka täyttää tiedon piilottamisen ja kapseloinnin käsitteen olio-ohjelmoinnissa.
Liittymän määritelmä
Liittymä kuuluu myös Javassa määriteltyihin viitetyyppeihin. Rajapinnan merkitys on siinä, että Javassa luokka voi periä vain yhden luokan. Tämän rajoituksen välttämiseksi Javan suunnittelijat ottivat käyttöön rajapinnan käsitteen. Rajapinta on syntaktisesti samanlainen kuin luokka, mutta siitä puuttuu kenttäilmoitus ja rajapinnan sisällä olevilla metodeilla ei ole toteutusta. Rajapinta ilmoitetaan käyttämällä avainsanaa interface. Katsotaanpa rajapinnan julistusta.
interface interface_name {type var_name= value;type method1(parameter-list);type method2(parameter-list);..}
Rajapinta ei määrittele mitään sen sisällä ilmoitettuja metodeja, koska siinä ei ole kenttiä, joilla toimia. Koska mikään rajapinnan sisällä oleva metodi ei suorita mitään toimintoa, rajapintaa ei voida koskaan instantioida. Jos rajapinnalla on jokin kenttäjäsen, se on alustettava niiden julistamisen yhteydessä. Rajapinta ei koskaan sisällä konstruktoreita, koska sillä ei ole kenttäjäseniä, jotka voitaisiin alustaa. Rajapinta siis määrittelee vain sen, mitä luokan on tehtävä, eikä sitä, miten sen on tehtävä.
Kun rajapinta on kerran luotu, sen voi toteuttaa mikä tahansa määrä luokkia avainsanan implements avulla. Mutta rajapinnan toteuttavien luokkien on määriteltävä kaikki rajapinnan sisällä olevat metodit. Rajapinta voi myös periä toisen rajapinnan extend-avainsanalla. Jos luokka toteuttaa rajapinnan, joka laajentaa toisen rajapinnan. Silloin luokan on määriteltävä molempien ketjussa esiintyvien rajapintojen metodit. Rajapinnan sisällä olevien metodien on aina oltava julkisia, koska niitä toteuttavien luokkien on päästävä niihin käsiksi.
Keskeiset erot luokan ja rajapinnan välillä Javassa
- Luokka voidaan instanttisoida luomalla sen objektit. Rajapintaa ei koskaan instantioida, koska rajapinnan sisällä ilmoitetut metodit ovat abstrakteja eivätkä suorita mitään toimintoja, joten minkään rajapinnan instantioinnista ei ole hyötyä.
- Luokka ilmoitetaan käyttämällä avainsanaa class. Samoin rajapinta luodaan käyttämällä avainsanaa interface.
- Luokan jäsenillä voi olla käyttöoikeuden määrittely kuten public, private, protected. Rajapinnan jäsenet ovat kuitenkin aina julkisia, koska niitä toteuttavien luokkien on päästävä niihin käsiksi.
- Luokan sisällä olevat metodit määritellään suorittamaan toiminto luokassa ilmoitetuille kentille. Koska rajapinnasta puuttuu kenttien ilmoittaminen, rajapinnan sisällä olevat metodit ovat puhtaasti abstrakteja.
- Luokka voi toteuttaa kuinka monta rajapintaa tahansa, mutta voi laajentaa vain yhtä yläluokkaa. Rajapinta voi laajentaa minkä tahansa määrän rajapintoja, mutta ei voi toteuttaa yhtään rajapintaa.
- Luokan sisällä on määritelty konstruktoreita, joiden avulla muuttuja saadaan alustettua. Mutta rajapinnalla ei ole konstruktoreita, koska siinä ei ole alustettavia kenttiä. Rajapinnan kentät alustetaan vain niiden julistuksen yhteydessä.
Johtopäätös
Kummallakin luokalla ja rajapinnalla on oma merkityksensä. Luokkaa käytetään silloin, kun halutaan määritellä, miten tehtävä tehtäisiin. Rajapintaa käytetään silloin, kun on tiedettävä, mikä tehtävä on tehtävä.