Wat zijn inheritance en polymorfisme in referentietypen?
sobes.tech AI
Antwoord van AI
Overerving is een mechanisme waarmee een nieuwe klasse (subklasse, afgeleide klasse) velden en methoden van een bestaande klasse (superklasse) kan erven. Dit bevordert hergebruik van code en de hiërarchie van klassen.
Polymorfisme (veelvormigheid) is het vermogen van een object om meerdere vormen aan te nemen. In de context van referentietypen betekent dit dat een variabele van een superklasse kan verwijzen naar een object van een subklasse. Dit maakt het mogelijk om objecten van verschillende subklassen op een uniforme manier te behandelen via een gemeenschappelijke interface of superklasse.
Er zijn twee hoofdtypen polymorfisme:
- Compileertijd (statisch polymorfisme): meestal bereikt door method overloading, waarbij een klasse meerdere methoden met dezelfde naam heeft, maar met verschillende handtekeningen (aantal en/of types van parameters).
- Uitvoertijd (dynamisch polymorfisme): bereikt door method overriding, waarbij een subklasse haar eigen implementatie van een methode biedt die al in de superklasse is gedefinieerd. Bij het aanroepen van zo'n methode via een referentie naar de superklasse wordt de implementatie van de subklasse uitgevoerd (als het objecttype een subklasse is).
Voorbeeld van overerving en dynamisch polymorfisme:
// Basisklasse
class Animal {
public void makeSound() {
System.out.println("Algemeen dierengeluid");
}
}
// Subklasse
class Dog extends Animal {
@Override // Methode overschrijven
public void makeSound() {
System.out.println("Waf!");
}
}
// Subklasse
class Cat extends Animal {
@Override // Methode overschrijven
public void makeSound() {
System.out.println("Miauw!");
}
}
public class Main {
public static void main(String[] args) {
// Statische type van variabele Animal, dynamische type van object Dog
Animal myDog = new Dog();
// Statische type van variabele Animal, dynamische type van object Cat
Animal myCat = new Cat();
// Statische type van variabele Animal, dynamische type van object Animal
Animal genericAnimal = new Animal();
// Demonstratie van polymorfisme
myDog.makeSound(); // Roept de methode van Dog aan
myCat.makeSound(); // Roept de methode van Cat aan
genericAnimal.makeSound(); // Roept de methode van Animal aan
}
}
In dit voorbeeld erven Dog en Cat van Animal. De variabelen myDog, myCat en genericAnimal hebben statisch type Animal, maar verwijzen naar objecten van verschillende dynamische types (Dog, Cat, Animal). Bij het aanroepen van de methode makeSound(), wordt in elke referentie de juiste implementatie van de methode uitgevoerd op basis van het dynamische type van het object, wat polymorfisme in runtime is.