Classes Statiques En Java


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

Quelle est la signification d'une telle classe. Faire toutes les méthodes de la classe statique doivent être static trop?

Est-elle nécessaire à l'inverse, que si une classe contient toutes les méthodes statiques de la classe statique trop?

À quoi servent les classes statiques?

Author: Mark, 2011-09-20

9 answers

Java a des classes statiques imbriquées mais il semble que vous recherchiez une classe statique de niveau supérieur. Java n'a aucun moyen de rendre statique une classe de niveau supérieur mais vous pouvez simuler une classe statique comme ceci:

  • Déclarer votre classe final - Empêche l'extension de la classe depuis l'extension d'une classe statique n'a pas de sens
  • Make the constructor private - Empêche l'instanciation par le code client car cela n'a aucun sens d'instancier une classe statique
  • Faire tous les le membres et fonctions de la classe static - Puisque la classe ne peut pas être instanciée, aucune méthode d'instance ne peut être appelée ni aucun champ d'instance accessible
  • 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 selon les 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;
    }
}

À quoi servent les classes statiques?{[15] } Une bonne utilisation d'une classe statique consiste à définir une classe unique, classes d'utilité et / ou de bibliothèque où l'instanciation n'aurait pas de sens. Un bon exemple est la classe de mathématiques 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 de mathématiques de Java. Notez qu'il est définitif 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ématique serait en effet statique.

 728
Author: Paul Sasik, 2015-03-06 16:38:12

Eh bien, Java a des "classes imbriquées statiques", mais elles ne sont pas du tout les mêmes que les classes statiques de C#, si c'est de là que vous veniez. Une classe imbriquée statique est juste une qui n'a 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 niveau supérieur en Java.

 283
Author: Jon Skeet, 2011-09-20 13:35:24

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

Ces classes [statiques imbriquées] ne peuvent accéder qu'aux membres statiques de la classe englobante [car 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(); 
  }
}
 128
Author: amit, 2016-10-14 19:30:42

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 qui peut être instanciée sans avoir à instancier la classe externe à laquelle elle appartient.

Exemple:

public class A
{

 public static class B
 {
 }
}

Parce que class B est déclaré statique, vous pouvez instancier explicitement comme:

B b = new B();

Remarque 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();
 85
Author: Bitmap, 2015-01-18 21:33:12

Que se passe-t-il lorsqu'un membre à l'intérieur d'un class est déclaré comme static..? Que les membres sont accessibles sans instancier le class. Par conséquent, faire une classe externe (classe de niveau supérieur) static n'a aucune signification. Par conséquent, il n'est pas permis.

Mais vous pouvez définir les classes internes comme statiques (car c'est un membre de la classe de niveau supérieur). Ensuite, cette classe peut être accédée sans instancier la classe de niveau supérieur. Considérons l'exemple suivant.

public class A {
    public static class B {

    }
}

Maintenant, dans une classe différente C, la classe B est accessible sans créer d'instance de la classe A.

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

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

Mais si le mot-clé static est supprimé de la classe B, il n'est pas accessible 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 de membres static dans une classe interne non-static.

 28
Author: Ramesh-X, 2015-12-18 06:05:18

Vu 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'ajouterais. J'interprète la question d'OP comme concernant les classes statiques en C#, qui sont connues sous le nom de singletons dans le monde Java. Pour ceux qui ne l'ignorent 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" par Joshua Bloch (largement considéré comme l'un des les meilleurs guides de style Java disponibles):

À partir de la version 1.5, il existe une troisième approche pour implémenter les 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, sauf qu'elle est plus concise, fournit la machine de sérialisation gratuitement et fournit une garantie sans faille contre l'instanciation multiple , même face à des attaques sophistiquées de sérialisation ou de réflexion. Tout ce l'approche n'a pas encore été largement adoptée, un type d'énumération à un seul élément est le meilleur moyen d'implémenter un singleton. (emphase de l'auteur)

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

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

 11
Author: Bennet Huber, 2015-03-13 18:34:01

Une classe peut-elle être statique en Java ?

La réponse est OUI, nous pouvons avoir la classe statique en java. En java, nous avons statique des variables d'instance ainsi que méthodes statiques et aussi static bloc. Les classes peuvent également être rendues statiques en Java.

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

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

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

2) La classe interne (ou la classe imbriquée non statique) peut accéder aux deux statiques et les membres non statiques de la classe externe. Une classe statique ne peut pas accéder membres non statiques de la classe externe. Il peut accéder uniquement statique membres de la classe extérieure.

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

 11
Author: roottraveller, 2016-10-10 09:19:45

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

 9
Author: Saket, 2011-09-20 13:36:26

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

 1
Author: duffymo, 2011-09-20 13:35:48