Supposons que nous avons une classe: 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() {};
}
4 Réponses :
La première ligne échoue, car La deuxième ligne réussit parce qu'il crée une sous-classe anonyme de Someclass code> S est
protégé code> et
MAINCLASS code> n'est pas dans
SOMECLAS code> ' S Paquet S, et ce n'est pas le sous-classement
MAINCLASS code>. P>
Someclass code>. Cette classe de classe interne anonyme
soméclass code>, il a donc accès à
soméclass code> 'S
protégé code> constructeur. Le constructeur par défaut de cette classe intérieure anonyme appelle implicitement ce constructeur de superclasse. P>
Votre classe anonyme devient essentiellement p> 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 () code> car le constructeur parent code> code> est accessible à partir d'un constructeur de sous-classe. P> P>
À 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.
Votre ligne crée une instance d'une nouvelle classe qui s'étend soméclass code>. Étant donné que
SOMECLASS code> 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. P> P>
Ces deux petits accolades dans
SomeClass sac2 = new SomeClass() {};