Question Classes statiques en Java


Y at-il quelque chose comme static class en Java?

Quelle est la signification d'une telle classe. Toutes les méthodes de la classe statique doivent-elles être static aussi?

Est-ce que l'inverse est nécessaire, si une classe contient toutes les méthodes statiques, la classe sera-t-elle statique aussi?

A quoi servent les classes statiques?


764
2017-09-20 13:32


origine


Réponses:


Java a statique imbriqué mais il semble que vous cherchiez une classe statique de haut niveau. 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
  • Faire le constructeur private - Empêche l'instanciation par le code client car cela n'a aucun sens d'instancier une classe statique
  • Faire tout 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 ou des 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 ne s'affichera que si vous tentez d'appeler le membre de l'instance

Exemple simple par suggestion d'en haut:

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? Une bonne utilisation d'une classe statique consiste à définir des classes uniques, utilitaires et / ou de 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 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.


710
2017-09-20 13:39



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 venez. Une classe imbriquée statique est juste une qui n'a pas implicitement une 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'y a pas de classe statique de haut niveau en Java.


278
2017-09-20 13:35



Il y a un statique classe 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 [imbriquées statiques] peuvent accéder uniquement aux membres statiques de la classe englobante [puisqu'elle n'a aucune référence aux instances de la classe englobante ...]

échantillon 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(); 
  }
}

125
2017-09-20 13:35



Oui, il existe une classe imbriquée statique dans 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
 {
 }
}

Car class B est déclaré statique, vous pouvez instancier explicitement:

B b = new B();

Notez 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();

83
2017-09-20 13:39



Qu'est-ce qui se passe quand un membre à l'intérieur d'un class est déclaré comme static..? Que les membres peuvent être consultés sans instancier le class. Donc faire classe externe (classe de haut niveau) static n'a aucun sens. Par conséquent, ce n'est pas autorisé.

Mais vous pouvez définir les classes internes comme statiques (comme 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érez l'exemple suivant.

public class A {
    public static class B {

    }
}

Maintenant, dans une classe différente C, classe B peut être consulté sans faire une instance de classe A.

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

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

Mais si le static mot-clé est supprimé de la classe B, il ne peut pas être accédé directement sans faire une instance de A.

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

Mais nous ne pouvons pas avoir static membres à l'intérieur d'un non-static classe interne.


28
2017-12-18 06:05



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 variables d'instance statiques aussi bien que méthodes statiques et aussi bloc statique. Les classes peuvent également être rendues statiques en Java.

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

Classe imbriquée statique par rapport à une classe imbriquée non statique

1) La 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 requiert la classe externe     référence.

2) La classe interne (ou la classe imbriquée non statique) peut accéder à la fois statique     et les membres non statiques de la classe Outer. Une classe statique ne peut pas accéder     membres non statiques de la classe Outer. Il ne peut accéder qu'aux données statiques     membres de la classe Outer.

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


11
2017-10-10 09:19



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 #, 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):

Depuis la version 1.5, il existe une troisième approche pour implémenter des singletons. Faites 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 de terrain public, sauf qu'elle est plus concise, fournit la machine de sérialisation gratuitement, et fournit une garantie absolue contre l'instanciation multiple, même face à des attaques sophistiquées de sérialisation ou de réflexion. Si cette approche n'a pas encore été largement adoptée, un Le type enum mono-élément est le meilleur moyen d'implémenter un singleton. (auteur de l'emphase)

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

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


10
2018-02-24 02:37



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


9
2017-09-20 13:36



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


1
2017-09-20 13:35