Abstraktia luokkaa ja käyttöliittymää käytetään ensisijaisesti abstraktioon, mutta ne eroavat toisistaan hyvin. Molemmat ovat Java-ydinosa, mutta niillä on omat sovelluskäytöt. Vaikka molemmat termit saattavat olla synonyymejä toistensa kanssa, niitä ei voida käyttää keskenään.
Näiden kahden välillä on merkittäviä eroja. Vaikka käyttöliittymämenetelmä on oletuksena abstrakti, abstrakti voi sisältää sekä abstrakteja että ei-abstrakteja menetelmiä. No, Java 8: n jälkeen, myös rajapinnoissa on menetelmien toteutuksia, ja niillä voi olla Javassa sekä staattisia että oletusmenetelmiä. Tutkitaan yksityiskohtaisesti näiden kahden eroa.
Java-abstrakti luokka on luokka, joka julistetaan abstraktiksi - se voi sisältää abstrakteja menetelmiä. Se on melko samanlainen kuin Java-käyttöliittymä paitsi, että se voi sisältää oletusmenetelmän toteutuksen. Kuten olio-ohjelmoinnissa, myös Java-abstraktio saavutetaan abstraktien luokkien ja rajapintojen avulla. Java-ohjelmissa abstraktio tarkoittaa merkityksettömien yksityiskohtien piilottamista käyttäjältä, jotta voidaan keskittyä vain olennaisiin yksityiskohtiin tehokkuuden lisäämiseksi ja siten monimutkaisuuden vähentämiseksi. Avainsanaa ”abstrakti” käytetään abstraktin luokan luomiseen juuri ennen luokan avainsanaa luokitteluilmoituksessa.
Abstrakti luokka voi sisältää tai ei sisällä abstraktiomenetelmiä (menetelmät ilman vartaloa), mutta jos luokalla on ainakin yksi abstraktiomenetelmä, se on julistettava abstraktiksi. Ei-abstrakteja menetelmiä voidaan kuitenkin käyttää myös vain abstraktissa luokassa, mutta vain oletuskäyttäytymisen toteuttamiseen. Abstraktin luokan menetelmillä voi olla pääsymuuntajat, kuten yksityiset, julkiset, staattiset ja suojatut, näkyvyystasosta riippuen. Abstraktia luokkaa ei voida pilkkailla eikä se tarjoa 100-prosenttista abstraktiota, koska sillä voi olla konkreettinen menetelmä.
Vaikka käyttöliittymä näyttää luokalta, se ei ole. Koska Java ei tue useita perintöjä, rajapinta on toisinaan ihanteellinen perustaa luokkahierarkialle. Rajapinta on enemmän luokan suunnitelma, jota käytetään myös Java-abstraktioiden saavuttamiseen. Se sisältää abstrakteja menetelmiä ja staattisia vakioita. Yksinkertaisesti sanottuna käyttöliittymä on abstraktien menetelmien kokoelma, jota käytetään määrittelemään käyttäytyminen, joka luokan on toteutettava. Toisin kuin abstraktissa luokassa, käyttöliittymä tarjoaa täydellisen abstraktion Javassa. Siinä voi olla sekä menetelmiä että muuttujia aivan kuten luokassa, mutta käyttöliittymässä ilmoitetut menetelmät ovat oletuksena abstraktit.
Abstrakti luokka | Käyttöliittymä |
Abstrakti avainsana käytetään abstraktin luokan luomiseen ja sitä voidaan käyttää menetelmillä. | Rajapinnan avainsanaa käytetään rajapinnan luomiseen, mutta sitä ei voida käyttää menetelmien kanssa. |
Luokka voi laajentaa vain yhden abstraktin luokan. | Luokka voi toteuttaa useamman kuin yhden käyttöliittymän. |
Abstraktilla luokalla voi olla sekä abstrakteja että ei-abstrakteja menetelmiä. | Käyttöliittymässä voi olla vain abstrakteja menetelmiä. |
Muuttujat eivät ole oletuksena lopullisia. Se voi sisältää ei-lopullisia muuttujia. | Muuttujat ovat oletusarvoisesti loppuja käyttöliittymässä. |
Abstrakti luokka voi tarjota käyttöliittymän toteutuksen. | Rajapinta ei voi tarjota abstraktin luokan toteutusta. |
Sillä voi olla menetelmiä toteutuksineen. | Se tarjoaa absoluuttisen abstraktion, eikä sillä voi olla menetelmien toteutusta. |
Sillä voi olla julkisia, yksityisiä, staattisia ja suojattuja käyttöoikeuksien muuntajia. | Menetelmät ovat implisiittisesti julkisia ja abstrakteja Java-käyttöliittymässä. |
Se ei tue useita perintöjä. | Se tukee useita perintöjä. |
Se on ihanteellinen koodin uudelleenkäyttöön ja evoluutioperspektiiviin. | Se on ihanteellinen tyyppiilmoitukseen. |
Abstraktiossa käytetään sekä abstraktia luokkaa että käyttöliittymää; heillä on kuitenkin kohtuullinen osuus eroista. Tärkein ero näiden kahden välillä perustuu abstraktiomenetelmiin. Vaikka ensimmäisellä voi olla abstraktit menetelmät tai ei, jälkimmäisellä on epäsuorasti abstrakti menetelmä. Abstraktilla luokalla voi olla sekä abstrakteja että ei-abstrakteja menetelmiä. Rajapinnalla puolestaan voi olla vain abstrakteja menetelmiä, joten niillä ei voi olla toteutusta, mikä tarkoittaa yksinkertaisesti, että rajapinnalla ei voi olla ei-abstrakteja menetelmiä. Abstraktia luokkaa ei voida toteuttaa, mikä kieltää objektin luomisen. Toisaalta rajapinta voi näyttää luokalta, mutta se ei ole.