7
votes

Initialisation anonyme de la classe avec constructeur protégé

Supposons que nous avons une classe: xxx pré>

dans MAINCLASS code> situé dans un emballage différent, j'ai essayé d'exécuter deux lignes: P>

public static void main(String[] args) {
    SomeClass sac1 = new SomeClass(); 
    SomeClass sac2 = new SomeClass() {}; 
}


0 commentaires

4 Réponses :


3
votes

La première ligne échoue, car Someclass S est protégé et MAINCLASS n'est pas dans SOMECLAS ' S Paquet S, et ce n'est pas le sous-classement MAINCLASS .

La deuxième ligne réussit parce qu'il crée une sous-classe anonyme de Someclass . Cette classe de classe interne anonyme soméclass , il a donc accès à soméclass 'S protégé constructeur. Le constructeur par défaut de cette classe intérieure anonyme appelle implicitement ce constructeur de superclasse.


0 commentaires

10
votes

Votre classe anonyme xxx

devient essentiellement xxx

Le constructeur n'a pas de modificateur d'accès, vous pouvez donc l'invoquer sans problème de le même paquet. Vous pouvez également appeler super () car le constructeur parent est accessible à partir d'un constructeur de sous-classe.


4 commentaires

À ma grande surprise, la même chose se passe lorsque vous utilisez un constructeur qui a des arguments. Dans ce cas, je pense que votre explication n'est plus valable.


@Andrei je n'ai pas mentionné de paramètres / arguments. Ils ne jouent aucun rôle dans la vérification de l'accessibilité.


Pas dans le chèque d'accésibilité, non. Mais si vous avez une classe avec seulement un constructeur protégé avec des paramètres, vous devez appeler explicitement son constructeur avec des paramètres de l'enfant. Je disais que cette règle semble être ignorée pour des cours anonymes.


@Andrei ce que vous dites est correct, mais ne semble pas pertinent ici. La question de l'opération portait sur l'accessibilité d'un constructeur d'une classe anonyme dans un autre forfait.



0
votes

Votre ligne xxx

crée une instance d'une nouvelle classe qui s'étend soméclass . Étant donné que SOMECLASS définit un constructeur protégé sans arguments, une classe enfant peut appeler cela implicitement dans son propre constructeur qui se produit dans cette ligne.


0 commentaires

2
votes

Ces deux petits accolades dans

SomeClass sac2 = new SomeClass() {};


0 commentaires