"there is no default constructor available" warum diese Fehlermeldung in Java?
Habe in Java eine Super- und Subklasse erstellt. Die Subklasse erbt von der Superklasse. Die Superklasse hatte einen public Konstruktor mit 3 Argumenten. Wollte nun in der Subklasse einen Konstruktor mit den gleichen Argumenten implementieren, da kam folgende Fehlermeldung:
there is no default constructor available
Als Lösung habe ich ergoogelt, dass die Subklasse scheinbar den Standardkonstruktor der Superklasse auf private hat, da ich nur einen mit 3 Argumenten implementiert habe und ich nun den Standardkonstruktor, also mit keinen Argumenten, public implementieren soll.
Wieso ist das nötig, dass ich den Standardkonstruktor der Superklasse public implementieren muss, damit ich in der Subklasse einen Konstruktor mit 3 Argumenten implementieren kann?
Mit freundlichen Grüßen
Kath
rufst du in der Subklasse "super();" auf?
ne, nicht explizit
4 Antworten
Ein "leerer" default-Konstruktor ist nicht zwingend nötig.
Du musst nur den einzig definierten Konstruktor der Superklasse auch bedienen, in deinem Fall einer mit 3 Parametern.
Wenn du das nicht willst, dann musst du eben einen Konstruktor in der Superklasse anbieten, der ohne Argumente aufgerufen werden kann.
Dann definierst du einen Konstruktor, der keine Argumente benötigt in der Superklasse. Damit kann man dann immer arbeiten.
Stell dir das so vor, dass in einem leeren Konstruktor der Sub-Klasse standardmäßig immer
super();
aufgerufen wird.
In deinem Fall gab es aber keinen passenden Konstruktor dazu, also musstest du entweder dafür sorgen, dass es das passende Gegenstück gibt, oder den Aufruf an den vorhandenen Konstruktor deiner Überklasse anpassen.
Und warum kann ich in der Subklasse keinen Konstruktor ohne Fehlermeldung implementieren, ohne einen Konstruktor von der Superklasse verwenden zu müssen?
Weil eine Subklasse nicht unabhängig von der Überklasse existieren kann.
Du baust ja auf der übergeordneten Klasse auf.
Darum sollte man sich angewöhnen immer einen leeren Default Konstruktor zu definieren.
In den meisten Fällen wird man den irgendwo brauchen, sei es z.B. durch ein Framework.
also einen leeren default Konstruktor in der Superklasse?
also was du meinst ist ich sollte in jeder Superklasse quasi das implementieren:
public SuperKlassenName(){}
?
ja. Das erlaubt das Erzeugen einer "leeren" Instanz der Klasse, auch wenn weitere Konstruktoren definiert wurden.
So ein Defaultkonstruktor wird sogar automatisch angelegt. Und er ruft auch (ebenfalls automatisch) den übergeordneten Defaultkonstruktor auf, also super().
Aber nur wenn die Klasse keinen anderen Konstruktor (mit Parametern) hat. Dann wird kein Defaultkonstruktor automatisch ergänzt! Und genau da bist du reingefallen.
im sorry, aber die aussage, dass man sich angewöhnen sollte immer ein default konstruktor anzulegen, kann ich nicht vertreten
diese aussage ist schwachsinn
vererbung sollte immer durchdacht sein und das geht nicht, indem man die öffentlichen "schnittstellen" der superklassen ignoriert.
dieser workaround wird für mehr komplexität und unsicherheiten beim programmieren sorgen, weil man nicht weiß ob die argumente, die das objekt eigentlich braucht (und per konstruktor bekommt), bereits auf das objekt initialisiert wurden sind
warum diese Fehlermeldung in Java?
Darum:
there is no default constructor available
Die Superklasse hatte einen public Konstruktor mit 3 Argumenten. Wollte nun in der Subklasse einen Konstruktor mit den gleichen Argumenten implementieren
Du musst auch den Konstruktor der Basis-Klasse aufrufen. Macht man mit "super"
Warum und wo genau muss ich das? Und was ist die Antwort auf meine fett gedruckte Frage?
Warum und wo genau muss ich das?
=> Suchmaschine
Wurde bestimmt ein paar Millionen Mal beantwortet
Wieso ist das nötig, dass ich den Standardkonstruktor der Superklasse public implementieren muss, damit ich in der Subklasse einen Konstruktor mit 3 Argumenten implementieren kann?
Ist nicht nötig.
Du musst nur einen der vorhandenen Konstruktoren in allen Konstruktoren der Ableitungen aufrufen und da Du nur einen mit drei Parametern hast, musst Du eben den aufrufen.
Ah. Und was, wenn ich jetzt in der Superklasse nur den Standardkonstruktor gehabt hätte? Warum hätte ich den dann public machen müssen?
Warum kann ich in der Subklasse keinen Konstruktor ohne Fehlermeldung implementieren, ohne einen von der Superklasse zu verwenden?
Weil die Initialisierung eines Objektes aufgrund der OOP-Kapselungsstrategie in dessen Klasse definiert sein muss, und nicht anderswo.
Du musst also zwingend einen Konstruktor der Superklasse aufrufen. Auch um die Subklasse zu erzeugen.
Die Verwirrung kommt m.E. daher, dass der Defaultkonstruktor auch implizit aufgerufen wird. Aber eben nur der, und nur wenn er zugänglich ist (nicht private).
Ups. :D
Das Tutorial zu super sagt dazu ungefähr das selbe:
If a constructor does not explicitly invoke a superclass constructor, the Java compiler automatically inserts a call to the no-argument constructor of the superclass.
If the super class does not have a no-argument constructor, you will get a compile-time error.
Object does have such a constructor, so if Object is the only superclass, there is no problem.
https://docs.oracle.com/javase/tutorial/java/IandI/super.html
You don't have to provide any constructors for your class, but you must be careful when doing this. The compiler automatically provides a no-argument, default constructor for any class without constructors. This default constructor will call the no-argument constructor of the superclass. In this situation, the compiler will complain if the superclass doesn't have a no-argument constructor so you must verify that it does. If your class has no explicit superclass, then it has an implicit superclass of Object, which does have a no-argument constructor.
https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
also ist der Defaultkonstruktor defaultmäßig private?
Steht in dem Kommentar von ArchEnema
Hat die Klasse keinen Konstruktor, gibt's einen Default-Konstruktor. Schreibst Du einen rein, wird kein Default-Konstruktor ergänzt und Du musst es selber machen.
Ups. :D
Nicht schlimm, deine Antwort war eh besser :D
Das Problem mit diesen Quellen ist aber leider, dass die Leute sie nicht lesen - wie wir ja gerade wieder sehen.
Deshalb auch immer mein - zugegeben nicht sehr freundlicher - Hinweis auf die Suchmaschinen, einfach weil täglich die gleichen Fragen gestellt werden...
Nein, public.
private musst du ihn schon selber machen, dann kann er aber nicht von außen aufgerufen werden, sondern nur von anderen Methoden (inkl. Konstruktoren) der selben Klasse.
So baut man Singletons/Factories: Keine public Konstruktoren. Die private Konstruktoren werden dann von public/protected static Methoden an der Klasse aufgerufen, die das fertige Objekt zurückgeben.
Mein Problem ist, dass ich nie eine exakte Antwort darauf erhalte, was ich eigentlich wissen will.
Mein Englisch ist nicht so gut, weshalb ich leider nicht alles verstehe, was in der Doku drinnen ist.
Ich hatte vorher auch schon zu dem Thema recherchiert, wie aus meiner Frage ersichtlich sein sollte, aber ich hatte die Antworten nicht verstanden, die ich über die Suchmaschine erhalten hatte.
Die Antwort war nämlich u.a. ich solle einen public Standardkonstruktor in der Superklasse implementieren. Ich habe aber nicht verstanden gehabt, wieso das hilft.
dankeschön, ich habe es jetzt verstanden
Es ist wirklich etwas verworren. Ich habe x Jahre Java-Erfahrung und noch mehr Englisch-Erfahrung, musste aber trotzdem googeln um eine erschöpfende Antwort geben zu können... ;)
Mein Englisch ist nicht so gut, weshalb ich leider nicht alles verstehe, was in der Doku drinnen ist.
Das solltest Du ändern, sonst hast Du keine Chance.
Du musst Englisch nicht fließend sprechen können, aber Du solltest es fließend lesen können. Bis dahin: Deepl.com
Klar, es gibt auch deutsche Quellen, aber sehr viel weniger und vor sind sie häufig nicht sehr gut. Die Leute, die wirklich gut sind, schreiben meistens auf Englisch und genau diese Quellen willst Du haben.
Und Thema Verständnis:
Hast Du ein Java-Buch? Z.B. "Java ist auch eine Insel" soll sehr gut sein.
So ein Buch behandelt diese Themen von Anfang bis Ende und nicht nur einen kleinen Teil mittendrin, wie es z.B. hier der Fall ist.
Ach ja und nur für den Fall: Video-Tutorials sind meistens Müll.
Ich studiere Medieninformatik im 2. Semester und nutze für das Informatik-Modul "Grundkurs Java - von den Grundlagen bis zu Datenbank- und Netzanwendungen". Fasse die Theorie immer zusammen und fertige ne Liste mit Fragen an, die ich versuch für mich dann beim Üben/Programmieren zu klären.
Besuche auch nen Englischkurs "Scientifical and technical English", hab aber das Gefühl, dass der nicht wirklich hilft, wenn es darum geht, Informatik-Texte zu verstehen. Ich denke, das kommt mit der Übung, wenn ich viel in dem Bereich lese und recherchiere. Aber ich lande halt trotzdem oft in Sackgassen und habe Fragen übrig, bei denen es sich für mich als schwierig herausstellt, diese zu klären...
Videos sind tatsächlich sowieso nicht wirklich mein Ding, wobei die meisten aus meinem Studiengang tatsächlich mit sowas lernen...
Ich denke, das kommt mit der Übung, wenn ich viel in dem Bereich lese und recherchiere.
Exakt - zumindest ging es mir so, ich konnte anfangs auch kein Englisch.
Aber das heißt, dass Du in den sauren Apfel beißen und auch englisch lesen musst - also nicht davor drücken, nur weil Du noch nicht gut darin bist ;)
Für den Lerneffekt wäre vermutlich besser, Du nutzt den Google-Translator, einfach weil der mies ist :D Wenn's schnell gehen soll, liefert DeepL beinahe perfekte Übersetzungen.
Besuche auch nen Englischkurs "Scientifical and technical English", hab aber das Gefühl, dass der nicht wirklich hilft
Ich hatte als Schüler aber auch noch das Glück, einen genialen Englisch-Lehrer in Rente als Nachbar zu haben, der mich sehr mochte. Er hat mir mit einer seeligen Ruhe Nachhilfe-Unterricht gegeben, natürlich wusste ich das nicht zu schätzen.
Was ich aber noch weiß: Der Mann hat mit mir keine Aufgaben abgearbeitet, sein Unterricht bestand nur aus einem: Reden über Gott und die Welt. Und wenn ich ein Wort nicht wusste, durfte ich keinen Übersetzer nutzen, ich sollte es umschreiben und anschließend im Wörterbuch nachschlagen.
Standard-Unterricht hilft mMn. nur begrenzt.
Am besten wäre, Du fährst eine Zeit ins Ausland oder findest einen Freund, der englisch aufgewachsen ist und mit dem Du dich unterhalten kannst. Dazu gibt's meine ich online auch eine Seite, die weltweit solche Kontakte herstellt, damit dann beide voneinander die jeweils andere Sprache lernen können. Ich weiß aber nicht mehr, was das war - vielleicht findest Du es.
Aber ich lande halt trotzdem oft in Sackgassen und habe Fragen übrig, bei denen es sich für mich als schwierig herausstellt, diese zu klären...
In dem Fall kann es sich lohnen, das Thema nochmal neu anzufangen. Es kommt gerade am Anfang sehr oft vor, dass Du etwas lernst, was dir ein paar Tage früher weitergeholfen hätte - entweder Du kannst diese Verknüpfung von selbst herstellen, oder Du fängst nochmal vorne an, dann erklären sich hoffentlich ein paar noch offene Fragen.
Aber so ist das leider, die Kette an aufeinander aufbauenden Dingen in der Softwareentwicklung ist enorm lang und ist blöderweise nicht mal gerade.
Alles baut irgendwie aufeinander auf.
Wenn Du die Grundlagen drauf hast, wird das aber besser bzw. mit mehr Erfahrung erkennst Du mögliche Zusammenhänge, von denen Du bisher gar nichts wusstest - einfach aus einer Vermutung heraus. Und das ist eine der Erfahrungsschätze, um die sich alles dreht.
du brauhcst nicht so gut in englisch zu sein solange du paar basics verstehst
habe hier n azubi gehabt, der hat 3 jahre durchgehend problemlos mit google translate gearbeitet
praktisch es ist natürlich trotzdem
habe hier n azubi gehabt, der hat 3 jahre durchgehend problemlos mit google translate gearbeitet
praktisch es ist natürlich trotzdem
Dann lieber DeepL :D
Aber klar geht das, es dauert nur sehr viel länger, zu einem Thema zu recherchieren, was zeit frisst und die Motivation schmälert, überhaupt englische Quellen zu suchen.
Konstruktoren werden nicht vererbt, du musst also irgendeinen Konstruktor der Superklasse aufrufen (sonst kann die nicht richtig initialisiert werden).
Wenn die Superklasse einen Defaultkonstruktor hat (ohne Parameter), dann wird der automatisch vom Subklassen-Konstruktor aufgerufen (implizites super(); ).
Wenn der Defaultkonstruktor der Superklasse aber private ist kann der nicht aus der Subklasse aufgerufen werden. Dafür muss er public oder protected sein.
Deshalb musst du explizit super() für irgendeinen (aufrufbaren) Konstruktor der Superklasse aufrufen.
also das problem ist grundsätzlich, dass du den "super-konstruktor" deiner superklasse nicht aufrufst.
theorie:
wenn du eine subklasse instanziierst wird immer ein "elternobjekt" erstellt.
als folge wird immer ein superkonstruktor aufgerufen.
praxis:
wenn eine superklasse keinen "standard-konstruktor" hat (konstruktor ohne argumente) dann weiß java nicht welchen konstruktor du aufrufen musst.
du musst deshalb explizit mit super angeben, dass du den superkonstruktor mit 3 argumenten aufrufst
Tatsächlich ist die Fehlermeldung weggegangen, nachdem ich den Subklassenkonstruktor so gemacht habe:
Was genau passiert da? Mit super() rufe ich also den von mir implementierten Konstruktor der Superklasse auf?
Was, wenn ich dort jetzt nicht einen Konstruktor hätte, dessen Argumente exakt zu dem passen, was ich jetzt für die Subklasse brauche?