Direct naar de hoofdinhoud
Module 3 · Les 1 van 25/14 in de cursus~12 min
Modulelessen (1/2)

Erfenis

Overerving is een fundamenteel mechanisme van OOP waarmee een klasse (een kindklasse of subklasse genoemd) velden en methoden kan overnemen van een andere klasse (een bovenliggende klasse of superklasse genoemd).

Dit bevordert hergebruik van code en voorkomt onnodige herhaling.

Een klas uitbreiden met extends

In Java gebruiken we het sleutelwoord extends om aan te geven dat een klasse van een andere klasse erft:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

De constructor en het trefwoord super()

Als de superklasse een constructor heeft die parameters accepteert, moet de subklasse deze expliciet in zijn constructor aanroepen met super(...) als allereerste statement:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

Methode overschrijven (@Override)

Een subklasse kan zijn eigen specifieke implementatie bieden voor een methode die is geërfd van de superklasse. Deze bewerking wordt overschrijven (methode overschrijven) genoemd en wordt aangegeven door de annotatie @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

De protected-modificator

De toegangsmodifier protected speelt een sleutelrol bij overerving. In tegenstelling tot private, dat leden alleen zichtbaar maakt binnen dezelfde klasse, staat protected toegang toe tot velden en methoden zowel binnen hetzelfde pakket als voor alle subklassen, zelfs als ze zich in verschillende pakketten bevinden.

Toegang tot bovenliggende leden met super

Naast het aanroepen van de superklasseconstructor, kan het sleutelwoord super binnen subklassemethoden worden gebruikt om te verwijzen naar methoden of variabelen van de bovenliggende klasse. Dit is met name handig als een methode wordt overschreven, maar u nog steeds het oorspronkelijke bovenliggende gedrag wilt aanroepen:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Enkelvoudige erfenis op Java

In Java kan een klasse slechts één klasse uitbreiden (enkele overerving). Directe overerving uit meerdere klassen (meervoudige overerving) is niet toegestaan; class Cat extends Animal, Mammal zal bijvoorbeeld een compilatiefout veroorzaken. Deze ontwerpkeuze vermijdt dubbelzinnigheden die bekend staan ​​als het "diamantprobleem" (wanneer twee superklassen dezelfde methode definiëren met verschillende implementaties). Om deze beperking te omzeilen introduceert Java het concept van Interfaces, dat we in de volgende module zullen onderzoeken.


Probeer het zelf

Oefening#java.m3.l1.e1
Pogingen: 0Laden…

Voltooi de subklasse Dog door Animal uit te breiden. Declareer de Dog-constructor die een naam (String) accepteert en super(naam) gebruikt om deze door te geven aan de Animal-constructor.

Editor laden…
Toon hint

Schrijf `public Dog(Stringnaam) { super(naam); }` binnen de klasse Hond.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m3.l1.e2
Pogingen: 0Laden…

Breid Dog uit van Animal en overschrijf de methode makeSound() zodat deze de string Woof retourneert in plaats van Generic Sound. Gebruik de annotatie @Override.

Editor laden…
Toon hint

Schrijf `@Override` boven de declaratie `public String makeSound() { return 'Woof'; }` binnen Hond.

Oplossing beschikbaar na 3 pogingen

Oefening#java.m3.l1.e3
Pogingen: 0Laden…

Declareer een klasse Cat die Animal uitbreidt en de methode makeSound() overschrijft om de tekenreeks Meow te retourneren. De klasse Animal heeft al een constructor die een naam accepteert; zorg ervoor dat de Cat-constructor ook een naam accepteert en deze correct doorgeeft aan de superklasse-constructor.

Editor laden…
Toon hint

Maak de klasse `Cat` en breid `Animal` uit. Declareer de constructor `public Cat(String name) { super(name); }` en overschrijf de methode `makeSound()` met behulp van `@Override` om `'Meow'` terug te geven.

Oplossing beschikbaar na 3 pogingen