© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen.

Slides:



Advertisements
Samankaltaiset esitykset
Tuloksellinen Java-ohjelmointi Luku 3 Luokkien käyttäminen
Advertisements

– Ohjelmistojen mallintaminen luokkamallin lisäpiirteitä.
Koostumussuhde Jukka Juslin © Jukka Juslin.
© Jukka Juslin1 Ohjelmointitaito (ict1td002, 12 op) Opintojakson esittely Kevät 2008 Jukka Juslin, Raine Kauppinen Tuloksellinen Java-ohjelmointi.
Java-ohjelmointi Opas ammattimaiseen osaamiseen Lisäosa: GUI
Osion kaksi kertaus Jukka Juslin © Jukka Juslin.
6. Metodit.
© Jukka Harju, Viittausmuuttujat. © Jukka Harju, Viittaukset •Viittausmuuttuja sisältää tiedon siitä missä muistipaikassa olio.
© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 13 Monimuotoisuus.
16. Javan omat luokat.
© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 6 (osittain) Tiedostot.
Luokkakaaviot Luokkakaaviot Tekninen suunnittelu.
Ict1td002: Ohjelmointitaito Kertaus Osio 2 - luokat - ilmentymät - viittaus- ja arvomuuttuja - ilmentymien taulukointi HAAGA-HELIA IltaTiko.
Polymorfismi Sisältö Mitä on polymorfismi?
Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1
Tuloksellinen Java-ohjelmointi Luku 9 Taulukot ja perustietorakenteet
Johdetun luokan määrittely tMyn1 Johdetun luokan määrittely •Kun johdettu luokka periytetään kantaluokasta, saadaan kantaluokan jäsenet enemmän tai vähemmän.
© Jukka Harju, Jukka Juslin
13. Pakkaukset.
Perintä. Yleistä Olio-ohjelmoinnin menetelmä muodostaa uusia luokkia aiemmin määriteltyjen luokkien avulla Luokka saa automaattisesti käyttöönsä kaikki.
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Toistolauseet
© Jukka Harju, Jukka Juslin1 Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 4 Ehto- ja toistolauseet.
OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT. LUOKKA JAVA ohjelma koostuu luokista LUOKKA sisältää metodeja molemmat sisältävät attribuutteja eli muuttujia.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
UML-luokkakaaviot.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Poikkeustenkäsittely  Mitä poikkeustenkäsittely tarkoittaa?  Poikkeuksen käsitteleminen  Poikkeusluokkien hierarkia  Poikkeuksen heittäminen 1.
9. Periytyminen Javassa.
© Jukka Harju, Jukka Juslin1 Tuloksellinen Java-ohjelmointi Luku 4 Ehto- ja toistolauseet Tuloksellinen Java-ohjelmointi.
Virtuaaliset jäsenfunktiot tMyn1 Virtuaaliset jäsenfunktiot Virtuaalinen jäsenfunktio on esiteltävä monimuotoisessa kantaluokassa. Virtuaalisen jäsenfunktion.
© Jukka Harju, Jukka Juslin
1 Kertaus koetta varten oleellisista asioista Jukka Juslin.
Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 2 Ensimmäiset ohjelmat © Jukka Harju, Jukka Juslin.
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
4. Attribuutit 4.1. Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2.
5. Kapselointi Yleistä Kapseloinnilla (encapsulation) tarkoitetaan luokan tietojen ja toimintojen pakkaamista yhdeksi suojatuksi kokonaisuudeksi.
10. Abstrakti luokka Johdanto Abstrakti luokka (abstract class) poikkeaa konkreettisesta luokasta (ei-abstrakti luokka) siten, että siitä ei.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
© Jukka Harju, Jukka Juslin1 Tuloksellinen Java-ohjelmointi Lisäosa: GUI Tuloksellinen Java-ohjelmointi.
© Jukka Juslin1 Tiedostot Tuloksellinen Java-ohjelmointi.
17. Kooste Kooste Kooste (aggregation) on luokkien A ja B välinen suhde, joka tarkoittaa “A on B:n osa” tai “A kuuluu B:hen”. − Koostesuhteessa.
© Jukka Juslin1 Osio2 Olio-ohjelmointi: Merkkijonot eli Stringit Jukka Juslin.
Oliot ja luokat Oliot ja luokat Oliot (object) ja luokat (class) ovat keskeisiä olio- ohjelmoinnin käsitteitä. Olio-ohjelmointi on ohjelmointiparadigma,
© Jukka Harju, Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs.
Vesa Ollikainen & Outi Grotenfelt
© Jukka Harju, Jukka Juslin1 Tuloksellinen Java-ohjelmointi HashMap, Properties, Logger, etc Tuloksellinen Java-ohjelmointi.
Tuloksellinen Java-ohjelmointi Luku 2 Ensimmäiset ohjelmat
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
11. Rajapinnat Sisällys Mitä rajapinnat ovat? Kuinka ne määritellään ja otetaan käyttöön? Moniperiytyminen rajapintojen avulla. Varoituksen.
Monimuotoinen luokka tMyn1 Monimuotoinen luokka Monimuotoinen luokka mahdollistaa saman jäsenfunktion toteutuksen monella tavalla. Tällöin puhutaan virtuaalisesta.
Javan oliovirrat eli oliotiedostojen käsittely. Olio- eli objektitiedostojen käsittely Käsittely täysin samanlaista kuin muiden tiedostojen 1.Otetaan.
1 © Jukka Juslin Luokat, attribuutit ja metodit Yleistietoa: seuraavalla koulutusviikolla tarkempi käsittely.
8. Periytyminen Sisällys Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö.
Yksikkötestaus ● Yksikkötestauksella tarkoitetaan lähdekoodiin kuuluvien yksittäisten osien testaamista. Termi yksikkö viittaa ohjelman pienimpiin mahdollisiin.
String-vertailusta ja Scannerin käytöstä (1/2)
17. Kooste.
5. Kapselointi.
11. Rajapinnat.
Poikkeustenkäsittelylohkot try-catch
3. Luokat, oliot ja metodit Java-kielessä (Lausekielinen ohjelmointi I ja II –kursseilla opitun kertausta.)
Toisto Toistolausekkeet for, while(ehto){…} ja do {…} while(ehto)
14. Hyvä ohjelmointitapa.
6. Metodit.
13. Pakkaukset.
8. Periytyminen.
3. Attribuutit.
13. Pakkaukset.
8. Periytyminen.
4. Luokan testaus ja käyttö olion kautta
eli oliotiedostojen käsittely
Esityksen transkriptio:

© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen

© Jukka Harju, Jukka Juslin2 Nämä kalvot on lisensoitu Creative Commons Attribution-ShareAlike 1.0 -lisenssillä. Lisäys edelliseen lisenssiin: Kalvojen muokkaaminen on sallittu vain opettajille, joiden kursseilla käytetään kurssikirjana Tuloksellinen Java-ohjelmointi – tai Java ohjelmointi opas ammattimaiseen osaamiseen -kirjaa.Creative Commons Attribution-ShareAlike 1.0 -lisenssillä

© Jukka Harju, Jukka Juslin3 Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia • Periytyminen vs koostuminen • Periytymisen toteuttaminen Javassa • Yliluokan metodien kutsuminen • Periytyminen ja konstruktorit •protected -näkyvyysalue • Yliluokan metodien korvaaminen •instanceof -operaattori • Periyttämisen estäminen • Konstruktorikutsujen ketju • Periytymisen hyödyntäminen Periytyminen

© Jukka Harju, Jukka Juslin4 Mitä periytyminen on Javassa? Tiedosto - nimi: String + lue(): String 1.Otetaan pohjaksi jo olemassa oleva luokka 1.Periytetään luokasta uusi luokka, entisen luokan attribuutit ja metodit saadaan valmiina uudelle luokalle MuokattavaTiedosto 1.Lisätään uuteen luokkaan tarvittavat uudet attribuutit ja metodit Katson kirjan esimerkit 10.2 ja kirjoita (teksti : String ) : boolean

© Jukka Harju, Jukka Juslin5 Mitä on periytyminen Javassa? •Olemassa olevan luokan (yliluokka) pohjalta periytetään uusi luokka (aliluokka). •Aliluokka laajentaa yliluokkaa (subclass extends superclass). –Aliluokka on yliluokan erikoistapaus. –Aliluokka perii yliluokan ominaisuudet. –Aliluokalle voidaan lisätä ominaisuuksia ja toimintoja tai korvata (muuttaa) yliluokan toimintoja. •Periytyminen lisää koodin uudelleenkäyttöä.

© Jukka Harju, Jukka Juslin6 Periytyminen UML-luokkakaaviossa •UML-luokkakaaviossa periytymistä kuvaa alla näkyvä nuolityyppi (generalization).

© Jukka Harju, Jukka Juslin7 Periytyminen UML-luokkakaaviossa •Yliluokasta perittyjä attribuutteja ja metodeja ei tarvitse toistaa aliluokan kuvauksessa. •Esimerkkinä Tietokone - Kannettava periytymishierarkia oikeaoppisesti (ei toisteta perittyjä attribuutteja ja metodeja) UML- luokkakaaviona kuvattuna.

© Jukka Harju, Jukka Juslin8 Termejä •Luokkahierarkia –Suora yliluokka •Periytetty eksplisiittisesti (yksi taso ylöspäin hierarkiassa). –Epäsuora yliluokka •Periytetty kaksi tai useampia tasoja ylempää hierarkiassa. –Yksittäisperiytyminen •Luokka periytetään yhdestä yliluokasta. –Moniperiytyminen •Luokka periytetään useammasta kuin yhdestä yliluokasta. –Java ei tue moniperiytymistä!

© Jukka Harju, Jukka Juslin9 Periytymishierarkia UML-luokkakaaviona teoksille. Aliluokka Suora yliluokka Epäsuora yliluokka

© Jukka Harju, Jukka Juslin10 Periytymishierarkia •Periytymissuhteet muodostavat aina puumaisen hierarkiarakenne. •Jokaisesta luokasta tulee –yliluokka •Tarjoaa attribuutteja / metodeja muille luokille. TAI –aliluokka •Perii attribuutteja / metodeja muilta luokilta.

© Jukka Harju, Jukka Juslin11 Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia • Periytyminen vs koostuminen • Periytymisen toteuttaminen Javassa • Yliluokan metodien kutsuminen • Periytyminen ja konstruktorit •protected -näkyvyysalue • Yliluokan metodien korvaaminen •instanceof -operaattori • Periyttämisen estäminen • Konstruktorikutsujen ketju • Periytymisen hyödyntäminen Periytyminen

© Jukka Harju, Jukka Juslin12 •Jos luokkien välille voidaan ajatella “olla”-tyyppinen suhde, on kyseessä periytyminen. –Aliluokan oliota käsitellään tällöin kuten yliluokan oliota. –Esimerkki: Kauhuelokuva on elokuva. •Kauhuelokuvalla on samat ominaisuudet ja toiminnot kuin elokuvalla. Lisäksi kauhuelokuvalla on ominaisuuksia joita "tavallisella" elokuvalla ei ole. •Jos olion voidaan ajatella “omistavan” toisen olion, on kyseessä koostuminen. –Oliolla on muita olioita attribuutteina. –Esimerkki: Näytöksessä esitetään aina yksi elokuva. Periytyminen vs koostuminen

© Jukka Harju, Jukka Juslin13 Periytyminen vs koostuminen •Onko seuraavissa kyse periytymisestä vai koostumisesta? AsuntolainaLaina LainanantajaLaina OsakasOsakeyhtiö Yritys Luokka 2Luokka 1

© Jukka Harju, Jukka Juslin14 Periytymisen toteuttaminen Javassa •Periytyminen toteutetaan Javassa extends -avainsanaa käyttämällä. •extends -määre esiintyy aina luokan määrittelyrivillä. Esimerkki public class Kannettava extends Tietokone •Pelkkä extends määreen käyttö riittää, Javan huolehtii attribuuttien ja metodien periyttämisestä.

© Jukka Harju, Jukka Juslin15 Periytymisen toteuttaminen Javassa /** * Kannettava-luokka kuvaa kannettavan * tietokoneen ominaisuudet ja toiminnot. * Jukka Harju */ public class Kannettava extends Tietokone { private double paino; private double kayttoaika; private final int AKUNKESTO=15; private double tutkiAkkuaJaljella() { double kestoaika = AKUNKESTO - kayttoaika; return kestoaika; } } /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * Jukka Harju */ public class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500.0; public double laskeHinta() { double hinta; hinta = muisti * PERUSHINTA; return hinta; } } Periytetään Kannettava-luokka extends-määreellä peritään Perittyjä attribuutteja ja metodeja ei tarvitse mitenkään kirjoittaa näkyviin aliluokan koodiin. Ne ovat aina automaattisesti periytymisen kautta käytettävissä.

© Jukka Harju, Jukka Juslin16 Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia • Periytyminen vs koostuminen • Periytymisen toteuttaminen Javassa • Yliluokan metodien kutsuminen • Periytyminen ja konstruktorit •protected -näkyvyysalue • Yliluokan metodien korvaaminen •instanceOf -operaattori • Periyttämisen estäminen • Konstruktorikutsujen ketju • Periytymisen hyödyntäminen Periytyminen

© Jukka Harju, Jukka Juslin17 Yliluokan metodien kutsuminen •Yliluokan metodia voidaan kutsua aliluokasta suoraan metodin nimellä. •Poikkeustapaus on metodi, joka on toteutettu samalla nimellä sekä ali- että yliluokassa. Tällöin yliluokan metodiin viitataan avainsanalla super. •Myös yliluokan konstruktoreja kutsutaan aliluokasta super- avainsanalla.

© Jukka Harju, Jukka Juslin18 Yliluokan metodien kutsuminen Esimerkki 1. Aliluokassa ei ole metodia public double laskeHinta, mutta yliluokassa on. Metodia voidaan kutsua aliluokasta suoraan metodin nimellä: public class Kannettava extends Tietokone { double hinta = laskeHinta(); // tämä rivi sopivassa // aliluokan metodissa!... }

© Jukka Harju, Jukka Juslin19 Yliluokan metodien kutsuminen Esimerkki 2. Oletuskonstruktori on toteutettu sekä ali- että yliluokassa. Aliluokasta kutsutaan yliluokan oletuskonstruktoria super -avainsanan avulla. public class Kannettava extends Tietokone {.. public Kannettava() { super(); //yliluokan oletuskonstruktorin kutsu paino = 0; }... }

© Jukka Harju, Jukka Juslin20 Yliluokan metodien kutsuminen Esimerkki 3. Sekä ali- että yliluokassa on toteutettu metodi public String muodostaLasku. Aliluokasta täytyy kutsua yliluokan muodostaLasku -metodia tällöin super -avainsanan avulla. public class Myyntilasku extends Lasku {... public String muodostaLasku() {... String lasku = lasku + super.muodostaLasku();... }... }

© Jukka Harju, Jukka Juslin21 Periytyminen ja konstruktorit •Aliluokkaan tulee aina toteuttaa kaikki tarvittavat konstruktorit. •Aliluokan konstruktorin alussa on automaattisesti implisiittinen yliluokan oletuskonstruktorin kutsu. •Tarvittaessa korvataan implisiittinen oletuskonstruktorin kutsu halutulla yliluokan konstruktorin kutsulla. •Yliluokan konstruktorikutsun on oltava aina aliluokan konstruktorin ensimmäinen lause!

© Jukka Harju, Jukka Juslin22 public class Kannettava extends Tietokone { private double paino; public Kannettava() { paino = 0; }... } Periytyminen ja konstruktorit Esimerkki 1. •Aliluokan konstruktorin alussa on automaattisesti implisiittinen yliluokan oletuskonstruktorin kutsu. Java suorittaa tässä yliluokan oletuskonstruktorin kutsun.

© Jukka Harju, Jukka Juslin23 public class Kannettava extends Tietokone { private double paino; public Kannettava(int muisti, String prosessori, double paino) { super(muisti, prosessori); setPaino(paino); }... } Periytyminen ja konstruktorit Esimerkki 2. •Tarvittaessa korvataan implisiittinen oletuskonstruktorin kutsu halutun yliluokan konstruktorin kutsulla. Implisiittisen oletuskonstruktorin kutsumisen sijaan kutsutaan yliluokan parametrillista konstruktoria. Huomaa että aliluokan parametrilliselle konstruktorille on välitettävä aina kaikkien (myös yliluokassa määriteltyjen) attribuuttien alkuarvot!

© Jukka Harju, Jukka Juslin24 public class Kannettava extends Tietokone { private double paino; public Kannettava(int muisti, String prosessori, double paino) { super(muisti, prosessori); setPaino(paino); }... } Periytyminen ja konstruktorit Esimerkki 3. •Yliluokan konstruktorikutsun on oltava aina aliluokan konstruktorin ensimmäinen lause! Tämän kutsun on sijaittava aina nimenomaan heti konstruktorin avaavaa "{"- merkkiä seuraavalla rivillä!

© Jukka Harju, Jukka Juslin25 Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia • Periytyminen vs koostuminen • Periytymisen toteuttaminen Javassa • Yliluokan metodien kutsuminen • Periytyminen ja konstruktorit •protected -näkyvyysalue • Yliluokan metodien korvaaminen •instanceof -operaattori • Periyttämisen estäminen • Konstruktorikutsujen ketju • Periytymisen hyödyntäminen Periytyminen

© Jukka Harju, Jukka Juslin26 protected –näkyvyysalue •protected –määre on public - ja private - määreiden välimuoto •protected –tyyppisiin komponentteihin on pääsy: –kyseisestä luokasta, –ko. luokan aliluokista, –muista saman pakkauksen luokista. •Yliluokan komponentin käyttäminen aliluokasta tapahtuu notaatiolla ” super. ”.

© Jukka Harju, Jukka Juslin27 protected –näkyvyysalue public class Tietokone { private String prosessori; private int keskusmuisti; //..konstruktorit yms... } public class Kannettava extends Tietokone { private double paino; public Kannettava(String prosessori, int keskusmuisti, double paino) { this.prosessori = prosessori; this.keskusmuisti = keskusmuisti; this.paino = paino; } Aiheuttaa käännösvirheen! Tässä rivissä ei virhettä. Esimerkki 1. Yliluokan private -tyyppiseen attribuuttiin viittaaminen suoraan aliluokasta ei mene käännöksestä läpi.

© Jukka Harju, Jukka Juslin28 public class Tietokone { protected String prosessori; protected int keskusmuisti; //..konstruktorit yms... } public class Kannettava extends Tietokone { private double paino; public Kannettava(String prosessori, int keskusmuisti, double paino) { this.prosessori = prosessori; this.keskusmuisti = keskusmuisti; this.paino = paino; } Onko tämä lause ”hyvä”? Esimerkki 2. Yliluokan protected -tyyppisiin attribuutteihin voi viitata suoraan aliluokasta, mutta onko se järkevää? protected –näkyvyysalue

© Jukka Harju, Jukka Juslin29 protected -attribuuttien käytön edut •Aliluokan jäsenet voivat muuttaa attribuuttien arvoja suoraan. •Lievä tehokkuushyöty, vältytään set- ja get- metodien liikakäytöltä.

© Jukka Harju, Jukka Juslin30 protected -attribuuttien käytön haitat •Ei validiteettitarkistusta, aliluokka voi sijoittaa attribuutille laittoman arvon. •Implementaatioriippuvaista: –Aliluokan metodit ovat todennäköisesti riippuvaisia yliluokan toteutuksesta. –Yliluokan toteutuksen muutokset voivat aikaansaada muutoksia aliluokassa, josta seuraa hauras (fragile) ohjelmisto.

© Jukka Harju, Jukka Juslin31 Yliluokan metodin korvaaminen •Aliluokka perii kaikki yliluokkansa metodit, eli yliluokan metodit ovat automaattisesti aliluokan käytettävissä. •Toisinaan halutaan aliluokan olion toimivan tietyn metodin osalta yliluokan oliosta poiketen. •Aliluokkaan voidaan tehdä halutusta metodista uusi toteutus, jossa metodiin tarvittavat toiminnalliset muutokset on huomioitu. •Menettelyä, jossa yliluokassa jo kertaalleen toteutetusta metodista toteutetaan aliluokassa uusi versio, kutsutaan korvaamiseksi (overriding).

© Jukka Harju, Jukka Juslin32 Korvaaminen luokkakaaviossa •Toteutettavana on oheisen luokkakaavion mukaiset luokat. •Yliluokassa on kaksi protected - näkyvyysalueella määriteltyä attribuuttia. •Aliluokassa korvataan yliluokan toString - metodi.

© Jukka Harju, Jukka Juslin33 Korvaaminen Javassa public class Tietokone { private String prosessori; private int keskusmuisti; //..konstruktorit yms... public String toString() { return "prosessori: "+prosessori+ " keskusmuisti: "+keskusmuisti; } public class Kannettava extends Tietokone{ private double paino; //.. konstruktorit yms... //korvattu toString-metodi public String toString() { return super.toString() + " paino: "+paino; } Hyödynnetään yliluokkaan toteutettua toString - metodia!

© Jukka Harju, Jukka Juslin34 Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia • Periytyminen vs koostuminen • Periytymisen toteuttaminen Javassa • Yliluokan metodien kutsuminen • Periytyminen ja konstruktorit •protected -näkyvyysalue • Yliluokan metodien korvaaminen •instanceof -operaattori • Periyttämisen estäminen • Konstruktorikutsujen ketju • Periytymisen hyödyntäminen Periytyminen

© Jukka Harju, Jukka Juslin35 instanceof -operaattori •Operaattorin instanceof -avulla voidaan tutkia onko olio jonkin luokan ilmentymä. •Operaattorin käyttöä tarvitaan monimuotoisuuden yhteydessä. public class TietokoneSovellus { public void kaynnistaSovellus() { Tietokone laite = /* sijoitetaan viittaus olioon */ if(laite instanceof Kannettava) { //tehdään kannettavalle tietokoneelle suoritettavat //toimenpiteet } else if (laite instanceof Tietokone) { //tehdään tietokoneelle suoritettavat toimenpiteet } }... } Tutkitaan onko kyseessä Kannettava -luokan olio….. vai Tietokone - luokan olio.

© Jukka Harju, Jukka Juslin36 Periyttämisen estäminen •Luokan periyttämisen voi estää käyttämällä luokan määrittelyssä avainsanaa final. •Näin on toimittu mm. Javan valmiissa Math -luokassa –Java-APIssa kerrotaan Math -luokasta: •Metodille final -sana estää metodin korvaamisen aliluokassa. java.lang Class Math java.lang.Objectjava.lang.Object java.lang.Math public final class Math extends ObjectObject

© Jukka Harju, Jukka Juslin37 Periyttämisen estäminen •Esimerkki: Estetään Tietokone-luokan periyttäminen. /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * Jukka Harju */ public final class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500.0; public double laskeHinta() { double hinta; hinta = muisti * PERUSHINTA; return hinta; } } Luokan periyttäminen estetty final -määreellä!

© Jukka Harju, Jukka Juslin38 Konstruktorikutsujen ketju •Aliluokan olion luonnin yhteydessä syntyy aina konstruktorikutsujen ketju: –Aliluokan konstruktori kutsuu aina periytymishierarkiassa ylempänä seuraavana olevan yliluokan konstruktoria joko implisiittisesti tai eksplisiittisesti. –Viimeisin ketjussa kutsuttu konstruktori on aina Object -luokan konstruktori, eli kaikkien Java-luokkien yhteinen kantaluokka on Object -luokka. –Alkuperäisen aliluokan konstruktorin runko suoritetaan viimeiseksi.

© Jukka Harju, Jukka Juslin39 Konstruktorikutsujen ketju public class Kannettava extends Tietokone { private double paino; public Kannettava(String prosessori, int muisti, double paino) { super(prosessori, muisti); setPaino(paino); }... } public class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500; public Tietokone(String prosessori, int muisti) { setProsessori(prosessori); setMuisti(muisti); } } Esimerkki. Tietokone -luokan parametrillisen konstruktorin kutsu. Kontrolli siirtyy Object -luokan oletuskonstruktorin implisiittinen kutsu. Kontrolli palaa

© Jukka Harju, Jukka Juslin40 •Edellä syntyi konstruktoriketju: •Kannettava -luokan parametrillinen konstruktori. •Tietokone -luokan parametrillinen konstruktori. •Object -luokan oletuskonstruktori. Konstruktorikutsujen ketju

© Jukka Harju, Jukka Juslin41 Periytymisen hyödyntäminen •Olemassa olevan koodin hyödyntäminen: –Periytetään jo aiemmin toteutettu valmiita luokkia •Lisätään tarvittavat ominaisuudet ja toiminnot. •Uudelleen määritellään yliluokan komponentteja. •Ei tarvita suoraa pääsyä yliluokan lähdekoodiin, esikäännetty (.class) koodi riittää.. –Olemassa on paljon open source -koodia, jota voi hyödyntää myös periytymisen kautta.