91 votes

Pourquoi Java interdit-il les champs statiques dans les classes internes?

class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 

Bien qu'il n'est pas possible d'accéder au champ statique OuterClass.InnerClass.moi, si je veux enregistrer quelque chose qui doit être statique, par exemple, le nombre de InnerClass les objets créés, il serait utile de rendre ce champ statique. Alors pourquoi ne Java interdire les champs statiques/méthodes dans les classes internes?

EDIT: je sais comment faire le bonheur du compilateur avec statique de la classe imbriquée (ou statiques à l'intérieur de la classe), mais ce que je veux savoir, c'est pourquoi java interdit statique champs/méthodes dans les classes internes (ou ordinaire intérieur de la classe) à partir de la langue de la conception et de la mise en œuvre des aspects, si quelqu'un en sait plus à ce sujet.

Merci.

60voto

OscarRyz Points 82553

Je veux savoir pourquoi java interdit statique déposée/de la méthode à l'intérieur de intérieur de la classe

Parce que ces classes internes sont "instance" inner classes. Qui est, ils sont comme une instance de l'attribut de l'affichage de l'objet.

Depuis qu'ils sont "instance" des classes, il ne ferait aucun sens pour permettre l' static , static à pour but de travailler sans une instance en premier lieu.

C'est comme vous essayez de créer un statique/instance de l'attribut dans le même temps.

Prenons l'exemple suivant:

 class Employee {
     public String name;
 }

Si vous la création de deux instances de l'employé:

Employee a = new Employee(); 
a.name = "Oscar";

Employee b = new Employee();
b.name = "jcyang";

Il est clair que chacun a de sa propre valeur pour la propriété name droit?

La même chose se passe avec l'intérieur de la classe, de chaque intérieur instance de classe est indépendante des autres intérieure instance de classe.

Donc, si vous essayez de créer un counter de l'attribut de classe, il n'y a aucun moyen d'action que la valeur de l'ensemble de deux instances différentes.

class Employee {
    public String name;
    class InnerData {
        static count; // ??? count of which ? a or b? 
     }
}

Lorsque vous créez l'instance a et b dans l'exemple ci-dessus, ce serait une bonne valeur pour la variable statique count? Il n'est pas possible de le déterminer, car l'existence de l' InnerData classe dépend entièrement de chaque de la enfermant des objets.

C'est pourquoi, lorsque la classe est déclarée static, il n'a pas besoin plus un vivant exemple, de la vivre soi-même. Maintenant qu'il n'y a pas de dépendance, vous pouvez déclarer un attribut static.

Je pense que cela semble répétitif, mais si vous pensez que sur les différences entre les instace contre les attributs de classe, il va donner un sens.

35voto

34voto

Asaph Points 56989

InnerClass ne peut pas avoir les membres static car il appartient à une instance (de OuterClass ). Si vous déclarez InnerClass tant que static pour le dissocier de l'instance, votre code sera compilé.

 class OuterClass {
    static class InnerClass {
        static int i = 100; // no compile error
        static void f() { } // no compile error
    }
}
 

BTW: Vous pourrez toujours créer des instances de InnerClass . static dans ce contexte permet que cela se produise sans une instance englobante de OuterClass .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X