Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat
Vesa Ollikainen & Outi Grotenfelt Rajapinnat Java-kieli ei tue luokkien moniperintää. Jokaisella luokalla voi olla vain yksi välitön yliluokka. Toisinaan olisi edullista, jos aliluokka voisi periä muuttujia ja metodeja useammalta yliluokalta. Rajapintojen avulla voidaan kiertää moniperinnän puute. Luokka perii yhden yliluokan. Luokka voi lisäksi toteuttaa yhden tai useampia rajapintoja. Toteutuksella tarkoitetaan, että rajapinnan määrittämät metodit kirjoitetaan rajapinnan toteuttavassa luokassa. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Rajapinnat Käsitteellisesti rajapinta muistuttaa abstraktia luokkaa, jonka kaikki metodit ovat abstrakteja. Rajapinnat ovat kuitenkin luokkahierarkian ulkopuolella. Rajapinnat ovat koodin modularisuutta edistävä työväline. Rajapinnan toteutus takaa, että määrätyt metodit ovat käytössä kaikissa sen toteuttavissa luokissa. Rajapintojen käyttö vähentää toteutukseen tehtävien muutoksen säteilyä toteuttavan luokan ulkopuolelle. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Rajapinta luokkakaaviossa Luokkakaaviossa luokan ja sen toteuttaman rajapinnan suhde ilmaistaan katkoviivanuolella. Kuvan esimerkki sallii myös laulamattomien lintujen toteutuksen. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Esimerkki rajapinnan määrittelystä Rajapinta Laulava määrää, että kaikissa sen toteuttavissa luokissa on toteutettava metodi laula(). Rajapinta määritetään avainsanalla interface. Kunkin metodin määreinä on public abstract. Määreet ovat voimassa vaikkei niitä kirjoittaisi. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Esimerkki rajapinnan määrittelystä.. Talitiainen- ja Varis-luokat ovat Lintu-luokan aliluokkia. Aliluokat toteuttavat Laulava-rajapinnan. toteutus ilmaistaan implements-avainsanalla jos toteutettavia rajapintoja on useita, ne erotetaan pilkuin. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Esimerkki rajapinnan määrittelystä.. Myös Iskelmätähti-luokka toteuttaa Laulava- rajapinnan. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Esimerkki rajapinnan määrittelystä.. Yllä laulavat-taulukko sisältää viittauksia rajapintoihin. Linnuille on määritetty muni()-metodi. Tarvitaan tyypinmuunnos alaspäin. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Muuttujat rajapinnoissa Rajapintoihin voi määrittää myös muuttujia. Muuttujien määreinä on aina public static final. Nämäkin määreet ovat voimassa ilman kirjoittamista. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Rajapintojen toteutus ja perintä Rajapinnat voivat periä toisia rajapintoja. periytyminen kuvataan extends-avainsanalla kuten luokkien tapauksessa. Rajapinta voi samanaikaisesti periä monta rajapintaa. extends-avainsanan perässä määritettävät perittävät rajapinnat erotetaan pilkuilla. public interface Kissa extends Nisäkäs, Kotieläin { int elämät = 7; void kehrää(); //… } Huomaa, että muuttuja elämät on automaattisesti static ja final. Metodi kehrää on automaattisesti public ja abstract. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Rajapinnat ja tehdasluokka Rajapinnan toteuttavien olioiden luonti voidaan piilottaa tehdasluokkiin. Esimerkissä tehdasluokka luo Laulava-rajapinnan toteuttavia olioita. Vuoron perään Talitiainen- ja Varis-olioita. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Rajapinnat ja tehdasluokka.. Testiluokka ei missään vaiheessa tiedä, mitä rajapinnan toteuttajia on olemassa. Tämä on eristetty tehdasluokkaan. Uuden linnun lisäys ei aiheuttaisi muutoksia testiluokkaan.. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Sisäluokat Sisäluokka on toisen luokan sisällä määritelty luokka. Vain ulkoluokasta (luokasta, jonka sisällä sisäluokka on), pääsee käsiksi sisäluokkaan. Ulkoluokassa on tehtävä ilmentymä sisäluokan oliosta. Sisäluokasta pääsee käsiksi ulkoluokan muuttujiin ja metodeihin. Koskee myös private-määreellä suojattuja. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Esimerkki Tarkastellaan esimerkkinä noppapelin toteutusta: Pelaajat heittävät vuoron perään noppaa. Se voittaa, joka saavuttaa ensimmäisenä sovitun pisterajan. Jos useampi pelaaja saavuttaa pisterajan samalla kierroksella, heistä ensimmäisenä heittänyt voittaa pelin. Määritetään Pelaaja-luokalle nyt sisäluokka Pistelaskuri. Sisäluokka pitää sisällään pelaajan pistemäärän ja siihen liittyvät metodit (mm. nopanheitolla kasvatuksen). Ulkoluokka hyödyntää sisäluokan palveluja. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Esimerkki.. Pistelaskuri on sisäluokka. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Esimerkki.. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Esimerkki.. 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Vesa Ollikainen & Outi Grotenfelt Anonyymi sisäluokka Anonyymi sisäluokka on nimetön rajapinnan toteuttava luokka, joka sijaitsee toisen luokan sisällä. Toteutus annetaan samalla, kun olio luodaan new-avainsanalla. Anonyymiä sisäluokkaa käytetään yleisesti tapahtumakäsittelyn ohjelmointiin. esimerkiksi koodi, joka suoritetaan, kun käyttöliittymäobjektille tehdään jotain (kuten painetaan painiketta). 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
Anonyymi sisäluokka, esimerkki Anonyymi sisäluokka määrittää Laulava- rajapinnan toteutuksen 17.9.2012 Vesa Ollikainen & Outi Grotenfelt
KIITOS! www.metropolia.fi www.facebook.com/MetropoliaAMK Outi.grotenfelt@metropolia.fi