Kursinnhold
Java OOP
Java OOP
OOP-Prinsipper: Arv
Arv
La oss se nærmere på prinsippet om OOP – arv.
Arv er en mekanisme som gjør det mulig å opprette klasser basert på en annen klasse.
Klassen som fungerer som grunnlag kalles forelder eller superklasse;
Klassen som opprettes basert på foreldreklassen kalles barn, subklasse eller etterkommer.
Dermed kan barneklassen arve egenskaper og attributter fra en annen klasse – foreldreklassen (dens metoder og variabler).
Du kan arve en klasse ved å bruke nøkkelordet extends
. Syntaksen for en barneklasse som arver fra en forelderklasse ser slik ut:
Child.java
class Child extends Parent { // properties and methods }
La oss se på et eksempel på hvordan arv fungerer i kode. Vi har en klasse Bird
med bestemte felter og metoder, og det finnes en klasse Parrot
med sine egne felter og metoder. En papegøye er en fugl, så logisk sett bør papegøyen arve fra Bird
-klassen:
Her er koden fra skjermbildet, omskrevet for bedre lesbarhet og klarhet:
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 :("); } } }
La oss forstå hva som skjer i disse illustrasjonene:
Vi oppretter en klasse
Bird
, som er foreldrekategorien i vårt tilfelle. Denne klassen har egne felter og metoder;Vi oppretter en klasse
Parrot
, som brukerextends
-nøkkelordet for å arve fra foreldrekategorienBird
. KlassenParrot
er en underklasse, og den har egne felter og metoder. I tillegg, som underklasse, arverParrot
alle felter og metoder fra foreldrekategorienBird
;Vi oppretter et objekt av klassen
Parrot
imain
-metoden og ser at vi kan initialisere feltene til bådeforeldrekategorien og underklassen. Først initialiserer vi feltene til foreldrekategorienBird
, deretter initialiserer vi feltene til underklassenParrot
. Deretter kaller vi metodene: først metodene til foreldrekategorien, deretter metoden til underklassen.
Slik brukte vi arv for å arve klassen Bird
.
Hvorfor gjør vi dette?
Når vi har mange ulike underklasser av Bird
, ikke bare Parrot
, for eksempel også Pigeon
og Penguin
, vil vi få mange dupliserte felter, som boolean canFly
. Det første arv hjelper med, er å unngå dupliserte kodefragmenter.
Videre forbedrer det lesbarheten betydelig. I praksis møter du sjelden klassen Bird
og dens underklasser direkte, men arv brukes ofte, spesielt sammen med grensesnitt.
Merk
Du vil lære om grensesnitt i neste del av dette kurset.
Regler for arv
Arv kun én klasse. Java støtter ikke multippel arv. En klasse kan kun ha én forelder;
Alt arves unntatt
private
-variabler og metoder.
Merk
Du kan ikke arve fra deg selv!
Tidligere nevnte jeg at en underklasse ville ha tilgang til alle variabler og metoder fra foreldrekategorien. Det er imidlertid ikke helt sant.
I realiteten er alle metoder og variabler merket med private
-modifikatoren ikke tilgjengelige for underklassen.
Overstyr foreldrekategoriens metode.
La oss tenke oss at vi arver en klasse, men det er visse deler av den arvede koden vi ikke liker. Anta at vi ønsker at en bestemt metode skal fungere annerledes enn i foreldrekategorien.
For å overstyre en metode fra foreldrekategorien, skriver vi @Override
over den:
Parrot.java
@Override public void eat() { System.out.println("The parrot is eating"); }
I koden ovenfor har vi overstyrt metoden til foreldreklassen, og nå vil den overstyrte metoden bli kalt når denne metoden kalles fra barneklassen!
Forhindre arv.
Hvis du ikke ønsker at noen skal arve klassen din, bruk final
-modifikatoren foran den.
For eksempel:
Bird.java
Parrot.java
public final class Bird { // fields and methods }
På denne måten, ved å bruke nøkkelordet final
, har vi forbudt arv av Bird
-klassen.
Dette er bare de grunnleggende reglene og egenskapene ved arv. Det er et omfattende tema, og du vil bruke det svært ofte. Gjennom kurset vil du bli kjent med andre aspekter av arv og bruke dem oftere.
1. Hvorfor trenger vi arv i Java?
2. Hvor mange klasser kan vi arve fra samtidig?
3. Hvordan kan vi forhindre arv i Java?
Takk for tilbakemeldingene dine!