2015-12-20 4 views
2

Cette classeclasses imbriquées statiques Instantiation

public class Main { 

    public static void main(String[] args) { 
     Main m = new Main(); 
     m.new A(); 
     m.new B(); //1 - compilation error 

     new Main.B(); 
    } 

    class A{} 
    static class B{} //2 
} 

se traduira par une erreur de compilation à la ligne 1:

Illegal enclosing instance specification for type Main.B 

Mais je ne comprends pas pourquoi, je trouve un peu contre-intuitif: à la ligne 2 nous avons une définition de classe statique, ne devrait-elle pas aussi être accessible à partir de l'objet m?

Modifier

Si Main avait une variable i, m.i statique ne serait pas aboutir à une erreur de compilation. Pourquoi le comportement est-il différent avec la définition de classe?

+0

L'accessibilité n'est pas pertinente. La classe StringBuilder est également accessible depuis l'objet 'm'. Mais vous n'utilisez pas 'm.new StringBuilder()' pour l'instancier. La syntaxe 'm.new' est utilisée pour instancier une classe interne de Main faisant référence à l'objet englobant' m'. B n'est pas une classe interne et n'a aucune référence implicite à un objet principal. –

+0

@JBNizet Jetez un oeil à mon édition, s'il vous plaît –

+0

Ce n'est pas une classe interne? Seules les classes non statiques sont définies "interne", tandis que les classes statiques sont "imbriquées"? –

Répondre

2

No.

Le point de l'ensemble d'une classe interne statique est qu'il ne fonctionne pas possède une instance de la classe externe.

+0

Je comprends cela. C'est comme n'importe quel autre membre statique. Mais si 'Main' avait une variable statique' i', 'm.i' n'entraînerait pas une erreur de compilation –

+1

@LuigiCortese: Cette fonctionnalité était une erreur. Les concepteurs de langage n'ont pas commis cette erreur à de nouvelles fonctionnalités linguistiques. – SLaks

+0

Sérieusement ?? Toute référence? –

1

m.new B(); est une manière incorrecte d'instancier une classe statique imbriquée car B n'est pas une variable d'instance de la classe Main - n'a donc pas besoin d'instance de Main pour le créer. Plutôt que vous pouvez faire

new Main.B(); 

Je cite docs pour plus de clarté

Une classe imbriquée statique interagit avec les membres de l'instance de sa classe externe (et d'autres classes) comme toute autre classe de haut niveau. En effet, une classe imbriquée statique est une classe de niveau supérieur qui a été imbriquée dans une autre classe de niveau supérieur pour la commodité de l'empaquetage.

+0

Lire ma modification, s'il vous plaît –

+0

Seules les classes imbriquées non statiques ont besoin d'une classe externe pour son instanciation. Donc, dire 'm.new B();' n'est pas correct car 'm' ne possède pas' B' c'est comme n'importe quelle autre classe de premier niveau. Donc ce que vous voulez dire, c'est pourquoi je ne peux pas accéder à la classe comme 'm.B' comme n'importe quelle autre variable statique.Je ne suis peut-être pas la bonne personne pour répondre à cette question :) c'est ainsi que cela a été conçu. –