Java-erfenis meesteren: concepten, typen en praktische voorbeelden
Java-erfenis meesteren
Verken Java-erfenis in diepte – begrijp de principes, real-world voorbeelden en hoe je het toepast voor schonere, herbruikbare code.
Erfenis is een hoeksteen van objectgeoriënteerd programmeren waarmee je een nieuwe klasse kunt maken op basis van een bestaande.
De afgeleide klasse heet een subklasse (kind of afgeleide), terwijl de klasse die het uitbreidt de superklasse (ouder of basis) is. Het extends sleutelwoord realiseert deze relatie.
class Dier { // methoden en velden } class Hond extends Dier { // Hond erft velden en methoden van Dier }
Hier erft Hond alle leden van Dier – de subklasse krijgt de functionaliteit van de ouder.
Voorbeeld 1: Basis erfenis
class Dier { String naam; public void eet() { System.out.println("Ik kan eten"); } } class Hond extends Dier { public void toon() { System.out.println("Mijn naam is " + naam); } } class Main { public static void main(String[] args) { Hond labrador = new Hond(); labrador.naam = "Rohu"; labrador.toon(); labrador.eet(); } }
Uitvoer
Mijn naam is Rohu Ik kan eten
In dit voorbeeld erft Hond naam en eet() van Dier, zodat een Hond-object ze direct kan benaderen.

De is-een relatie
Erfenis in Java vertegenwoordigt een is-een relatie: een subklasse is een gespecialiseerde vorm van zijn superklasse.
- Auto is een Voertuig
- Sinaasappel is een Fruit
- Chirurg is een Dokter
- Hond is een Dier
Deze natuurlijke hiërarchieën rechtvaardigen het gebruik van erfenis.
Methode overriden
Wanneer een subklasse een methode definieert met dezelfde handtekening als zijn superklasse, overrided de subklasse-methode de superklasse-versie. Dit maakt runtime polymorfisme mogelijk.
Voorbeeld 2: eat() overriden
class Dier { public void eet() { System.out.println("Ik kan eten"); } } class Hond extends Dier { @Override public void eet() { System.out.println("Ik eet hondenvoer"); } public void blaf() { System.out.println("Ik kan blaffen"); } } class Main { public static void main(String[] args) { Hond labrador = new Hond(); labrador.eet(); labrador.blaf(); } }
Uitvoer
Ik eet hondenvoer Ik kan blaffen
De eet() aanroep op labrador resolveert naar de ge-override methode in Hond.
Tip: De @Override annotatie is optioneel maar sterk aanbevolen – het zorgt ervoor dat de compiler controleert of je inderdaad een methode overrided.
super gebruiken om de superklasse te benaderen
Bij overriden laat het super sleutelwoord je de implementatie van de ouder aanroepen.
Voorbeeld 3: super in eet()
class Dier { public void eet() { System.out.println("Ik kan eten"); } } class Hond extends Dier { @Override public void eet() { super.eet(); System.out.println("Ik eet hondenvoer"); } public void blaf() { System.out.println("Ik kan blaffen"); } } class Main { public static void main(String[] args) { Hond labrador = new Hond(); labrador.eet(); labrador.blaf(); } }
Uitvoer
Ik kan eten Ik eet hondenvoer Ik kan blaffen
Hier roept super.eet() de methode aan gedefinieerd in Dier voordat de subklasse-logica uitgevoerd wordt.
Op dezelfde manier kan super superklasse constructors aanroepen.
Protected leden in erfenis
Velden of methoden gemarkeerd als protected zijn toegankelijk voor subklassen ongeacht pakket.
Voorbeeld 4: Toegang tot protected leden
class Dier { protected String naam; protected void toon() { System.out.println("Ik ben een dier."); } } class Hond extends Dier { public void getInfo() { System.out.println("Mijn naam is " + naam); } } class Main { public static void main(String[] args) { Hond labrador = new Hond(); labrador.naam = "Rocky"; labrador.toon(); labrador.getInfo(); } }
Uitvoer
Ik ben een dier. Mijn naam is Rocky
De subklasse kan het protected veld naam vrij lezen en wijzigen en toon() aanroepen.
Waarom erfenis gebruiken?
- Code hergebruik: Een kindklasse erft automatisch alle public en protected leden van zijn ouder.
- Polymorfisme: Overriden maakt dynamische methode-dispatch mogelijk, een sleutelfeature van runtime polymorfisme.
Typen erfenis
Java ondersteunt vijf conceptuele erfenismodellen – elk nuttig in verschillende scenario's.
1. Enkele erfenis
Een klasse breidt slechts één superklasse uit.

2. Meervoudige erfenis (Multilevel)
Een subklasse wordt de superklasse van een andere klasse, wat een ketting creëert.

3. Hiërarchische erfenis
Meerdere subklassen erven van één superklasse.

4. Multiple erfenis
Java staat niet toe dat een klasse meer dan één klasse uitbreidt, maar interfaces bieden een manier om dit patroon te bereiken.

Let op: Multiple erfenis kan geïmplementeerd worden via interfaces; zie Java implements multiple inheritance.
5. Hybride erfenis
Een mengsel van twee of meer erfenistypen – bijvoorbeeld het combineren van hiërarchische en multiple erfenis.

Java
- C# Inheritance: Concepten, Types en Praktische Code
- C# Erfelijkheid Beheersen: Herbruikbare, Onderhoudbare Code Bouwen
- Java's final-sleutelwoord begrijpen: variabelen, methoden en klassen
- Java instanceof operator: een uitgebreide gids
- Java geneste static classes begrijpen: gebruik, verschillen en voorbeelden
- Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
- Java Singleton patroon uitgelegd: hoe veilig te implementeren en gebruiken
- Java Reflectie meesteren: klassen, methoden en velden inspecteren tijdens runtime
- Java ObjectOutputStream: Serialisatie, methoden en praktische voorbeelden
- Java Generics: Herbruikbare, type-veilige code bouwen
- Java-bestandsbewerkingen onder de knie krijgen met java.io – Aanmaken, lezen, schrijven en verwijderen