55 votes

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

Je n'ai trouvé de réponse satisfaisante nulle part.

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 ?

79voto

Barend Points 8232

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.

9voto

kaya3 Points 17037

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" :

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.

2voto

Peter Lawrey Points 229686

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)

0voto

salsinga Points 1693

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.

0 votes

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

0voto

Rahul Narang Points 23

La définition d'une classe externe comme statique servira-t-elle à d'autres fins qu'une classe non statique ?

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

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

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