9 periytyminen javassa
This presentation is the property of its rightful owner.
Sponsored Links
1 / 33

9. Periytyminen Javassa PowerPoint PPT Presentation


  • 65 Views
  • Uploaded on
  • Presentation posted in: General

9. Periytyminen Javassa. Sisällys. Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super -attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat ja periytyminen. Periytymisen estäminen. Periytymismekanismi Java-kielessä.

Download Presentation

9. Periytyminen Javassa

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


9 periytyminen javassa

9. Periytyminen Javassa


Sis llys

Sisällys

  • Periytymismekanismi Java-kielessä.

  • Piirteiden näkyvyys periytymisessä.

  • Metodien korvaaminen ja super-attribuutti.

  • Attribuutin peittäminen periytymisen kautta.

  • Rakentajat ja periytyminen.

  • Periytymisen estäminen.


Periytymismekanismi java kieless

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: Java liittää automaattisesti tämän luokan omien luokkarakenteiden juuriluokan yliluokaksi.

  • Javassa periytyminen ilmaistaan varatulla sanalla extends, jolla piirteet periytyvät automaattisesti.

  • Perityt piirteet eivät ole välttämättä käytettävissä.


Periytymismekanismi java kieless1

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


Nis k s ja kissa nisakas java

Nisäkäs ja kissa (Nisakas.java)

public class Nisakas {

// Yliluokan attribuutit.

private boolean elossa;

private double paino;

// Yliluokan metodit.

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

Nisäkäs ja kissa (Kissa.java)

public classKissa 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...");

}

}


Nis k s ja kissa testi java

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

System.out.println(mussu.hanta());// pörrö

mussu.syo();// Syön kuin nisäkäs...

mussu.kehraa();// murr, murrrr...

}

}

  • Huom! Kaikki tiedostot ovat samassa hakemistossa.


Piirteiden n kyvyys periytymisess

Piirteiden näkyvyys periytymisessä

  • Javan näkyvyysmääreet (private, protected ja public) säätelevät piirteiden näkyvyyttä sekä luokkahierarkian sisällä että pakkausten välillä.

  • Koska pakkaukset käsitellään myöhemmin, nyt riittää tietää vain seuraavaa:

    • public-määreellä esitellyt yliluokan piirteet näkyvät aina jälkeläisille ja ovat käytettävissä kaikissa muissa luokissa.

    • private-määre kätkee yliluokan piirteet sekä jälkeläisiltä että kaikilta muilta luokilta.

    • protected-määre on edellisten välimuoto, kun luokat on jaettu pakkauksiin.


Nis k s ja kissa

Nisäkäs ja kissa

  • Lisätään Kissa-luokkaan metodi:

    public boolean onkoIso() { return paino > 10; }

  • Koodi ei kuitenkaan mene läpi kääntäjästä, joka sanoo “paino has private access in Nisakas”.

  • paino-attribuutinprivate-määre:

    private double paino;

    kätkee attribuutin kaikilta muilta luokilta mukaan lukien myös aliluokat, vaikka Nisakas-luokka on esitelty public-määreellä!


Kissa luokan olio

mussu-olion perusluokka on Kissa.

mussu on myös Nisakas, mutta kätketty paino-attribuutti ei ole mussun käytettävissä.

Attribuutti saadaan kuitenkin käyttöön epäsuorasti aksessorin avulla:

public boolean onkoIso() {

return paino() > 10;

}

paino, elossa

paino()

paino(Double)

syo() ...

vari, hanta

aantele(String)

kehraa() ...

Kissa-luokan olio

  • Jos julkisten aksessoreiden määrittely ei ole järkevää, on luokkien 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!


Korvaaminen

Korvaaminen

  • Aliluokan metodi korvaa (override) yliluokan metodin, mikäli aliluokassa esitellään (näkyvyysmäärettä lukuun ottamatta) metodi täsmälleen samalla otsikolla kuin yliluokan metodi.

    • Näkyvyyttä voi laajentaa, mutta ei supistaa.

  • Korvaaminen on siis eri asia kuin kuormittaminen (overloading), jossa metodin nimi pysyy samana, mutta parametrilista vaihtelee.

  • Korvaamismekanismin avulla voidaan toteuttaa yliluokan määrittelemä toiminnallisuus aliluokalle ominaisella tavalla.

  • Korvaamisen muoto ja sen tarve tapauskohtainen.

    • Korvattua versiota voidaan kutsua tarvittaessa.


Nis k s ja kissa1

Nisäkäs ja kissa

  • Määritellään Kissa-luokkaan syo()-metodi, jossa 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 kissa2

Nisäkäs ja kissa

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

}


Korvaaminen1

Korvaaminen

  • Korvaamisen voi ajatella tunnuksen peittämisenä: aliluokan uusi versio syrjäyttää yliluokan version, mutta ei hävitä sitä.

  • Peitettyyn metodiin voidaan viitata luokan super-attribuutilla (vertaa this). Yleisesti:

    super.metodinNimi(…);

  • super-attribuutti on automaattisesti käytettävissä Javan toimesta.

    • super-attribuutti ei näy luokan ulkopuolelle.


Korvaaminen2

super-attribuutti viittaa olioon itseensä, mutta olio asetetaan yliluokkansa rooliin. (this-attribuuttia käytetään perusluokan roolissa.)

Attribuutilla voidaan viitata vain yliluokan näkyviin osiin.

Huom! Periytyminen on vain yksi luokkien välisistä suhteista (assosiaatioista) UML:lla piirretyissä luokka-kaavioissa. Assosiaatioita voidaan nimetä ja nimen yhteyteen voidaan piirtää myös nuoli, joka kuvaa assosiaation lukusuunnan.

super

Kissa

Nisakas

Korvaaminen


Nis k s ja kissa3

Nisäkäs ja kissa

  • Määritellään Kissa-luokkaan syo()-metodi, jossa syödään ensin 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();

    }


Nis k s ja kissa4

Nisäkäs ja kissa

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

}


Peitt minen periytymisen kautta

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.

Attribuutit: o, p

A

o, p

Attribuutit: o, p, p, q

B

p, q

p

p

Luokan A tunnus.

Luokan B tunnus.

Peittäminen periytymisen kautta


Peitt minen periytymisen kautta1

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


Peitt minen periytymisen kautta2

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);

}

}


Peitt minen periytymisen kautta3

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


Periytyminen ja rakentajat

Periytyminen ja rakentajat

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


Periytyminen ja rakentajat1

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); …

}

Periytyminen ja rakentajat


Periytyminen ja rakentajat2

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.

  • Ketjuttamalla ei tarvitse kirjoittaa samaa koodia useampaan paikkaan.


Periytyminen ja rakentajat3

Periytyminen ja rakentajat

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); }

}


Periytyminen ja rakentajat4

Periytyminen ja rakentajat

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);

}

}


Periytyminen ja rakentajat5

Periytyminen ja rakentajat

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);

}

}


Periytyminen ja rakentajat6

Periytyminen ja rakentajat

public class Testi {

public static void main(String[] args) {

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


Nis k s ja kissa nisakas java1

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 java1

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);

}

...

}


Nis k s ja kissa testi java1

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

}

}


Periytymisen est minen

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.


Norjalainen mets kissa

Norjalainen metsäkissa

public final class Kissa extends Nisakas {

...

}

// Kissan periytyminen Norjalaiseksi metsäkissaksi ei nyt

// onnistu (cannot inherit from final Kissa)

public class NorjalainenMetsakissa extends Kissa {

public NorjalainenMetsakissa() { super(6, "tuuhea"); }

}


  • Login