CodeGym /Kurse /JAVA 25 SELF /Begriff der Vererbung, Syntax von

Begriff der Vererbung, Syntax von extends

JAVA 25 SELF
Level 17 , Lektion 0
Verfügbar

1. Was ist Vererbung?

Vererbung ist ein Mechanismus, der es ermöglicht, eine neue Klasse auf Basis einer bereits existierenden zu erstellen, indem man deren Eigenschaften und Methoden „vererbt“. Die neue Klasse heißt Unterklasse (oder abgeleitete Klasse), die ursprüngliche heißt Elternklasse (oder Basisklasse).

Das ist, als würden Sie einen neuen Kuchen auf Basis eines alten Rezepts machen: Sie nehmen das Beste daraus, fügen ein paar neue Zutaten hinzu – und voilà, schon haben Sie „Kuchen nach Omas Rezept mit geheimer Zutat“.

  • Elternklasse – enthält gemeinsame Eigenschaften und Verhalten.
  • Unterklasse – erbt all das und kann zusätzlich eigenes hinzufügen oder Verhalten ändern.

Zum Beispiel: „Katze ist ein Tier“: Alle Katzen sind Tiere, aber nicht alle Tiere sind Katzen. Tier kann die Basisklasse sein und Katze deren Unterklasse – ebenso wie Hund zum Beispiel.
Oder: „Kreis ist eine Figur“: Jeder Kreis ist eine Figur, aber nicht jede Figur ist ein Kreis. Figur kann die Elternklasse sein und Kreis sowie Dreieck ihre Unterklassen. In Java werden diese Beziehungen mit dem Schlüsselwort extends umgesetzt.

Wozu braucht man Vererbung?

Die Millionenfrage: Warum nicht einfach Code von einer Klasse in eine andere kopieren? Warum wurde Vererbung überhaupt erfunden?

  • Wiederverwendung von Code: Alles Gemeinsame wird in die Basisklasse ausgelagert. Felder und Methoden müssen nicht dupliziert werden – sie stehen den Unterklassen automatisch zur Verfügung. Beispielsweise kann in einem Programm für eine Universität die Basisklasse Person sein, die mindestens Name und Geburtstag hat; „Student“ und „Dozent“ sind Unterklassen mit eigenen Eigenschaften.
  • Erweiterung und Spezialisierung: Man kann neue Eigenschaften und Methoden hinzufügen oder bestehende nur dort ändern, wo es nötig ist. Alle Tiere geben Laute von sich, aber die Katze miaut, während der Hund bellt. Außerdem kann man der Katze die Fähigkeit geben, auf Bäume zu klettern (die Basisklasse hat das nicht).
  • Strukturierung von Hierarchien: Der Code wird logischer und verständlicher. Wenn Sie Klassen wie Animal, Dog, Cat haben, ist sofort klar, dass Dog und Cat Spezialfälle von Animal sind.

Beispiel. Gäbe es in Java keine Vererbung, müssten Sie Methoden wie eat(), sleep() und das Feld name in jede Tierklasse kopieren. Und wenn morgen die Methode breathe() hinzukommen soll, müssten Sie Dutzende Klassen ändern! Mit Vererbung genügt es, die „Atem“-Fähigkeit in die Basisklasse zu packen.

2. Vererbungssyntax: extends

Wie deklariert man Vererbung in Java? Ganz einfach: Verwenden Sie das Schlüsselwort extends.

class ParentClass {
    // Felder und Methoden
}

class Subclass extends ParentClass {
    // zusätzliche Felder und Methoden
}

Beispiel 1: Tiere

// Elternklasse
class Animal {
    String name;

    void eat() {
        System.out.println(name + " isst.");
    }
}

// Unterklasse
class Cat extends Animal {
    void meow() {
        System.out.println(name + " sagt: Miau!");
    }
}

Was passiert hier?

  • Die Klasse Cat erbt alle Felder und Methoden der Klasse Animal.
  • Das heißt, Cat hat bereits das Feld name und die Methode eat(), obwohl wir sie nicht explizit geschrieben haben.
  • Zusätzlich bekommt Cat die eigene Methode meow().

Verwendung

public class Main {
    public static void main(String[] args) {
        Cat kitty = new Cat();
        kitty.name = "Buddy";
        kitty.eat();      // Buddy isst.  (geerbt)
        kitty.meow();     // Buddy sagt: Miau! (eigene Methode)
    }
}

Voilà! Wir erhalten eine neue Klasse mit minimalem Code und vermeiden Duplizierung.

3. Was genau erbt eine Unterklasse?

In Java erbt eine Unterklasse:

  • Alle öffentlichen (public) und geschützten (protected) Felder und Methoden der Basisklasse.
  • Alle package-private Felder und Methoden, wenn sich die Unterklasse im selben Package befindet.

Nicht geerbt werden:

  • Konstruktoren (sie müssen in der Unterklasse explizit deklariert werden).
  • Private (private) Felder und Methoden (sie sind nur innerhalb der Basisklasse selbst zugänglich).
  • Statische Initialisierungsblöcke (sie werden nicht vererbt, können aber in jeder Klasse vorhanden sein).
  • Mitglieder mit package-private Zugriff, wenn sich die Unterklasse in einem anderen Package befindet.

Veranschaulichung

class Animal {
    public String name;
    private int age;

    public void eat() { 
        System.out.println("Ich esse"); 
    }
    private void secret() { 
        System.out.println("Geheimnis!"); 
    }
}

class Dog extends Animal {
    public void bark() { 
        System.out.println("Wau!"); 
    }
}
  • Dog erbt das Feld name und die Methode eat().
  • Dog sieht nicht das Feld age und die Methode secret() – sie sind privat.

4. Einschränkungen der Vererbung in Java

Java ist ziemlich streng und hat seine eigenen Regeln:

Nur Einfachvererbung bei Klassen: Jede Klasse kann nur von genau einer anderen Klasse erben. Eine Klasse kann jedoch beliebig viele Unterklassen haben.

class Dog extends Animal { ... } // OK
class Dog extends Animal, Pet { ... } // Fehler! So geht es nicht

Mehrfachvererbung von Schnittstellen (Interfaces) – möglich, aber das ist eine eigene Geschichte; dazu später mehr.

Die Klasse Object ist die Oberklasse aller Klassen in Java. Auch wenn Sie extends nicht explizit schreiben, erbt Ihre Klasse implizit von Object.

5. Praktisches Beispiel

Bauen wir unsere „zoologische“ Anwendung weiter.

Schritt 1. Basisklasse Animal

class Animal {
    String name;

    void eat() {
        System.out.println(name + " isst.");
    }
}

Schritt 2. Unterklasse Cat

class Cat extends Animal {
    void meow() {
        System.out.println(name + " sagt: Miau!");
    }
}

Schritt 3. Unterklasse Dog

class Dog extends Animal {
    void bark() {
        System.out.println(name + " sagt: Wau!");
    }
}

Schritt 4. Klassen verwenden

public class Main {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "Bella";
        cat.eat();   // Bella isst.
        cat.meow();  // Bella sagt: Miau!

        Dog dog = new Dog();
        dog.name = "Rex";
        dog.eat();   // Rex isst.
        dog.bark();  // Rex sagt: Wau!
    }
}

Was haben wir erhalten?

  • Beide Klassen Cat und Dog verwenden das gemeinsame Feld name und die Methode eat() aus der Basisklasse.
  • Jede Klasse fügt ihr eigenes, einzigartiges Verhalten hinzu: meow() für die Katze, bark() für den Hund.
  • Wenn man ändern muss, wie Tiere essen, genügt es, die Methode eat() in der Klasse Animal anzupassen – die Änderungen gelten automatisch für alle Unterklassen.

6. Nützliche Feinheiten

Visualisierung: Klassenhierarchie

Man kann sich die Hierarchie so vorstellen:

.        Animal
        /    \
     Cat     Dog
  • Animal – Basisklasse, enthält alles Allgemeine für Tiere.
  • Cat und Dog – Unterklassen, sie bringen ihre einzigartigen Eigenschaften mit.

Ein wenig über Konstruktoren und Vererbung

Konstruktoren werden nicht vererbt. Wenn Sie in der Unterklasse keinen Konstruktor definieren, fügt Java automatisch einen parameterlosen Konstruktor hinzu (sofern die Elternklasse einen hat). Hat die Elternklasse nur einen Konstruktor mit Parametern, muss dieser in der Unterklasse explizit über super(...) aufgerufen werden. Kurzes Beispiel:

class Animal {
    String name;
    Animal(String name) {
        this.name = name;
    }
}

class Cat extends Animal {
    Cat(String name) {
        super(name); // Konstruktor der Elternklasse aufrufen
    }
}

7. Typische Fehler beim Einsatz von Vererbung

Fehler Nr. 1: Versuch, gleichzeitig von mehreren Klassen zu erben.
In Java kann man nicht class Cat extends Animal, Pet schreiben. Nur eine Elternklasse ist erlaubt!

Fehler Nr. 2: Die Erwartung, dass private Felder und Methoden in der Unterklasse verfügbar sind.
Private Mitglieder werden nicht vererbt (genauer: sie existieren, sind aber aus der Unterklasse nicht zugänglich). Verwenden Sie protected, wenn Unterklassen Zugriff haben sollen.

Fehler Nr. 3: Vergessener Aufruf des Eltern-Konstruktors.
Wenn die Basisklasse keinen parameterlosen Konstruktor hat und Sie super(...) nicht explizit aufrufen, führt das zu einem Kompilierungsfehler.

Fehler Nr. 4: Vererbung „nur um Code zu sparen“ statt aus inhaltlichen Gründen.
Wenn zwischen Klassen keine „ist-ein“-Beziehung (is-a) besteht, sollten Sie Vererbung nicht einsetzen. Zum Beispiel sollte „Mensch“ nicht von „Auto“ erben, auch wenn beide ein Feld speed haben.

1
Aufgabe
JAVA 25 SELF, Level 17, Lektion 0
Gesperrt
Training eines virtuellen Haustiers: Katzengewohnheiten 🐾
Training eines virtuellen Haustiers: Katzengewohnheiten 🐾
1
Aufgabe
JAVA 25 SELF, Level 17, Lektion 0
Gesperrt
Die Treue des Hundes: Schlaf und Bellen in der virtuellen Welt 🐶
Die Treue des Hundes: Schlaf und Bellen in der virtuellen Welt 🐶
1
Aufgabe
JAVA 25 SELF, Level 17, Lektion 0
Gesperrt
Unternehmensfuhrpark: Fahrzeuge starten 🚗
Unternehmensfuhrpark: Fahrzeuge starten 🚗
1
Aufgabe
JAVA 25 SELF, Level 17, Lektion 0
Gesperrt
Obstladen: Bunte Gaben der Natur 🍎🍌
Obstladen: Bunte Gaben der Natur 🍎🍌
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION