Javaohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen 1

  • Slides: 41
Download presentation
Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen 1

Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen 1

 Nämä kalvot on lisensoitu Creative Commons Attribution-Share. Alike 1. 0 -lisenssillä. Lisäys edelliseen

Nämä kalvot on lisensoitu Creative Commons Attribution-Share. Alike 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. 2

Periytyminen Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia

Periytyminen 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 3

Mitä periytyminen on Javassa? 1. Otetaan pohjaksi jo olemassa oleva luokka 1. Periytetään luokasta

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

Mitä on periytyminen Javassa? • Olemassa olevan luokan (yliluokka) pohjalta periytetään uusi luokka (aliluokka).

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öä. 5

Periytyminen UML-luokkakaaviossa • UML-luokkakaaviossa periytymistä kuvaa alla näkyvä nuolityyppi (generalization). 6

Periytyminen UML-luokkakaaviossa • UML-luokkakaaviossa periytymistä kuvaa alla näkyvä nuolityyppi (generalization). 6

Periytyminen UML-luokkakaaviossa • Yliluokasta perittyjä attribuutteja ja metodeja ei tarvitse toistaa aliluokan kuvauksessa. •

Periytyminen UML-luokkakaaviossa • Yliluokasta perittyjä attribuutteja ja metodeja ei tarvitse toistaa aliluokan kuvauksessa. • Esimerkkinä Tietokone - Kannettava periytymishierarkia oikeaoppisesti (ei toisteta perittyjä attribuutteja ja metodeja) UMLluokkakaaviona kuvattuna. 7

Termejä • Luokkahierarkia – Suora yliluokka • Periytetty eksplisiittisesti (yksi taso ylöspäin hierarkiassa). –

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ä! 8

Epäsuora yliluokka Suora yliluokka Aliluokka Periytymishierarkia UML-luokkakaaviona teoksille. 9

Epäsuora yliluokka Suora yliluokka Aliluokka Periytymishierarkia UML-luokkakaaviona teoksille. 9

Periytymishierarkia • Periytymissuhteet muodostavat aina puumaisen hierarkiarakenne. • Jokaisesta luokasta tulee – yliluokka •

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

Periytyminen Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia

Periytyminen 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 11

Periytyminen vs koostuminen • Jos luokkien välille voidaan ajatella “olla”-tyyppinen suhde, on kyseessä periytyminen.

Periytyminen vs koostuminen • 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. 12

Periytyminen vs koostuminen • Onko seuraavissa kyse periytymisestä vai koostumisesta? Luokka 1 Luokka 2

Periytyminen vs koostuminen • Onko seuraavissa kyse periytymisestä vai koostumisesta? Luokka 1 Luokka 2 Yritys Osakeyhtiö Osakas Lainanantaja Laina Asuntolaina 13

Periytymisen toteuttaminen Javassa • Periytyminen toteutetaan Javassa extends-avainsanaa käyttämällä. • extends-määre esiintyy aina luokan

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ä. 14

Periytymisen toteuttaminen Javassa /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * *

Periytymisen toteuttaminen Javassa /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * * @author Jukka Harju */ public class Tietokone { peritään private int muisti; private String prosessori; peritään private final double PERUSHINTA = 500. 0; peritään public double laske. Hinta() { double hinta; hinta = muisti * 0. 0002 + PERUSHINTA; return hinta; } } Periytetään Kannettava-luokka extends-määreellä /** * Kannettava-luokka kuvaa kannettavan * tietokoneen ominaisuudet ja toiminnot. * * @author Jukka Harju */ public class Kannettava extends Tietokone { private double paino; private double kayttoaika; private final int AKUNKESTO=15; private double tutki. Akkua. Jaljella() { double kestoaika = AKUNKESTO - kayttoaika; return kestoaika; } } Perittyjä attribuutteja ja metodeja ei tarvitse mitenkään kirjoittaa näkyviin aliluokan koodiin. Ne ovat aina automaattisesti periytymisen kautta käytettävissä. 15

Periytyminen Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia

Periytyminen 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 • instance. Of-operaattori • • • Periyttämisen estäminen Konstruktorikutsujen ketju Periytymisen hyödyntäminen 16

Yliluokan metodien kutsuminen • Yliluokan metodia voidaan kutsua aliluokasta suoraan metodin nimellä. • Poikkeustapaus

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. 17

Yliluokan metodien kutsuminen Esimerkki 1. Aliluokassa ei ole metodia public double laske. Hinta, mutta

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

Yliluokan metodien kutsuminen Esimerkki 2. Oletuskonstruktori on toteutettu sekä ali- että yliluokassa. Aliluokasta kutsutaan

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; }. . . } 19

Yliluokan metodien kutsuminen Esimerkki 3. Sekä ali- että yliluokassa on toteutettu metodi public String

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

Periytyminen ja konstruktorit • Aliluokkaan tulee aina toteuttaa kaikki tarvittavat konstruktorit. • Aliluokan konstruktorin

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! 21

Periytyminen ja konstruktorit Esimerkki 1. • Aliluokan konstruktorin alussa on automaattisesti implisiittinen yliluokan oletuskonstruktorin

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

Periytyminen ja konstruktorit Esimerkki 2. • Tarvittaessa korvataan implisiittinen oletuskonstruktorin kutsu halutun yliluokan konstruktorin

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

Periytyminen ja konstruktorit Esimerkki 3. • Yliluokan konstruktorikutsun on oltava aina aliluokan konstruktorin ensimmäinen

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

Periytyminen Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia

Periytyminen 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 25

protected –näkyvyysalue • protected –määre on public- ja privatemääreiden välimuoto • protected –tyyppisiin komponentteihin

protected –näkyvyysalue • protected –määre on public- ja privatemää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. ”. 26

protected –näkyvyysalue Esimerkki 1. Yliluokan private-tyyppiseen attribuuttiin viittaaminen suoraan aliluokasta ei mene käännöksestä läpi.

protected –näkyvyysalue Esimerkki 1. Yliluokan private-tyyppiseen attribuuttiin viittaaminen suoraan aliluokasta ei mene käännöksestä läpi. 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; Aiheuttaa this. keskusmuisti = keskusmuisti; käännösvirheen! this. paino = paino; } Aiheuttaa käännösvirheen! Tässä rivissä ei virhettä. 27

protected –näkyvyysalue Esimerkki 2. Yliluokan protected-tyyppisiin attribuutteihin voi viitata suoraan aliluokasta, mutta onko se

protected –näkyvyysalue Esimerkki 2. Yliluokan protected-tyyppisiin attribuutteihin voi viitata suoraan aliluokasta, mutta onko se järkevää? 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; Onko tämä lause this. keskusmuisti = keskusmuisti; this. paino = paino; ”hyvä”? } } Onko tämä lause ”hyvä”? 28

protected-attribuuttien käytön edut • Aliluokan jäsenet voivat muuttaa attribuuttien arvoja suoraan. • Lievä tehokkuushyöty,

protected-attribuuttien käytön edut • Aliluokan jäsenet voivat muuttaa attribuuttien arvoja suoraan. • Lievä tehokkuushyöty, vältytään set- ja getmetodien liikakäytöltä. 29

protected-attribuuttien käytön haitat • Ei validiteettitarkistusta, aliluokka voi sijoittaa attribuutille laittoman arvon. • Implementaatioriippuvaista:

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. 30

Yliluokan metodin korvaaminen • Aliluokka perii kaikki yliluokkansa metodit, eli yliluokan metodit ovat automaattisesti

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). 31

Korvaaminen luokkakaaviossa • Toteutettavana on oheisen luokkakaavion mukaiset luokat. • Yliluokassa on kaksi protectednäkyvyysalueella

Korvaaminen luokkakaaviossa • Toteutettavana on oheisen luokkakaavion mukaiset luokat. • Yliluokassa on kaksi protectednäkyvyysalueella määriteltyä attribuuttia. • Aliluokassa korvataan yliluokan to. Stringmetodi. 32

Korvaaminen Javassa public class Tietokone { private String prosessori; private int keskusmuisti; //. .

Korvaaminen Javassa public class Tietokone { private String prosessori; private int keskusmuisti; //. . konstruktorit yms. . . public String to. String() { return "prosessori: "+prosessori+ " keskusmuisti: "+keskusmuisti; } public class Kannettava extends Tietokone{ private double paino; //. . konstruktorit yms. . . Hyödynnetään yliluokkaan toteutettua to. Stringmetodia! //korvattu to. String-metodi public String to. String() { return super. to. String() + " paino: "+paino; } } 33

Periytyminen Sisältö • Mitä on periytyminen Javassa? • Periytyminen UML-luokkakaaviossa • Termejä • Periytymishierarkia

Periytyminen 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 34

instanceof-operaattori • Operaattorin instanceof-avulla voidaan tutkia onko olio jonkin luokan ilmentymä. • Operaattorin käyttöä

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

Periyttämisen estäminen • Luokan periyttämisen voi estää käyttämällä luokan määrittelyssä avainsanaa final. • Näin

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: java. lang Class Math java. lang. Object java. lang. Math public final class Math extends Object • Metodille final-sana estää metodin korvaamisen aliluokassa. 36

Periyttämisen estäminen • Esimerkki: Estetään Tietokone-luokan periyttäminen. /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet

Periyttämisen estäminen • Esimerkki: Estetään Tietokone-luokan periyttäminen. /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. Luokan periyttäminen estetty * final-määreellä! * @author Jukka Harju */ public final class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500. 0; public double laske. Hinta() { double hinta; hinta = muisti * 0. 0002 + PERUSHINTA; return hinta; } } 37

Konstruktorikutsujen ketju • Aliluokan olion luonnin yhteydessä syntyy aina konstruktorikutsujen ketju: – Aliluokan konstruktori

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. 38

Konstruktorikutsujen ketju Esimerkki. Tietokone-luokan parametrillisen konstruktorin kutsu. Object-luokan oletuskonstruktorin implisiittinen kutsu. public class Kannettava

Konstruktorikutsujen ketju Esimerkki. Tietokone-luokan parametrillisen konstruktorin kutsu. Object-luokan oletuskonstruktorin implisiittinen kutsu. public class Kannettava extends Tietokone { private double paino; public Kannettava(String prosessori, int muisti, double paino) { super(prosessori, muisti); set. Paino(paino); } . . . Kontrolli siirtyy } public class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500; public Tietokone(String prosessori, int muisti) { set. Prosessori(prosessori); set. Muisti(muisti); } } Kontrolli palaa 39

Konstruktorikutsujen ketju • Edellä syntyi konstruktoriketju: • Kannettava-luokan parametrillinen konstruktori. • Tietokone-luokan parametrillinen konstruktori.

Konstruktorikutsujen ketju • Edellä syntyi konstruktoriketju: • Kannettava-luokan parametrillinen konstruktori. • Tietokone-luokan parametrillinen konstruktori. • Object-luokan oletuskonstruktori. 40

Periytymisen hyödyntäminen • Olemassa olevan koodin hyödyntäminen: – Periytetään jo aiemmin toteutettu valmiita luokkia

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. 41