Sisällys. 12. Monimuotoisuus. Johdanto. Alityypitys. Johdanto. Periytymismekanismi määrittää alityypityksen.

Samankaltaiset tiedostot
12. Monimuotoisuus 12.1

12. Monimuotoisuus 12.1

Sisällys. Mitä on periytyminen? Yksittäis- ja moniperiytyminen. Oliot ja perityt luokat. Periytymisen käyttö. 8.2

Mitä on periytyminen?

9. Periytyminen Javassa 9.1

16. Javan omat luokat 16.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

9. Periytyminen Javassa 9.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Java-kielen perusteet

7. Oliot ja viitteet 7.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Oliot viestivät metodeja kutsuen

Olio-ohjelmointi Javalla

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

7. Näytölle tulostaminen 7.1

Java-kielen perusteet

ITKP102 Ohjelmointi 1 (6 op)

Taulukot. Jukka Harju, Jukka Juslin

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

4. Luokan testaus ja käyttö olion kautta 4.1

4. Olio-ohjelmoinista lyhyesti 4.1

15. Ohjelmoinnin tekniikkaa 15.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

15. Ohjelmoinnin tekniikkaa 15.1

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Mikä yhteyssuhde on?

Muuttujat ja kontrolli. Ville Sundberg

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

2. Olio-ohjelmoinista lyhyesti 2.1

Java-kielen perusteet

7/20: Paketti kasassa ensimmäistä kertaa

Virtuaalifunktiot ja polymorfismi

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009

Osion kaksi kertaus. Jukka Juslin. Jukka Juslin

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Tietotyypit ja operaattorit

- Komposiittityypit - Object (Mukaanlukien funktiot) - Array. - Erikoisdatatyypit - null - undefined

17. Javan omat luokat 17.1

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta

Listarakenne (ArrayList-luokka)

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 2 / 2010 Välikoe / 26.3

17. Javan omat luokat 17.1

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Oliot ja tyypit. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos

1. Omat operaatiot 1.1

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IV Periytyminen ja monimuotoisuus

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Rajapinta (interface)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Metodien tekeminen Javalla


Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

etunimi, sukunimi ja opiskelijanumero ja näillä

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

14. Poikkeukset 14.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

19. Olio-ohjelmointia Javalla 19.1

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

13. Loogiset operaatiot 13.1

Sisällys. 19. Unified Modeling Language (UML) Johdanto. Johdanto. Johdanto. Luokkakaavio:

Muusta kuin vesisioista

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Antti-Jussi Lakanen Ohjelmointi 1, C# / kevät 2011

Matematiikan tukikurssi

Sisältö. 22. Taulukot. Yleistä. Yleistä

3. Muuttujat ja operaatiot 3.1

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmiston testaus ja laatu. Testaus yleistä

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 15. Lohkot. Lohkot. Lohkot

2. Olio-ohjelmoinnin perusteita 2.1

Groovy. Niko Jäntti Jesper Haapalinna Group 31

8. Näppäimistöltä lukeminen 8.1

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Olio-ohjelmointi Syntaksikokoelma

Javan perusteita. Janne Käki

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Transkriptio:

Sisällys 12. Monimuotoisuus Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen. Parametrinvälitys eräs monimuotoisuuden sovellus.. Rajapinnat ja alityypitys. 12.1 12.2 Johdanto Monimuotoisuus eli polymorfismi (polymorphism) on yleisesti sitä, että ohjelman tunnus voi tarkoittaa erilaisia asioita. Monimuotoisuus on monimuotoinen käsite. Metodien kuormitus ja korvaaminen eräänlaista monimuotoisuutta. Monimuotoisuus liittyy erityisen kiinteästi periytymiseen: Luokkahierarkia määrittelee alityypityksen, jossa kukin jälkeläinen edustaa alityyppiä ja kukin esi-isä ylityyppiä. Tarkastellaan jatkossa monimuotoisuutta Javakielen näkökulmasta. lityypitys Määritellään tyyppien yhteensopivuus (<:) hyvin vapaamuotoisesti luokkien periytymissuhteen avulla: Tyyppi T () on yhteensopiva itsensä kanssa. T <: T (refleksiivisyys). lityyppi S (ali) on yhteensopiva ylityyppinsä T (ylinsa) kanssa. S <: T. lityyppi S (jälkeläinen) on yhteensopiva kaikkien ylityyppiensä Q (esi-isiensä) kanssa. Jos S <: T ja T <: Q, niin S <: Q, (transitiivisuus). Ylityyppi Q (esi-isä) ei ole yhteensopiva alityyppiensä T (jälkeläistensä) kanssa (antisymmetrisyys). 12.3 12.4

lityypitys lityypitys Esim. C Koska - on -, -, C- ja D-luokkien esi-isä ( > {,, C, D ), niin -, -, C- ja D-tyypit ovat yhteensopivia -tyypin kanssa. D Samoin koska - on - ja C- luokkien esi-isä ( > { C, ), niin - ja C-tyypit ovat yhteensopivia -tyypin kanssa. Toisaalta esimerkiksi -tyyppi ei ole yhteensopiva -tyypin kanssa, koska - ei ole - luokan jälkeläinen. Huomaa myös, että esimerkiksi C- ja D-tyypit eivät sovi yhteen, koska niitä vastaavien luokkien välillä ei ole periytymissuhdetta. lityypityksen seurauksena viitteiden x (X-) ja y (Y-) sijoitus x = y; on sallittu, jos Y <: X eli X > Y. lityyppi käy ylityyppiinsä. Esimerkki: o = null; a = null; b = null; C c = null; D d = null; // Oikeellisia sijoituksia. o = a; // <: o = b; // <: o = c; // C <: o = d; // D <: a = b; // <: a = c; // C <: // Virheellisiä sijoituksia. a = o; // > b = a; // > c = d; // ei periytymissuhdetta Vertailussa operadien oltava yhteensopivia, järjestyksellä ei ole väliä. 12.5 12.6 lityypitys Viite ja siihen liittyvä olio voivat olla eri luokista, kunhan tyypit vain ovat sijoitusyhteensopivia. Viitteeseen voi liittyä viitteen luokan olioiden lisäksi myös olioita viitteen luokan jälkeläisluokista. Esim. o = null; o = new (); Nisakas n = new Kissa(); p = new String(); Staattinen ja dynaaminen Erotetaan jatkossa viitteen (staattinen ) ja olion perus (dynaaminen ) toisistaan. Dynaaminen vaihtelee staattisen luokan asettamissa rajoissa. Staattinen on dynaamisen luokan yläraja. Staattinen // Oikein ( > ) o = new (); // Väärin ( > ) p = new (); Dynaaminen voi olla,,, 12.7 12.8

Staattinen ja dynaaminen Esimerkki Staattinen Kissa molli = new Kissa(); Kissa Kissa Nisakas nisse = new Kissa(); Nisakas Kissa elain; elain = new Kissa(); Dynaaminen Kissa elain = new Koira(); Koira // Tämä ei käänny, // koska > Kissa. Kissa mussu = new (); (Kissa) () Staattinen ja dynaaminen Java näkee olion viitteen luokan (staattinen ) kautta: ilman tyyppimuunnosta käytettävissä ovat vain staattisen luokan piirteet. // setetaan kissaan // Nisakas-luokan viite. Nisakas nisse = new Kissa(); // Kissa ei osaa nyt esim. // kehrätä, koska staattinen // on Nisakas. // Kääntäjä tuottaa virheen. nisse.kehraa(); nisse elossa, paino syo(), onkoiso() turkillinen vari, hanta aantele(string), kehraa() -kerros Elain-kerros Nisakas-kerros Kissa-kerros 12.9 12.10 Staattinen ja dynaaminen Olio-ohjelmassa viitteeseen liittyvän olion tyyppi selviää usein vasta ohjelman ajon aikana. Tässä tapauksessa myös kutsuttavan metodin versio täytyy päätellä ajon aikana. Dynaamisesti ajon aikana tapahtuvaa metodikutsujen liittämistä metodeihin kutsutaan myöhäiseksi sidonnaksi. Proseduraalisissa ohjelmointikielissä aliohjelmien kutsut voidaan liittää aliohjelmien koodiin jo käännösaikana: kutsut ja määrittelyt sidotaan siis staattisesti (aikainen sidonta). Parametrinvälitys Monimuotoisuutta hyödynnetään usein parametrinvälityksessä. Parametrin tyypiksi asetetaan jokin riittävän lähellä hierarkian juurta oleva, jolloin metodille voidaan antaa parametriksi jälkeläisluokkien viitteitä (ja olioita). // Täällä rokotetaan // muun muassa // kissoja, koiria ja ihmisiä. Kissa rontti = new Kissa(); // Toimii, koska Kissa <: Nisakas. rokota(rontti); 12.11 12.12

Parametrinvälitys instanceof-operaattorilla voidaan selvittää parametriin liittyvän olion, jos tiedetään mitä luokkia oliot edustavat. Yleisesti: viite instanceof LuokanNimi Operaattori palauttaa totuusarvon true, mikäli viite osoittaa olioon, jonka (tai esi-isä) on nimeltään LuokanNimi. if (n instanceof Kissa) { // Täällä rokotetaan kissa. else if (n instanceof Ihminen) { // Täällä rokotetaan ihminen Huom! Operaattorin runsas käyttö ei ole suotavaa, koska yleensä pyritään mahdollisimman erillisiin luokkiin. Eksplisiittiset tyyppimuunnokset ()-operaattorilla ovat tuttuja jo alkeistyyppien yhteydestä. Esim. // 1.25 double osamaara = 5 / (double)4; // Väliaikainen muunnos, // osamäärän palaa arvoon 1.25 // tämän lauseen jälkeen System.out.println((int)osamaara); // 1 // Tallennetaan muunnoksen tulos. int kokonaisosa = (int)osamaara; // 1 12.13 12.14 Myös viitteen (staattinen ) voidaan tarvittaessa muuttaa toiseksi tyyppimuunnosoperaatiolla. Yleisesti: (LuokanNimi)viite ja ((LuokanNimi)viite).piirre missä LuokanNimi voi olla viitteen luokan esi-isän tai jälkeläisen nimi. // Luodaan Kissa-luokan olio ja asetetaan siihen -viite. mussu = new Kissa(); // Ei käänny. Staattinen on, joka ei kehrää. mussu.kehraa(); // Kääntyy. Staattinen tässä lauseessa Kissa. ((Kissa)mussu).kehraa(); lkuperäinen palautuu muunnoksen jälkeen, mutta tarvittaessa muunnoksen tulos voidaan sijoittaa toiseen viitteeseen, jonka on sama kuin muunnoksessa käytetty. // setetaan olioon viite, jonka on Kissa. Kissa mussu2 = (Kissa)mussu; // Onnistuu. Staattinen Kissa. mussu2.kehraa(); Yleensä tyyppi muunnetaan siten, että viitteen tyyppi muunnetaan alityypikseen (downcasting), koska monimuotoisuutta hyödynnetään usein parametrinvälityksessä. 12.15 12.16

on vaarallinen operaatio, koska kääntäjä tarkistaa vain onko tyyppimuunnos kieliopillisesti oikein. ten avulla viite voidaan liittää täysin väärän tyyppiseen olioon, jolloin staattisen luokan piirteiden käsittely aiheuttaa ohjelman pysäyttävän poikkeuksen. Esim. // Staattinen, dynaaminen Kissa. k = new Kissa(); // Voidaan muuntaa, koska > String, // mutta ohjelma kaatuu (ClassCastException). ((String)k).length(); jonaikaisia tyyppitarkistuksia voidaan tehdä instanceofoperaattorilla ennen tyyppimuunnosta. if (n instanceof Kissa) { // turvallinen, kun tiedetään // dynaamiseksi luokaksi Kissa. ((Kissa)n).sahise(); else if (n instanceof Ihminen) { // Täällä rokotetaan ihminen 12.17 12.18 Rajapinnat ja alityypitys Rajapinnat noudattavat alityypityssääntöjä. Rajapinnan toteuttava ja sen jälkeläiset katsotaan rajapinnan kanssa yhteensopiviksi. Oletetaan, että Kissa- toteuttaa Tervehtiva-rajapinnan. // Staattinen ja dynaaminen Kissa. Kissa mussu = new Kissa(); // Staattinen Tervehtiva, dynaaminen Kissa. Tervehtiva terve = mussu; terve.moikkaa(); terve.syo(); // Kääntyy; kutsutaan rajapinnan metodia. // Ei käänny; metodi ei viitteen luokassa. 12.19