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

Zur Navigation springen Zur Suche springen
keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 25: Zeile 25:
# Implementiere die Klassen. Nutz dazu das Vererbungskonzept so weit es geht aus.
# Implementiere die Klassen. Nutz dazu das Vererbungskonzept so weit es geht aus.
{{Aufgabe:End}}
{{Aufgabe:End}}
== Vererbung implmentieren ==
Für die Implementierung von Vererbung gibt es in Java das Schlüsselwort <code>extends</code>. Man ergänzt es bei der Unterklasse direkt hinter dem Klassennamen mit dem Namen der Oberklasse.
<syntaxhighlight lang="java" line=1>
public class Form {
  // ...
}
public class Rechteck extends Form {
  // ...
}
public class Quadrat extends Rechteck {
  // ...
}
</syntaxhighlight>
== Methoden überschreiben ==
== Methoden überschreiben ==
Beim Überschreiben bekommen abgeleitete Klassen eine eigene Version mindestens einer Methode der Basisklasse.
Beim Überschreiben bekommen abgeleitete Klassen eine eigene Version mindestens einer Methode der Basisklasse.
Zeile 31: Zeile 45:
[[Datei:UML Vererbung 3.jpg|center]]
[[Datei:UML Vererbung 3.jpg|center]]


<syntaxhighlight lang="java">
<syntaxhighlight lang="java" line="1">
class Tier {
class Tier {
     public void sagWas() {
     public void sagWas() {
Zeile 86: Zeile 100:


== <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.


<syntaxhighlight lang="java">
<syntaxhighlight lang="java" line="1">
class Tier {
class Tier {
   // Das Attribut ist private und von der Unterklasse nicht nutzbar.
   // Das Attribut ist private und von der Unterklasse nicht nutzbar.
Zeile 118: Zeile 134:
}
}
</syntaxhighlight>
</syntaxhighlight>
{{Aufgabe:Start}}
# Ergänzen sie eine Klasse <code>HundMitBesitzer</code>, die ein Attribut <code>String besitzer</code> hat, das den Namen des Hundebesitzers speichert. Bei Aufruf der Methode <code>public void ausgabe()</code> soll zunächst die Ausgabe von <code>Hund</code> ausgegeben werden, dann der Name des Besitzers.
{{Aufgabe:End}}


== Das Schlüsselwort <code>final</code> ==
== Das Schlüsselwort <code>final</code> ==
Möchte man verhindern, dass eine Unterklasse eine Methode überschreibt, dann kann man sie als <code>final</code> deklarieren.
Möchte man verhindern, dass eine Unterklasse eine Methode ''überschreibt'', dann kann man sie als <code>final</code> deklarieren. Versucht eine Unterklasse es dennoch, dann kann das Programm nicht mehr [[wikipedia:Compiler|übersetzt]] werden.


<syntaxhighlight lang="java">
<syntaxhighlight lang="java" line="1">
class Tier {
class Tier {
   // Das Attribut ist private und von der Unterklasse nicht nutzbar.
   // Das Attribut ist private und von der Unterklasse nicht nutzbar.

Navigationsmenü