Lernpfad:Objektorientierte Programmierung mit Java/Vererbung: Unterschied zwischen den Versionen

keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
{{Navigation}}
{{Navigation}}
''Vererbung'' ist eines der wichtigsten Konzepte der Objektorientierten Programmierung. Mit ihr ist es möglich komplexe Problembereiche in sinnvolle Klassenhierarchien zu unterteilen. Dabei werden Eigenschaften und Fähigkeiten, die mehrere Klassen besitzen, nur einmal in einer '''Oberklasse''' implementiert und an eine oder mehrere '''Unterklassen''' weiter ''vererbt''.
''Vererbung'' ist eines der wichtigsten Konzepte der objektorientierten Programmierung. Mit ihr ist es möglich komplexe Problembereiche in sinnvolle Klassenhierarchien zu unterteilen. Dabei werden Eigenschaften und Fähigkeiten, die mehrere Klassen besitzen, nur einmal in einer '''Oberklasse''' implementiert und an eine oder mehrere '''Unterklassen''' weiter ''vererbt''.


== Vererbung im Überblick ==
== Vererbung im Überblick ==
Zeile 15: Zeile 15:
Es ergeben sich einige Dopplungen bei Eigenschaften und Methoden. Jede Klasse besitzt x- und y-Koordinaten und eine Richtung als Attribut, sowie die Methoden <code>versetzen</code> und <code>drehen</code>. Diese müssten bei der Implementierung jeweils exakt gleich umgesetzt werden, was neben viel Aufwand sehr fehleranfällig ist.
Es ergeben sich einige Dopplungen bei Eigenschaften und Methoden. Jede Klasse besitzt x- und y-Koordinaten und eine Richtung als Attribut, sowie die Methoden <code>versetzen</code> und <code>drehen</code>. Diese müssten bei der Implementierung jeweils exakt gleich umgesetzt werden, was neben viel Aufwand sehr fehleranfällig ist.


Statt dessen können im Problembereich logische Zusammenhänge zwischen den Klassen identifiziert werden. Jede Klasse ''ist eine'' <code>Form</code>. Ein <code>Quadrat</code> ''ist ein'' <code>Rechteck</code>. Die konkreten Form-Klassen haben alle bestimmte Attribute und Methoden gemeinsam.
Stattdessen können im Problembereich logische Zusammenhänge zwischen den Klassen identifiziert werden. Jede Klasse ''ist eine'' <code>Form</code>. Ein <code>Quadrat</code> ''ist ein'' <code>Rechteck</code>. Die konkreten Form-Klassen haben alle bestimmte Attribute und Methoden gemeinsam.


<code>Form</code> ist also eine '''Oberklasse''' von <code>Dreieck</code> und <code>Rechteck</code>. <code>Quadrat</code> ist eine '''Unterklasse''' von <code>Rechteck</code>. (Also ist <code>Rechteck</code> wiederum '''Oberklasse''' von <code>Quadrat</code>.) Die Methoden müssen so nur einmal in <code>Form</code> implementiert werden, sind aber durch die Vererbung in allen Objektinstanzen verfügbar.
<code>Form</code> ist also eine '''Oberklasse''' von <code>Dreieck</code> und <code>Rechteck</code>. <code>Quadrat</code> ist eine '''Unterklasse''' von <code>Rechteck</code>. (Also ist <code>Rechteck</code> wiederum '''Oberklasse''' von <code>Quadrat</code>.) Die Methoden müssen so nur einmal in <code>Form</code> implementiert werden, sind aber durch die Vererbung in allen Objektinstanzen verfügbar.
Zeile 29: Zeile 29:


{{Aufgabe:Start}}
{{Aufgabe:Start}}
# Folgende Begriffe sollen in Form eines Klassendiagramms in eine Klassenhierarchie umgesetzt werden: ''Gebäude - Kirche - Einfamilienhaus - Hochhaus - Haus - Bungalow - Dom - Kathedrale''.<br/>Von jedem Gebäude soll die Höhe und die zugelassene Anzahl Bewohner bzw. Besucher abrufbar sein. Die Höhe von Häusern berechnet sich aus der Anzahl der Stockwerke und der Höhe pro Stockwerk. In einem Hochaus sind pro Stockwerk eine Anzahl Personen zugelassen.<br/>Wähle zu diesem Zweck geeignete Attribute für die einzelnen Klassen. Beachte dabei, welche Attribute von der bzw. den Oberklasse(n) geerbt werden.
# Folgende Begriffe sollen in Form eines Klassendiagramms in eine Klassenhierarchie umgesetzt werden: ''Gebäude - Kirche - Einfamilienhaus - Hochhaus - Haus - Bungalow - Dom - Kathedrale''.<br/>Von jedem Gebäude soll die Höhe und die zugelassene Anzahl Bewohner bzw. Besucher abrufbar sein. Die Höhe von Häusern berechnet sich aus der Anzahl der Stockwerke und der Höhe pro Stockwerk. In einem Hochhaus sind pro Stockwerk eine Anzahl Personen zugelassen.<br/>Wähle zu diesem Zweck geeignete Attribute für die einzelnen Klassen. Beachte dabei, welche Attribute von der bzw. den Oberklasse(n) geerbt werden.
# Implementiere die Klassen. Nutz dazu das Vererbungskonzept so weit es geht aus.
# Implementiere die Klassen. Nutze dazu das Vererbungskonzept so weit es geht aus.
{{Aufgabe:End}}
{{Aufgabe:End}}


Zeile 47: Zeile 47:
</syntaxhighlight>
</syntaxhighlight>


Hat die Oberklasse ''keinen leeren Konstruktor'' (also keinen Konstruktor ohne Parameter), dann muss die Unterklasse noch den Konstruktor der Oberklasse mit Hilfe des Schlüsselwortes <code>super</code> ''explizit aufrufen'', um die Paramter zu initialisieren. Dies muss die erste Anweisung im Konstruktor der Unterklasse sein.
Hat die Oberklasse ''keinen leeren Konstruktor'' (also keinen Konstruktor ohne Parameter), dann muss die Unterklasse noch den Konstruktor der Oberklasse mithilfe des Schlüsselwortes <code>super</code> ''explizit aufrufen'', um die Parameter zu initialisieren. Dies muss die erste Anweisung im Konstruktor der Unterklasse sein.
<syntaxhighlight lang="java" line=1 highlight="11">
<syntaxhighlight lang="java" line=1 highlight="11">
public class Form {
public class Form {
Zeile 116: Zeile 116:
{{Aufgabe:Start}}
{{Aufgabe:Start}}
# Lies den [http://openbook.rheinwerk-verlag.de/javainsel/06_004.html#u6.4.1 "Abschnitt 6.4.1: Methoden in Unterklassen mit neuem Verhalten ausstatten"] im Onlinebuch "Java ist auch eine Insel" bis zur Überschrift "Die Annotation @Override".
# Lies den [http://openbook.rheinwerk-verlag.de/javainsel/06_004.html#u6.4.1 "Abschnitt 6.4.1: Methoden in Unterklassen mit neuem Verhalten ausstatten"] im Onlinebuch "Java ist auch eine Insel" bis zur Überschrift "Die Annotation @Override".
# Erstell ein kleines Beispielprojekt, an dem das Konzept "Überschreiben" erklärt werden kann.
# Erstelle ein kleines Beispielprojekt, an dem das Konzept "Überschreiben" erklärt werden kann.
{{Aufgabe:End}}
{{Aufgabe:End}}
=== Quiz ===
=== Quiz ===
Zeile 129: Zeile 129:


== <code>super</code> und <code>this</code> ==
== <code>super</code> und <code>this</code> ==
Wird eine Methode von einer Unterklasse überschrieben möchte man dennoch manchmal explizit die überschriebene Methode der Oberklasse aufrufen. Für diese Fälle gibt es das bekannte Schlüsselwort <code>super</code>. Es bezieht sich immer auf ''die Oberklasse der aktuellen Klasse''. Um ''explizit die aktuelle Klasse'' zu referenzieren, kann das Schlüsselwort <code>this</code> benutzt werden.
Wird eine Methode von einer Unterklasse überschrieben, möchte man dennoch manchmal explizit die überschriebene Methode der Oberklasse aufrufen. Für diese Fälle gibt es das bekannte Schlüsselwort <code>super</code>. Es bezieht sich immer auf ''die Oberklasse der aktuellen Klasse''. Um ''explizit die aktuelle Klasse'' zu referenzieren, kann das Schlüsselwort <code>this</code> benutzt werden.


Im folgenden Beispiel überschriebt die Klasse <code>Hund</code> die Methode <code>public void ausgabe()</code> er Oberklasse <code>Tier</code>, um auch die Rasse auszugeben. Die Ausgabe der Oberklasse soll dennoch gemacht werden, daher wird die Methode der Oberklasse explizit mit <code>super.ausgabe()</code> aufgerufen.
Im folgenden Beispiel überschriebt die Klasse <code>Hund</code> die Methode <code>public void ausgabe()</code> er Oberklasse <code>Tier</code>, um auch die Rasse auszugeben. Die Ausgabe der Oberklasse soll dennoch gemacht werden, daher wird die Methode der Oberklasse explizit mit <code>super.ausgabe()</code> aufgerufen.
8.581

Bearbeitungen