Konstruktor in einer abgeleiteten Klasse
lima-city → Forum → Programmiersprachen → Java
abgeleiteten klasse erstellen
anfang
beispiel
benutzen
code
compiler
erstellen
existieren
fehlermeldung
gleichen parametern
implizit aufrufen
klasse erstellen
konflikt
methode
null
parameter
problem
super code
super null
super schreiben
-
Scheinbar darf man in einer abgeleiteten Klasse nicht einfach so einen neuen Konstruktor erstellen.
Bekomme zum Beispiel diese Fehlermeldung.
Implicit super constructor Field() is undefined. Must explicitly invoke another constructor
Hab eine Klasse Field mit zwei Parametern im Konstruktor davon leitet eine weitere Klasse "Fence" ab, die keine Parameter im Konstruktor benötigt. Nun dachte ich mir, da es eine abgeleitete Klasse ist, muss auf jeden Fall der gleiche Konstruktoraufbau mit den gleichen Parametern rein. Aber warum darf man nicht einfach einen zweiten Konstruktor, ohne Parameter in der abgeleiteten Klasse erstellen? Wie kann man diesen Konflikt lösen aber trotzdem einen leeren Konstruktor in Fence benutzen dürfen?
public class Field { public Field(FieldType thisField, TiledMap grassMap) { } } public class Fence extends Field{ public Fence(FieldType thisField, TiledMap grassMap) { super(thisField, grassMap); // TODO Auto-generated constructor stub } public Fence() { DAS MAG DER COMPILER NICHT ? } }
Edit: Zur Lösung des Problems kann man auch einen leeren Konstruktor in der Field-Klasse erstellen. Ich begreife aber nicht warum. Der ist doch leer und ganz ohne Parameter und braucht nicht mal super() :). .
public Field() {}
Dachte eigentlich immer, es darf in der abgeleiteten klasse allgemein mehr Methoden (incl. der überschreibbaren) geben.
Beitrag zuletzt geändert: 6.12.2010 23:09:50 von pixilab -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn du in einem Konstruktor einer Klasse kein super(...) aufrufst, dann nimmt Java implizit an, dass am Anfang des Konstruktors ein super(); steht und ruft damit den leeren Konstruktor der Superklasse auf, der in dem Fall existieren muss.
Die Klasse Field hat keinen leeren Konstruktor, also kannst die in Fence super(); weder explizit noch implizit aufrufen.
Was aber z.B. geht ist sowas:
public Fence() { super(null, null); }
Beitrag zuletzt geändert: 6.12.2010 23:48:04 von black-devils -
du musst im Konstruktor der abgeleiteten Klasse immer den Konstrukter der Basisklasse aufrufen.
Also selbst wenn der leer ist musst du immernoch "super()" schreiben.
Oder du machst es so das der Konstruktor der abgeleiteten Klasse die Variablen die im Basisklassenkonstuktor verwendet werden, als Parameter hat und rufst damit den Konstruktor auf.
Damit ändert sich nichts an den Werten in der Basisklasse und du hast deine abgeleitete Klasse :)
Beitrag zuletzt geändert: 18.12.2010 21:42:46 von a-o-w -
Stimmt nicht ganz. "super()" muss man nicht extra schreiben, der wird impliziet angenommen. Ein Problem gibt es aber, wenn die Super-Klasse keinen leeren Konstruktor (wie in dem Fall) hat.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage