Pourquoi n'êtes-vous pas en mesure de déclarer une classe statique en Java?
Réponses
Trop de publicités?Seulement les classes imbriquées peuvent être statiques. Ce faisant, vous pouvez utiliser la classe imbriquée sans disposer d'une instance de l'extérieur de la classe.
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 :
Haut niveau les classes sont statiques par défaut. Les classes internes sont non-statique par défaut. Vous pouvez modifier la valeur par défaut pour les classes internes explicitement marquage statiques. Haut niveau des classes, par la vertu d'être de haut niveau, ne peut pas avoir de non-sémantique statique, car il peut y avoir aucun parent de la classe de référence. Par conséquent, il n'y a aucun moyen de changer la valeur par défaut pour les classes de niveau supérieur.
Donc, je suis arrivé en retard à la fête, mais voici mes deux cents - point de vue philosophique, l'ajout de Colin Hebert réponse.
À un niveau élevé, votre question concerne la différence entre les objets et les types. Bien qu'il existe beaucoup de voitures (des objets), il est seulement une Voiture de classe (type). Déclarer que quelque chose comme statique signifie que vous êtes d'exploitation dans le "type" de l'espace. Il n'y en a qu'une. Le haut-niveau de la classe de mot-clé définit déjà un type dans le "type" de l'espace. Comme un résultat "public static de la classe de Voiture" est redondante.
Classe avec un 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 utilisé sans initialisation:
if (value == eOAuth.ECodeOauthInvalidGrant)
eOAuth.GetSomeStuff();
...
Assurez-vous qu'ils peuvent, mais seulement intérieure classes imbriquées. Il y a, cela signifie que les instances de la classe imbriquée ne nécessitent pas une instance englobante de l'extérieur de la classe.
Mais pour les classes de niveau supérieur, la langue concepteurs ne pouvais pas penser à quelque chose d'utile à faire avec le mot-clé, de sorte qu'il n'est pas permis.