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.)
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();
}
}
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()).
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 |
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) |
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) |
Vastaus
Vastaus