web-dev-qa-db-fra.com

Pourquoi une classe de niveau supérieur ne peut-elle pas être statique en Java?

Impossible de trouver une réponse satisfaisante n'importe où.

36
ngesh

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.

66
Barend

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

  1. Devrait être commun à tous les objets de la classe.
  2. Devrait appartenir à la classe et accessible par nom de classe.
  3. Ne devrait pas avoir besoin d'un objet de classe pour y accéder.

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?

  1. Chaque classe est déjà commune à tous ses objets et il n'est pas nécessaire de la rendre statique pour devenir disponible pour tous ses objets.
  2. Nous avons besoin d'un nom de classe pour accéder à ses membres statiques, car ces membres font partie de la classe, tandis qu'une classe externe fait partie du package. Nous pouvons également accéder directement à la classe en écrivant simplement package_name.class_name (similaire à class_name.static_field_name). pas besoin de faire ce qui est déjà là par défaut.
  3. Nous n'avons besoin d'aucun objet pour accéder à une classe si elle est visible, nous pouvons simplement écrire package_name.class_name pour y accéder. Et par définition, une classe est un modèle pour ses objets et nous créons une classe pour créer des objets à partir de celle-ci (une exception sera toujours présente, par exemple Java.lang.Math), là encore, il n’est pas nécessaire de définir une classe externe comme statique.

À 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

3
Naresh Joshi

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
Peter Lawrey
  1. Chaque fois que nous exécutons une classe, la machine virtuelle Java crée un objet. Tous les objets statiques sont créés dans la mémoire statique et non dans la mémoire de tas. Cela signifie que nous avons le même ensemble de copies pour tous les objets. Donc, si la classe supérieure est statique et que vous exécutez le pgm, il crée un objet statique et conserve le contrôle de Sur la même mémoire statique. ce qui est faux. 

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. 

0
Anurag Prasad

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

0

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.

0
user6674097

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.

0
salsinga