Kursusindhold
Java OOP
Java OOP
OOP-Principper: Arv
Arv
Lad os tale om OOP-princippet - Arv.
Arv er en mekanisme, der muliggør oprettelse af klasser baseret på en anden klasse.
Klassen, der fungerer som grundlag, kaldes forælder eller superklasse;
Klassen, der oprettes på baggrund af forælderklassen, kaldes barn, subklasse eller efterkommer.
Dermed kan barneklassen arve egenskaber og karakteristika fra en anden klasse - forælderklassen (dens metoder og variabler).
Du kan arve en klasse ved at bruge nøgleordet extends
. Syntaksen for en barneklasse, der arver fra en forælderklasse, ser således ud:
Child.java
class Child extends Parent { // properties and methods }
Lad os se på et eksempel på, hvordan arv fungerer i kode. Vi har en klasse Bird
med bestemte felter og metoder, og der er en klasse Parrot
med sine egne felter og metoder. En papegøje er en fugl, så logisk set bør papegøjen arve fra Bird
-klassen:
Her er koden fra skærmbilledet, omskrevet for bedre læsbarhed og klarhed:
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 :("); } } }
Lad os forstå, hvad der sker på disse billeder:
Vi opretter en klasse
Bird
, som i dette tilfælde er forældreklassen. Denne klasse har sine egne felter og metoder;Vi opretter en klasse
Parrot
, som brugerextends
-nøgleordet til at arve fra forældreklassenBird
. KlassenParrot
er en underklasse og har sine egne felter og metoder. Derudover arverParrot
som underklasse alle felter og metoder fra forældreklassenBird
;Vi opretter et objekt af klassen
Parrot
imain
-metoden og ser, at vi kan initialisere felterne for bådeforældre- og underklassen. Først initialiserer vi felterne for forældreklassenBird
, og derefter initialiserer vi felterne for underklassenParrot
. Dernæst kalder vi metoderne: først metoderne fra forældreklassen og derefter metoden fra underklassen.
Dermed brugte vi arv til at arve klassen Bird
.
Hvorfor gør vi dette?
Når vi har mange forskellige underklasser af Bird
, ikke kun Parrot
, men for eksempel også Pigeon
og Penguin
, vil vi have mange duplikerede felter, såsom boolean canFly
. Det første arv hjælper med, er at undgå duplikerede kodefragmenter.
Desuden forbedrer det læsbarheden betydeligt. I praksis støder man sjældent direkte på klassen Bird
og dens underklasser, men arv bruges ofte, især med interfaces.
Note
Du lærer om interfaces i næste afsnit af dette kursus.
Regler for arv
Arv kun én klasse. Java understøtter ikke multipel arv. En klasse kan kun have én forælder;
Alt arves undtagen
private
-variabler og metoder.
Note
Du kan ikke arve fra dig selv!
Tidligere nævnte jeg, at en underklasse ville have adgang til alle variabler og metoder fra forælderen. Det er dog ikke helt sandt.
I virkeligheden er alle metoder og variabler markeret med private
-modifikatoren ikke tilgængelige for underklassen.
Overskriv forældreklassens metode.
Lad os forestille os, at vi arver en klasse, men der er visse dele af den arvede kode, vi ikke bryder os om. Antag, at vi ønsker, at en bestemt metode skal fungere anderledes end i forældreklassen.
For at overskrive en metode fra forældreklassen skriver vi @Override
ovenover:
Parrot.java
@Override public void eat() { System.out.println("The parrot is eating"); }
I koden ovenfor har vi overskrevet metoden fra forældreklassen, og nu, når denne metode kaldes fra barnklassen, vil den overskrevne metode blive udført!
Forhindring af arv.
Hvis du ikke ønsker, at nogen skal arve din klasse, skal du bruge final
-modifikatoren foran den.
For eksempel:
Bird.java
Parrot.java
public final class Bird { // fields and methods }
På denne måde har vi ved at bruge nøgleordet final
forbudt arv af Bird
-klassen.
Dette er blot de grundlæggende regler og egenskaber ved arv. Det er et omfattende emne, som du vil bruge meget ofte. Gennem kurset vil du blive fortrolig med andre aspekter af arv og anvende dem hyppigere.
1. Hvorfor har vi brug for arv i Java?
2. Hvor mange klasser kan vi arve fra på én gang?
3. Hvordan kan vi forhindre arv i Java?
Tak for dine kommentarer!