J'ai trouvé le code dans lequel la classe statique contient des méthodes qui ne sont pas déclarées statiques. Compilateur n'affiche aucun avertissement. Cela semble déroutant, n'est-ce pas? P>
6 Réponses :
Seules les classes intérieures peuvent être déclarées statique code>. Une classe statique n'a pas de pointeur à sa classe extérieure et ne peut donc référence que sur des champs statiques et des méthodes de la classe extérieure. Une classe statique peut toutefois elle-même contenir des méthodes non statiques. P>
Une «classe intérieure» est par définition non statique. Vous voulez dire «classe imbriquée».
Il n'y a pas de concept de classe statique en Java (pas même la classe intérieure statique). Si vous voyez la classe est statique et qu'elle est en état de fonctionnement, elle doit être une classe intérieure (également appelée classe imbriquée) qui est déclarée statique. Et il n'y a aucune restriction pour avoir uniquement des méthodes statiques dans des classes intérieures statiques. P>
L'importance de la déclaration de la classe interne statique est de pouvoir créer des instances de la classe imbriquée indépendamment de la classe dans laquelle il est imbriqué. Si la statique n'est pas mentionnée, chaque instance de la classe imbriquée sera associée à une instance de la classe dans laquelle elle est imbriquée. p>
Cette question a plus de détails. classe de classe interne Java et classe imbriquée statique p>
Eh bien, alors il y a un concept de classes statiques, n'est-ce pas?
@MathiSschwarz: Pas vraiment. Au moins pas comme ça, on voit souvent. C # a des "classes statiques" et ce que vous voyez ici est quelque chose de très différent.
@Mathiesschwarz: il est intérieur et pas pour les classes normales
Bien sûr, les mots peuvent signifier quelque chose d'autre dans d'autres langues, mais cette question concerne Java. En Java, une classe statique est une classe interne sans pointeur sur la classe / objet externe.
@Mathiesschwarz: Mais puisque la question implique une compréhension qui semble provenir de C #, le fait que cela signifie autre chose en C # est B> pertinent pour cette question. Le contexte est important.
@MathiSschwarz: Vous avez pris un sens très simple, mais ma réponse indique également que vous n'avez pas compris: Il n'y a pas de concept de classe statique autre que les classes intérieures statiques. Code>
Il n'existe pas de "classe intérieure statique". Voir JLS # 8.1.3 : 'Une classe intérieure est une classe imbriquée qui n'est pas explicitement ou implicitement déclarée statique ». Une «classe intérieure» est par définition non statique. Une «classe imbriquée» peut être statique ou non statique.
Mon commentaire aurait dû être adressé à @mathiesschwarz.
..so que nous pouvons dire: "Comme nous déclarons la classe comme statique en Java, C # ou C ++; il y a le concept de classe statique dans toutes ces langues. Et sa signification peut varier d'une langue à d'autres".
«Si vous voyez la classe est statique et qu'elle est en état de fonctionnement, elle doit être une classe intérieure» - ce n'est pas correct. Une classe intérieure est toujours non statique. Une classe imbriquée déclarée statique est appelée classe imbriquée statique. Les deux sont des classes imbriquées (qui est un terme général utilisé pour décrire des classes au sein de classes).
Il n'y a pas de "classe statique" en Java (du moins pas dans la façon dont vous semblez le comprendre). En C # Il existe une "classe statique" qui ne peut pas être instanciée et ne peut pas avoir des membres non statiques. Ce concept n'existe pas explicitement en Java (vous pouvez obtenir le même effet en faisant tous les constructeurs Ce que vous voyez est probablement un statique imbriqué EM> classe comme ceci: p> ceci seul em> signifie qu'une instance code> bar code> ne em> pas em > avoir une référence à une instance externe privé code>, cependant).
FOO code> (comme ce serait le cas si
bar code> n'avait pas le modificateur code> STATIC CODE>). P >
bar code> peut avoir tout type de membres qu'il aurait pu avoir s'il s'agissait d'une classe de haut niveau. p> p>
Une classe statique est une classe imbriquée qui n'a aucune référence implicite à la classe extérieure. Une classe statique peut avoir des méthodes statiques ou des méthodes d'instance. Remarque: une classe interne ne peut pas avoir des méthodes statiques. P>
De JLS 8.1.3 "Une classe intérieure est une classe imbriquée qui n'est pas explicitement ou implicitement déclarée statique." docs.oracle.com/javase/specs/jls/se7/html/jls-8.html
@Peterlawrey "Une classe statique est une classe imbriquée qui n'a aucune référence implicite à la classe extérieure" - c'est l'aspect le plus important de tous à mon avis. J'aimerais pouvoir uppouver cela deux fois.
Remarque: Les classes locales et anonymes sont également des classes intérieures même si elles sont définies dans un contenu statique. c'est-à-dire avec aucune instance extérieure implicite.
Le mot-clé code> statique code> est totalement différent des attributs / méthodes et classes. P>
Pour les attributs et les méthodes, il indiquera que le compilateur ne dispose qu'une seule instance de l'attribut ou de la méthode pouvant être référencée sans une instance vivante de la classe. P>
Le mais un classe statique code> ne peut être utilisé que pour la classe intérieure, pour indiquer que la classe peut être référencée sans une instance existante de la classe enfermante. Il est donc utile pour l'énumération intérieure qui doit être accessible de l'extérieur. P>
classe statique code> peut faire référence à ce qu'il veut, de son propre corps. P>
Voir JLS # 8.1 .3 . Votre explication des méthodes statiques est également incorrecte.
@EJP Je pense que le poste ci-dessus était une adresse directe à la question, afin de clarifier le malentendu de l'OP de la référence statique utilisée dans le contexte d'une classe (interne) et référencée à un champ membre. Donc, je crois, de manière informelle, dans un sens large, il pourrait avoir raison. Ou s'il vous plaît clarifier ma compréhension.
* J'aurais dû dire que je suis imbriqué plutôt que de l'intérieur ci-dessus
Les réponses ici sont bonnes, mais je suppose que je devrais ajouter un exemple. Considérez la définition de la classe suivante pour utiliser la barre de classe, vous devez créer une instance de classe FOO en premier. p> mais si vous avez utilisé le mot clé statique comme suit p> , vous auriez pu ignorer une étape p > Si vous essayez de utiliser statiquement FOO.bar directement lorsque la classe interne n'est pas statique, vous obtiendrez l'erreur suivante - P> error: an enclosing instance that contains Foo.Bar is required
Foo.Bar bar = new Foo.Bar();
^
1 error
belle réponse .. ça aide
Votre question devrait être la classe intérieure statique B> ...?
@Priyankdoshi Les classes intérieures sont par définition non statiques.