Direkt zum Hauptinhalt springen
eLearner.app
Modul 3 · Lektion 1 von 25/14 im Kurs~12 min
Lektionen des Moduls (1/2)

Vererbung

Vererbung ist ein grundlegender Mechanismus der OOP, der es einer Klasse (Tochterklasse oder Unterklasse genannt) ermöglicht, Felder und Methoden von einer anderen Klasse (Vaterklasse oder Superklasse genannt) zu erben.

Dies fördert die Wiederverwendbarkeit des Codes und vermeidet unnötige Wiederholungen.

Eine Klasse mit extends erweitern

In Java verwenden wir das Schlüsselwort extends, um anzugeben, dass eine Klasse von einer anderen erbt:

Code
class Vehicle {
    protected int speed; // 'protected' rende il campo visibile alle sottoclassi

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

class Car extends Vehicle {
    // Car eredita automaticamente il campo speed e il metodo honk()
}

Der Konstruktor und das Schlüsselwort super()

Wenn die Superklasse einen Konstruktor hat, der Parameter akzeptiert, muss die Unterklasse ihn explizit in ihrem Konstruktor mit super(...) als allererste Anweisung aufrufen:

Code
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); // Richiama il costruttore di Person
        this.studentId = studentId;
    }
}

Methoden überschreiben (@Override)

Eine Unterklasse kann eine eigene spezifische Implementierung für eine von der Superklasse geerbte Methode bereitstellen. Dieser Vorgang wird als Überschreiben (Method Overriding) bezeichnet und durch die Annotation @Override gekennzeichnet.

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

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

Der Modifikator protected

Der Zugriffsmodifikator protected spielt eine Schlüsselrolle bei der Vererbung. Im Gegensatz zu private, das Elemente nur innerhalb derselben Klasse sichtbar macht, ermöglicht protected den Zugriff auf Felder und Methoden sowohl innerhalb desselben Pakets (Package) als auch durch alle Unterklassen, selbst wenn sie sich in anderen Paketen befinden.

Mit super auf Elemente der Vaterklasse zugreifen

Neben dem Aufrufen des Konstruktors der Superklasse kann das Schlüsselwort super innerhalb der Methoden der Unterklasse verwendet werden, um auf Methoden oder Variablen der Vaterklasse zu verweisen. Dies ist besonders nützlich, wenn eine Methode überschrieben wird, aber dennoch das ursprüngliche Verhalten der Vaterklasse aufgerufen werden soll:

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

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Esegue il comportamento di Animal
        System.out.println("Il gatto fa le fusa mentre dorme.");
    }
}

Einfachvererbung in Java

In Java kann eine Klasse nur eine einzige Klasse erweitern (Einfachvererbung). Es ist nicht erlaubt, direkt von mehreren Klassen zu erben (Mehrfachvererbung), beispielsweise führt class Cat extends Animal, Mammal zu einem Fehler. Diese Designentscheidung vermeidet Mehrdeutigkeiten, die als „Diamant-Problem“ bekannt sind (wenn zwei Superklassen dieselbe Methode mit unterschiedlichen Implementierungen definieren). Um diese Einschränkung zu umgehen, führt Java das Konzept der Interfaces ein, das wir im nächsten Modul behandeln werden.


Probier es selbst

Übung#java.m3.l1.e1
Versuche: 0Wird geladen…

Vervollständige die Unterklasse Dog durch Erweitern von Animal. Deklariere den Konstruktor von Dog, der einen Namen (String) akzeptiert, und verwende super(name), um ihn an den Konstruktor von Animal zu übergeben.

Editor wird geladen…
Hinweis anzeigen

Schreibe `public Dog(String name) { super(name); }` in die Klasse Dog.

Lösung nach 3 Versuchen verfügbar

Übung#java.m3.l1.e2
Versuche: 0Wird geladen…

Erweitere Dog von Animal und überschreibe die Methode makeSound() so, dass sie die Zeichenkette Woof anstelle von Generic Sound zurückgibt. Verwende die Annotation @Override.

Editor wird geladen…
Hinweis anzeigen

Schreibe `@Override` über die Deklaration `public String makeSound() { return 'Woof'; }` in Dog.

Lösung nach 3 Versuchen verfügbar

Übung#java.m3.l1.e3
Versuche: 0Wird geladen…

Deklariere eine Klasse Cat, die Animal erweitert und die Methode makeSound() so überschreibt, dass sie die Zeichenkette Meow zurückgibt. Die Klasse Animal hat bereits einen Konstruktor, der einen Namen akzeptiert. Stelle sicher, dass der Konstruktor von Cat ebenfalls einen Namen akzeptiert und ihn korrekt an den Konstruktor der Superklasse übergibt.

Editor wird geladen…
Hinweis anzeigen

Erstelle die Klasse `Cat` durch Erweitern von `Animal`. Deklariere den Konstruktor `public Cat(String name) { super(name); }` und überschreibe die Methode `makeSound()` unter Verwendung von `@Override`, um `'Meow'` zurückzugeben.

Lösung nach 3 Versuchen verfügbar