web-dev-qa-db-fra.com

Classes statiques dans Java

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

Quel est le sens d'une telle classe. Est-ce que toutes les méthodes de la classe statique doivent aussi être static?

Faut-il au contraire que si une classe contient toutes les méthodes statiques, elle soit également statique?

A quoi servent les classes statiques?

888
Kraken

Java possède des classes statiques imbriquées , mais il semble que vous recherchiez une classe statique de niveau supérieur. Java n'a aucun moyen de créer une classe statique de niveau supérieur, mais vous pouvez simuler une classe statique comme celle-ci:

  • Déclarez votre classe final - Empêche l'extension de la classe car étendre une classe statique n'a aucun sens
  • Assurez le constructeur private - Empêche l'instanciation par le code client car il n'y a aucun sens d'instancier une classe statique
  • Marque all les membres et les fonctions de la classe static - Comme la classe ne peut pas être instanciée, aucune méthode d'instance ne peut être appelée ni aucun champ d'instance accédé
  • Notez que le compilateur ne vous empêchera pas de déclarer un membre d'instance (non statique). Le problème n'apparaîtra que si vous essayez d'appeler le membre de l'instance.

Exemple simple par suggestions ci-dessus:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile 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, des utilitaires et/ou des bibliothèques où l'instanciation n'aurait aucun 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 une instanciation dans un tel cas serait inutile et déroutant. Voir les Math classe et code source . Notez qu'il s'agit de final et que tous ses membres sont static. Si Java permettait aux classes de niveau supérieur d'être déclarées static, la classe Math serait en effet statique.

808
Paul Sasik

Bien, Java a "des classes imbriquées statiques", mais elles ne sont pas du tout identiques aux classes statiques de C #, si c'est de là que vous veniez. Une classe imbriquée statique est une classe qui ne comporte pas implicitement de référence à une instance de la classe externe.

Les classes imbriquées statiques peuvent avoir des méthodes d'instance et des méthodes statiques.

Il n’existe pas de classe statique de premier niveau en Java.

305
Jon Skeet

Il existe une classe statique classe imbriquée , cette classe [statique imbriquée] ne nécessite pas d'instance de la classe englobante pour être instanciée elle-même.

Ces classes [celles imbriquées statiques] peuvent uniquement accéder aux membres statiques de la classe englobante [puisqu'elle n'a 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(String[] args) { 
    /*will fail - compilation error, you need an instance of Test to instantiate A*/
    A a = new A(); 
    /*will compile successfully, not instance of Test is needed to instantiate B */
    B b = new B(); 
  }
}
144
amit

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

Exemple:

public class A
{

 public static class B
 {
 }
}

Puisque class B est déclaré statique, vous pouvez explicitement instancier comme suit:

B b = new B();

Notez que si class B n'a pas été déclaré statique pour le rendre autonome, un appel d'objet d'instance aurait ressemblé à ceci:

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

Que se passe-t-il lorsqu'un membre à l'intérieur d'une class est déclaré comme static ..? On peut accéder aux membres sans instancier la class. Par conséquent, créer une classe externe (classe de niveau supérieur) static n'a aucune signification. Par conséquent, ce n'est pas autorisé.

Mais vous pouvez définir les classes internes comme statiques (en tant que membre de la classe de niveau supérieur). Il est ensuite possible d'accéder à cette classe sans instancier la classe de niveau supérieur. Prenons l'exemple suivant.

public class A {
    public static class B {

    }
}

Maintenant, dans une autre classe C, vous pouvez accéder à la classe B sans créer d'instance de classe A.

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

Les classes static peuvent également avoir des membres non-static. Seule la classe devient statique.

Toutefois, si le mot clé static est supprimé de la classe B, vous ne pourrez y accéder directement sans créer une instance de A.

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

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

32
Ramesh-X

Une classe peut-elle être statique dans 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 aussi des blocs statiques . Les classes peuvent également être rendues statiques en Java.

En Java, nous ne pouvons pas rendre statique la classe de niveau supérieur (externe). Seules les classes imbriquées peuvent être statiques.

classe imbriquée statique vs classe imbriquée non statique

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

2) La classe interne (ou la classe imbriquée 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.

voir ici: https://docs.Oracle.com/javase/tutorial/Java/javaOO/nested.html

12
roottraveller

Comme il s’agit du meilleur résultat sur Google pour "classe statique Java" et que la meilleure réponse n’est pas là, j’ai pensé que je l’ajouterais. J'interprète la question d'OP concernant les classes statiques en C #, appelées 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 - Deuxième édition" de Joshua Bloch (largement considéré comme l'un des meilleurs guides de style Java disponibles):

A 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 champ public, à la différence qu’elle est plus concise, fournit le mécanisme de sérialisation gratuitement et offre une garantie absolue contre toute instanciation, même face à des attaques de sérialisation ou de réflexion sophistiquées. Bien que cette approche n’ait pas encore été adoptée à grande échelle, un type le type enum à élément unique est le meilleur moyen de mettre en œuvre un singleton. (auteur de l’accent)

Bloch, Joshua (2008-05-08). Effective Java (série Java) (p. 18). Pearson Education.

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

12
Bennet Huber

Les classes externes ne peuvent pas être statiques, mais les classes imbriquées/internes peuvent l'être. Cela vous aide fondamentalement à utiliser la classe imbriquée/interne sans créer d'instance de la classe externe.

8
Saket

En termes simples, Java prend en charge la déclaration d'une classe comme étant statique uniquement pour les classes internes, mais pas pour les classes de niveau supérieur.

classes de niveau supérieur: Un projet Java peut contenir plusieurs classes de niveau supérieur dans chaque Java fichier source, une des classes étant nommée d'après le nom du fichier. Il n'y a que trois options ou mots-clés autorisés devant les classes du niveau supérieur, public, abstrait et final .

Classes internes: Les classes situées à l'intérieur d'une classe de niveau supérieur sont appelées classes internes, ce qui est fondamentalement le concept de classes imbriquées. . Les classes internes peuvent être statiques. L'idée de rendre les classes internes statiques consiste à tirer parti de l'instanciation des objets des classes internes sans instancier l'objet de la classe de niveau supérieur. C'est exactement comme si les méthodes et les variables statiques travaillaient à l'intérieur d'une classe de niveau supérieur.

D'où Java prend en charge les classes statiques au niveau de la classe interne (dans les classes imbriquées)

Et Java ne prend pas en charge les classes statiques dans les classes de niveau supérieur.

J'espère que cela donne une solution plus simple à la question pour une compréhension de base des classes statiques en Java.

2
saichand

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.

0
duffymo