| 

.NET C# Java Javascript Exception

4
Hallo,

ich komme mit super() in Java nicht so ganz klar. Es ist da, damit zum Beispiel beim Aufruf von eine Unterklasse auch der Konstruktor seine Oberklasse miteinbezogen wird oder? Nehmen wir mal ein Beispiel:

public class OberKlasse {

int a;
public OberKlasse() { // Konstruktor

this.a = 15;
}
}

public class UnterKlasse extends OberKlasse {

int b = 20;
public UnterKlasse() { //Konstruktor

//super(); //macht kein unterschied ob es da ist oder nicht
}
public int anzeigeUnterKlasse() {

return a + b; //return ist immer 35
}
}


Ich dachte bisher, ohne super(); in der UnterKlasse wird in der OberKlasse der Konstruktor ignoriert und das this.a = 15; wird natürlich garnicht compiliert. Aber ob super oder nicht, er macht das trozdem. Ich verstehe anscheinend super nicht so ganz. Kann mir das jemand erklären?

Gruß
08.09.2009
Revollt 51 1 2 3
5 Antworten
12
Java ruft automatisch den parameterlosen Konstruktor der Basisklasse auf, wenn es nicht explizit im Quellcode steht. Nur wenn es einen solchen Konstruktor nicht gibt, oder statt dem parameterlosen ein anderer Konstruktor aufgerufen werden soll, musst du super verwenden.
08.09.2009
reima 334 2 2
Danke, wieder was gelernt - war mir völlig unbewusst, dass parameterlose Konstruktoren der Basisklasse immer ausgeführt werden. Diese Erkenntnis hilft mir sicherlich bei der Fehlersuche ;)
Andreas_D 08.09.2009
2
Wenn der Konstruktor der Basisklasse immer ausgeführt wird, egal ob mit super() oder nicht, liegt das vermutlich daran, dass Java zuerst die Basisklasse erstellt und daraus dann die abgeleitete. Soll heißen, es wird erst der Konstruktor der Basisklasse aufgerufen und dann der Konstruktor der abgeleiteten Klasse.

Ansonsten lässt sich sagen, dass super() in Java immer die Funktion aus der Basisklasse aufruft. zB:
public class Base
{
...

void MachWas()
{
...
};
};

public class Derived extend Base
{
...

void MachWas()
{
super.MachWas(); //Führt die Methode MachWas von Base aus
...
}
}
09.09.2009
Shelling 356 1 3
3
Autsch. `super()` ist immer ein Konstrukturaufruf. Wenn eine Methode aus der Superklasse aufgerufen werden soll, sollte schon `super.machWas()` aufgerufen werden.
Bombe 09.09.2009
@Bombe: Richtig, jetzt wird mir das auch klarer. super() alleine macht da garnichts...zumindest erkenne ich das nicht. Aber wenn man super.bla() macht dann ist das schon eher nachvollziehbar! Das war übrigens das was hier irgendwie KEINER erkennen oder mir sagen konnte... Amen
Revollt 09.09.2009
Ah, da bin ich dann wohl mit Ruby durcheinander gekommen (ich glaube da verhielt sich das so...). Hab den Fehler korrigiert, danke dafür.
Shelling 09.09.2009
2
reima hat es schon ganz richtig erklärt. Gibt es in der Basisklasse keinen Konstruktor, wird beim Kompilieren automatisch ein Default-Konstruktor hinzugefügt. Das ist einfach ein parameterloser leerer Konstruktor. Sobald man aber selbst einen Konstruktor anlegt, wird beim Kompilieren kein Default-Konstruktor erzeugt. Ist der selbst erstellte Konstruktor parameterlos, wird er quasi zum Default-Konstruktor.
Beim Erzeugen eines Objektes aus einer Unterklasse, wird immer zuerst der Default-Konstruktor der Basisklasse aufgerufen. Ein explizites Aufrufen mittels super() ist überflüssig.
Gibt es in der Basisklasse nun aber z.B. nur einen einzigen selbst erstellten Konstruktor mit Parametern z.B.:

public MyClass(int i)

, dann ist ein Aufruf etwa von

super(6)

im Konstruktor der Unterklasse zwingend erforderlich, weil nun kein Default-Konstruktor mehr in der Basisklasse existiert. Fehlt hier der Aufruf meckert der Compiler.

Gibt es nun neben dem Konstruktor mit Parametern noch einen weitern parameterlosen, existiert quasi wieder ein Default-Konstruktor und man hat in der Unterklasse die Wahl. Gibt man super ohne Parameter an oder lässt es ganz weg, wird der Default-Konstruktor (parameterlos) aufgerufen. Mit

super(6)

ruft man dann parametrierten Konstruktor auf.

Wenn super() aufgerufen wird, dann muss es übrigens immer das erste sein, was im Konstruktor gemacht wird.
17.09.2009
jenser78 131 1 2
0
Da war einer schneller. super() führt den Konstruktor der Vorfahrenklasse aus, da hast du Recht. Aber ist es nicht so, dass man super() auch für explizite Funktionen der Vorfahrenklasse aufrufen kann?

Kreis( int x, int y, int rad ) {
super( x, y ); radius = rad; }


bzw.

super.ausgeben()
08.09.2009
Dustin Klein 2,9k 2 9
"super() führt den Konstruktor der Vorfahrenklasse aus" - verstehe ich nicht. Mit oder ohne Super wird der Konstruktor der Vorfahrenklasse ausgeführt. Das war ja eigentlich meine Frage... bzw. blicke ich da nicht mehr durch.
Revollt 08.09.2009
0
super ist ein bißchen wie this.
Nur dass super sich auf die Basisklasse bezieht.

Die Verwendung zum Aufruf von Nicht-Default-Konstruktoren der Basisklasse wurde ja hinreichend erwähnt.

Daneben ist es möglich, bei überschriebenen Methoden ("overwrite"), die Variante aus Sicht der Basisklasse aufzurufen. Das heißt, entweder hat die Basisklasse selbst eine solche Methode, oder eine ihrer Basisklassen.

Nützlich ist letzteres, wenn die neue überschriebene Methode eigentlich nur die bisherige Methode um einen Vorspann bzw. Nachspann ergänzt. Sie also nicht ersetzt.

Beispiel

@overwrite
public RetTyp methode (Typ pPara)
{
.. // Vorspann
RetTyp ret = super.methode (pPara);
.. // Nachspann
return ret;
}
18.09.2009
stefan.bachert 395 4
Hm, ohne viel Ahnung von Java zu haben muss ich sagen das sich in diesem Thread das keyword "super" eher ließt wie ein base. in .NET. Und base und this sind mal so gar nicht ähnlich :)
Nicolai Schönberg 05.11.2011

Stelle deine Java-Frage jetzt!