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

Samankaltaiset tiedostot
9. Periytyminen Javassa 9.1

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

9. Periytyminen Javassa 9.1

15. Ohjelmoinnin tekniikkaa 15.1

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

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

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

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. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Oliot viestivät metodeja kutsuen

Mitä on periytyminen?

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

Pakkauksen kokoaminen

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

12. Monimuotoisuus 12.1

Olio-ohjelmointi Javalla

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

16. Javan omat luokat 16.1

1. Omat operaatiot 1.1

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

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

Periytyminen (inheritance)

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

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

19. Olio-ohjelmointia Javalla 19.1

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

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

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

Pakkauksen kokoaminen

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

2. Olio-ohjelmoinista lyhyesti 2.1

14. Poikkeukset 14.1

Javan perusteita. Janne Käki

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

4. Olio-ohjelmoinista lyhyesti 4.1

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

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

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

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

KOHDELUOKAN MÄÄRITTELY

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

7. Oliot ja viitteet 7.1

14. Poikkeukset 14.1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Java-kielen perusteet

20. Javan omat luokat 20.1

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

Mikä yhteyssuhde on?

Luokat ja oliot. Ville Sundberg

Java-kielen perusteet

Metodien tekeminen Javalla

Taulukot. Jukka Harju, Jukka Juslin

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

Olio-ohjelmointi Syntaksikokoelma

Rajapinta (interface)

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

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

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

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

7. Näytölle tulostaminen 7.1

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

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

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

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

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

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

Ohjelmointi 2, välikoe

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

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

11. Javan valintarakenteet 11.1

17. Javan omat luokat 17.1

5. HelloWorld-ohjelma 5.1

Luokan muodostimet (Constructors)

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

14. Hyvä ohjelmointitapa 14.1

public static void main (String [] args)

18. Abstraktit tietotyypit 18.1

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

12. Näppäimistöltä lukeminen 12.1

Poikkeustenkäsittely

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

Ohjelmoinnin perusteet, kurssikoe

Ohjelmoinnin jatkokurssi, kurssikoe

Java-kielen perusteita

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

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

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

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

17. Javan omat luokat 17.1

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

Transkriptio:

Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat ja periytyminen. Periytymisen estäminen. 9.1 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ä. Periytymismekanismi Java-kielessä Yleisesti: 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.3 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; Nisäkäs ja kissa (Kissa.java) public class Kissa extends Nisakas { // Aliluokan attribuutit. private String vari; private String hanta; // Aliluokan metodit: rakentajat, aksessorit, muut oliometodit jne. public void kehraa() { System.out.println("murr, murrrr"); 9.5 9.6 Nisäkäs ja kissa (Testi.java) // Luodaan kissa. Kissa mussu = new Kissa(); mussu.paino(9); mussu.hanta("pörrö"); System.out.println(mussu.paino()); // 9 System.out.println(mussu.hanta()); // pörrö mussu.syo(); // Syön kuin nisäkäs mussu.kehraa(); // murr, murrrr Oletetaan, että kaikki tiedostot ovat käännettäessä ja ajettaessa samassa hakemistossa. 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.7 9.8

Piirteiden näkyvyys periytymisessä Korvaaminen 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! Aliluokan B metodi m B korvaa (override) yliluokasta A perimänsä ilmentymämetodin m A, kun m B esitellään pääsääntöisesti täsmälleen samalla otsikolla kuin m A. 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.9 9.10 Nisäkäs ja kissa 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 täysin uutta koodia. Kissa-luokan metodi: public void syo() { System.out.println("Syön kuin kissa"); kehraa(); Nisäkäs ja kissa 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.11 9.12

Korvaaminen Korvattu metodi ei hävitä peitettyä versiota, vaan syrjäyttää sen siten, että peritty metodi on tarvittaessa saatavilla. Perittyä metodia voidaan kutsua super-attribuutin kautta, joka on aina automaattisesti käytettävissä Javan toimesta kuten this-attribuutti. Super-attribuutti viittaa olioon itseensä this-attribuutin tapaan, mutta super-attribuutin kautta oliota käsitellään yliluokkansa ilmentymänä. Super-attribuutilla voidaan viitata kaikkiin yliluokan näkyviin piirteisiin. Nisäkäs ja kissa 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. Kissa-luokan metodi: public void syo() { super.syo(); kehraa(); 9.13 9.14 Nisäkäs ja kissa 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 Override-annotaatio 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.15 9.16

Override-annotaatio Peittäminen periytymisen kautta 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(); Attribuutin tunnus peittää perityn attribuutin tunnuksen, kun jälkeläisessä (aliluokassa) esitellään attribuutti samalla tunnuksella kuin esi-isässä (yliluokassa). Vain aliluokassa näkyvä attribuutti voidaan peittää. Yliluokan public- ja protected-määrein esitellyt. o, p p, q A B Luokan B tunnus. p p Attribuutit: o, p Attribuutit: o, p, p, q Luokan A tunnus. 9.17 9.18 Peittäminen periytymisen kautta Periytymisen kautta peitettyyn yliluokan attribuuttiin voidaan viitata aliluokassa super-attribuutin avulla. Peittämistä ei voi estää toisen attribuutin tyyppiä tai näkyvyysmäärettä vaihtamalla. Peittäminen koskee vain jälkeläistä: Esi-isän metodeissa käytetään vain esi-isän attribuuttia. Yleensä ottaen ei ole tarvetta eikä edes syytä esitellä attribuutteja siten, että ne peittävät esi-isän attribuutin. Peittäminen periytymisen kautta public class A { // Attribuutti p näkyy kaikkiin A:n jälkeläisluokkiin, // riippumatta siitä, että sijaitsevatko jälkeläiset // A-luokan pakkauksessa tai muissa pakkauksissa. // Attribuutti näkyy myös A:n pakkauksen muihin luokkiin. protected char p = 'a'; public void tulosta() { System.out.println("A:n metodi: " + p); 9.19 9.20

Peittäminen periytymisen kautta public class B extends A { protected String p = "b"; // Peittää A:n attribuutin public void tulosta() { System.out.println("B:n metodi: " + p); System.out.println("super.p: " + super.p); super.tulosta(); B-luokan metodi tulostaa: B:n metodi: b super.p: a A:n metodi: a Rakentajat eivät periydy yliluokalta aliluokalle. Aliluokan oliota luotaessa kutsutaan automaattisesti yliluokan oletusrakentajaa. Yliluokan rakentaja alustaa yliluokan attribuutit, jonka jälkeen palataan suorittamaan aliluokan rakentajan sisältö. Aliluokan rakentajassa voidaan kutsua super-metodin avulla yliluokan rakentajaa, jolloin automaattista kutsua ei tapahdu. 9.21 9.22 Yliluokan rakentajan kutsu yleisesti: super(); tai super(parametrit); public Aliluokka() { super(); public Aliluokka(int p) { super(p); Yliluokan rakentajan kutsun on oltava aliluokan rakentajan ensimmäinen lause. Luokan oma rakentajaa voidaan kutsua luokan toisesta rakentajasta this-metodilla, jonka myös on oltava rakentajan ensimmäinen lause. public Aliluokka() { this(10); 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. Ketjuttamalla ei tarvitse kirjoittaa samaa koodia useampaan paikkaan. 9.23 9.24

public class A { private int a; public A() { a = 1; System.out.println("A:n 1. rakentaja"); public A(int i) { a = i; System.out.println("A:n 2. rakentaja"); public void tulosta() { System.out.println("a: " + a); public class B extends A { private int b; public B() { b = 2; System.out.println("B:n 1. rakentaja"); public B(int i) { super(); b = i; System.out.println("B:n 2. rakentaja"); public void tulosta() { super.tulosta(); System.out.println("b: " + b); 9.25 9.26 public class C extends B { private int c; public C() { c = 3; System.out.println("C:n 1. rakentaja"); public C(int i) { super(i + 2); c = i; System.out.println("C:n 2. rakentaja"); public void tulosta() { super.tulosta(); System.out.println("c: " + c); C s = new C(); s.tulosta(); C t = new C(10); t.tulosta(); Näytölle tulostuu A:n 1. rakentaja B:n 1. rakentaja C:n 1. rakentaja a: 1 b: 2 c: 3 A:n 1. rakentaja B:n 2. rakentaja C:n 2. rakentaja a: 1 b: 12 c: 10 9.27 9.28

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); 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.29 9.30 Nisäkäs ja kissa (Testi.java) 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 Periytymisen estäminen Luokan käyttö yliluokkana voidaan estää final-määreellä. Yleisesti: määreet final class LuokanNimi missä määreet-kohta on valinnainen. Samoin metodin korvaaminen kielletään varatulla sanalla final. 9.31 9.32