Warum können Sie nicht von einer Klasse erben, deren Konstruktor privat ist?

8

Warum verbietet Java die Vererbung von einer Klasse, deren Konstruktor privat ist?

    
CodeBlue 21.05.2013, 03:20
quelle

5 Antworten

21

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.

    
Peter Lawrey 21.05.2013, 05:23
quelle
18

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 Object -Konstruktor erfolgt, da es sich um die Superklasse aller Klassen handelt. Es wird seinen Standardkonstruktor : %Vor%

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.

    
Luiggi Mendoza 21.05.2013 03:21
quelle
1

Wenn der Konstruktor einer Klasse privat ist, kann die untergeordnete Klasse keinen Aufruf an den Superkonstruktor vornehmen. Daher würde die Vererbung fehlschlagen.

    
Lokesh 21.05.2013 03:21
quelle
1

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.

    
Hari Hara Kumar 29.08.2014 14:54
quelle
0

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.

    
Sanjaya Liyanage 21.05.2013 03:30
quelle

Tags und Links