Impossible de trouver une réponse satisfaisante n'importe où.
Toutes les classes de niveau supérieur sont, par définition, statiques.
La static
se résume à ceci: une instance de la classe peut être autonome. Ou bien, l'inverse: une classe interne non statique (= classe interne d'instance) ne peut exister sans une instance de la classe externe. Puisqu'une classe de niveau supérieur n'a pas de classe externe, elle ne peut être que static
.
Étant donné que toutes les classes de niveau supérieur sont statiques, il est inutile de disposer du mot clé static
dans une définition de classe de niveau supérieur.
Quelques codes 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
}
}
Je mets le "mais ne fais pas ça" là-dedans parce que c'est vraiment la conception de code moche. Les classes internes d'instance ne doivent pas être visibles en dehors de la classe externe. Ils ne doivent être utilisés que dans la classe externe.
J'ai donné la même réponse Pourquoi une classe Java ne peut-elle pas être déclarée comme statique? . Mais l'écrire encore ici
Nous devrions définir les membres comme statiques
Supposons maintenant que nous définissions une classe externe comme statique et supposons que nous sommes autorisés à le faire. Cela servira-t-il à quelque chose ou procurera-t-il un avantage ou créera-t-il ambiguïté et complications pour les développeurs et les créateurs de langage?
Vérifions, définir une classe externe comme statique servira les objectifs que nous avons définis ci-dessus ou non?
À partir des points précédents, nous pouvons dire que les créateurs Java n’ont pas permis à une classe externe d’être statique car il n’est pas nécessaire de la rendre statique. Permettre de rendre la classe externe statique ne fera qu'accroître les complications, l'ambiguïté et la duplicité. Lisez plus sur Pourquoi une classe Java externe ne peut pas être statique
static
peut être ajouté aux classes imbriquées d'une interface, même s'il s'agit de la valeur par défaut.
Je crois que static
ne peut pas être ajouté aux classes de niveau supérieur car au départ, il n'y avait pas de classes imbriquées et vous ne pouviez pas ajouter de statique à aucune classe.
Des classes imbriquées ultérieures ont été ajoutées et des variables statiques peuvent être ajoutées aux classes imbriquées. Toutefois, il existe une tendance à ne pas modifier la syntaxe plus que nécessaire, elle n'a donc pas été ajoutée aux classes de niveau supérieur. (car il n'y avait aucun besoin/avantage)
2.Nous devrions définir les membres comme statiques qui Devrait être commun à tous les objets de la classe . Depuis, chaque classe est déjà commune à tous ses objets et il n'est pas nécessaire de faire il statique pour devenir disponible à tous ses objets.
Eh bien, je suppose que vous ne comprenez pas bien si vous souhaitez voir un mot clé "statique" dans une classe externe.
En bref, comment allez-vous même utiliser la fonctionnalité static dans une classe externe?
public class Outer
{
public static int x = 0 ;
}
Vous allez maintenant faire Outer.x pour accéder à la variable statique. Cela impliquerait que x partage une valeur unique parmi tous les objets de Outer.
Maintenant que nous en avons fini, quelle conséquence aurait le mot-clé static dans la classe Outer? .
Nous ne pouvons pas déclarer la classe externe (niveau supérieur) comme statique car le mot clé static sert à fournir de la mémoire et à exécuter une logique sans créer d'objets. Une classe n'a pas de logique de valeur directement.
Chaque fois que nous exécutons une classe, la machine virtuelle Java instancie un objet. La machine virtuelle Java peut créer un certain nombre d'objets. Par définition, statique signifie que vous disposez du même ensemble de copies pour tous les objets. Ainsi, si la classe est statique, chaque fois que vous exécutez un programme, il crée un objet et continue de naviguer vers le même emplacement mémoire.