Java verhindert nicht das Unterklassieren von Klassen mit privaten Konstruktoren.
%Vor%druckt
%Vor%Was es verhindert, sind Unterklassen, die auf keine Konstruktoren ihrer Superklasse zugreifen können. Dies bedeutet, dass ein privater Konstruktor nicht in einer anderen Klassendatei verwendet werden kann und ein lokaler Konstruktor eines Pakets nicht in einem anderen Paket verwendet werden kann.
In dieser Situation ist die einzige Möglichkeit, die Sie haben, die Delegierung. Sie müssen eine Factory-Methode aufrufen, um eine Instanz der Klasse "super" zu erstellen und sie zu umbrechen.
Weil eine Klasse ihren Superklassenkonstruktor immer aufrufen muss. Wenn auf den Superklassenkonstruktor nicht zugegriffen werden kann, kann die Unterklasse nicht initialisiert werden.
Weitere Informationen: JLS 8.8.10. Verhindern der Instantiierung einer Klasse
Zu Brian Roachs Kommentaren:
Der Aufruf [an den Elternklassenkonstruktor] ist nur implizit, wenn Sie es nicht explizit tun und der Elternteil einen öffentlichen oder geschützten Konstruktor hat (oder hat keinen definiert. In diesem Fall gibt es einen Standardno- arg). Es ist erforderlich, weil ... so funktioniert die Sprache. Children [Klassen] müssen [ihren] Konstruktor der Eltern aufrufen.
Beachten Sie, dass bei der Instantiierung jeder -Klasse in Java immer ein impliziter Aufruf von Hinweis vom JLS-Link: Es ist ein Fehler bei der Kompilierung, wenn ein Standardkonstruktor implizit deklariert wird, aber die Oberklasse keinen barrierefreien Konstruktor (§6.6) hat, der keine Argumente annimmt und keine throws-Klausel hat. Object
-Konstruktor erfolgt, da es sich um die Superklasse aller Klassen handelt. Es wird seinen Standardkonstruktor :
Wenn Sie eine Unterklasse haben, haben Sie zwei Möglichkeiten für Kindklasse (Unterklasse) Konstruktoren: 1. Standardkonstruktor (kein Argumentkonstruktor): In diesem Fall versucht der Standardkonstruktor automatisch, den übergeordneten Klassenkonstruktor aufzurufen: Dies wird fehlschlagen, da der Elternklassenkonstruktor privat ist. 2. Parametrisierter Konstruktor: Wenn Sie versuchen, ein Objekt für eine Kindklasse zu erstellen, die den Konstruktor parametrisiert hat, müssen Sie Elternkonstruktor zwingend vom Kindklassenkonstruktor aus aufrufen, indem Sie Parameter übergeben oder Parameter nicht übergeben: Dies wird auch fehlschlagen, da der Elternkonstruktor ist privat.
Da die Kindklasse entweder einen Standardkonstruktor oder einen parametrisierten Konstruktor hat und es nicht möglich ist, einen von beiden zu haben, können Sie keine Unterklasse für eine Elternklasse mit privatem Konstruktor haben.
Ja etwas zu Luiggis Antwort hinzufügen Diese Eigenschaft von Java wird verwendet, wenn die Singleton-Klassen erstellt werden, die nur eine Instanz dieser Klasse erstellen lassen.
Tags und Links java inheritance