Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

8.8 Rajapinta (Interfaces)

Rajapinta on luokan kaltainen struktuuri, jonka olioita luodaan luokan olioiden tapaan. Rajapinnalla javassa voidaan toteuttaa moniperintä ts. alaluokka voi omata useamman kantaluokan ominaisuuksia. Luokkien kohdallahan tämä ei ole mahdollista, kuten kappaleessa 8 on todettu. Rajapinta sisältää yleensä public abstract -muuntimella toteutettuja metodikutsuja ja public static final -muuntimilla toteutettuja jäsenmuutujia. Rajapinnan idea on pakottaa ohjelmoitsijan ylikirjoittamaan halutut metodit täsmälleen tietyllä muodollisten parametrien määrällä, jotka vastaavat rajapinnassa esiteltyä vartalotonta metodia. Rajapintoja käytetään usein ns. takaisinkutsuttavien metodien kohdalla, joihin perehdytään seuraavalla kurssilla "Tapahtumapohjainen ohjelmointi". Graafiset käyttöliittymät (mm. Windows) on toteutettu tällä menetelmällä.

Rajapinta ja luokka käyttäytyvät hyvin samankaltaisesti. Rajapinta kirjoitetaan omaan tiedostooonsa .java -tyyppinä ja käännetään class -tyypiksi. Pääsääntöisesti kaikkialla voidaan class sanan sijasta käyttää interface -sanaa. Ainoa ero niillä on, että luokkien olioita voidaan muodostaa new -komenolla. Rajapintaa ei voi. Esimerkissä E47 on esitelty rajapinnan käyttötapa.

Esimerkki E47

// Määritellään rajapinta
interface perusHedelma {
  void pilaantua();
  void liiskaantua();
}

Rajapinta perusHedelma sisältää kaksi ominaisuutta pilaantua() ja liiskaantua()

Luokka hedelma käyttää rajapintaa perusHedelma

// luokka joka periytyy rajapinnasta
class hedelma implements perusHedelma {
  private String vari;
  private int paiviaPilaantumiseen;
}

Luokka hedelma sisältää kaksi jäsenmuuttujaa, joihin voi viitata vain luokasta itsestään (private) tai rajapinnan kautta.

Tehdään rajapinta pallomaisetHedelmat

interface pallomaisetHedelmat{
  void kierii();
   void pyorii();
}

Rajapinta pallomaisetHedelmät sisältää siis kaksi ominaisuutta eli kierii() ja pyörii().

Luokasta hedelma periytetään appelsiini -luokka, joka saa metodinsa rajapinnan pallomasetHedelmat avulla.

class appelsiini extends hedelma implements pallomaisetHedelmat{
  private float sade;
}

Nyt teemme koko rakennelmaa testaavan ohjelma E47 (Voit itse kirjoittaa metodit pilaantua(), liiskaantua(), kieria() ja pyoria().

public class E47 {
  public static void main(String args[]){
    appelsiini appelsiini1 = new appelsiini();
    hedelma hedelma1 = (hedelma) appelsiini1; // Olioiden tyyppimuunnokset!!
    perusHedelma perusHedelma1 = (perushedelma) appelsiini1;
    pallomaisetHedelmat pallomaisetHedelmat1 = (pallomaisetHedelmat) appelsiini1;
   
    hedelma1.pilaantuu(); // hedelmät tekevät molempia
    perushedelma1.liiskaantuu();

    perusHedelma1.kierii();  // perusHedelmä ei kieri
    pallomaisetHedelmat1.pyorii(); // mutta pallomaiset hedelmät pyörivät

   appelsiini1.pilaantuu(); // appelsiineilla on kaikkia mainitut ominaisuudet
   appelsiini1.liiskaantuu();
   appelsiini1.kierii();
   appelsiini1.pyorii();
  }
}

Ainoa, mikä enää on jäljellä, on niiden metodien ylikirjoittaminen luokissa hedelma ja appelsiini, jotka on implementoitu rajapintoihin. Ne voidaan jättää lukijan tehtäväksi. Jos haluat, voit kokeilla rajapinnan metodeissa public abstract muuntimia.

Kaikki rajapinnassa määriteltävät muuttujat ovat vakioita, ne ovat automaattisesti public, static, ja final - muuntimilla luotuja, esim.

interface pallomaisetHedelmat {
public double KIERINTAKITKAKERROIN = 0.2323;
  void kierii();
  void pyorii();
}

Mikäli luokkaan halutaan useamman useamman rajapinna ominaisuuksia, voidaan tehdä seuraavasti. Rajapintojen nimet kerrotaan implements -sanan jälkeen pilkulla erotettuna.

public interference sitrusHedelmat{
    public abstract void maistuuKirpealta();
}

class appelsiini extends hedelma implements pallomaisetHedelmat, sitrusHedelmat{
  private float sade;
}

Rajapinnat voivat olla myös tietotyyppeinä. Määrittely tehdään ilman new -komentoa seuraavasti

rajapinnanNimi muuttujanNimi;

Tehtäviä

  1. Tee esimerkki E47 toimivaksi ohjelmaksi

    Vastaus

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava