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!