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:
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:
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.
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:
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
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.
Hinweis anzeigen
Schreibe `public Dog(String name) { super(name); }` in die Klasse Dog.
Lösung nach 3 Versuchen verfügbar
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.
Hinweis anzeigen
Schreibe `@Override` über die Deklaration `public String makeSound() { return 'Woof'; }` in Dog.
Lösung nach 3 Versuchen verfügbar
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.
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