Java LanguageClasses imbriquées et internes


Introduction

En utilisant Java, les développeurs ont la possibilité de définir une classe dans une autre classe. Une telle classe s'appelle une classe imbriquée . Les classes imbriquées sont appelées classes internes si elles ont été déclarées comme non statiques, sinon elles sont simplement appelées classes imbriquées statiques. Cette page sert à documenter et à fournir des détails sur les exemples d'utilisation des classes imbriquées et internes Java.

Syntaxe

  • Classe publique OuterClass {classe publique InnerClass {}} // Les classes internes peuvent également être privées
  • Classe publique OuterClass {classe statique publique StaticNestedClass {}} // Les classes imbriquées statiques peuvent également être privées
  • public void method () {classe privée LocalClass {}} // Les classes locales sont toujours privées
  • SomeClass anonymousClassInstance = new SomeClass () {}; // Les classes internes anonymes ne peuvent pas être nommées, donc l'accès est sans objet. Si 'SomeClass ()' est abstrait, le corps doit implémenter toutes les méthodes abstraites.
  • SomeInterface anonymousClassInstance = new SomeInterface () {}; // Le corps doit implémenter toutes les méthodes d'interface.

Remarques

Terminologie et classification

La spécification de langage Java (JLS) classe les différents types de classe Java comme suit:

Une classe de niveau supérieur est une classe qui n'est pas une classe imbriquée.

Une classe imbriquée est une classe dont la déclaration se produit dans le corps d'une autre classe ou interface.

Une classe interne est une classe imbriquée qui n'est pas explicitement ou implicitement déclarée statique.

Une classe interne peut être une classe membre non statique , une classe locale ou une classe anonyme . Une classe membre d'une interface est implicitement statique, elle n'est donc jamais considérée comme une classe interne.

En pratique, les programmeurs se réfèrent à une classe de niveau supérieur contenant une classe interne en tant que "classe externe". En outre, il existe une tendance à utiliser "classe imbriquée" pour faire référence uniquement aux classes imbriquées statiques (explicitement ou implicitement).

Notez qu'il existe une relation étroite entre les classes internes anonymes et les lambda, mais les lambda sont des classes.

Différences sémantiques

  • Les classes supérieures sont le "cas de base". Ils sont visibles par d'autres parties d'un programme soumis à des règles de visibilité normales basées sur la sémantique des modificateurs d'accès. S'ils ne sont pas abstraits, ils peuvent être instanciés par tout code où les constructeurs pertinents sont visibles sur la base des modificateurs d'accès.

  • Les classes imbriquées statiques suivent les mêmes règles d'accès et d'instanciation que les classes de niveau supérieur, à deux exceptions près:

    • Une classe imbriquée peut être déclarée comme private , ce qui la rend inaccessible en dehors de sa classe supérieure.
    • Une classe imbriquée a accès aux membres private de la classe de niveau supérieur englobante et de toutes ses classes testées.

    Cela rend les classes imbriquées statiques utiles lorsque vous devez représenter plusieurs "types d'entités" dans une limite d'abstraction étroite; Par exemple, lorsque les classes imbriquées sont utilisées pour masquer les "détails d'implémentation".

  • Les classes internes ajoutent la possibilité d'accéder aux variables non statiques déclarées dans des étendues englobantes:

    • Une classe membre non statique peut faire référence à des variables d'instance.
    • Une classe locale (déclarée dans une méthode) peut également faire référence aux variables locales de la méthode, à condition qu'elles soient final . (Pour Java 8 et versions ultérieures, ils peuvent être effectivement définitifs .)
    • Une classe interne anonyme peut être déclarée dans une classe ou une méthode et peut accéder à des variables selon les mêmes règles.

    Le fait qu'une instance de classe interne puisse faire référence à des variables dans une instance de classe englobante a des implications pour l'instanciation. Plus précisément, une instance englobante doit être fournie, implicitement ou explicitement, lorsqu'une instance d'une classe interne est créée.

Classes imbriquées et internes Exemples Liés