Java Super
Mit der speziellen Java Methode super() kannst du dir einige Eigenschaften der Vererbung zu Nutzen machen. In diesem Artikel erklären wir dir, in welchem Zusammenhang du sie benutzt.
Du lernst besser, wenn du das Thema erklärt bekommst, anstatt Text zu lesen? Genau das machen wir in unserem Video .
Inhaltsübersicht
Java Super einfach erklärt
Das Schlüsselwort super kannst du für zwei verschiedene Fälle benutzen.
- Fall 1: Den Konstruktor einer Oberklasse aufrufen.
- Fall 2: Eine Methode aus der Oberklasse aufrufen.
Im ersten Fall erbt eine Oberklasse an eine Unterklasse. Nun willst du ein Objekt der Unterklasse erzeugen. Führst du die Instanziierung aus, so wird nicht nur der Konstruktor der Unterklasse, sondern auch der Standardkonstruktor der Oberklasse aufgerufen. Das liegt an der Vererbungsbeziehung der zwei Klassen
. Diese Instanziierung der Oberklasse kannst du mithilfe der Methode super()
steuern. Damit kannst du entscheiden, welcher Konstruktor der Superklasse angesprochen werden soll, indem du die Signatur der Konstruktoren
ausnutzt. Wichtig ist, dass der super()
Aufruf an erster Stelle im Konstruktor der Unterklasse stehen soll, falls du ihn nutzen möchtest.
Im zweiten Fall können wir direkt Methoden der Oberklasse ansprechen. Das funktioniert mit dem Punktoperator, indem du schreibst:
super.methodennamen();
Super Java
Das Konzept der Vererbung
ist dir ja bereits bekannt. Eine Oberklasse, die auch Superklasse genannt wird, vererbt ihre Methoden und Attribute an Unterklassen. Diese können dann auf die Funktionen der Oberklasse zugreifen und auch die dort programmierten Variablen nutzen. Ein konkretes Beispiel findest du weiter unten. Zunächst erklären wir dir die Funktionsweise von super
.
Nehmen wir noch eine weitere Klasse hinzu. Und zwar möchtest du in dieser all deine Objekte erzeugen. Als erstes willst du ein Objekt der Unterklasse erzeugen. Dafür benutzt du den entsprechenden Aufruf des Konstruktors. Nun ruft das Java Programm nicht nur den Konstruktor der Unterklasse, sondern auch den Standardkonstruktor der Oberklasse auf. Das liegt daran, dass die Oberklasse ja an die Unterklasse erbt und diese somit verbunden sind. Zusammengefasst werden mit einer Instanziierung also zwei Konstruktoren aufgerufen.
Nun möchtest du aber nicht, dass ein Konstruktor und zusätzlich noch immer der Standardkonstruktor der Oberklasse aufgerufen werden. Das kannst du mit dem Schlüsselwort super()
ändern. Damit kannst du auf den geeigneten Konstruktor der Oberklasse zugreifen. Schreibst du dabei Parameter in die Klammern wird auch der zu den Parametern passende Konstruktor der Oberklasse gesucht und nicht mehr der Standardkonstruktor aufgerufen. Das ist ähnlich wie beim Überschreiben von Methoden
. Wichtig ist, dass zuerst der Konstruktor der Oberklasse abgearbeitet wird, bevor die Unterklasse weiter bearbeitet wird. Falls du also die Oberklasse aufrufen willst, muss super
immer die erste Anweisung innerhalb des Konstruktors sein.
Java Super Beispiel
Für ein Beispiel programmieren wir uns drei verschiedene Klassen. Zunächst eine Oberklasse, die an eine Unterklasse erbt. Die Vererbung setzt du mit einem extends
um. Außerdem haben beide Klassen einen Standardkonstruktor und einen Konstruktor, der einen Wert verarbeiten kann. Ebenfalls gibt es eine Mainklasse mit der Main Methode, die für die Erzeugung der Objekte zuständig ist.
public class Oberklasse{
public Oberklasse(){
}
public Oberklasse(String a){
System.out.println(a);
}
}
public class Unterklasse extends Oberklasse{
public Unterklasse(){
}
public Unterklasse(String a){
System.out.println(a);
}
}
public class Main{
public static void main(String[] args){
Unterklasse objekt = new Unterklasse();
}
}
In der Main Klasse starten wir mit einer Instanziierung der Unterklasse. Diese ruft zunächst den Standardkonstruktor der Unterklasse und dann der Oberklasse auf. Dabei wird zuerst der, der Oberklasse vollständig abgearbeitet bevor der Konstruktor der Unterklasse beendet wird.
Nun kannst du bei der Instanziierung auch einen Wert mitgeben, hier wäre das der String Hallo
:
Unterklasse objekt = new Unterklasse("Hallo");
Das ruft den anderen Konstruktor der Unterklasse auf. Es ändert sich aber nichts daran, dass der nächste Befehl der Aufruf des Standardkonstruktors der Oberklasse ist. Da du weißt, dass der Aufruf der Konstruktoren der Oberklasse mit super()
erfolgt, kannst du Oberklasse und Unterklasse auch wie folgt umschreiben.
public class Oberklasse{
public Oberklasse(){
}
public Oberklasse(String a){
System.out.println(a + ", mein Name ist...");
}
}
public class Unterklasse extends Oberklasse{
public Unterklasse(){
super();
}
public Unterklasse(String a){
super(a);
System.out.println(a);
}
}
Den Aufruf super()
im Standardkonstruktor könntest du auch weglassen. Im zweiten Konstruktor der Unterklasse haben wir dem super
Aufruf auch einen Parameter mitgegeben. Hier wird dann nicht mehr der Standardkonstrukor, sondern der Konstruktor der Oberklasse aufgerufen, der die Möglichkeit hat einen String Parameter zu verarbeiten. Diese Objektinstanziierung:
Unterklasse objekt = new Unterklasse("Hallo");
würde zu folgender Ausgabe führen:
Hallo mein Name ist...
Hallo
So kann also mithilfe von Java super von dem Standardkonstruktor auf einen anderen gewechselt werden.
Java Super() für Methoden
Die Objektorientierung und Vererbung in Java ermöglicht es uns so wenig Code wie möglich schreiben zu müssen. Du kannst dich einfach an den Variablen und Attributen anderer Klassen bedienen. Eine Möglichkeit Methoden einer Oberklasse zu benutzen funktioniert auch mit dem Java super. Dafür schreiben wir in unsere Oberklasse die Methode methodeOberklasse()
:
public class Oberklasse{
public Oberklasse(){
}
public Oberklasse(String a){
System.out.println(a + ", mein Name ist...");
}
public methodeOberklasse(){
System.out.println("Die Methode der Oberklasse wurde benutzt.")
}
}
Angenommen die main Methode ruft beim Erzeugen eines Objekts new Unterklasse();
den Standardkonstruktor der Unterklasse auf,
public class Unterklasse extends Oberklasse{
public Unterklasse(){
super.methodeOberklasse();
}
}
dann wäre die Ausgabe des Programmcodes:
Die Methode der Oberklasse wurde benutzt.
Konflikt mit this
In dem Video zu den Java Klassen
wurde das Schlagwort this
beschrieben. Dieses wird benutzt, um der Variable einer Klasse ihren neuen Wert, den der Instanz, zuzuweisen. Zudem muss this
immer an erster Stelle in dem Konstruktor stehen. So hast du jetzt einmal das super()
und das this
, welche an erster Stelle im Konstruktor stehen wollen. Die Lösung besteht hier darin, das this
in eine private Methode hin umzulagern und ein super an die erste Stelle des Konstruktors zu schreiben. Ein Beispiel könnte wie folgt aussehen:
public class Unterklasse extends Oberklasse{
string name;
public Unterklasse(name){
super();
methode(name);
}
private void methode(String name){
this.name = name;
}
}
Dabei wird die Variable Name bei der Instanziierung des Objektes der Unterklasse mitgegeben. Zusammengefasst wird also immer das super an erster Stelle geschrieben und das this ausgelagert.
Java Vererbung
Damit du die Java Methode Super richtig verstehst, solltest du unbedingt wissen, wie die Vererbung funktioniert. Auch dazu haben wir ein Video für dich erstellt. Schau es dir gleich an!