Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich bräuchte mal eure hilfe.... es geht um super()
normalerweise dient dieser doch dazu, um auf die oberklasse bei vererbung zu zugreifen oder?
in folgendem wird nicht mit vererbung gearbeitet. nur mit verketteten listen, falls das iwie relevant sein sollte.
ich hab in einer klasse jetzt 2 konstruktoren...
der erste konstruktor hat keine parameter und als inhalt nur ein "super()"
(mein verstand sagt mir super() geht nun in den konstruktor der oberklasse.. jedoch gibt es keine?)
der zweite konstruktor überlädt diesen dann und hat mehrere parameter die auf interne variablen im codeblock übergeben werden.
ich verstehe nicht wofür das super() an dieser stelle gut ist?
ruft den parameterlosen Konstruktor der Oberklasse auf. Eine Oberklasse gibt es immer, wenn keine explizit angegeben ist, dann ist Object die Oberklasse.
... und wenn eine Klasse keine einzigen Konstruktor im Quellcode hat wird automatisch ein leerer parameterloser Konstruktor hinzugefügt.
@HimBromBeere
warum sollte der Aufruf des parameterlosen Konstruktors dasselbe sein wie ein parameterloser Konstruktor? oO Die Frage macht keinen Sinn.
Ich meine, mit super() wird ja genau dieser parameterlose Konstruktor aufgerufen... ich wollt ja nur nochmal erklären, warum man sich ein super() auch schenken kann...
1. Jeder Konstruktor muss als allerersten Aufruf einen Vaterkonstruktor aufrufen, außer wenn er mithilfe von this(..) einen anderen Konstruktor derselben Klasse aufruft. Falls der
Code:
super(..);
Aufruf fehlt fügt Java automatisch
Code:
super();
ein.
2. Jede Klasse muss mindestens einen Konstruktor besitzen, sollte dies nicht der Fall sein wird automatisch von Java ein parameterloser Konstruktor mit der Sichtbarkeit public ohne Inhalt erstellt (der automatisch
Code:
super();
aufruft, siehe Punkt 1)
3. Jede Klasse muss von einer anderen Klasse erben. Sollte kein extends angegeben sein, fügt Java automatisch ein
Code:
extends Object
ein.
PS: Punkt 3 gilt natürlich nicht für die Klasse Object...
Ich möchte Schandro's Post noch um einen Punkt ergänzen:
1. Jeder Konstruktor muss als allerersten Aufruf einen Vaterkonstruktor aufrufen, außer wenn er mithilfe von this(..) einen anderen Konstruktor derselben Klasse aufruft. Falls der super(..); Aufruf fehlt fügt Java automatisch super(); ein.
Richtig, falls die Vaterklasse einen parameterlosen Konstruktor bereitstellt. Ist dies nicht der Fall, kann weder Java automatisch ein implizites super() einfügen, noch wäre ein expliziter Aufruf von super() [beachte: leere Klammern!] korrekt. Die Kindklasse würde in diesem Fall nicht kompilieren, solange man nicht einen expliziten super-Aufruf im Konstruktor der Kindklasse verwendet, der den Vaterklassen-Konstruktor auch mit den erwarteten Werten bedient.
Wenn man also ganz pingelig sein will, ist diese Aussage:
Falls der super(..); Aufruf fehlt fügt Java automatisch super(); ein.
nicht korrekt, da ein super(..), also ein Aufruf mit Wertübergabe, nicht das selbe ist wie ein super() Aufruf ohne Übergabe von Parameterwerten.
Wer jetzt verwirrt ist, ich meine folgendes:
Java:
class A{
private Object data;
// Durch Definition dieses Konstruktors gibt es keinen Default-Konstruktor in Klasse A mehr:
public A(Object data){
this.data = data;
}
}
Java:
class B extends A{
// Der Default-Konstruktor für B reicht hier nicht mehr aus, wir müssen ihn durch einen eigenen ersetzen:
public B(){
// super(); <- Kompiliert nicht, Konstruktor A() in Klasse A nicht vorhanden
super(new Object()); // <- Wir müssen explizit den A(Object)-Konstruktor der Klasse A aufrufen
}
}
Wenn man einen Default-Konstruktor (natürlich nebst anderen Konstruktoren) implementiert, der wirklich nichts macht, würde ich auch zu [c]super();[/c] tendieren, da man sonst einen leeren Block hat. Natürlich könnte man als Alternative auch einen "schönen" Kommentar ala [c]// do nothing[/c] oder sonst einen Müll schreiben, aber der Entwickler sieht so oder so, dass der Konstruktor leer ist...