OOP-Periaatteet: Perintä
Pyyhkäise näyttääksesi valikon
Perintä
Käsitellään OOP-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 – yliluokan – ominaisuudet ja piirteet (metodit ja muuttujat).
Luokan periminen tapahtuu avainsanalla 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 :("); } } }
Tarkastellaan, mitä näissä kuvissa tapahtuu:
- Luodaan luokka
Bird, joka on tässä tapauksessa yliluokka. Tällä luokalla on omat kentät ja metodit; - Luodaan luokka
Parrot, joka käyttääextends-avainsanaa periäkseen yliluokanBird.Parrot-luokka on aliluokka, ja sillä on omat kentät ja metodit. Lisäksi aliluokkanaParrotperii kaikki kentät ja metodit yliluokastaBird; - 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 metodeja ja sitten aliluokan metodia.
Näin käytimme perintää perimään Bird-luokan.
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 paljon päällekkäin. Perinnän ensimmäinen hyöty on välttää päällekkäistä koodia.
Lisäksi se parantaa merkittävästi luettavuutta. Käytännössä Bird-luokkaa ja sen aliluokkia kohdataan harvoin suoraan, mutta perintää käytetään yleisesti, erityisesti rajapintojen 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 mainitsin, että aliluokka saa käyttöönsä kaikki yliluokan muuttujat ja metodit. Tämä ei kuitenkaan ole täysin totta.
Todellisuudessa kaikki private-määreellä merkityt metodit ja muuttujat eivät ole aliluokan käytettävissä.
- Yliluokan metodin ylikirjoittaminen.
Kuvitellaan, että perimme luokan, mutta tietyt perityn koodin osat eivät miellytä. 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ä ennen sitä.
Esimerkiksi:
Bird.java
Parrot.java
123public final class Bird { // fields and methods }
Tällä tavalla käyttämällä avainsanaa final olemme kieltäneet periytymisen Bird-luokasta.
Nämä ovat vain perussäännöt ja periytymisen ominaisuudet. Aihe on laaja, ja tulet käyttämään sitä hyvin usein. Kurssin aikana tutustut muihin periytymisen osa-alueisiin ja käytät niitä yhä enemmän.
1. Miksi tarvitsemme periytymistä Javassa?
2. Kuinka monesta luokasta voimme periä kerrallaan?
3. Miten perintä voidaan estää Javassa?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme