OOP-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
123class 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
Parrot.java
Main.java
12345678910111213141516171819package 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:
- Luodaan luokka
Bird, joka toimii tässä tapauksessa yliluokkana. Tällä luokalla on omat kenttänsä ja metodinsa; - Luodaan luokka
Parrot, joka käyttääextends-avainsanaa periäkseen yliluokanBird.Parrot-luokka on aliluokka, jolla on omat kentät ja metodit. Lisäksi aliluokkanaParrotperii kaikki yliluokanBirdkentät ja metodit; - Luodaan
Parrot-luokan oliomain-metodissa ja nähdään, että voimme alustaa sekä yliluokan että aliluokan kentät. Ensin alustetaan yliluokanBirdkentät ja sen jälkeen aliluokanParrotkentä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
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
Parrot.java
123public 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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
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
OOP-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
123class 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
Parrot.java
Main.java
12345678910111213141516171819package 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:
- Luodaan luokka
Bird, joka toimii tässä tapauksessa yliluokkana. Tällä luokalla on omat kenttänsä ja metodinsa; - Luodaan luokka
Parrot, joka käyttääextends-avainsanaa periäkseen yliluokanBird.Parrot-luokka on aliluokka, jolla on omat kentät ja metodit. Lisäksi aliluokkanaParrotperii kaikki yliluokanBirdkentät ja metodit; - Luodaan
Parrot-luokan oliomain-metodissa ja nähdään, että voimme alustaa sekä yliluokan että aliluokan kentät. Ensin alustetaan yliluokanBirdkentät ja sen jälkeen aliluokanParrotkentä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
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
Parrot.java
123public 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?
Kiitos palautteestasi!