Pourquoi n'êtes-vous pas en mesure de déclarer une classe comme statique en Java?
java
static-class
Mariselvam
la source
la source
static
?static
classes carabstract final
, par exemple, elles ne peuvent pas être instanciées et ne peuvent pas être étendues. Cela signifie qu'ils ne peuvent contenir que des membres statiques, ce qui est utile pour les classes qui ne contiennent que des méthodes d'assistance.Réponses:
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.
Sources :
Sur le même sujet:
la source
Les classes de niveau supérieur sont statiques par défaut. Les classes internes ne sont pas statiques par défaut. Vous pouvez modifier la valeur par défaut des classes internes en les marquant explicitement comme 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 parent à laquelle se référer. Par conséquent, il n'existe aucun moyen de modifier la valeur par défaut pour les classes de niveau supérieur.
la source
static
mot - clé d'une classe de niveau supérieur de dénoter et d'appliquer qu'il ne peut contenir que des membres statiques et ne pas être instanciés; cela pourrait cependant avoir dérouté les gens comme celastatic
a une signification différente pour les classes imbriquées.Donc, je viens en retard à la fête, mais voici mes deux cents - ajoutant philosophiquement à la réponse de Colin Hebert.
À un niveau élevé, votre question porte sur la différence entre les objets et les types. Bien qu'il existe de nombreuses voitures (objets), il n'y a qu'une seule classe de voitures (type). Déclarer quelque chose comme statique signifie que vous travaillez 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". Par conséquent, la «voiture de classe statique publique» est redondante.
la source
La classe avec constructeur privé est statique.
Déclarez votre classe comme ceci:
et vous pouvez utiliser sans initialisation:
la source
static class
déclaration en C #), le compilateur ne permettra même pas au code de déclarer des variables de ce type, ni de l'utiliser comme paramètre de type générique. Un simple manque de constructeurs accessibles dans une classe qui pourraient autrement être soit instanciés soit hérités n'empêcherait pas la déclaration de variables de ce type, ni son utilisation comme paramètre de type générique.Bien sûr qu'ils le peuvent, mais uniquement les classes imbriquées
internes. 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 penser à rien d'utile à faire avec le mot-clé, donc ce n'est pas autorisé.
la source
static
, il serait parfois logique de pouvoir le faire. Par exemple, une classe contenant uniquement des méthodes d'assistance statiques n'a aucun sens pour être instanciée, mais le langage Java ne vous empêche pas de le faire. Vous pouvez rendre la classe non instanciable (et pratiquement «statique») à d'autres classes en déclarant le constructeur par défautprivate
, ce qui interdit l'instanciation car aucun constructeur n'est visible.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.
la source
... il peut être déclaré statique - tant qu'il s'agit d'une classe membre.
Du JLS:
et ici:
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.
la source
Inner
?Nested
aurait été un choix moins déroutant.Comme expliqué ci-dessus, une classe ne peut être statique que si elle est 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".
Débutant Singleton info ici .
Caveat:
la source
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 (fonctions) statiques et qui est destinée à prendre en charge la programmation procédurale. De telles classes ne sont pas vraiment des classes dans la mesure où 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 n'existe en Java. Vous pouvez cependant utiliser des énumérations 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] :
la source
Tout ce que nous codons en java va dans une classe. Chaque fois que nous exécutons une classe, la JVM instancie un objet. JVM peut créer un certain nombre d'objets, par définition statique signifie que vous avez le même jeu de copie pour tous les objets.
Ainsi, 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 de remplacer le même emplacement mémoire.
Si vous remplacez simplement l'objet à chaque fois que vous l'exécutez, quel est l'intérêt de le créer?
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.
la source
Les seules classes qui peuvent être statiques sont les classes internes. Le code suivant fonctionne très bien:
Le point des classes internes statiques est qu'elles n'ont pas de référence à l'objet de classe externe.
la source
Je pense que c'est aussi simple que de boire un verre de café!. Jetez un coup d'oeil à cela. Nous n'utilisons pas explicitement de mot clé statique lors de la définition de classe.
N'est-ce pas une définition de la classe statique? Nous utilisons simplement une fonction liée à une seule classe. Attention, dans ce cas, nous pouvons utiliser une autre classe dans celle imbriquée. Regarde ça:
la source
new StaticClass()
et cela n'a pas vraiment de sens. Avec un constructeur privé, il n'en autoriserait pas les instances.On peut regarder
PlatformUI
dans Eclipse pour une classe avec des méthodes statiques et un constructeur privé lui-même étant final.la source
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.
la source