"there is no default constructor available" warum diese Fehlermeldung in Java?

ZaoDaDong  06.04.2022, 09:53

rufst du in der Subklasse "super();" auf?

KathaHohenfels 
Beitragsersteller
 06.04.2022, 09:53

ne, nicht explizit

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Berufserfahrung – Java-Entwickler von Batch- und Webanwendungen

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:01

Tatsächlich ist die Fehlermeldung weggegangen, nachdem ich den Subklassenkonstruktor so gemacht habe:

public Azubi(String nachname, String vorname, double gehalt){
    super(nachname, vorname, gehalt);
}

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?

ZaoDaDong  06.04.2022, 10:03
@KathaHohenfels

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.

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:04
@ZaoDaDong

Und warum kann ich in der Subklasse keinen Konstruktor ohne Fehlermeldung implementieren, ohne einen Konstruktor von der Superklasse verwenden zu müssen?

ZaoDaDong  06.04.2022, 10:05
@KathaHohenfels

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.

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:13
@ZaoDaDong

also einen leeren default Konstruktor in der Superklasse?

also was du meinst ist ich sollte in jeder Superklasse quasi das implementieren:

public SuperKlassenName(){}

?

ZaoDaDong  06.04.2022, 10:13
@KathaHohenfels

ja. Das erlaubt das Erzeugen einer "leeren" Instanz der Klasse, auch wenn weitere Konstruktoren definiert wurden.

ArchEnema  06.04.2022, 10:19
@KathaHohenfels

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.

orochi02  06.04.2022, 11:20
@ZaoDaDong

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"


KathaHohenfels 
Beitragsersteller
 06.04.2022, 09:56

Warum und wo genau muss ich das? Und was ist die Antwort auf meine fett gedruckte Frage?

Palladin007  06.04.2022, 09:59
@KathaHohenfels
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.

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:02
@Palladin007

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?

ArchEnema  06.04.2022, 10:07
@KathaHohenfels

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).

ArchEnema  06.04.2022, 10:13
@Palladin007

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

Palladin007  06.04.2022, 10:20
@KathaHohenfels

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.

Palladin007  06.04.2022, 10:21
@ArchEnema
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...

ArchEnema  06.04.2022, 10:24
@KathaHohenfels

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.

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:25
@Palladin007

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.

ArchEnema  06.04.2022, 10:26
@KathaHohenfels

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... ;)

Palladin007  06.04.2022, 10:33
@KathaHohenfels
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.

KathaHohenfels 
Beitragsersteller
 06.04.2022, 10:39
@Palladin007

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...

Palladin007  06.04.2022, 12:32
@KathaHohenfels
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.

orochi02  06.04.2022, 12:57
@KathaHohenfels

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

Palladin007  06.04.2022, 13:59
@orochi02
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