Pourquoi n'êtes-vous pas en mesure de déclarer une classe statique en Java?


Pourquoi n'êtes-vous pas en mesure de déclarer une classe statique en Java?

Author: minarmahmud, 2010-08-27

14 answers

Seules les classes imbriquées peuvent être statiques. Ce faisant, vous pouvez utiliser la classe imbriquée sans avoir d'instance de la classe externe.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Sources :

Sur le même sujet :

 461
Author: Colin Hebert, 2017-05-23 10:31:22

Donc, j'arrive en retard à la fête, mais voici mes deux cents - ajoutant philosophiquement à la réponse de Colin Hebert.

À un niveau élevé, votre question traite de la différence entre les objets et les types. Bien qu'il y ait beaucoup de voitures (objets), il n'y a qu'une seule classe de voiture (type). Déclarer quelque chose comme statique signifie que vous opérez dans l'espace "type". Il n'y en a qu'une. Le mot-clé de classe de niveau supérieur définit déjà un type dans l'espace" type". En conséquence " voiture de classe statique publique" est redondante.

 31
Author: Eric Jankowski, 2013-06-27 21:18:18

Les classes de niveau supérieur sont statiques par défaut. Les classes internes sont non statiques par défaut. Vous pouvez modifier la valeur par défaut pour les classes internes explicitement marquage statiques. Les classes de niveau supérieur, en raison de leur niveau supérieur, ne peuvent pas avoir de sémantique non statique car il ne peut y avoir de classe parente à laquelle se référer. Par conséquent, il n'y a aucun moyen de modifier la valeur par défaut pour les classes de niveau supérieur.

 30
Author: necromancer, 2013-08-18 21:12:12

La classe avec le constructeur privé est statique.

Déclarez votre classe comme ceci:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

Et vous pouvez utiliser sans initialisation:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...
 29
Author: Sergey Vakulenko, 2012-05-31 16:55:49

Bien sûr qu'ils le peuvent, mais seulementinner classes imbriquées. Là, cela signifie que les instances de la classe imbriquée ne nécessitent pas d'instance englobante de la classe externe.

Mais pour les classes de haut niveau, les concepteurs de langage ne pouvaient rien penser d'utile à faire avec le mot-clé, donc ce n'est pas autorisé.

 12
Author: Michael Borgwardt, 2010-08-27 14:42:55

Vous pouvez créer une classe utilitaire (qui ne peut pas avoir d'instances créées) en déclarant un type enum sans instances. c'est-à-dire que vous déclarez spécifiquement qu'il n'y a pas d'instances.

public enum MyUtilities {;
   public static void myMethod();
}
 12
Author: Peter Lawrey, 2010-08-27 22:13:30
public class Outer {
   public static class Inner {}
}

... il peut être déclaré statique - tant qu'il s'agit d'une classe membre.

Du JLS:

Les classes membres peuvent être statiques, auquel cas elles n'ont pas accès aux variables d'instance de la classe environnante; ou elles peuvent être des classes internes (§8.1.3).

Et ici:

Le mot-clé static peut modifier la déclaration d'un membre de type C dans le corps d'une classe non interne T. Son effet est de déclarer que C n'est pas une classe interne. Tout comme une méthode statique de T n'a pas d'instance actuelle de T dans son corps, C n'a pas non plus d'instance actuelle de T, ni d'instances lexicalement englobantes.

Un mot-clé statique n'aurait aucun sens pour une classe de niveau supérieur, simplement parce qu'une classe de niveau supérieur n'a pas de type englobant.

 8
Author: Andreas_D, 2010-08-27 12:42:31

Comme expliqué ci-dessus, une Classe ne peut pas être statique à moins qu'elle ne soit membre d'une autre Classe.

Si vous cherchez à concevoir une classe "dont il ne peut pas y avoir plusieurs instances", vous voudrez peut-être examiner le modèle de conception "Singleton".

Informations Singleton débutant ici.

Mise en garde:

Si vous envisagez d'utiliser le modèle singleton, résister avec tous votre peut. Il est l'un des plus faciles DesignPatterns à comprendre, probablement la plupart des populaire, et certainement le la plupart des abus. (source: JavaRanch comme lié ci-dessus)

 5
Author: S.Jones, 2010-08-27 12:57:34

En plus de la façon dont Java définit les classes internes statiques, il existe une autre définition des classes statiques selon le monde C# [1]. Une classe statique est une classe qui n'a que des méthodes statiques (fonctions) et qui est destinée à prendre en charge la programmation procédurale. De telles classes ne sont pas vraiment des classes en ce sens que l'utilisateur de la classe ne s'intéresse qu'aux fonctions d'assistance et non à la création d'instances de la classe. Bien que les classes statiques soient prises en charge en C#, aucune prise en charge directe de ce type n'existe en Java. Vous pouvez cependant, utilisez enums pour imiter les classes statiques C# en Java afin qu'un utilisateur ne puisse jamais créer d'instances d'une classe donnée (même en utilisant la réflexion) [2]:

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}
 4
Author: shams, 2013-05-13 21:36:09

Les seules classes qui peuvent être statiques sont les classes internes. Le code suivant fonctionne très bien:

public class whatever {
    static class innerclass {
    }
}

Le point des classes internes statiques est qu'elles n'ont pas de référence à l'objet de classe externe.

 2
Author: user2645256, 2013-08-02 09:01:37

Tout ce que nous codons en java va dans une classe. Chaque fois que nous exécutons une classe, JVM instancie un objet. JVM peut créer un certain nombre d'objets, par définition Statique signifie que vous avez le même ensemble de copie sur tous les objets.

Donc, si Java aurait permis à la classe supérieure d'être statique chaque fois que vous exécutez un programme, il crée un objet et continue à remplacer sur le même emplacement de mémoire.

Si vous remplacez simplement l'objet chaque fois que vous l'exécutez quel est le point de créer il?

C'est donc la raison pour laquelle Java s'est débarrassé de la statique pour la classe de niveau supérieur.

Il pourrait y avoir des raisons plus concrètes, mais cela avait beaucoup de sens logique pour moi.

 2
Author: user2626445, 2018-07-26 19:45:17

Je pense que c'est aussi simple que de boire un verre de café!. Il suffit de prendre un coup d'oeil à ce. Nous n'utilisons pas explicitement le mot-clé statique lors de la définition de la classe.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

N'est-ce pas une définition de classe statique? Nous utilisons simplement une fonction liée à une classe. Veillez à ce que dans ce cas, nous puissions utiliser une autre classe dans cet imbriqué. Regardez ceci:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}
 1
Author: Erfankam, 2012-05-17 14:51:53

On peut regarder PlatformUI dans Eclipse pour une classe avec des méthodes statiques et un constructeur privé avec lui-même étant final.

public final class <class name>
{
   //static constants
   //static memebers
}
 1
Author: user175881, 2012-11-28 07:12:57

Si l'avantage d'utiliser une classe statique n'était pas d'instancier un objet et d'utiliser une méthode, il suffit de déclarer la classe comme publique et cette méthode comme statique.

 0
Author: eeadev, 2013-01-31 10:52:41