Javaohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen 1
- Slides: 41
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 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 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 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). • 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 • 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). – 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
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 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. – 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 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 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. * * @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 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 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 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 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 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 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 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 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 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 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 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. 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 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, 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: – 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 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 määriteltyä attribuuttia. • Aliluokassa korvataan yliluokan to. Stringmetodi. 32
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 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öä 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 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 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 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 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. • Object-luokan oletuskonstruktori. 40
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
- Java opas
- Hkia extranet
- Hilmo opas
- Extranetapps.hongkongairport
- Viitenumeron muodostaminen
- Extranetapps hongkongairport com/opas/public
- Kirjansidonta opas
- Atjosen opas uef
- 1950 luvun muoti
- Pooliset molekyyliyhdisteet
- E^x derivaatta
- Kartografski znak za luku
- Nollan vastaluku
- 1960-luvun populaarimusiikki
- Käyttöpääoma vs nettokäyttöpääoma
- Boje na topografskim kartama
- 1960-luvun muoti suomessa
- X kromosomaalinen periytyminen
- Bios 3 vastaukset
- Välimuotoinen periytyminen
- Risteytyskaavio
- Java periytyminen
- Sukupuolen määräytyminen
- Ihonvärin periytyminen