ubuntuusers.de

Java Konstruktoren und Vererbung

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Sorcim

Anmeldungsdatum:
1. April 2008

Beiträge: 256

Guten Tag, ich bin Maschinenbau Student und im Moment am Lernen für eine Java Klausur.

Nun habe ich hier eine Aufgabe, in der ein Quellcode gegeben ist und man Fehler raussuchen soll. Ein eingebauter Fehler ist dort, dass eine erbende Klasse im Konstruktor zwar den super konstruktor aufruft, allerdings ohne Parameter. In der Eltern-Klasse wurde nur der eine Konstruktor mit Parametern definiert.

Gibt mir ein Kompiler an dieser Stelle einen Fehler aus, weil es den super() Konstruktor nicht gibt (also eben genau mit der Signatur) oder könnte die Kind-Klasse fälschlicherweise auf einen Default-Konstruktor zurückgreifen?

Gruß, Tobias

Phoenox

Avatar von Phoenox

Anmeldungsdatum:
10. September 2007

Beiträge: 26

Normalerweise gibt es den Standard-Konstruktor implizit, er ist also vorhanden, auch wenn er nicht extra definiert wird.

Die Unterklasse kann also den super()-Konstruktor nutzen, solange dieser nicht als private definiert ist. Allerdings könnte es sein, dass infolgedessen bestimmte Attribute nicht richtig initialisiert wurden, sodass es eventuell Folgefehler geben könnte.

Zur Sicherheit kannst du ja mal den Code posten... 😉

Gruß Phoenox

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@Sorcim: Einfach ausprobieren 😉

Sorcim

(Themenstarter)

Anmeldungsdatum:
1. April 2008

Beiträge: 256

Naja, Folgefehler sind da keine drin und die wären für uns auch weniger relevant (das ist noch ein sehr niedriges Niveau).

Allerdings wird in der Lösung angegeben, der Aufruf des Default-Super-Konstruktors sei aufgrund der Vererbung nicht zulässig, da er in diesem Fall private sei. Ist der also standardmäßig private? Wozu gibt es überhaupt private Konstruktoren - sind die nicht irgendwie sinnlos?

P.S.: Lunar schrieb:

@Sorcim: Einfach ausprobieren 😉

Jo das mach ich jetzt auch 😉

Phoenox

Avatar von Phoenox

Anmeldungsdatum:
10. September 2007

Beiträge: 26

Der Standard-Konstruktor ist - falls nicht anders angegeben - als default deklariert, es kann ihn also so ziemlich jeder benutzen. Wenn in der Lösung steht, er wäre private, dann muss ausdrücklich irgendwo folgendes stehen

1
2
private Konstruktor() {
}

Private Konstruktoren sind eben genau dazu da, um zu verhindern, dass Objekte einer Klasse erzeugt werden. Wenn du zum Beispiel eine Utility-Klasse, die nur Methoden bereitstellen soll, erstellen willst, ist es sinnvoll, den Standardkonstruktor private zu definieren, da ein Objekt dieser Klasse keinen Sinn macht.

Sorcim

(Themenstarter)

Anmeldungsdatum:
1. April 2008

Beiträge: 256

Dann ist die Begründung in der Lösung wohl nicht ganz richtig (denn der Default Konstruktor wurde nicht ausdrücklich als private deklariert).

Und danke für die Erklärung, wofür man private Konstruktoren benötigt und überhaupt danke für die Hilfe ☺

Lg, Tobias

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Außerdem benötigt man private Konstruktoren für Singleton-Klassen, auf dessen Exemplar über statische Methoden zugegriffen werden kann. Beim ersten Zugriff muss aber auch das Singleton erstmal erzeugt werden, was eben über den privaten Konstruktor geschieht. Default-Konstruktoren, die nur im Paket sichtbar sind, benötigt man unter anderem auch, wenn bestimmte Klassen nur in Abhängigkeit von anderen erzeugt werden können. Das klassische Beispiel ist eine DOM-Implementierung, bei der Elemente nicht ohne ein Dokument leben sollen.

Gemäß der Sprachspezifikation wird der Standard-Konstruktor nur erzeugt, wenn die Klasse keinen anderen Konstruktor hat. Wenn in der Basisklasse also bereits ein andere Konstruktor definiert ist, hat die Basisklasse keinen Standard-Konstruktor und der Aufruf des parameterlosen Basis-Konstruktors in einer abgeleiteten Klasse ist nicht gültig. Wenn die Lösung behauptet, der Aufruf wäre ungültig, weil der Standard-Konstruktor in diesem Fall privat ist, dann ist die Lösung falsch. Der Standard-Konstruktor existiert gar nicht – auch nicht mit privater Sichtbarkeit –, wenn in der Klasse bereits ein beliebiger anderer Konstruktor definiert ist.

Der Standard-Konstruktor hat übrigens auch keine "default"-Sichtbarkeit, sondern übernimmt die Sichtbarkeit seiner Klasse. In einer privaten inneren Klasse wäre auch der Standardkonstruktor privat.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Lunar hat fast alles was zu sagen ist gesagt, aber diesem hier:

Phoenox schrieb:

Private Konstruktoren sind eben genau dazu da, um zu verhindern, dass Objekte einer Klasse erzeugt werden.

möchte ich sicherheitshalber nochmal ausdrücklich widersprechen.

Private Konstruktoren können zwar dazu genutzt werden, aber sie sind nicht genau dazu da. Es kann neben diesen erreichbare Konstruktoren geben, und es kann statische Methoden geben, die den privaten Konstruktor aufrufen können.

1
2
private Foo () {}
public static getFoo (Bar bar) { Foo foo = new Foo(); foo.setBar (bar); return foo; }
Antworten |