Je n'ai trouvé de réponse satisfaisante nulle part.
Vous pourriez peut-être développer davantage votre réponse, je pense qu'elle sera meilleure que celle qui a été acceptée (j'ai voté pour).
Je n'ai trouvé de réponse satisfaisante nulle part.
Toutes les classes de premier niveau sont, par définition, statiques.
Qu'est-ce que le static
se résume au fait qu'une instance de la classe peut se suffire à elle-même. Ou, dans l'autre sens : une classe interne non statique (= classe interne d'instance) ne peut exister sans une instance de la classe externe. Puisqu'une classe de premier niveau n'a pas de classe externe, elle ne peut être autre que static
.
Porque todo les classes de premier niveau sont statiques, ayant le static
dans une définition de classe de premier niveau est inutile.
Un peu de code pour jouer avec :
public class Foo {
public class Bar {
// Non-static innner class
}
public static class Baz {
// Static inner class
}
}
public class Example {
public static void main(String[] args) {
new Foo(); // this is ok
new Foo.Baz(); // this is ok
new Foo.Bar(); // does not compile!
Foo f = new Foo();
Foo.Bar bar = f.new Bar(); //this works, but don't do this
}
}
J'ai mis le "mais ne faites pas ça" parce que c'est vraiment conception de code moche. Les classes internes d'instance ne doivent pas être visibles en dehors de la classe externe. Elles ne doivent être utilisées qu'à l'intérieur de la classe externe.
En d'autres termes, une déclaration de type de niveau supérieur ne peut pas être statique, car l'option Spécification du langage Java (JLS) ne dit pas qu'il peut l'être. Le JLS le dit explicitement sur le static
comme modificateur des classes de premier niveau :
Le modificateur
static
ne concerne que les classes membres (§8.5.1), et non les classes de premier niveau, locales ou anonymes.
Toutefois, la réponse acceptée - qui a reçu de nombreux votes positifs - indique que c'est parce que les classes de premier niveau sont implicitement statiques "par définition", de sorte que la fonction static
serait inutile. C'est faux.
Le mot "static" apparaît dans le JLS à de nombreux endroits, mais jamais pour faire référence à des déclarations de type de haut niveau. Voici une liste exhaustive des choses qui puede être "statique" :
throws
Les clauses sont jeté statiquement .Le mot "static" n'est pas utilisé dans le JLS pour faire référence aux déclarations de type de haut niveau ; ainsi, en plus de ne pas être explicitement statiques, elles ne sont pas (et ne peuvent pas être) "implicitement" statiques, par définition.
static
peuvent être ajoutées aux classes imbriquées d'une interface, même si c'est le cas par défaut.
Je crois static
ne peuvent pas être ajoutés aux classes de niveau supérieur car, à l'origine, il n'y avait pas de classes imbriquées et vous ne pouviez pas ajouter de statique à n'importe quelle classe.
Plus tard, les classes imbriquées ont été ajoutées et le statique pouvait être ajouté aux classes imbriquées, mais il y a une tendance à ne pas changer la syntaxe plus que nécessaire, donc il n'a pas été ajouté aux classes de niveau supérieur. (car il n'y avait pas de besoin/bénéfice)
Chaque fois que nous exécutons une classe, la JVM instancie un objet. La JVM peut créer un certain nombre d'objets, par définition, le terme "statique" signifie que vous avez le même ensemble de copies pour tous les objets. Donc, si la classe supérieure est statique, à chaque fois que vous exécutez un programme, il crée un objet et le garde en mémoire au même endroit.
La définition d'une classe externe comme statique servira-t-elle à d'autres fins qu'une classe non statique ?
Chaque classe est déjà commune à tous ses objets, et il n'est pas nécessaire de la rendre statique pour qu'elle devienne disponible pour tous ses objets.
Nous avons besoin d'un nom de classe pour accéder à ses membres statiques car ces membres font partie d'une classe alors qu'une classe externe fait partie d'un package. Nous pouvons accéder directement à la classe en écrivant simplement nom_du_paquet.nom_de_la_classe (similaire à nom_de_la_classe.nom_du_champ_statique). Donc, encore une fois, il n'est pas nécessaire de faire quelque chose qui est déjà là par défaut.
Nous n'avons pas besoin d'un objet pour accéder à une classe si elle est visible. Nous pouvons simplement écrire nom_du_paquet.nom_de_la_classe pour y accéder. Et par définition, une classe est un plan pour ses objets, et nous créons une classe pour créer des objets à partir d'elle (bien qu'une exception sera toujours présente, comme java.lang.Math). Encore une fois, il n'est pas nécessaire de définir une classe externe comme statique. D'après les points ci-dessus, nous pouvons dire que les créateurs de Java n'ont pas permis à une classe externe d'être statique parce qu'il n'y a pas besoin de la rendre statique. Permettre de rendre la classe externe statique ne fera qu'augmenter les complications, l'ambiguïté et la duplicité.
Consultez ce lien pour plus de détails. https://dzone.com/articles/why-an-outer-class-cant-be-static
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.
12 votes
Si vous ne savez pas quelles réponses vous avez trouvées, vous obtiendrez probablement d'autres réponses insatisfaisantes.
1 votes
@BoltClock et bien j'ai trouvé ces réponses qui demandaient juste la raison d'une telle classe mais pas la raison pour laquelle elles ne peuvent pas être statiques coderanch.com/t/515963/java-programmer-SCJP/certification/ et coderanch.com/t/523014/java/java/Why-Class-cannot-declared-as et download.oracle.com/javase/tutorial/java/javaOO/nested.html
0 votes
Que signifie le fait qu'une classe imbriquée soit statique ? Comment cela s'applique-t-il à une classe de niveau supérieur ?