2013-10-17 7 views
4

Pourquoi est-il possible de définir des classes internes (alias non hiérarchique imbriqué) dans une interface?Classes imbriquées dans une interface

Cela a-t-il un sens? Ils ne peuvent exister au sein d'une instance de l'interface contenant, car les interfaces ne peuvent pas être instanciés, alors ...

Ce qui suit ne compile:

interface MyInterface 
{ 
    static class StaticNestedClass 
    { 
     static int a() 
     { 
      return 0; 
     } 
     int b() 
     { 
      return 1; 
     } 
    } 
    class InnerClass 
    { 
     static int a() 
     { 
      return 0; 
     } 
     int b() 
     { 
      return 1; 
     } 
    } 
} 

Y at-il une différence entre les 2 ci-dessus des classes? Est-ce que static est réellement pris en compte? Notez que si vous modifiez interface avec class, vous obtenez évidemment une erreur de compilation sur InnerClass 'static int a().

En outre, un coup d'oeil à l'adresse suivante:

interface MyInterface 
{ 
    int c=0; 
    static class StaticNestedClass 
    { 
     static int a() 
     { 
      return c; 
     } 
     int b() 
     { 
      return c+1; 
     } 
    } 
    class InnerClass 
    { 
     static int a() 
     { 
      return c; 
     } 
     int b() 
     { 
      return c+1; 
     } 
    } 
} 

Contrairement lorsque la externe contenant l'entité est une classe, ici bien sûr il n'y a pas une telle chose comme un » intérieur (imbriqué non statique) class peut accéder aux champs de outer alors qu'une classe imbriquée statique ne peut pas ", car, étant donné que notre thingie externe est une interface, notre entier c est implicitement statique ... Les classes imbriquées de interface sont elles aussi implicitement statiques?

Donc, encore une fois, sont StaticNestedClass et InnerClass tout de même?

+1

I ** pense ** classe 'InnerClass' est implicitement statique, de façon similaire à' C' – Cruncher

+1

@Cruncher dans En fait, toute non-méthode dans une interface est marquée comme static par le compilateur automatiquement. –

Répondre

3
class InnerClass 

est implicitement (converti par le compilateur selon JLS, Section 9.5)

Une déclaration de type de membre dans une interface est implicitement statique et public. Il est permis de spécifier de manière redondante l'un ou l'autre de ces modificateurs ou les deux.

static class InnerClass 

parce qu'il est dans une interface.

Vous obtiendrez l'erreur lors du changement d'interface en classe, car les classes internes non statiques ne sont pas autorisées, et il n'est pas implicitement converti en statique dans le cas d'une classe.

Pour répondre à votre dernière question directement,

oui, StaticNestedClass et InnerClass sont les mêmes

+2

[Le JLS, section 9.5] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.5) parle de membres d'interface implicitement 'static', inclut les classes de membres. – rgettman

+0

@rgettman Je cherchais la section spécifique JLS. Je suis tombé sur cela, et je n'étais pas sûr que cette partie couvrait les classes internes. Merci, va ajouter à la poste. EDIT: peu importe, j'étais à 9,3, 9,5 est plutôt explicite à cela – Cruncher

+0

Merci Cruncher et rgettman, la section JLS 9.5 est exactement ce que je cherchais. –

Questions connexes