web-dev-qa-db-fra.com

Java: classe statique vs classe interne

Quelle est la différence entre une classe imbriquée statique et non statique?

350
Abhishek Sanghvi

Une classe interne, par définition , ne peut pas être statique, je vais donc reformuler votre question en "Quelle est la différence entre des classes imbriquées statiques et non statiques?"

Une classe imbriquée non statique a un accès complet aux membres de la classe dans laquelle elle est imbriquée. Une classe imbriquée statique ne comporte pas de référence à une instance imbriquée. Par conséquent, une classe imbriquée statique ne peut pas invoquer de méthodes non statiques ni accéder aux champs non statiques d'une instance de la classe dans laquelle elle est imbriquée.

542
Brandon E Taylor

Regardons la source de la sagesse pour de telles questions: Effective Java:

Techniquement, il n’existe pas de classe interne statique. Selon Effective Java, la terminologie correcte est classe imbriquée statique. Une classe imbriquée 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 imbriquée non statique est implicitement associée à une instance englobant de sa classe contenante ... Elle est possible d'appeler des méthodes sur l'instance englobante.

Une classe imbriquée statique n'a pas accès à l'instance englobante. Il utilise aussi moins d'espace.

125
Steve McLeod

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

  1. Dans le cas de la déclaration de champs et de méthodes membres, la classe interne non statique ne peut pas avoir de champs ni de méthodes statiques. Mais, en cas de classe interne statique, peut avoir des champs et méthodes statiques et non statiques.

  2. L'instance de classe interne non statique est créée avec la référence d'objet de classe externe, dans laquelle elle a été définie, cela signifie qu'elle a une instance englobante. Mais l'instance de la classe interne statique est créée sans la référence de la classe Outer, ce qui signifie qu'elle ne possède 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(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}
64
user918477
  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 d'instance et méthodes) de la classe englobante de la même manière que le style procédural permettant d'obtenir de la valeur sans créer d'objet.

  2. La classe interne statique peut déclarer des membres statiques et non statiques. Les méthodes statiques ont accès 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 objet de classe interne non statique.

  3. La classe interne non statique ne peut pas déclarer un champ statique ni des méthodes statiques. Il doit être déclaré dans des types statiques ou de niveau supérieur. Vous obtiendrez cette erreur en disant "les champs statiques ne peuvent être déclarés que dans des types statiques ou de niveau supérieur".

  4. Une classe interne non statique peut accéder aux membres statiques et non statiques de la classe englobante dans un style procédural de 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éé un objet de classes internes. Si la classe principale accède aux membres de la classe non statique, elle peut créer un objet de classe interne non statique.

  6. Si la classe principale accède aux membres de la classe interne statique, elle 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.
13
abishkar bhattarai

Discussion sur des classes imbriquées ...

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

Lorsque vous avez une déclaration de classe imbriquée qui est non statique, Java ne vous laissera pas l'instancier, sauf via la classe englobante. L'objet créé à partir de la classe interne est lié à l'objet créé à partir de la classe externe. La classe interne peut donc 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 objet) et vous pouvez donc instancier la classe imbriquée par elle-même.

10
DigitalRoss

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: ne peut déclarer que des membres non statiques, mais peut accéder aux membres statiques et non statiques de sa classe parente.

3
Vijay Kumar

Une classe interne ne peut pas être statique, je vais donc reformuler votre question en "Quelle est la différence entre des classes imbriquées statiques et non statiques?".

comme tu dis ici la classe intérieure ne peut pas être statique ... j'ai trouvé le code ci-dessous qui est donné statique .... raison? ou qui est correct ....

Oui, rien dans la sémantique d'un type imbriqué statique ne vous empêcherait de le faire. Cet extrait fonctionne bien.

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

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

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

la réponse était --->

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

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

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

3
kathir

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é.

2
Emil