Si une variable est déclarée comme public static varName;
, alors je peux y accéder de n'importe où comme ClassName.varName
. Je suis également conscient que les membres statiques sont partagés par toutes les instances d'une classe et ne sont pas réaffectés dans chaque instance.
La déclaration d'une variable private static varName;
est-elle différente de la déclaration d'une variable private varName;
?
Dans les deux cas, il n'est pas accessible en tant que ClassName.varName
ou à ClassInstance.varName
partir d'une autre classe.
Est-ce que déclarer la variable comme statique lui donne d'autres propriétés spéciales?
Réponses:
Bien sûr, il est accessible en tant que
ClassName.var_name
, mais uniquement de l'intérieur de la classe dans laquelle il est défini - c'est parce qu'il est défini commeprivate
.public static
ou lesprivate static
variables sont souvent utilisées pour les constantes. Par exemple, de nombreuses personnes n'aiment pas «coder en dur» des constantes dans leur code; ils aiment faire unpublic static
ouprivate static
variable avec un nom significatif et l'utiliser dans leur code, ce qui devrait rendre le code plus lisible. (Vous devez également créer de telles constantesfinal
).Par exemple:
Que vous le fassiez
public
ouprivate
que vous souhaitiez que les variables soient visibles en dehors de la classe ou non.la source
ClassName.var_nam
? Où je peux y accéder directement:var_nam
en classeLes variables statiques ont une valeur unique pour toutes les instances d'une classe.
Si vous deviez faire quelque chose comme:
et puis tu as voulu changer de nom, c'est bien, mon nom reste le même. Si, cependant, vous vouliez le changer pour avoir 17 yeux, alors tout le monde dans le monde aurait également 17 yeux.
la source
Les variables statiques privées sont utiles de la même manière que les variables d'instance privées sont utiles: elles stockent l'état auquel on accède uniquement par du code dans la même classe. L'accessibilité (privé / public / etc.) et la nature d'instance / statique de la variable sont des concepts entièrement orthogonaux.
J'éviterais de penser que les variables statiques sont partagées entre «toutes les instances» de la classe - cela suggère qu'il doit y avoir au moins une instance pour que l'état soit présent. Non - une variable statique est associée au type lui-même au lieu de toutes les instances du type.
Ainsi, chaque fois que vous voulez un état associé au type plutôt qu'à une instance particulière, et que vous voulez garder cet état privé (peut-être en autorisant un accès contrôlé via des propriétés, par exemple), il est logique d'avoir une variable statique privée.
En passant, je recommanderais fortement que les seuls types de variables que vous rendez publiques (ou même non privées) soient des constantes - des variables finales statiques de types immuables. Tout le reste doit être privé pour séparer l'API et l'implémentation (entre autres).
la source
Eh bien, vous avez raison Les variables statiques publiques sont utilisées sans créer d'instance de la classe, mais les variables statiques privées ne le sont pas. La principale différence entre eux et où j'utilise les variables statiques privées est lorsque vous devez utiliser une variable dans une fonction statique. Pour les fonctions statiques, vous ne pouvez utiliser que des variables statiques, vous les rendez donc privées pour ne pas y accéder à partir d'autres classes. C'est le seul cas pour lequel j'utilise la statique privée.
Voici un exemple:
la source
Person
, alors ce serait probablement un bogue, car vous ne pourriez pas avoir plusieurs personnes d'âge différent (si c'était un cas d'utilisation prévu).Eh bien, les
private static
variables peuvent être utilisées pour partager des données entre les instances de cette classe. Bien que vous ayez raison de dire que nous ne pouvons pas accéder auxprivate static
variables en utilisant des constructions commeClassName.member
ou,ClassInstance.member
mais le membre sera toujours visible à partir des méthodes de cette classe ou des instances de cette classe. Ainsi, en effet, les instances de cette classe pourront toujours faire référence à un membre.la source
À quoi sert une variable de classe statique privée?
Disons que vous avez une classe de livre de bibliothèque. Chaque fois que vous créez un nouveau livre, vous souhaitez lui attribuer un identifiant unique. Une façon consiste simplement à commencer à 0 et à incrémenter le numéro d'identification. Mais, comment tous les autres livres connaissent-ils le dernier numéro d'identification créé? Simple, enregistrez-le en tant que variable statique. Les clients doivent-ils savoir que le numéro d'identification interne réel est celui de chaque livre? Non. Cette information est privée.
Ceci est un exemple artificiel, mais je suis sûr que vous pouvez facilement penser à des cas où vous voudriez que toutes les instances de classe aient accès à des informations communes qui devraient rester privées de tout le monde. Ou même si vous ne pouvez pas, c'est une bonne pratique de programmation de rendre les choses aussi privées que possible. Que faire si vous avez accidentellement rendu public ce champ numBooks, même si les utilisateurs de Book n'étaient pas censés en faire quoi que ce soit. Ensuite, quelqu'un pourrait changer le nombre de livres sans créer un nouveau livre.
Très sournois!
la source
Oui, les deux sont différents. Et le premier est appelé
class variable
parce qu'il contient une valeur unique pour celaclass
tandis que l'autre est appeléinstance variable
parce qu'il peut contenir une valeur différente pour différentsinstances(Objects)
. Le premier est créé une seule fois dans jvm et l'autre est créé une fois par instance, c'est-à-dire que si vous avez 10 instances, vous en aurez 10 différentesprivate varName;
dans jvm.Oui, les variables statiques obtiennent des propriétés différentes des variables d'instance normales. J'en ai déjà mentionné quelques-uns et voyons-en quelques-uns ici:
class variables
(les variables d'instance déclarées comme statiques) sont accessibles directement en utilisant un nom de classe commeClassName.varName
. Et tout objet de cette classe peut accéder et modifier sa valeur, contrairement aux variables d'instance accessibles uniquement par ses objets respectifs. Les variables de classe peuvent être utilisées dans les méthodes statiques.Logiquement,
private static variable
n'est pas différent depublic static variable
premier qui vous donne plus de contrôle. IMO, vous pouvez littéralement remplacerpublic static variable
parprivate static variable
à l'aide despublic static
méthodes getter et setter.Un domaine largement utilisé
private static variable
est dans l'implémentation d'unSingleton
modèle simple où vous n'aurez qu'une seule instance de cette classe dans le monde entier. Ici, l'static
identifiant joue un rôle crucial pour rendre cette instance unique accessible par le monde extérieur (bien sûr, la méthode getter statique publique joue également un rôle principal).la source
Le mot clé privé utilisera pour l'accès à la variable dans la classe et en gardant statique dans le sens où nous pouvons également accéder à la variable en méthode statique, mais la variable de référence ne peut pas accéder en méthode statique.
la source
Une autre perspective:
la source
Lorsque dans une méthode statique vous utilisez une variable, la variable doit également être statique à titre d'exemple:
la source
Les variables statiques sont les variables communes à toutes les instances d'une classe..si une instance la change ... alors la valeur de la variable statique sera mise à jour pour toutes les autres instances
la source
Pour certaines personnes, cela a plus de sens s'ils le voient dans quelques langues différentes, j'ai donc écrit un exemple en Java et en PHP sur ma page où j'explique certains de ces modificateurs. Vous pensez peut-être mal à cela.
Vous devriez regarder mes exemples si cela n'a pas de sens ci-dessous. Va ici http://www.siteconsortium.com/h/D0000D.php
L'essentiel, c'est que c'est à peu près exactement ce qu'il dit. C'est une variable membre statique qui est privée. Par exemple, si vous souhaitez créer un objet Singleton, pourquoi souhaitez-vous rendre publique la variable SingletonExample.instance. Si vous le faisiez, une personne qui utilisait la classe pourrait facilement écraser la valeur.
C'est tout ce que c'est.
la source
Si vous utilisez des variables statiques privées dans votre classe, les classes Static Inner de votre classe peuvent atteindre vos variables. C'est parfaitement bon pour la sécurité du contexte.
la source
Si une variable est définie comme statique publique, elle est accessible via son nom de classe depuis n'importe quelle classe.
Les fonctions sont généralement définies comme des statiques publiques auxquelles il est possible d'accéder simplement en appelant le nom de la classe d'implémentation.
Un très bon exemple est la
sleep()
méthode de la classe ThreadSi une variable est définie comme statique privée, elle n'est accessible que dans cette classe, donc aucun nom de classe n'est nécessaire ou vous pouvez toujours utiliser le nom de classe (jusqu'à vous). La différence entre private var_name et private static var_name est que les variables statiques privées ne sont accessibles que par des méthodes statiques de la classe tandis que les variables privées sont accessibles par n'importe quelle méthode de cette classe (à l'exception des méthodes statiques)
Un très bon exemple en est la définition de connexions de base de données ou de constantes qui nécessitent de déclarer une variable comme statique privée.
Un autre exemple courant est
la source
Je suis nouveau sur Java, mais une façon d'utiliser des variables statiques, comme je suppose que beaucoup de gens le font, est de compter le nombre d'instances de la classe. par exemple:
Ensuite, vous pouvez sysout:
Vous pouvez également avoir accès à numCompanies à partir de chaque instance de la classe (ce que je ne comprends pas complètement), mais ce ne sera pas de manière "statique". Je n'ai aucune idée si c'est la meilleure pratique ou non, mais cela a du sens pour moi.
la source
*) Si une variable est déclarée comme privée, elle n'est pas visible en dehors de la classe, cela s'appelle masquage de données.
*) Si une variable est déclarée comme statique alors la valeur de la variable est la même pour toutes les instances et nous n'avons pas besoin de créer un objet pour appeler cette variable, nous pouvons appeler cette variable simplement
classname.variablename;
la source
La variable statique privée sera également partagée dans la sous-classe. Si vous avez changé dans une sous-classe et que l'autre sous-classe obtiendra la valeur modifiée, auquel cas, il se peut que ce ne soit pas ce à quoi vous vous attendiez.
la source
ThreadLocal
les variables sont généralement implémentées commeprivate static
. De cette manière, ils ne sont pas liés à la classe et chaque thread a sa propre référence à son propre objet "ThreadLocal".la source
Dans l'exemple suivant,
eye
est modifié par PersonB, tandis queleg
reste le même. Cela est dû au fait qu'une variable privée fait une copie d'elle-même dans la méthode, de sorte que sa valeur d'origine reste la même; alors qu'une valeur statique privée n'a qu'une seule copie pour toutes les méthodes à partager, la modification de sa valeur changera sa valeur d'origine.}
la source