2010-11-22 6 views
0

Étant donné cet extrait de code, pourriez-vous expliquer pourquoi il woks? Le fait est que le constructeur de la classe est marqué privé, donc cela ne devrait-il pas nous empêcher de l'appeler avec un nouvel opérateur?Portée privée du constructeur

public class Alpha { 
protected Alpha() {} 
} 
class SubAlpha extends Alpha { 
private SubAlpha() {System.out.println("ok");} 
public static void main(String args[]) { 
    new SubAlpha(); 
} 
} 

Tout fonctionne parce que la méthode statique fait partie de la classe et peut voir tous les champs et méthodes privés, non? En dehors de cette "nouvelle" initialisation ne marcherait jamais?

Répondre

5

Le constructeur ne private dans votre question est SubAlpha, qui SubAlpha elle-même appel. Il n'y a pas de problème, une classe peut appeler ses propres méthodes privées. Le constructeur Alpha est protected, donc SubAlpha y a accès.

Modifier: Re votre édition: Oui, exactement. Une classe distincte (qu'il s'agisse d'une sous-classe ou non) n'aurait pas accès au constructeur privé de SubAlpha et ne pourrait pas construire avec succès un .

Exemple 1:

public class Beta 
{ 
    public static final void main(String[] args) 
    { 
     new SubAlpha(); 
//  ^--- Fails with a "SubAlpha() has private access in SubAlpha" 
//   compilation error 
    } 
} 

Exemple 2:

public class SubSubAlpha extends SubAlpha 
{ 
    private subsubAlpha() 
    { 
// ^== Fails with a "SubAlpha() has private access in SubAlpha" 
//  compilation error because of the implicit call to super() 
    } 
} 

Ceci est, bien sûr, spécifique constructeur, car la portée est toujours spécifique membres. Si une classe a un constructeur différent avec une signature différente et une portée moins restrictive, alors une classe l'utilisant (y compris une sous-classe) peut utiliser cette autre signature de constructeur. (Dans le cas d'une sous-classe, cela nécessiterait un appel explicite à super(args);.)

1

Le code fonctionne comme la méthode principale est également dans la même classe. Vous ne pouvez peut-être pas initialiser SubAplha à partir d'une classe différente.

Questions connexes