Lernziele

Zentrale Konzepte in diesem Kapitel: Vererbung, Subtyping, Ersetzbarkeit, polymorphe Variablen
Java-Konstrukte in diesem Kapitel: extends, super (in Konstruktoren), Cast-Operator, Object

10.1 Einsatz von Vererbung

Konzept:
Vererbung erlaubt uns, eine Klasse als Erweiterung einer anderen zu definieren

Vererbung ist ein Mechanismus, mit dem wir unser Problem der Code-Duplizierung lösen können

Für dieses neu eingeführte Konzept der objektorientieren Programmierung brauchen wir auch eine passende Terminologie. In einer Situation wie dieser sagen wir: “Die Klasse NachrichtEinsendung erbt von der Klasse Einsendung”

Wenn wir über Java-Programme sprechen, sagen wir auch manchmal, dass die Klasse NachrichtenEinsendung die Klasse Einsendung erweitert (extends)

Konzept:
Eine Superklasse ist eine Klasse, die von anderen Klassen erweitert wird.

Konzept:
Eine Subklasse ist eine Klasse, die eine andere Klasse erweitert bzw. von dieser Klasse erbt. Sie erbt alle Datenfelder und Methoden von Ihrer Superklasse.

10.2 Vererbungshierarchien

Konzept:
Klassen, Die über Vererbungsbeziehungen miteinander verknüpft sin, bilden eine Vererbungshierarchie

10.3 Vererbung in Java

// Superklasse

public class Einsendung
{
  private String benutzername;
  private long zeitstempel;
  private int gefielWieOft;
  private ArrayList<String> kommentare;
  //Konstruktoren und Methoden hier ausgelassen
}


// Vererbung einfügen

public class NachrichtenEinsendung extends Einsendung
{
  private String nachricht;
  //Konstruktoren und Methoden hier ausgelassen
}

public class FotoEinsendung extends Einsendung
{
  private String dateiname;
  private String ueberschrift;
  //Konstruktoren und Methoden hier ausgelassen
}

Die Klausel extends Einsendung gibt an, dass diese Klasse eine Subklasse der Klasse Einsendung ist. Zweitens definiert die Klasse NachrichtenEinsendung nur die Datenfelder die spezifisch für NachrichtenEinsendung-Objekte sind. (In diesem Fall nur nachricht)

Notes: Die Subklassen können so auf die Public-Felder/Methoden der Superklasse zugreifen.

10.4 Vererbung und Initialisierung

public class Einsendung
{
  private String benutzername;
  private long zeitstempel;
  private int gefielWieOft;
  private ArrayList<String> kommentare;
  
  public Einsendung(String autor)
  {
    benutzername = autor;
    zeitstempel = System.currentTimeMillis();
    gefielWieOft = 0;
    kommentare = new ArrayList<>();
  }
}



public class NachrichtenEinsendung extends Einsendung
{
  private String nachricht;
  
  public NachrichtenEinsendung(String autor, String text)
  {
    super(autor); // ist vom Konstruktor Einsendung (Superklasse)
    nachricht = text;
  }  

}

Der Konstruktor von NachrichtenEinsendung bekommt alle Parameter, die für die Initialisierung von Datenfeldern in den beiden Klassen Einsendung und NachrichtenEinsendung benötigt werden. -> super(autor)

Notes: Das Schlüsselwort super bewirkt hier – Ausgehend vom Konstruktor der Subklasse – einen Aufruf des Konstruktors der Superklasse. In Java muss im Konstruktor einer Subklasse immer als erste Anweisung der Konstruktor der Superklasse aufgerufen werden.

Konzept:
Konstruktor der Superklasse: Im Konstruktor einer Subklasse muss immer als erste Anweisung der Konstruktor der Superklasse aufgerufen werden. Wenn im Quelltext kein solcher Aufruf angegeben ist, versucht Java automatisch, einen parameterlosen Aufruf einzufügen.

10.5 Wiederverwendung

Konzept:
Vererbung erlaubt die Wiederverwendung bereits erstellter Klassen in neuen Zusammenhängen

Diese Art der Wiederverwendung bewirkt, dass wir sehr viel weniger programmieren müssen, wenn wir weitere “Einsendungs-“typen einführen.

10.6 Vorteile durch Vererbung

  • Vermeidung von Code-Duplizierung: Die Verwendung von Vererbung vermeidet, dass gleiche oder weitgehend ähnliche Quelltextabschnitte doppelt oder mehrfach geschrieben werden müssen.
  • Wiederverwendung von Quelltext: Bestehender Quelltext kann wiederverwendet werden. Wenn bereits eine Klasse existiert die unseren Anforderungen sehr nahekommt, dann können wir manchmal eine Subklasse dieser Klasse definieren und ihre Implementierung wiederverwenden, anstatt alles erneut definieren zu müssen
  • Einfachere Wartung: Die Wartung der Anwendung wird vereinfacht, den die Beziehung zwischen den Klassen sind explizit ausgedrückt. Eine Änderung an Datenfeldern oder Methoden, die zwischen mehreren Subklassen geteilt werden, muss nur einmal vorgenommen werden.
  • Erweiterbarkeit: Durch Vererbung ird es einfacher, eine bestehende Anwendung zu erweitern.

10.7 Subtyping

Konzept:
Subtyp: Analog zur Klassenhierarchie bilden die Objekttypen eine Typenhierarchie. Der Typ, der durch eine Subklasse definiert ist, ist ein Subtyp des Typs, der durch die zugeordnete Superklasse definiert wird.

Konzept:
Variablen und Subtypen: Eine Variable kann ein Objekt halten, dessen Typ entweder gleich dem deklarierten Typ der Variablen oder ein beliebiger Subtyp des deklarierten Typs ist

Fahrzeug f1 = new Fahrzeug();
Fahrzeug f2 = new Auto();
Fahrzeug f3 = new Fahrrad();

Konzept:
Ersetzbarkeit: Objekte von Subtypen können an allen Stellen verwendet werden, an denen ein Supertyp erwartet wird. Dieses Prinzip nennen wir Ersetzbarkeit.

Notes: Umgekehrt funktioniert nicht

Auto meinAuto = new Fahrzeug() // dies ist ein Fehler
Auto a2 = new Fahrzeug() // dies ist ein Fehler!

Die Übergabe eines Parameters verhält sich exakt wie eine Zuweisung an eine Variable. Deshalb können wir ein Objekt von Typ Auto an eine Methode übergeben, die einen Parameter vom Typ Fahrzeug erwartet.

public void methodenName (Fahrzeug fahrzeug){}

xxx.methodenName(f2); // Ein Objekt Auto.

10.8 Polymorphe Variablen

Variablen für Objekttypen sind in Java polymorphe Variablen. Der Term polymorh -> vielgestaltig bezieht sich auf den Umstand dass eine Variable Objekte von verschiedenen Typen halten kann.

10.9 Die Klasse Object

Konzept:
Alle Klassen ohne explizit deklarierte Superklasse haben Object als ihre Superklasse

Zusammenfassung der Konzepte

  • Vererbung erlaubt uns, eine Klasse als Erweiterung einer anderen zu definieren
  • Eine Superklasse ist eine Klasse, die von anderen Klassen erweitert wird.
  • Eine Subklasse ist eine Klasse, die eine andere Klasse erweitert bzw. von dieser Klasse erbt. Sie erbt alle Datenfelder und Methoden von Ihrer Superklasse.
  • Klassen, Die über Vererbungsbeziehungen miteinander verknüpft sin, bilden eine Vererbungshierarchie
  • Konstruktor der Superklasse: Im Konstruktor einer Subklasse muss immer als erste Anweisung der Konstruktor der Superklasse aufgerufen werden. Wenn im Quelltext kein solcher Aufruf angegeben ist, versucht Java automatisch, einen parameterlosen Aufruf einzufügen.
  • Vererbung erlaubt die Wiederverwendung bereits erstellter Klassen in neuen Zusammenhängen
  • Subtyp: Analog zur Klassenhierarchie bilden die Objekttypen eine Typenhierarchie. Der Typ, der durch eine Subklasse definiert ist, ist ein Subtyp des Typs, der durch die zugeordnete Superklasse definiert wird.
  • Variablen und Subtypen: Eine Variable kann ein Objekt halten, dessen Typ entweder gleich dem deklarierten Typ der Variablen oder ein beliebiger Subtyp des deklarierten Typs ist
  • Ersetzbarkeit: Objekte von Subtypen können an allen Stellen verwendet werden, an denen ein Supertyp erwartet wird. Dieses Prinzip nennen wir Ersetzbarkeit.
  • Alle Klassen ohne explizit deklarierte Superklasse haben Object als ihre Superklasse
Zuletzt bearbeitet: 24. Oktober 2022

Autor

Kommentare

Schreibe eine Antwort oder einen Kommentar

Deine EMail-Adresse wird nicht veröffentlicht.