Classes statiques en Java

Y a-t-il quelque chose comme static class en Java?

Quelle est la signification d’une telle classe? Est-ce que toutes les méthodes de la classe statique doivent aussi être static ?

Est-ce que c’est le contraire, si une classe contient toutes les méthodes statiques, la classe doit-elle aussi être statique?

A quoi servent les classes statiques?

Java a des classes nestedes statiques, mais il semble que vous cherchiez une classe statique de haut niveau. Java n’a aucun moyen de créer une classe de niveau supérieur statique, mais vous pouvez simuler une classe statique comme ceci:

  • Déclarez votre classe final – Empêche l’extension de la classe puisque l’extension d’une classe statique n’a aucun sens
  • Rendre le constructeur private – Empêche l’instanciation par le code client car cela n’a aucun sens d’instancier une classe statique
  • Rendre tous les membres et fonctions de la classe static – Comme la classe ne peut pas être instanciée, aucune méthode d’instance ne peut être appelée ou les champs d’instance peuvent être accédés
  • Notez que le compilateur ne vous empêchera pas de déclarer un membre d’instance (non statique). Le problème apparaîtra uniquement si vous tentez d’appeler le membre d’instance

Exemple simple par suggestions ci-dessus:

 public class TestMyStaticClass { public static void main(Ssortingng []args){ MyStaticClass.setMyStaticMember(5); System.out.println("Static value: " + MyStaticClass.getMyStaticMember()); System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember()); // MyStaticClass x = new MyStaticClass(); // results in comstack time error } } // A top-level Java class mimicking static class behavior public final class MyStaticClass { private MyStaticClass () { // private constructor myStaticMember = 1; } private static int myStaticMember; public static void setMyStaticMember(int val) { myStaticMember = val; } public static int getMyStaticMember() { return myStaticMember; } public static int squareMyStaticMember() { return myStaticMember * myStaticMember; } } 

A quoi servent les classes statiques? Une bonne utilisation d’une classe statique consiste à définir des classes uniques, utilitaires et / ou de bibliothèque où l’instanciation n’aurait pas de sens. Un bon exemple est la classe Math qui contient des constantes mathématiques telles que PI et E et fournit simplement des calculs mathématiques. Exiger l’instanciation dans un tel cas serait inutile et déroutant. Voir la classe Math de Java . Notez qu’il est final et que tous ses membres sont statiques. Si Java permettait aux classes de niveau supérieur d’être déclarées statiques, la classe Math serait en effet statique.

Eh bien, Java a des “classes nestedes statiques”, mais elles ne sont pas du tout identiques aux classes statiques de C #, si c’est de là que vous veniez. Une classe nestede statique est simplement une classe qui n’a pas implicitement de référence à une instance de la classe externe.

Les classes nestedes statiques peuvent avoir des méthodes d’instance et des méthodes statiques.

Il n’y a pas de classe statique de haut niveau en Java.

Il existe une classe nestede statique, cette classe [statique nestede] n’a pas besoin d’une instance de la classe englobante pour être instanciée.

Ces classes [celles nestedes statiques] ne peuvent accéder qu’aux membres statiques de la classe englobante [car il ne fait aucune référence aux instances de la classe englobante …]

exemple de code:

 public class Test { class A { } static class B { } public static void main(Ssortingng[] args) { /*will fail - compilation error, you need an instance of Test to instantiate A*/ A a = new A(); /*will comstack successfully, not instance of Test is needed to instantiate B */ B b = new B(); } } 

Oui, il existe une classe nestede statique en Java. Lorsque vous déclarez une classe nestede statique, elle devient automatiquement une classe autonome qui peut être instanciée sans avoir à instancier la classe externe à laquelle elle appartient.

Exemple:

 public class A { public static class B { } } 

Comme la class B est déclarée statique, vous pouvez explicitement instancier comme:

 B b = new B(); 

Notez que si la class B n’a pas été déclarée statique pour la rendre autonome, un appel d’object instance aurait ressemblé à ceci:

 A a= new A(); B b = a.new B(); 

Qu’est-ce qui se passe quand un membre à l’intérieur d’une class est déclaré static ..? On peut accéder aux membres sans instancier la class . Par conséquent, rendre static la classe externe (classe de niveau supérieur) n’a pas de sens. Par conséquent, ce n’est pas autorisé.

Mais vous pouvez définir les classes internes en tant que statique (car il est membre de la classe de niveau supérieur). On peut alors accéder à cette classe sans instancier la classe de premier niveau. Prenons l’exemple suivant.

 public class A { public static class B { } } 

Maintenant, dans une classe C différente, on peut accéder à la classe B sans créer d’instance de classe A

 public class C { AB ab = new AB(); } 

static classes static peuvent aussi avoir non-static membres non-static . Seule la classe devient statique.

Mais si le mot-clé static est supprimé de la classe B , il est impossible d’y accéder directement sans créer d’instance de A

 public class C { A a = new A(); AB ab = a. new B(); } 

Mais nous ne pouvons pas avoir de membres static dans une classe interne non-static .

Voyant que c’est le meilleur résultat sur Google pour “static class java” et que la meilleure réponse n’est pas là, j’ai pensé que je l’appendais. J’interprète la question d’OP comme concernant les classes statiques en C #, connues sous le nom de singletons dans le monde Java. Pour ceux qui ne le savent pas, en C #, le mot-clé “static” peut être appliqué à une déclaration de classe, ce qui signifie que la classe résultante ne peut jamais être instanciée.

Extrait de “Effective Java – Second Edition” de Joshua Bloch (largement considéré comme l’un des meilleurs guides de style Java disponibles):

À partir de la version 1.5, il existe une troisième approche pour implémenter des singletons. Créez simplement un type enum avec un élément:

 // Enum singleton - the preferred approach public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 

Cette approche est fonctionnellement équivalente à l’approche du domaine public, sauf qu’elle est plus concise, fournit la machinerie de sérialisation gratuitement et offre une garantie absolue contre l’instanciation multiple, même en cas d’attaques sophistiquées de sérialisation ou de reflection. Bien que cette approche n’ait pas encore été largement adoptée, un type enum à un seul élément est le meilleur moyen d’implémenter un singleton. (accentuation de l’auteur)

Bloch, Joshua (2008-05-08). Java efficace (Java Series) (p. 18). Pearson Education.

Je pense que la mise en œuvre et la justification sont assez explicites.

Une classe peut-elle être statique en Java?

La réponse est OUI , nous pouvons avoir une classe statique en Java. En Java, nous avons des variables d’instance statiques, ainsi que des méthodes statiques et des blocs statiques . Les classes peuvent également être rendues statiques en Java.

Dans java, nous ne pouvons pas rendre statique la classe de niveau supérieur (externe). Seules les classes nestedes peuvent être statiques.

classe nestede statique vs classe nestede non statique

1) La classe statique nestede n’a pas besoin de référence de classe externe, mais la classe nestede non statique ou la classe interne nécessitent une référence de classe externe.

2) La classe interne (ou classe nestede non statique) peut accéder aux membres statiques et non statiques de la classe externe. Une classe statique ne peut pas accéder aux membres non statiques de la classe Outer. Il ne peut accéder qu’aux membres statiques de la classe Outer.

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Les classes externes ne peuvent pas être statiques, mais les classes nestedes / internes peuvent l’être. Cela vous aide essentiellement à utiliser la classe nestede / interne sans créer d’instance de la classe externe.

Java a des méthodes statiques associées aux classes (par exemple, java.lang.Math n’a que des méthodes statiques), mais la classe elle-même n’est pas statique.