9. Periytyminen Javassa 9.1

Samankaltaiset tiedostot
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ä

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

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

15. Ohjelmoinnin tekniikkaa 15.1

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

Oliot viestivät metodeja kutsuen

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

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

12. Monimuotoisuus 12.1

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

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

Mitä on periytyminen?

Pakkauksen kokoaminen

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

Olio-ohjelmointi Javalla

Periytyminen (inheritance)

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

16. Javan omat luokat 16.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

12. Monimuotoisuus 12.1

1. Omat operaatiot 1.1

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

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

Pakkauksen kokoaminen

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Metodien tekeminen Javalla

Mikä yhteyssuhde on?

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

19. Olio-ohjelmointia Javalla 19.1

KOHDELUOKAN MÄÄRITTELY

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

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Luokat ja oliot. Ville Sundberg

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

14. Poikkeukset 14.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

2. Olio-ohjelmoinista lyhyesti 2.1

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Javan perusteita. Janne Käki

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

20. Javan omat luokat 20.1

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

Java-kielen perusteet

4. Olio-ohjelmoinista lyhyesti 4.1

14. Poikkeukset 14.1

Sisällys. 15. Lohkot. Lohkot. Lohkot

Rajapinta (interface)

7. Oliot ja viitteet 7.1

Ohjelmointi 2, välikoe

11. Javan valintarakenteet 11.1

15. Ohjelmoinnin tekniikkaa 15.1

7. Näytölle tulostaminen 7.1

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

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

Olio-ohjelmointi Syntaksikokoelma

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

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

Poikkeustenkäsittely

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

5. HelloWorld-ohjelma 5.1

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

17. Javan omat luokat 17.1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Java kahdessa tunnissa. Jyry Suvilehto

Java-kielen perusteita

Taulukot. Jukka Harju, Jukka Juslin

ITKP102 Ohjelmointi 1 (6 op)

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

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

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

1. Olio-ohjelmointi 1.1

1 Tehtävän kuvaus ja analysointi

Rinnakkaisohjelmointi, Syksy 2006

ITKP102 Ohjelmointi 1 (6 op)

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Java-kielen perusteet

Luokan sisällä on lista

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

public static void main (String [] args)

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

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

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

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

18. Abstraktit tietotyypit 18.1

Ohjelmoinnin jatkokurssi, kurssikoe

Transkriptio:

9. Periytyminen Javassa 9.1

Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio. Rakentajat ja periytyminen. Periytymisen estäminen. 9.2

Periytymismekanismi Java-kielessä Javan luokkahierarkia on yksijuurinen kaikkien olioiden esi-isä on Object-luokka. Object-luokalla on joitakin hyödyllisiä piirteitä, jotka esitellään myöhemmin. Omia Java-luokkia ei tarvitse periyttää Object-luokasta, koska Java liittää automaattisesti tämän luokan omien luokkarakenteiden juuriluokan yliluokaksi. Javassa periytyminen ilmaistaan varatulla sanalla extends, jolla piirteet periytyvät automaattisesti yliluokasta aliluokkaan. Kaikki perityt piirteet eivät ole välttämättä käytettävissä. 9.3

Periytymismekanismi Java-kielessä määreet class Aliluokka extends Yliluokka {... missä määreet ja niiden puuttuminen säätelevät luokan näkyvyyttä (esimerkiksi public) ja luokan tyyppiä (final ja abstract). Luokat määritellään edelleen public-määreellä. 9.4

Nisäkäs ja kissa (Nisakas.java) public class Nisakas { private boolean elossa; private double paino; public boolean elossa() { return elossa; public void elossa(boolean e) { elossa = e; public double paino() { return paino; public void paino(double p) { if (p > 0) { paino = p; public void syo() { System.out.println("Syön kuin nisäkäs..."); public boolean onkoiso() { return false; 9.5

Nisäkäs ja kissa (Kissa.java) public class Kissa extends Nisakas { private String vari; private String hanta;... public void kehraa() { aantele("murr, murrrr..."); 9.6

Nisäkäs ja kissa (Testi.java) public class Testi { public static void main(string[] args) { // Luodaan kissa. Kissa mussu = new Kissa(); mussu.paino(9); mussu.hanta("pörrö"); System.out.println(mussu.paino()); // 9.0 System.out.println(mussu.hanta()); // pörrö mussu.syo(); // Syön kuin nisäkäs... mussu.kehraa(); // murr, murrrr... 9.7

Piirteiden näkyvyys periytymisessä Javan näkyvyysmääreet säätelevät piirteiden näkyvyyttä sekä luokkahierarkian sisällä että pakkausten välillä. Public-määreellä esitellyt luokan piirteet näkyvät aina jälkeläisille ja ovat käytettävissä pakkauksesta riippumatta kaikissa muissa luokissa. Private-määre kätkee yliluokan piirteet kaikilta muilta luokilta, myös jälkeläisiltä, pakkauksista riippumatta. Protected-määre on edellisten välimuoto, jolla on näkyvää vaikutusta näkyvyyteen vasta, kun luokat pakataan. Pakkausten välistä näkyvyyttä pohditaan lisää myöhemmin. 9.8

Piirteiden näkyvyys periytymisessä Private-määreellä kätketty tieto saadaan käyttöön luokan jälkeläisissä julkisten aksessoreiden kautta. // Metodin korvaus Kissa- // luokassa. public boolean onkoiso() { // Kätketty tieto voidaan // lukea perityllä metodilla. return paino() > 10; Jos julkisten aksessoreiden määrittely ei ole järkevää, on attribuutit esiteltävä protected-määreellä ja luokat pakattava. Näin kätketty tieto on huonommassa tallessa kuin private-määreellä esitelty. Protected-määrettä ei saa käyttää siksi, että ei jaksa kirjoittaa aksessoreita! 9.9

Korvaaminen Aliluokan metodi korvaa (override) yliluokasta perimänsä ilmentymämetodin, kun aliluokan metodi esitellään pääsääntöisesti täsmälleen samalla otsikolla kuin yliluokan metodi. Luokka- tai rajapintatyyppinen tyyppimääre voidaan korvata yhteensopivalla tyypillä (covariant return type). Näkyvyyttä voi laajentaa (protected public), mutta ei supistaa. Luokkametodia ei voi korvata. Korvaamisen sijasta tapahtuu metodin peittäminen (hiding). Korvaaminen on eri asia kuin kuormittaminen (overloading), jossa metodin nimi pysyy samana, mutta parametrilista vaihtelee. Korvaamismekanismin avulla voidaan toteuttaa yliluokasta peritty toiminnallisuus aliluokalle ominaisella tavalla. 9.10

Korvaaminen Korvaamisen muoto ja sen tarve on tapauskohtainen. Korvattua versiota voidaan kutsua tarvittaessa. Korvataan Kissa-luokassa peritty syo-metodi siten, että metodissa kuvataan kuinka nimenomaan kissat syövät. Metodin runko on kirjoitettu täysin uudestaan. public void syo() { System.out.println("Syön kuin kissa..."); kehraa(); 9.11

Korvaaminen public class Testi { public static void main(string[] args) { Nisakas nisse = new Nisakas(); Kissa mussu = new Kissa(); nisse.syo(); // Syön kuin nisäkäs... mussu.syo(); // Syön kuin kissa... // murr, murrrr... 9.12

Korvaaminen Korvattu metodi ei hävitä peitettyä versiota, vaan syrjäyttää sen siten, että peritty metodi on tarvittaessa saatavilla. Perittyä ilmentymämetodia voidaan kutsua superattribuutin kautta, joka on aina automaattisesti käytettävissä Javan toimesta kuten this-attribuutti. Super-attribuutilla voidaan viitata kaikkiin yliluokan näkyviin piirteisiin. Super-attribuuttia ei voi käyttää luokkametodissa, koska se on ilmentymäattribuutti. Luokkametodissa voidaan kutsua yliluokan metodia luokan nimen kautta. 9.13

Korvaaminen Korvataan Kissa-luokassa sinne peritty syo-metodi siten, että ensin syödään kuten nisäkkäät yleensä ja sitten aletaan kehrätä tyytyväisenä. Aluksi kutsutaan korvattua versiota. public void syo() { super.syo(); kehraa(); 9.14

Korvaaminen public class Testi { public static void main(string[] args) { Nisakas nisse = new Nisakas(); Kissa mussu = new Kissa(); nisse.syo(); // Syön kuin nisäkäs... mussu.syo(); // Syön kuin nisäkäs... // murr, murrrr... 9.15

Korvaaminen Annotaatiot (annotation) ovat kommenttien tapaan ohjelmaan liittyvää metatietoa (tietoa tiedosta). Annotaatioilla voidaan ohjailla Java-kääntäjän toimintaa. Annotaation tunnus alkaa @-merkillä. Esimerkiksi @Override, @Deprecated ja @SuppressWarnings. Ohjelmoija lisää annotaatiot itse lähdekoodiin. Tällä kurssilla hyödyllisin annotaatio on Java-kielen oma Override-annotaatio joka pakottaa kääntäjän ilmoittamaan virheestä, jos annotoitu metodi ei korvaa yliluokan metodia. Estää pienellä vaivalla korvauksen yhteydessä tavallisia kirjoitusja ajatusvirheitä. 9.16

Korvaaminen Override-annotaatio annetaan omalle rivilleen välittömästi ennen metodin otsikkoa. Annotaatio estää Kissa-luokan kääntämisen, jos syo-metodin korvaus on epäonnistunut esimerkiksi kirjoitusvirheen vuoksi siten, että korvauksen asemasta määritellään uusi metodi. // Annotaatio paljastaa epäonnistuneen korvauksen. @Override public void Syo() { super.syo(); kehraa(); 9.17

Periytyminen ja rakentajat Rakentajat eivät periydy yliluokalta aliluokalle. Aliluokan oliota luotaessa kutsutaan automaattisesti yliluokan oletusrakentajaa. Automaattista kutsua ei tapahdu, jos aliluokan rakentajassa kutsutaan super-metodin avulla yliluokan rakentajaa. Yliluokan rakentajaa ei voi kutsua sen nimellä. Yliluokan oletusrakentajan kutsuminen itse ei ole tarpeen. Yliluokan rakentaja alustaa yliluokan attribuutit, jonka jälkeen palataan suorittamaan aliluokan rakentajan sisältö. Rakentajan pitäisi alustaa vain oman luokkansa tietoja. 9.18

Periytyminen ja rakentajat Yliluokan rakentajan kutsun on oltava aliluokan rakentajan ensimmäinen lause. Luokan oma rakentajaa voidaan kutsua luokan toisesta rakentajasta this-metodilla. Myös tämän kutsun on oltava rakentajan ensimmäinen lause. public Aliluokka( ) { super( ); public Luokka() { this( ); public Luokka( ) { this(); 9.19

Periytyminen ja rakentajat Rakentajat suoritetaan ketjussa. Yliluokka kutsuu oman yliluokkansa rakentajaa joko automaattisesti tai ohjelmoijan toimesta kunnes päädytään Object-luokan rakentajaan. Luokkahierarkiassa edetään takaisin suorittamalla esi-isien rakentajat, joista kukin alustaa oman osuutensa aliluokan perimistä attribuuteista. Suoritetaan aliluokan rakentajan loput lauseet. Ketjuttamisen ansiosta luokka voi ottaa aina vastuun vain omien tietojensa alustamisesta ja samaa koodia ei tarvitse kirjoittaa useampaan paikkaan. 9.20

Nisäkäs ja kissa (Nisakas.java) public class Nisakas {... public Nisakas() { paino = 0.1; elossa = true; public Nisakas(boolean e, double p) { elossa(e); paino(p);... 9.21

Nisäkäs ja kissa (Kissa.java) public class Kissa extends Nisakas {... public Kissa(boolean e, double p, String v, String h) { // Kutsutaan yliluokan rakentajaa, // jolloin koodia ei tarvitse monistaa aliluokkaan. super(e, p); // Myös aksessoreita kutsumalla pääsee helpommalla. vari(v); hanta(h);... 9.22

Nisäkäs ja kissa (Testi.java) public class Testi { public static void main(string[] args) { Kissa hassu = new Kissa(true, 2, "harmaa", "kippura"); System.out.println(hassu.elossa()); // true System.out.println(hassu.paino()); // 2.0 System.out.println(hassu.vari()); // harmaa System.out.println(hassu.hanta()); // kippura 9.23

Nisäkäs ja kissa Object() true, 2 Nisakas(boolean e, double p) Kissa(boolean e, double p, String v, String h) super(e, p) new Kissa(true, 2, "harmaa", "kippura") 9.24

Periytymisen estäminen Luokan käyttö yliluokkana voidaan estää final-määreellä. määreet final class LuokanNimi... missä määreet-kohta on valinnainen. Metodin korvaaminen kielletään varatulla sanalla final. 9.25