Warum kann man nicht Erben von einer Klasse, deren Konstruktor ist private?
Warum funktioniert Java nicht zulassen Vererbung von einer Klasse, deren Konstruktor ist private?
- Peter Lawrey Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java nicht verhindern, dass sub-classing von Klassen mit privaten Konstruktoren.
Drucke
Was es verhindert ist die sub-Klassen, die keinen Zugriff auf die Konstruktoren der Superklasse. Dies bedeutet, dass ein private-Konstruktor nicht verwendet werden, in eine class Datei und eine Paket-lokalen Konstruktor nicht verwendet werden, in ein anderes Paket.
In dieser situation die einzige option, die Sie haben, ist die delegation. Sie benötigen zum Aufruf einer factory-Methode eine Instanz zu schaffen, die "super" - Klasse und wickeln Sie es.
access $010
Class
😉Weil eine Klasse muss rufen die super-Klasse-Konstruktor immer. Wenn die super-Klasse-Konstruktor kann nicht zugegriffen werden, dann ist die sub-Klasse kann nicht initialisiert werden.
Mehr info: JLS 8.8.10. Verhinderung der Instanziierung einer Klasse
Bezüglich Brian Roach Kommentare:
Beachten Sie, dass beim instanziieren alle Klasse in Java, da gibt es immer einen impliziten Aufruf zu
Object
Konstruktor da ist die super-Klasse aller Klassen. Er führt seine default-Konstruktor:Hinweis aus der JLS link:
Wenn der Konstruktor der Klasse ist private dann Kind-Klasse kann nicht rufen Sie zu den super-Konstruktor.
Daher die Vererbung fehlschlagen würde.
Wenn Sie eine Unterklasse, haben Sie 2 Möglichkeiten für die untergeordnete Klasse(Unterklasse) Konstruktoren :
1. Standard-Konstruktor(No-argument-Konstruktor) : In diesem Fall default-Konstruktor wird automatisch versuchen, rufen Sie die übergeordnete Klasse-Konstruktor : dieser schlägt fehl, da übergeordnete Konstruktor der Klasse ist private.
2. Parametrisierter Konstruktor : Wenn Sie versuchen, erstellen Sie ein Objekt für ein Kind-Klasse, die hat parametrisierten Konstruktor, müssen Sie zwingend nennen übergeordneten Klasse Konstruktor von der abgeleiteten Klasse der Konstruktor entweder durch die übergabe der Parameter oder keine Parameter übergeben : dies schlägt auch fehl, da die parent-Konstruktor ist private.
Da die untergeordnete Klasse wird entweder ein Standard-Konstruktor oder parametrisierten Konstruktor und es ist nicht möglich, entweder von Ihnen, Sie können eine Unterklasse für eine übergeordnete Klasse mit privatem Konstruktor.
Ja etwas hinzuzufügen, zu Luiggi Antwort diese Funktion von java verwendet wird, bei der Erstellung des Singleton-Klassen, die erlaubt nur eine Instanz dieser Klasse erstellt werden.
enum
. Siehe: stackoverflow.com/questions/5759596/... . Wenn du das nicht hast, Buch, kaufen Sie es. Es ist ein must-read für jeden ernsthaften über java