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

StackOverflow https://stackoverflow.com/questions/3584113

  •  01-10-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

Seules les classes imbriquées peuvent être statiques. En ce faisant, vous pouvez utiliser la classe imbriquée sans avoir une 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:

Autres conseils

Top classes de niveau sont statiques par défaut. Les classes internes ne sont pas statiques par défaut. Vous pouvez changer la valeur par défaut pour les classes internes en marquant explicitement les statiques. Top classes de niveau, en vertu d'être de haut niveau, ne peuvent pas avoir une sémantique non-statique, car il n'y a pas de classe parent pour désigner. Par conséquent, il n'y a aucun moyen de changer la valeur par défaut pour les classes de haut niveau.

Alors, je suis arrivé en retard à la fête, mais voici mes deux cents -. Ajoutant philosophiquement à la réponse de Colin Hebert

A un haut niveau de votre question a trait à la différence entre les objets et types. Bien qu'il ya beaucoup de voitures (objets), il n'y a qu'une seule classe de voiture (type). Déclarant quelque chose comme des moyens statiques que vous exploitez dans l'espace « type ». Il n'y a qu'un seul. Le mot-clé de classe de niveau supérieur définit déjà un type dans l'espace « type ». En conséquence "public static class Car" est redondant.

classe avec 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();
...

Bien sûr, ils peuvent, mais seulement interne classes imbriquées. Là-bas, cela signifie que les instances de la classe imbriquée ne nécessitent pas une instance englobante de la classe externe.

Mais pour les classes de niveau supérieur, les concepteurs de langage ne pouvait penser à quelque chose utile à faire avec le mot-clé, il est donc pas permis.

Vous pouvez créer une classe utilitaire (qui ne peut pas avoir des instances créées) en déclarant un type ENUM sans cas. dire que vous déclarez specificly qu'il n'y a pas de cas.

public enum MyUtilities {;
   public static void myMethod();
}
public class Outer {
   public static class Inner {}
}

... elle peut être déclarée statique -. Tant qu'il est une classe de membre

De la JLS:

  

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

et ici:

  

Le mot-clé statique peut modifier la déclaration d'un type de membre C dans le corps d'une classe non intérieure T. Son effet est de déclarer que C est pas une classe interne. Tout comme statique procédé de T n'a pas d'instance en cours de T dans son corps, C n'a pas non plus instance en cours de T, et ne possède aucun cas renfermant lexicalement.

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

Comme expliqué ci-dessus, une classe ne peut pas être statique à moins qu'il est membre d'une autre classe.

Si vous cherchez à concevoir une classe « dont il ne peut y avoir plusieurs instances », vous pouvez regarder dans le modèle de conception « Singleton ».

Infos Beginner Singleton .

Caveat:

  Si vous envisagez d'utiliser

  singleton, résister de toutes   votre force. Il est l'un des plus faciles   DesignPatterns à comprendre, probablement   le plus populaire, et sans aucun doute le   les plus maltraités.    (source: JavaRanch comme lié ci-dessus)

En plus de la façon dont Java définit les classes internes statiques, il existe une autre définition des classes statiques comme par le monde C # [1] . Une classe statique est celui qui n'a que des méthodes statiques (fonctions) et il est destiné à soutenir la programmation procédurale. Ces classes ne sont pas vraiment des classes en ce que l'utilisateur de la classe est seulement intéressé par les fonctions d'aide et non pas dans la création d'instances de la classe. Alors que les cours statiques sont pris en charge en C #, aucun soutien direct existe en Java. Vous pouvez toutefois utiliser les énumérations pour mimer C # classes statiques en Java de sorte qu'un utilisateur ne peut jamais créer des 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();
    }
}

Tout code que nous en java va dans une classe. Chaque fois que nous courons une classe JVM instancier un objet. JVM peut créer un certain nombre d'objets, par définition signifie que vous avez statique le même ensemble de copie à tous les objets.

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

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

qui est la raison pour laquelle Java se débarrasse de la statique pour le haut niveau de classe.

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

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

public class whatever {
    static class innerclass {
    }
}

Le point de classes internes statiques est qu'ils ne sont pas une référence à l'objet de la classe externe.

Je pense que cela est possible que boire facilement un verre de café !. Jetez un coup d'oeil à cela. Nous n'utilisons mot-clé statique en définissant explicitement 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);
    }
}

est-ce pas une définition de classe statique? Nous utilisons seulement une fonction binded juste une classe. Veillez à ce que dans ce cas, nous pouvons utiliser une autre classe dans cette imbriquée. 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);
    }
}

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

public final class <class name>
{
   //static constants
   //static memebers
}

si l'avantage d'utiliser une classe statique était de ne pas instancier un objet et en utilisant une méthode puis juste déclarer la classe comme public et cette méthode statique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top