web-dev-qa-db-fra.com

Une classe imbriquée statique peut-elle être instanciée en Java?

D'après Oracle tutorials J'ai trouvé ce texte:

Comme pour les méthodes de classe et les variables, une classe imbriquée statique est associée à sa classe externe. Et comme les méthodes de classe statiques, une classe imbriquée statique ne peut pas faire directement référence à des variables d’instance ou à des méthodes définies dans sa classe englobante - elle ne peut les utiliser que par le biais d’une référence d’objet.

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

Les classes statiques imbriquées sont accessibles en utilisant le nom de la classe englobante:

OuterClass.StaticNestedClass

Par exemple, pour créer un objet pour la classe imbriquée statique, utilisez cette syntaxe:

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass ();

Je pensais qu'il n'était pas possible d'instancier une classe statique, donc je ne comprends pas vraiment la phrase en gras. 

Avez-vous une idée de ce que cela signifie?

21
user1031431

Vous pouvez soit confondre static avec abstract, comme le dit kihero, soit vous confondez le concept avec une classe qui possède des méthodes static (qui est juste une classe ayant des méthodes statiques).

Une classe imbriquée statique est simplement une classe imbriquée ne nécessitant pas d'instance de sa classe englobante. Si vous connaissez C++, les classes all en C++ sont des classes "statiques". En Java, les classes imbriquées ne sont pas statiques par défaut (cette variété non statique est également appelée une "classe interne"), ce qui signifie qu'elles nécessitent une instance de leur classe externe, qu'elles suivent en arrière-plan dans un champ masqué - mais Cela permet aux classes internes de se référer aux champs de leur classe englobante associée.

public class Outer {

    public class Inner { }

    public static class StaticNested { }

    public void method () {
        // non-static methods can instantiate static and non-static nested classes
        Inner i = new Inner(); // 'this' is the implied enclosing instance
        StaticNested s = new StaticNested();
    }

    public static void staticMethod () {
        Inner i = new Inner(); // <-- ERROR! there's no enclosing instance, so cant do this
        StaticNested s = new StaticNested(); // ok: no enclosing instance needed

        // but we can create an Inner if we have an Outer: 
        Outer o = new Outer();
        Inner oi = o.new Inner(); // ok: 'o' is the enclosing instance
    }

}

Beaucoup d'autres exemples sur Comment instancier une classe interne non statique dans une méthode statique

En fait, je déclare toutes les classes imbriquées statiques par défaut, sauf si j'ai spécifiquement besoin d'accéder aux champs de la classe englobante.

33
Jason C

Les classes imbriquées statiques ne sont pas du tout elles-mêmes statiques. En Java, aucune classe n'est statique. Le mot clé statique dans les classes imbriquées statiques implique qu'il s'agit d'un autre membre statique de la classe externe. Mais c'est juste une autre classe brute. C’est pourquoi nous pouvons instancier cette classe

13
Abhishek raut

Vous confondez static avec abstract. Les classes abstraites ne peuvent pas être instanciées. static n'est pas un qualificatif valide pour les classes de niveau supérieur, mais la signification pour les classes internes est celle que vous avez citée.

5
kiheru

Je suppose que vous avez un peu mal compris la classe statique . Il est vrai que chaque classe abstraite et chaque interface ne peuvent pas être instanciées, mais vous pouvez instancier une classe statique . Une chose que vous devriez remarquer est que chaque classe statique est une classe statique imbriquée . Vous ne pouvez pas simplement créer une classe statique, comme vous pouvez le constater: essayez de créer une nouvelle classe dans Eclipse

Une classe statique appartient toujours à la "classe parente" qui la renferme, et la différence entre classe statique et non statique est la suivante: Vous pouvez vous référer à la classe statique enfant comme une propriété statique de la "classe parente":

ParentClass.NestedStaticClass nestedstatic = new ParentClass.NestedStaticClass();

mais vous ne pouvez faire référence à la classe imbriquée non statique en instanciant une classe parente, comme ceci:

ParentClass parent = new ParentClass();
ParentClass.NestedClass nested = parent.new NestedClass();

La différence est juste comme celle entre le champ statique et non statique.

0
Dai Niu