Java: classe statique vs classe interne

Quelle est la différence entre les classes internes statiques et non statiques?

Une classe interne, par définition , ne peut pas être statique, je vais donc reformuler votre question en tant que “Quelle est la différence entre les classes nestedes statiques et non statiques?”

Une classe nestede non statique a un access complet aux membres de la classe dans laquelle elle est nestede. Une classe nestede statique n’a pas de référence à une instance d’imbrication, de sorte qu’une classe nestede statique ne peut pas invoquer des méthodes non statiques ou accéder à des champs non statiques d’une instance de la classe dans laquelle elle est nestede.

Regardons dans la source de la sagesse pour de telles questions: Java efficace de Joshua Bloch :

Techniquement, il n’y a pas de classe interne statique. Selon Java efficace , la terminologie correcte est une classe nestede statique . Une classe nestede non statique est en effet une classe interne, avec des classes anonymes et des classes locales.

Et maintenant, pour citer:

Chaque instance d’une classe non statique [nestede] est implicitement associée à une instance englobante de sa classe contenant … Il est possible d’invoquer des méthodes sur l’instance englobante.

Une classe nestede statique n’a pas access à l’instance englobante. Il utilise aussi moins d’espace.

Il existe deux différences entre les classes internes statiques et les classes internes non statiques.

  1. En cas de déclaration de champs et de méthodes membres, la classe interne non statique ne peut pas avoir de champs et de méthodes statiques. Mais, dans le cas d’une classe interne statique, peuvent avoir des champs et des méthodes statiques et non statiques.

  2. L’instance de classe interne non statique est créée avec la référence d’object de classe externe, dans laquelle elle a été définie, ce qui signifie qu’elle contient une instance englobante. Mais l’instance de classe interne statique est créée sans la référence à la classe externe, ce qui signifie qu’elle n’a pas d’instance englobante.

Voir cet exemple

 class A { class B { // static int x; not allowed here } static class C { static int x; // allowed here } } class Test { public static void main(Ssortingng… str) { A a = new A(); // Non-Static Inner Class // Requires enclosing instance AB obj1 = a.new B(); // Static Inner Class // No need for reference of object to the outer class AC obj2 = new AC(); } } 
  1. La classe interne statique ne peut pas accéder aux membres non statiques de la classe englobante. Il peut accéder directement aux membres statiques (champ et méthodes d’instance) de la même classe comme le style procédural d’obtention de valeur sans créer d’object.

  2. La classe interne statique peut déclarer des membres statiques et non statiques. Les méthodes statiques ont access aux membres statiques de la classe principale. Cependant, il ne peut pas accéder aux membres de classe internes non statiques. Pour accéder aux membres d’une classe interne non statique, il doit créer un object de classe interne non statique.

  3. La classe interne non statique ne peut pas déclarer de méthode statique et de champ statique. Il doit être déclaré en types statique ou supérieur. Vous obtiendrez cette erreur en disant que “les champs statiques ne sont déclarés que dans les types statiques ou de premier niveau”.

  4. La classe interne non statique peut accéder aux membres statiques et non statiques de la classe englobante dans le style procédural d’obtention de la valeur, mais elle ne peut pas accéder aux membres de la classe interne statique.

  5. La classe englobante ne peut pas accéder aux membres des classes internes tant qu’elle n’a pas créé d’object de classes internes. SI la classe principale accède aux membres d’une classe non statique, elle peut créer un object de classe interne non statique.

  6. Si la classe principale dans l’access aux membres de la classe interne statique a deux cas:

    • Cas 1: Pour les membres statiques, il peut utiliser le nom de classe de la classe interne statique
    • Cas 2: Pour les membres non statiques, il peut créer une instance de classe interne statique.

Discuter des classes nestedes

La différence est qu’une déclaration de classe nestede qui est également statique peut être instanciée en dehors de la classe englobante.

Lorsque vous avez une déclaration de classe nestede qui n’est pas statique, Java ne vous laissera pas instancier sauf via la classe englobante. L’object créé à partir de la classe interne est lié à l’object créé à partir de la classe externe, de sorte que la classe interne peut référencer les champs de la classe externe.

Mais si c’est statique, alors le lien n’existe pas, les champs externes ne sont pas accessibles (sauf via une référence ordinaire comme n’importe quel autre object) et vous pouvez donc instancier la classe nestede par elle-même.

Une classe interne ne peut pas être statique, je vais donc reformuler votre question en “Quelle est la différence entre les classes nestedes statiques et non statiques?”.

comme tu disais ici la classe interne ne peut pas être statique … j’ai trouvé le code ci-dessous qui est donné statique …. raison? ou qui est correct ….

Oui, il n’y a rien dans la sémantique d’un type nested statique qui vous empêcherait de le faire. Cet extrait fonctionne correctement.

  public class MultipleInner { static class Inner { } public static void main(Ssortingng[] args) { for (int i = 0; i < 100; i++) { new Inner(); } } } 

c'est un code posté sur ce site ...

pour la question ---> Une classe nestede statique peut-elle être instanciée plusieurs fois?

la réponse était --->

Bien sûr, le type nested peut faire son propre contrôle d'instance (par exemple, constructeur privé, modèle singleton, etc.), mais cela n'a rien à voir avec le fait qu'il s'agit d'un type nested. De plus, si le type nested est une énumération statique, vous ne pouvez bien sûr pas l’instancier.

Mais en général, oui, un type nested statique peut être instancié plusieurs fois.

Notez que techniquement, un type nested statique n'est pas un type "interne".

classe interne statique: peut déclarer des membres statiques et non statiques mais ne peut accéder qu’aux membres statiques de sa classe parents.

classe interne non statique: peut déclarer uniquement les membres non statiques mais peut accéder aux membres statiques et non statiques de sa classe parente.

Une classe nestede statique interagit avec les membres d’instance de sa classe externe (et d’autres classes), comme toute autre classe de niveau supérieur. En fait, une classe nestede statique est une classe de niveau comportemental qui a été nestede dans une autre classe de niveau supérieur pour la commodité de l’emballage.