Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele OOP-Periaatteet: Perintä | OOP
Java OOP

bookOOP-Periaatteet: Perintä

Perintä

Käsitellään OOP:n periaatetta – Perintä.

Perintä on mekanismi, jonka avulla voidaan luoda luokkia toisen luokan pohjalta.

  • Luokkaa, joka toimii pohjana, kutsutaan yliluokaksi tai superluokaksi;
  • Luokkaa, joka luodaan yliluokan pohjalta, kutsutaan aliluokaksi, alaluokaksi tai jälkeläiseksi.

Näin ollen aliluokka voi periä toisen luokan ominaisuudet ja piirteet – eli yliluokan (sen metodit ja muuttujat).

Luokan voi periä käyttämällä avainsanaa extends. Aliluokan syntaksi, joka perii yliluokan, näyttää tältä:

Child.java

Child.java

copy
123
class Child extends Parent { // properties and methods }

Tarkastellaan esimerkkiä siitä, miten perintä toimii koodissa. Meillä on luokka Bird, jolla on tietyt kentät ja metodit, ja luokka Parrot, jolla on omat kentät ja metodit. Papukaija on lintu, joten loogisesti papukaijan tulisi periä Bird-luokka:

Tässä on kuvakaappauksesta otettu koodi, kirjoitettuna uudelleen paremman luettavuuden ja selkeyden vuoksi:

Bird.java

Bird.java

Parrot.java

Parrot.java

Main.java

Main.java

copy
12345678910111213141516171819
package animals.birds; public class Bird { public String color; public boolean canFly; public int maxAge; public void eat() { System.out.println("The bird is eating"); } public void fly() { if (canFly) { System.out.println("The bird is flying!"); } else { System.out.println("This bird can't fly :("); } } }

Käydään läpi, mitä näissä kuvissa tapahtuu:

  1. Luodaan luokka Bird, joka toimii tässä tapauksessa yliluokkana. Tällä luokalla on omat kenttänsä ja metodinsa;
  2. Luodaan luokka Parrot, joka käyttää extends-avainsanaa periäkseen yliluokan Bird. Parrot-luokka on aliluokka, jolla on omat kentät ja metodit. Lisäksi aliluokkana Parrot perii kaikki yliluokan Bird kentät ja metodit;
  3. Luodaan Parrot-luokan olio main-metodissa ja nähdään, että voimme alustaa sekä yliluokan että aliluokan kentät. Ensin alustetaan yliluokan Bird kentät ja sen jälkeen aliluokan Parrot kentät. Seuraavaksi kutsutaan metodeja: ensin yliluokan metodit ja sitten aliluokan metodi.

Näin käytettiin perintää Bird-luokan perimiseen.

Miksi näin tehdään?

Kun meillä on useita erilaisia Bird-aliluokkia, ei pelkästään Parrot, vaan esimerkiksi myös Pigeon ja Penguin, tällöin kenttiä, kuten boolean canFly, esiintyy monessa paikassa. Perintä auttaa ensisijaisesti välttämään koodin toistoa. Lisäksi se parantaa luettavuutta merkittävästi. Käytännössä Bird-luokkaa ja sen aliluokkia käytetään harvoin suoraan, mutta perintä on yleistä, erityisesti rajapintojen (interface) kanssa.

Huomio

Opit rajapinnoista tämän kurssin seuraavassa osiossa.

Perinnän säännöt

  • Peri vain yksi luokka. Java ei tue moniperintää. Yhdellä luokalla voi olla vain yksi yliluokka;

  • Kaikki periytyy paitsi private-muuttujat ja -metodit.

Huomio

Et voi periä itseäsi!

Aiemmin mainittiin, että aliluokka saa käyttöönsä kaikki yliluokan muuttujat ja metodit. Tämä ei kuitenkaan ole täysin totta.

Todellisuudessa kaikki private-muodolla merkityt metodit ja muuttujat eivät ole aliluokan käytettävissä.

  • Yliluokan metodin ylikirjoittaminen.

Kuvitellaan, että perimme luokan, mutta haluamme muuttaa jotain perityssä koodissa. Oletetaan, että haluamme tietyn metodin toimivan eri tavalla kuin yliluokassa.

Ylikirjoittaaksemme yliluokan metodin, kirjoitetaan @Override sen yläpuolelle:

Parrot.java

Parrot.java

copy
1234
@Override public void eat() { System.out.println("The parrot is eating"); }

Yllä olevassa koodissa olemme ylikirjoittaneet yläluokan metodin, ja nyt kun tätä metodia kutsutaan alaluokasta, kutsutaan ylikirjoitettua metodia!

  • Periytymisen estäminen.

Jos et halua, että kukaan perii luokkaasi, käytä final-määrettä sen edessä. Esimerkiksi:

Bird.java

Bird.java

Parrot.java

Parrot.java

copy
123
public final class Bird { // fields and methods }

Tällä tavalla, käyttämällä avainsanaa final, olemme kieltäneet perimisen Bird-luokasta.

Nämä ovat vain perussäännöt ja perinnän ominaisuudet. Se on laaja aihe, ja tulet käyttämään sitä hyvin usein. Kurssin aikana tutustut muihin perinnän osa-alueisiin ja käytät niitä yhä useammin.

1. Miksi tarvitsemme perintää Javassa?

2. Kuinka monesta luokasta voimme periä kerrallaan?

3. Kuinka voimme estää periytymisen Javassa?

question mark

Miksi tarvitsemme perintää Javassa?

Select the correct answer

question mark

Kuinka monesta luokasta voimme periä kerrallaan?

Select the correct answer

question mark

Kuinka voimme estää periytymisen Javassa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you explain how method overriding works in inheritance?

What is the difference between private and public fields in inheritance?

Why can't Java support multiple inheritance?

Awesome!

Completion rate improved to 4.76

bookOOP-Periaatteet: Perintä

Pyyhkäise näyttääksesi valikon

Perintä

Käsitellään OOP:n periaatetta – Perintä.

Perintä on mekanismi, jonka avulla voidaan luoda luokkia toisen luokan pohjalta.

  • Luokkaa, joka toimii pohjana, kutsutaan yliluokaksi tai superluokaksi;
  • Luokkaa, joka luodaan yliluokan pohjalta, kutsutaan aliluokaksi, alaluokaksi tai jälkeläiseksi.

Näin ollen aliluokka voi periä toisen luokan ominaisuudet ja piirteet – eli yliluokan (sen metodit ja muuttujat).

Luokan voi periä käyttämällä avainsanaa extends. Aliluokan syntaksi, joka perii yliluokan, näyttää tältä:

Child.java

Child.java

copy
123
class Child extends Parent { // properties and methods }

Tarkastellaan esimerkkiä siitä, miten perintä toimii koodissa. Meillä on luokka Bird, jolla on tietyt kentät ja metodit, ja luokka Parrot, jolla on omat kentät ja metodit. Papukaija on lintu, joten loogisesti papukaijan tulisi periä Bird-luokka:

Tässä on kuvakaappauksesta otettu koodi, kirjoitettuna uudelleen paremman luettavuuden ja selkeyden vuoksi:

Bird.java

Bird.java

Parrot.java

Parrot.java

Main.java

Main.java

copy
12345678910111213141516171819
package animals.birds; public class Bird { public String color; public boolean canFly; public int maxAge; public void eat() { System.out.println("The bird is eating"); } public void fly() { if (canFly) { System.out.println("The bird is flying!"); } else { System.out.println("This bird can't fly :("); } } }

Käydään läpi, mitä näissä kuvissa tapahtuu:

  1. Luodaan luokka Bird, joka toimii tässä tapauksessa yliluokkana. Tällä luokalla on omat kenttänsä ja metodinsa;
  2. Luodaan luokka Parrot, joka käyttää extends-avainsanaa periäkseen yliluokan Bird. Parrot-luokka on aliluokka, jolla on omat kentät ja metodit. Lisäksi aliluokkana Parrot perii kaikki yliluokan Bird kentät ja metodit;
  3. Luodaan Parrot-luokan olio main-metodissa ja nähdään, että voimme alustaa sekä yliluokan että aliluokan kentät. Ensin alustetaan yliluokan Bird kentät ja sen jälkeen aliluokan Parrot kentät. Seuraavaksi kutsutaan metodeja: ensin yliluokan metodit ja sitten aliluokan metodi.

Näin käytettiin perintää Bird-luokan perimiseen.

Miksi näin tehdään?

Kun meillä on useita erilaisia Bird-aliluokkia, ei pelkästään Parrot, vaan esimerkiksi myös Pigeon ja Penguin, tällöin kenttiä, kuten boolean canFly, esiintyy monessa paikassa. Perintä auttaa ensisijaisesti välttämään koodin toistoa. Lisäksi se parantaa luettavuutta merkittävästi. Käytännössä Bird-luokkaa ja sen aliluokkia käytetään harvoin suoraan, mutta perintä on yleistä, erityisesti rajapintojen (interface) kanssa.

Huomio

Opit rajapinnoista tämän kurssin seuraavassa osiossa.

Perinnän säännöt

  • Peri vain yksi luokka. Java ei tue moniperintää. Yhdellä luokalla voi olla vain yksi yliluokka;

  • Kaikki periytyy paitsi private-muuttujat ja -metodit.

Huomio

Et voi periä itseäsi!

Aiemmin mainittiin, että aliluokka saa käyttöönsä kaikki yliluokan muuttujat ja metodit. Tämä ei kuitenkaan ole täysin totta.

Todellisuudessa kaikki private-muodolla merkityt metodit ja muuttujat eivät ole aliluokan käytettävissä.

  • Yliluokan metodin ylikirjoittaminen.

Kuvitellaan, että perimme luokan, mutta haluamme muuttaa jotain perityssä koodissa. Oletetaan, että haluamme tietyn metodin toimivan eri tavalla kuin yliluokassa.

Ylikirjoittaaksemme yliluokan metodin, kirjoitetaan @Override sen yläpuolelle:

Parrot.java

Parrot.java

copy
1234
@Override public void eat() { System.out.println("The parrot is eating"); }

Yllä olevassa koodissa olemme ylikirjoittaneet yläluokan metodin, ja nyt kun tätä metodia kutsutaan alaluokasta, kutsutaan ylikirjoitettua metodia!

  • Periytymisen estäminen.

Jos et halua, että kukaan perii luokkaasi, käytä final-määrettä sen edessä. Esimerkiksi:

Bird.java

Bird.java

Parrot.java

Parrot.java

copy
123
public final class Bird { // fields and methods }

Tällä tavalla, käyttämällä avainsanaa final, olemme kieltäneet perimisen Bird-luokasta.

Nämä ovat vain perussäännöt ja perinnän ominaisuudet. Se on laaja aihe, ja tulet käyttämään sitä hyvin usein. Kurssin aikana tutustut muihin perinnän osa-alueisiin ja käytät niitä yhä useammin.

1. Miksi tarvitsemme perintää Javassa?

2. Kuinka monesta luokasta voimme periä kerrallaan?

3. Kuinka voimme estää periytymisen Javassa?

question mark

Miksi tarvitsemme perintää Javassa?

Select the correct answer

question mark

Kuinka monesta luokasta voimme periä kerrallaan?

Select the correct answer

question mark

Kuinka voimme estää periytymisen Javassa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 2. Luku 2
some-alt