J’ai observé qu’extra-atmosphérique classes peuvent accéder à des variables d’instance privée classes internes. Comment est-ce possible ? Voici un exemple de code montrant les mêmes :
Pourquoi ce comportement est autorisé ?
J’ai observé qu’extra-atmosphérique classes peuvent accéder à des variables d’instance privée classes internes. Comment est-ce possible ? Voici un exemple de code montrant les mêmes :
Pourquoi ce comportement est autorisé ?
L'intérieur de la classe est juste une façon de séparer proprement les quelques fonctionnalités qui appartient vraiment à l'original de l'extérieur de la classe. Ils sont destinés à être utilisés quand vous avez 2 exigences:
Compte tenu de ces exigences, les classes internes ont un accès complet à leur extérieur de la classe. Étant donné qu'ils sont essentiellement un membre de l'extérieur de la classe, il est logique qu'ils aient accès à des méthodes et des attributs de l'extérieur de la classe -- y compris des soldats.
L'intérieur de la classe est (à des fins de contrôle d'accès) considérés comme faisant partie de la classe conteneur. Cela signifie un accès complet à tous les soldats.
La façon dont cela est mis en oeuvre en utilisant la synthèse paquet protégé méthodes: L'intérieur de la classe seront compilées dans une catégorie distincte dans le même package (ABC$XYZ). La JVM ne prend pas en charge ce niveau d'isolation directement, de sorte que le bytecode niveau de l'ABC$XYZ aura paquet protégé par des méthodes que l'extérieur de la classe utilise pour obtenir le privé, les méthodes et les champs.
Il y a une bonne réponse figurant sur une autre question similaire à ceci: pourquoi le privite membre d'un intérieur de classe statique accessible par les méthodes d'outter classe?
Il dit qu'il y a une définition de privé de portée sur JLS - Détermination de l'Accessibilité:
Sinon, si le membre ou le constructeur est déclaré en privé, alors l'accès est autorisé si et seulement si elle se produit dans le corps de la classe de haut niveau (§7.6) qui recouvre la déclaration du membre ou d'un constructeur.
La logique derrière les classes internes est que si vous créez un intérieur de classe à l'extérieur de la classe, c'est parce qu'ils auront besoin de partager un peu les choses, et donc il est logique pour eux d'être en mesure d'avoir plus de souplesse que "régulier" classes ont.
Si, dans votre cas, il n'a pas de sens pour les classes à être en mesure de voir les uns les autres rouages, ce qui signifie que l'intérieur de la classe pourrait simplement avoir été faite d'une classe régulière, vous pouvez déclarer l'intérieur de la classe en tant que static class XYZ
. À l'aide de static
signifie qu'ils ne seront pas partager l'état (et, par exemple, new ABC().new XYZ()
ne fonctionne pas, et vous aurez besoin d'utiliser new ABC.XYZ()
.
Mais, si c'est le cas, vous devriez réfléchir à l'opportunité d' XYZ
devrait vraiment être un intérieur classe et que peut-être qu'il mérite son propre fichier. Parfois, il est logique de créer un statique à l'intérieur de la classe (par exemple, si vous avez besoin d'une petite classe qui implémente une interface à l'extérieur de la classe, et qui ne sera pas utile n'importe où ailleurs). Mais à environ la moitié du temps, il doit avoir été un extérieur de la classe.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.