Kurssisisältö
Java OOP
Java OOP
OOP-Periaatteet: Perintä
Perintä
Käsitellään OOP-periaatetta – Perintä.
Perintä on mekanismi, jonka avulla voidaan luoda luokkia toisen luokan pohjalta.
- Luokkaa, jota käytetään 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 (metodit ja muuttujat).
Luokan voi periä käyttämällä avainsanaa extends
. Aliluokan syntaksi, joka perii yliluokan, näyttää tältä:
Child.java
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, sekä luokka Parrot
, jolla on omat kentät ja metodit. Papukaija on lintu, joten loogisesti papukaijan tulisi periä Bird
-luokka:
Tässä on kuvakaappauksen koodi, kirjoitettu uudelleen paremman luettavuuden ja selkeyden vuoksi:
Bird.java
Parrot.java
Main.java
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:
- Luodaan luokka
Bird
, joka on tässä tapauksessa yliluokka. 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 aliluokkanaParrot
perii kaikki yliluokanBird
kentät ja metodit; - Luodaan
Parrot
-luokan oliomain
-metodissa ja nähdään, että voimme alustaa sekä yliluokan että aliluokan kentät. Ensin alustetaan yliluokanBird
kentät ja sitten aliluokanParrot
kentät. Seuraavaksi kutsutaan metodeja: ensin yliluokan metodit ja sitten aliluokan metodi.
Näin käytimme perintää perimään Bird
-luokan.
Miksi teemme näin?
Kun meillä on useita erilaisia Bird
-aliluokkia, ei pelkästään Parrot
, vaan esimerkiksi myös Pigeon
ja Penguin
, meillä olisi paljon päällekkäisiä kenttiä, kuten boolean canFly
. 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 peritään paitsi
private
-muuttujat ja metodit.
Huomio
Et voi periä itseäsi!
Aiemmin mainitsin, että aliluokalla olisi pääsy kaikkiin yliluokan muuttujiin ja metodeihin. Tämä ei kuitenkaan ole täysin totta.
Todellisuudessa kaikki private
-muuttujat ja -metodit 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, kirjoitamme @Override
sen yläpuolelle:
Parrot.java
@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
public final class Bird { // fields and methods }
Tällä tavalla, käyttämällä avainsanaa final
, olemme kieltäneet Bird
-luokan perimisen.
Nämä ovat vain perussäännöt ja perinnän ominaisuudet. Kyseessä on laaja aihe, jota tulet käyttämään 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ä samanaikaisesti?
3. Miten perintä voidaan estää Javassa?
Kiitos palautteestasi!