Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

8.5 Periytyminen

Luokan periytymisellä tarkoitetaan luokan kopioimista uudeksi luokaksi. Alkuperäistä luokkaa kutsutaan superluokaksi eli esi-isäksi eli kantaluokaksi ja uutta luokkaa aliluokaksi (subclass) eli alaluokaksi eli jälkeläiseksi.

Kaikilla alaluokasta luoduilla olioilla on oletuksena oikeus käyttää superluokkansa metoja ja jäsenmuuttujia. Oletusta voidaan muuttaa muuntimilla, joihin palaamme kappaleessa 8.5.1.

Alaluokka muodostetaan superluokasta seuraavasti

class alaLuokka extends superLuokka{}

Esimerkissä 42 loimme luokan omena. Teemme tämä avulla uuden luokan soseOmena.

class soseOmena extends omena {
  boolean soseena=false;
  public soseOmena(String vari1, String maku1, boolean matoisuus1, boolean soseena1) {
    vari = vari1; maku = maku1; matoisuus = matoisuus1; soseena = soseena1;
  }
}

ja tälle testiohjelman

class E43 {
  public static void main(String args[]){
    soseOmena pakasteOmenaSose = new soseOmena("Ruskea","hapan",true,true);
    pakasteOmenaSose.tulostaAttribuutit();
  }
}

Kaikki oliot periytyvät javan kantaluokasta java.lang.object.  Tätä voidaan kuvata seuraavasti. (Kuvassa on Omena -luokka vaikka pitäisi olla omena.)

wpeF.jpg (11187 bytes)

Tällöin kutsuttaessa luokan soseOmena jäsenmuuttujaa tai metodia, etsitään sitä ensin luokasta soseOmena. Jos sitä ei löydy, etsitään seuraavasta eli luokasta omena. Jos sieltäkään ei löydy, etsitään luokkahierarkiassa ylöspäin, kunnes saavutaan luokkaan java.lang.object. Jos täältäkään ei löydy ko. jäsenmuuttujaa tai metodia, ilmoitetaan ettei muuttuja tai metodi löydy luokasta soseOmena. Jos ei haluta, että alaluokka käyttää jotain superluokkansa jäsenmuuttujaan tai metodi, se voidaan muuntimella piilottaa alaluokalta. (kts kpl.8.5.1)

Kaikki appletit periytyvät javan luokasta java.applet.Applet. Tehdään mallin vuoksi ensimmäinen appletti. Tämä on piristävää siitäkin syystä, että olemme ascii input/output -menetelmää käyttäneet jo riittämiin. Toivon ettei lukijan usko siihen, että olemme opettelemassa internet -ohjelmontia, ole vielä lopullisesti mennyt.

  public class E44 extends java.applet.Applet
// ensimmäinen apletti
   {
    }

Käytämme tässä joitain javaan valmiiksi luotuja olioita (jotka löytyvät tällä kertaa paketista java.awt.*);. Ensimmäinen niistä on Font.

Font f = new Font("TimesRoman", Font.BOLD, 36 );

Muodostimelle lähetettävistä parametreistsa ensimmäinen ja viimeinen ovat jo opitun kaltaisia (siis merkkijono ja int). Sensijaan keskimmäinen on Font -luokan vakio BOLD (joka ilmeisesti lihavoi tekstin), joka selvitetään ennen kutsua (sieltä palautuu itse asiassa int).

Lisäksi käytämme luokkaa Graphics, joka määrittelee joukon ikkunan ominaisuuksia.  Palaamme tähän kappaleessa 10.3.1.

Täten

import java.awt.*;
public class applet1 extends java.applet.Applet
// ensimmäinen apletti
   {
    Font f = new Font("TimesRoman",Font.BOLD,36);
    public void paint(Graphics screen)   //piirtometodi. Palaamme asiaan myöhemmin
     {
      screen.setFont(f);  //määrätään käytetty fontti
      screen.setColor(Color.red);  //määrätään fontin väri
      screen.drawString("Tässä on ensimmäinen apletti",5,40);  // piirrertään merkkijono appletti-ikkunan
                                          & nbsp;                // vasemmasta ylänurkasta suhteen kohtaan 5 oikealle ja 40 alas
     }
   }

Appletti on ohjelma, jota voidaan ajaa suoraan internet -selaimen  päällä. Sinun tulee tehdä normaali HTML -sivu. HTML -koodiin kirjoitetaan applet tagi seuraavan mallin mukaisesti

<APPLET CODE="applet1.class" WIDTH=600 HEIGHT=100>
</APPLET>

Talleta html -sivu nimelle E44.htm. WIDTH -atribuutti ilmoittaa aukeavan harmaan neliön leveyden ja HEIGHT korkeuden pikseleinä. Tämän jälkeen käännetään apletti tavukoodiksi. Ohjelma käynnistyy automaattisesti avattaessa internet -selain. (malli).

Appletteihin palaamme kappaleessa 10.

Periytymistä voi selvittää  java.lang.object -luokan getclass() ja getName -metodilla seuraavasti

Esimerkki 45

class tulostaLuokka {
  int  x = 0,  y = 1;
  void tulosta() {
    System.out.println("x on "+x+" y on "+y);
     System.out.println("Tämä on luokan " + this.getClass().getName() + " olio");
  }
}
class E45 extends tulostaLuokka {
  public static void main(String args[]){
    E45 olio = new E45();
    olio.tulosta();
  }
}

8.5.1 Kapselointi

Jokainen tähän mennessä tehty luokka on periaatteessa käytössä uutta luokkaa tehtäessä. Tämä ei voi olla kovin tarkoituksen mukaista mikäli halutaan tehdä ohjelmia, jotka eivät sotkisi toistensa toimintaa. On sanottu, että eräs olio-ohjelmoinnin tärkeimmistä piirteistä on kapseloida olion jäsenmuuttujien data siten, että ainoastaan sallituilla metodeilla voidaan käsitellä luokan dataa. Datan piilotus alaluokilta ja muilta luokilta tehdään muuntimilla. Seuraavaksi tarkastellaan jäsenmuuttujien muuntimia, joilla voidaan muuttaa jäsenmuuttujien ominaisuusia. Meillä on ollut jo käytössä static ja final. Tämän jälkeen tehdään sama menettely luokan metodeille ja lopuksi itse luokille. Taulukossa puhutaan ennenaikaisesti metodien ylikirjoittamisesta. Palaamme asiaan kappaleessa 8.6. Muuntimia voi olla peräkkäin useampia, kunhan niiden sisällöt eivät ole ristiriidassa keskenään (esim. public static void main()).

8.5.1.1 Jäsenmuuttujan muuntimet

Jäsenmuuttujien muuntimiin olemme jo tutustuneetkin. Ne on listattu seuraavaan taulukkoon

Muunnin Selitys
ei muunninta kts kpl 8.7 paketit
public Muuttujaa voi osoittaa mistä luokasta tahansa
private Muuttujaa voi osoittaa vain luokasta. johon se on määritelty. Ei periytyvyyttä
protected Muuttujaa voi osoittaa vain alaluokasta
final Muuttujaa voi osoittaa mistä luokasta tahansa, mutta arvoa ei voi muuttaa (vakiot)
threadsafe Muuttujan arvoa ei voi muuttaa, jos kaksi ohjelmaa tai prosessia käyttää sitä yhtäaikaa

8.5.1.2 Metodin muuntimet

Luokan metodi voi olla olion käytössä riippuen siitä mitä muunninta käytetään metodin edessä (esim public void tulosta()).

Muuntimet on esitetty seuraavassa taulukossa

Muunnin Selitys
ei muunninta kts kpl 8.7 paketit
public Metodia voi osoittaa mistä luokasta tahansa. Metodin ylikirjoitus on sallittu jos ylikirjoittava metodi on myös public
private Metodia voi osoittaa vain luokasta, johon se on määritelty. Ylikuormitus ja ylikirjoitus ovat sallittuja. Metodi ei periydy
protected Metodia voi osoittaa vain alaluokasta. Ylikuormitus on sallittu. Ylikirjoitus on sallittu vain, jos ylikirjoittava metodi on public tai protected
final Metodia voi osoittaa mistä luokasta tahansa.Metodi ei periydy
native Metodi, joka ei ole kirjoitettu javalla, vaan jollakin toisella ohjelmointikielellä. Ylikuormitus ja ylikirjoitus ovat mahdollisia
abstract Metodin käyttö onnistuu vain alaluokasta. Metodin vartalo ohjelmoidaan ylikirjoittamalla metodi alaluokassa. (Vartaloton metodi.)
synchronized Metodia ei voi käyttää useampi yhtäaikaa toimiva olio tai ohjelma (säie)

8.5.1.3 Luokan muuntimet

Muunnin laitetaan class sanan eteen. Muuntimet on esitetty seuraavassa taulukossa

Muunnin Selitys
ei muunninta kts kpl 8.7 paketit
public Luokka periytyy ja sen sisältämiä jäsenmuuttujia ja metodeja voi osoittaa mistä tahansa
final Luokka ei periydy. Luokan sisältöä ei voi muuttaa. Jäsenmuuttujia ja metodeja voi osoittaa mistä luokasta tahansa
abstract Luokka on pakko periyttää. Luokasta ei voi luoda oliota muuten kuin periyttämällä alaluokka. Luokan metodit eivät sisällä laisinkaan ohjelmakoodia (eli ovat vartalottomia)

Tehtäviä

  1. Periytä luokasta kala luokat petokala ja syöttikala. Luo pari sopivaa petokalaa ja muutamia sopivia syöttikaloja. Anna kaloille haluamasi ominaisuudet. Tee jokaisen luokan jäsenmuuttujasta sellainen, että niihin voi viitata vain saman luokan metodeista. Anna ominaisuuus syöKala luokalle petokala. Tällöin luokan syöttiKala olioon on jotenkin merkittävä, että kala on syöty.

    Vastaus

  2. Anna edellisen tehtävän luokalle syöttiKala metodi lisäänny, joka luo uuden olion syöttiKala.(Vihje tee syöttiKala tyyppinen taulukko kalat, johon lisäät kalan lauseella kalat[i] = kalat[i-1].lisäänny(); Poikanen perii luonnollisesti emonsa ominaisuudet. Mikä ovat parametrin tyyppi? (Muista kpl 8.2.3.)

    Vastaus

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava