Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

© Jukka Harju, 20051 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs.

Samankaltaiset esitykset


Esitys aiheesta: "© Jukka Harju, 20051 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs."— Esityksen transkriptio:

1 © Jukka Harju, 20051 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs koostuminen 6. Periytymisen toteuttaminen Javassa 7. Yliluokan metodien kutsuminen 8. Periytyminen ja muodostimet 9.protected -näkyvyysalue 10. Yliluokan metodien korvaaminen 11.instanceof -operaattori 12. Periyttämisen estäminen 13. Muodostinkutsujen ketju 14. Periytymisen hyödyntäminen Periytyminen

2 © Jukka Harju, 20052 Mitä on periytyminen Javassa? Tietokone - prosessori: String - muisti: int + laskeHinta(): double 1. Otetaan pohjaksi jo olemassa oleva luokka 2. Periytetään luokasta uusi luokka, entisen luokan attribuutit ja metodit saadaan valmiina uudelle luokalle Kannettava 3.Lisätään uuteen luokkaan tarvittavat uudet attribuutit ja metodit - paino: double + tutkiAkkuaJaljella(): double

3 © Jukka Harju, 20053 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öä.

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

5 © Jukka Harju, 20055 Periytyminen UML-luokkakaaviossa Yliluokasta perittyjä attribuutteja ja metodeja ei tarvitse toistaa aliluokan kuvauksessa. Edellä esitetty Tietokone - Kannettava periytymishierarkia oikeaoppisesti (ei toisteta perittyjä attribuutteja ja metodeja) UML- kaaviona kuvattuna:

6 © Jukka Harju, 20056 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ä!

7 © Jukka Harju, 20057 Periytymishierarkia UML-kaaviona teoksille. Aliluokka Suora yliluokka Epäsuora yliluokka

8 © Jukka Harju, 20058 Periytymishierarkia Periytymissuhteet: puumainen hierarkiarakenne Jokaisesta luokasta tulee –yliluokka Tarjoaa attribuutteja/metodeja muille luokille. TAI –aliluokka Perii attribuutteja/metodeja muilta luokilta.

9 © Jukka Harju, 20059 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs koostuminen 6. Periytymisen toteuttaminen Javassa 7. Yliluokan metodien kutsuminen 8. Periytyminen ja muodostimet 9.protected -näkyvyysalue 10. Yliluokan metodien korvaaminen 11.instanceof -operaattori 12. Periyttämisen estäminen 13. Muodostinkutsujen ketju 14. Periytymisen hyödyntäminen Periytyminen

10 © Jukka Harju, 200510 Jos voit ajatella luokkien välille “olla”- tyyppisen suhteen, 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 voit ajatella olion “omistavan” toisen olion, on kyseessä koostuminen –Oliolla on muita olioita attribuutteina. –Esimerkki: Näytöksessä esitetään aina yksi elokuva. Periytyminen vs koostuminen

11 © Jukka Harju, 200511 Periytyminen vs koostuminen Onko seuraavissa kyse periytymisestä vai koostumisesta? Luokka 1Luokka 2 YritysOsakeyhtiö Osakas LainaLainanantaja LainaAsuntolaina

12 © Jukka Harju, 200512 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

13 © Jukka Harju, 200513 Periytymisen toteuttaminen Javassa Pelkkä extends määreen käyttö riittää, Javan huolehtii attribuuttien ja metodien periyttämisestä.

14 © Jukka Harju, 200514 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ä.

15 © Jukka Harju, 200515 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs koostuminen 6. Periytymisen toteuttaminen Javassa 7. Yliluokan metodien kutsuminen 8. Periytyminen ja muodostimet 9.protected -näkyvyysalue 10. Yliluokan metodien korvaaminen 11.instanceOf -operaattori 12. Periyttämisen estäminen 13. Muodostinkutsujen ketju 14. Periytymisen hyödyntäminen Periytyminen

16 © Jukka Harju, 200516 Yliluokan metodien kutsuminen Yliluokan metodia voi 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 muodostimia kutsutaan aliluokasta super- avainsanalla.

17 © Jukka Harju, 200517 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!... }

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

19 © Jukka Harju, 200519 Yliluokan metodien kutsuminen Esimerkki 3. Sekä ali- että yliluokassa 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();... }... }

20 © Jukka Harju, 200520 Periytyminen ja muodostimet Aliluokkaan tulee aina toteuttaa kaikki tarvittavat muodostimet. Aliluokan muodostimen alussa on automaattisesti implisiittinen yliluokan oletusmuodostimen kutsu. Tarvittaessa korvataan implisiittinen oletusmuodostimen kutsu halutulla yliluokan muodostimen kutsulla. Yliluokan muodostinkutsun on oltava aina aliluokan muodostimen ensimmäinen lause!

21 © Jukka Harju, 200521 Periytyminen ja muodostimet Esimerkki 1. Aliluokan muodostimen alussa on automaattisesti implisiittinen yliluokan oletusmuodostimen kutsu. public class Kannettava extends Tietokone { double paino; public Kannettava() { paino = 0; }... } Java suorittaa tässä yliluokan oletusmuodostimen kutsun.

22 © Jukka Harju, 200522 Periytyminen ja muodostimet Esimerkki 2. Tarvittaessa korvataan implisiittinen oletusmuodostimen kutsu halutun yliluokan muodostimen kutsulla. public class Kannettava extends Tietokone { double paino; public Kannettava(int muisti, String prosessori, double paino) { super(muisti, prosessori); this.paino = paino; }... } Implisiittisen oletusmuodostimen kutsumisen sijaan kutsutaan yliluokan parametrillista muodostinta. Huomaa että aliluokan parametrilliselle muodostimelle on välitettävä aina kaikkien (myös yliluokassa määriteltyjen) attribuuttien alkuarvot!

23 © Jukka Harju, 200523 Periytyminen ja muodostimet Esimerkki 3. Yliluokan muodostinkutsun on oltava aina aliluokan muodostimen ensimmäinen lause! public class Kannettava extends Tietokone { double paino; public Kannettava(int muisti, String prosessori, double paino) { super(muisti, prosessori); this.paino = paino; }... } Tämän kutsun on sijaittava aina nimenomaan heti muodostimen avaavaa "{"-merkkiä seuraavalla rivillä!

24 © Jukka Harju, 200524 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs koostuminen 6. Periytymisen toteuttaminen Javassa 7. Yliluokan metodien kutsuminen 8. Periytyminen ja muodostimet 9.protected -näkyvyysalue 10. Yliluokan metodien korvaaminen 11.instanceof -operaattori 12. Periyttämisen estäminen 13. Muodostinkutsujen ketju 14. Periytymisen hyödyntäminen Periytyminen

25 © Jukka Harju, 200525 protected –näkyvyysalue protected –määre on public - ja private - määreiden välimuoto protected –tyyppisiin komponentteihin on pääsy: –ko luokasta, –ko luokan aliluokista, –muista saman pakkauksen luokista. Yliluokan komponentin käyttäminen aliluokasta: –avainsana super ja piste (.).

26 © Jukka Harju, 200526 protected –näkyvyysalue public class Tietokone { private String prosessori; private int keskusmuisti; //..muodostimet 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.

27 © Jukka Harju, 200527 protected –näkyvyysalue public class Tietokone { protected String prosessori; protected int keskusmuisti; //..muodostimet 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ää?

28 © Jukka Harju, 200528 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ä.

29 © Jukka Harju, 200529 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 © Jukka Harju, 200530 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 © Jukka Harju, 200531 Korvaaminen luokkakaaviossa Toteutettavana oheisen luokkakaavion mukaiset luokat. Yliluokalla kaksi protected - näkyvyysalueella määriteltyä attribuuttia. Aliluokassa korvataan yliluokan toString - metodi.

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

33 © Jukka Harju, 200533 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs koostuminen 6. Periytymisen toteuttaminen Javassa 7. Yliluokan metodien kutsuminen 8. Periytyminen ja muodostimet 9.protected -näkyvyysalue 10. Yliluokan metodien korvaaminen 11.instanceof -operaattori 12. Periyttämisen estäminen 13. Muodostinkutsujen ketju 14. Periytymisen hyödyntäminen Periytyminen

34 © Jukka Harju, 200534 instanceof -operaattori Operaattorin instanceof -avulla voidaan tutkia onko olio jonkin luokan ilmentymä. 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.

35 © Jukka Harju, 200535 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 kerrottaan Math -luokasta: java.lang Class Math java.lang.Objectjava.lang.Object java.lang.Math public final class Math extends ObjectObject

36 © Jukka Harju, 200536 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ä!

37 © Jukka Harju, 200537 Muodostinkutsujen ketju Aliluokan olion luonnin yhteydessä syntyy aina muodostinkutsujen ketju: –Aliluokan muodostin kutsuu aina seuraavana ylempänä hierarkiassa olevan yliluokan muodostinta joko implisiittisesti tai eksplisiittisesti. –Viimeisin ketjussa kutsuttu muodostin on aina Object - luokan muodostin, eli kaikkien Java-luokkien yhteinen kantaluokka on Object -luokka. –Alkuperäisen aliluokan muodostimen runko suoritetaan viimeiseksi.

38 © Jukka Harju, 200538 Muodostinkutsujen ketju public class Kannettava extends Tietokone { private double paino; public void 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.0; public void Tietokone(String prosessori, int muisti) { setProsessori(prosessori); setMuisti(muisti); } } Esimerkki. Tietokone -luokan parametrillisen muodostimen kutsu. Kontrolli siirtyy Object -luokan oletusmuodostimen implisiittinen kutsu. Kontrolli palaa

39 © Jukka Harju, 200539 Edellä syntyi muodostinketju: 1.Kannettava -luokan parametrillinen muodostin 2.Tietokone -luokan parametrillinen muodostin 3.Object -luokan oletusmuodostin. Muodostinkutsujen ketju

40 © Jukka Harju, 200540 Periytymisen hyödyntäminen Olemassa olevan koodin hyödyntäminen: –Periytetään jo aiemmin toteutettu valmiita luokkia Lisätään tarvittavat ominaisuudet ja toiminteet. Uudelleenmääritellään yliluokan komponentteja. Ei tarvita suoraa pääsyä yliluokan lähdekoodiin, esikäännetty (.class) koodi riittää. –Independent Software Vendors (ISVs) Kehittävät lisensoitua koodia myytäväksi, julkaisu esikäännetyssä muodossa. Käyttäjät johtavat uusia luokkia, ISV:n lähdekoodiin pääsyä ei tarvita. –Olemassa myös paljon open-source koodia, jota voi hyödyntää myös periytymisen kautta.


Lataa ppt "© Jukka Harju, 20051 Sisältö 1. Mitä on periytyminen Javassa? 2. Periytyminen UML-luokkakaaviossa 3. Termejä 4. Periytymishierarkia 5. Periytyminen vs."

Samankaltaiset esitykset


Iklan oleh Google