Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

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

Samankaltaiset esitykset


Esitys aiheesta: "© Jukka Harju, Jukka Juslin1 Java-ohjelmointi opas ammattimaiseen osaamiseen Luku 12 Periytyminen."— Esityksen transkriptio:

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

2 © 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ä

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

4 © 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 10.3. + kirjoita (teksti : String ) : boolean

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

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

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

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

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

10 © 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.

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

12 © 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

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

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

15 © Jukka Harju, Jukka Juslin15 Periytymisen toteuttaminen Javassa /** * 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 tutkiAkkuaJaljella() { double kestoaika = AKUNKESTO - kayttoaika; return kestoaika; } } /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * * @author Jukka Harju */ public class Tietokone { private int muisti; private String prosessori; private final double PERUSHINTA = 500.0; public double laskeHinta() { double hinta; hinta = muisti * 0.0002 + 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ä.

16 © 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

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

18 © 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!... }

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

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

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

22 © 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.

23 © 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!

24 © 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ä!

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

26 © 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. ”.

27 © 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.

28 © 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

29 © 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ä.

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

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

32 © 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.

33 © 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!

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

35 © 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.

36 © 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

37 © Jukka Harju, Jukka Juslin37 Periyttämisen estäminen •Esimerkki: Estetään Tietokone-luokan periyttäminen. /** * Tietokone-luokka kuvaa tietokoneen * ominaisuudet ja toiminnot. * * @author 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 * 0.0002 + PERUSHINTA; return hinta; } } Luokan periyttäminen estetty final -määreellä!

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

39 © 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

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

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


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

Samankaltaiset esitykset


Iklan oleh Google