209 votes

Pourquoi les classes Java externes accède à la classe interne émanant des députés ?

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é ?

83voto

Kaleb Brasee Points 25776

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:

  1. Un morceau de fonctionnalité dans votre extérieur de la classe serait plus clair si elle était mise en œuvre dans une classe à part.
  2. Même si c'est dans une catégorie distincte, la fonctionnalité est très étroitement liée à la façon que l'extérieur de la classe fonctionne.

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.

71voto

Ich Points 161

Si vous souhaitez masquer les membres privés de votre classe interne, vous pouvez définir une Interface avec les membres du publics et créer une classe interne anonyme qui implémente cette interface :

62voto

Thilo Points 108673

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.

20voto

Colin Su Points 1322

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.

3voto

abyx Points 15304

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.com

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.

Powered by:

X