Quelle est l'utilisation d'une variable statique privée en Java?
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.
Est la déclaration d'une variable comme private static varName;
toute différente de la déclaration d'une variable private varName;
?
Dans les deux cas, il ne peut être accédé comme ClassName.varName
ou ClassInstance.varName
à partir d'une autre classe.
La déclaration de la variable comme statique lui donne-t-elle d'autres propriétés spéciales?
19 réponses
Bien sûr, il peut être consulté comme ClassName.var_name
, mais seulement à l'intérieur de la classe dans laquelle il est défini - c'est parce qu'il est private
.
public static
ou private static
Les variables sont souvent utilisées pour les constantes. Par exemple, beaucoup de gens n'aiment pas les constantes "hard-code" dans leur code; ils aiment faire une variable public static
ou private static
avec un nom significatif et l'utiliser dans leur code, ce qui devrait rendre le code plus lisible. (Vous devriez également faire de telles constantes final
).
Pour exemple:
public class Example {
private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
private final static String JDBC_USERNAME = "username";
private final static String JDBC_PASSWORD = "password";
public static void main(String[] args) {
Connection conn = DriverManager.getConnection(JDBC_URL,
JDBC_USERNAME, JDBC_PASSWORD);
// ...
}
}
Si vous le faites public
ou private
dépend si vous voulez que les variables soient visibles en dehors de la classe ou non.
Variables Statiques ont une valeur unique pour toutes les instances d'une classe.
Si vous deviez faire quelque chose comme:
public class Person
{
private static int numberOfEyes;
private String name;
}
Et ensuite vous vouliez changer votre nom, c'est bien, mon nom reste le même. Si, cependant, vous vouliez le changer pour que vous ayez 17 des yeux, alors tout le monde dans le monde aurait également 17 des yeux.
Les variables statiques privées sont utiles de la même manière que les variables d'instance privées: elles stockent l'État auquel on accède uniquement par le code dans la même classe. L'accessibilité (privé / public / etc) et la nature 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. Aucun - une variable statique est associée au type lui-même au lieu de toutes les instances du type.
Donc, 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é (permettant peut-être un accès contrôlé via des propriétés, par exemple), il est logique d'avoir une variable statique privée.
En aparté, je recommande fortement que le type seulement de variables que vous rendez publiques (ou même non-private) sont des constantes-des variables finales statiques de types immuables. Tout le reste devrait être privé pour séparer L'API et l'implémentation (entre autres choses).
Eh bien, les variables private static
peuvent être utilisées pour partager des données entre les instances de cette classe. Bien que vous ayez raison, nous ne pouvons pas accéder aux variables private static
en utilisant des constructions comme ClassName.member
ou ClassInstance.member
mais le Membre sera toujours visible à partir des méthodes de cette classe ou des instances de cette classe. Donc, en effet, les instances de cette classe seront toujours en mesure de se référer à member.
Eh bien, vous avez raison les variables statiques publiques sont utilisées sans faire une 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 private static.
Voici un exemple:
Class test {
public static String name = "AA";
private static String age;
public static void setAge(String yourAge) {
//here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
age = yourAge;
}
}
Quelle est l'utilisation d'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 est de 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 ont-ils besoin de savoir que le numéro d'identification interne réel est pour chaque Livre? Aucun. Cette information est privée.
public class Book {
private static int numBooks = 0;
private int id;
public String name;
Book(String name) {
id = numBooks++;
this.name = name;
}
}
Ceci est un artificiel exemple, 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 être privées de tout le monde. Ou même si vous ne pouvez pas, c'est une bonne pratique de programmation pour 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 livres n'étaient pas censés faire quoi que ce soit avec. Ensuite, quelqu'un pourrait changer le nombre de livres sans créer un nouveau livre.
Très sournois!
Déclare une variable comme {[1] } différente de déclarer une variable
private varName;
?
Oui, les deux sont différents. Et le premier est appelé class variable
, car elle détient seule valeur pour que class
, alors que l'autre est appelé instance variable
, car il peut contenir une valeur différente pour différents instances(Objects)
. Le premier est créé une seule fois dans la jvm et l'autre est créé une fois par instance, c'est-à-dire si vous avez 10 instances, vous aurez 10 private varName;
différents dans la jvm.
La déclaration de la variable comme
static
lui donne-t-elle d'autres caractéristiques spéciales propriétés?
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 en voyons quelques-uns ici: class variables
(Les variables d'instance déclarées statiques) peuvent être accédées directement en utilisant le nom de classe comme ClassName.varName
. Et n'importe quel objet de cette classe peut accéder et modifier sa valeur contrairement aux variables d'instance accessibles uniquement par ses objets respectifs. Variables de classe peut être utilisé dans des méthodes statiques.
Quelle est l'utilisation d'un
private static variable
en Java?
Logiquement, private static variable
n'est pas différent de public static variable
plutôt le premier vous donne plus de contrôle. IMO, vous pouvez littéralement remplacer public static variable
par private static variable
à l'aide des méthodes public static
getter et setter.
Une zone largement utilisée de private static variable
est en implémentation du modèle simple Singleton
où vous n'aurez qu'une seule instance de cette classe dans le monde entier. Ici, l'identifiant static
joue un rôle crucial rôle pour rendre cette instance unique est accessible par le monde extérieur (bien sûr, la méthode getter statique publique joue également un rôle principal).
public class Singleton {
private static Singleton singletonInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return Singleton.singletonInstance;
}
}
Une autre perspective:
- une classe et son instance sont deux choses différentes à l'exécution. Une information de classe est "partagée" par toutes les instances de cette classe.
- les variables de classe non statiques appartiennent aux instances et la variable statique appartient à la classe.
- tout comme les variables d'une instance peuvent être privées ou publiques, les variables statiques peuvent également être privées ou publiques.
Mot-clé privé utilisera pour l'accès à la variable dans la classe et en gardant statique dans le sens où nous pouvons accéder à la variable dans la méthode statique aussi, mais la variable de référence ne peut pas accéder à la méthode statique.
Lorsque dans une méthode statique vous utilisez une variable, la variable doivent être statiques trop à titre d'exemple:
private static int a=0;
public static void testMethod() {
a=1;
}
Les variables statiques sont les variables communes à toutes les instances d'une classe..si une instance le change.. ensuite, la valeur de la variable statique serait mise à jour pour toutes les autres instances
Pour certaines personnes, cela a plus de sens s'ils le voient dans quelques langues différentes, alors j'ai écrit un exemple en Java, et PHP sur ma page où j'explique certains de ces modificateurs. Vous pourriez penser à ce sujet incorrectement.
Vous devriez regarder mes exemples si cela n'a pas de sens ci-dessous. Allez ici http://www.siteconsortium.com/h/D0000D.php
L'essentiel est que c'est à peu près exactement ce qu'il dit qu'il est. C'est une variable membre statique qui est privé. Par exemple, si vous vouliez créer un objet Singleton, pourquoi voudriez-vous créer SingletonExample.variable d'instance publique. Si vous l'avez fait, une personne qui utilisait la classe pourrait facilement écraser la valeur.
, ce Qui est tout ce qu'il est.
public class SingletonExample { private static SingletonExample instance = null; private static int value = 0; private SingletonExample() { ++this.value; } public static SingletonExample getInstance() { if(instance!=null) return instance; synchronized(SingletonExample.class) { instance = new SingletonExample(); return instance; } } public void printValue() { System.out.print( this.value ); } public static void main(String [] args) { SingletonExample instance = getInstance(); instance.printValue(); instance = getInstance(); instance.printValue(); } }
Si vous utilisez des variables statiques privées dans votre classe, les classes internes statiques de votre classe peuvent atteindre vos variables. C'est parfaitement bon pour la sécurité du contexte.
Si une variable est définie comme statique publique, elle est accessible via son nom de classe depuis n'importe quelle classe.
Généralement, les fonctions sont définies comme publiques statiques auxquelles on peut accéder simplement en appelant le nom de la classe d'implémentation.
Un très bon exemple est la méthode sleep()
dans la classe de Thread
Thread.sleep(2500);
Si une variable est définie comme statique privée, elle n'est accessible qu'au sein de cette classe, donc aucun nom de classe n'est nécessaire ou vous pouvez toujours utiliser le nom de la classe (jusqu'à vous). Différence entre private var_name et private static var_name est que les variables statiques privées ne sont accessibles que par les méthodes statiques de la classe tandis que les variables privées sont accessibles par n'importe quelle méthode de cette classe(sauf les méthodes statiques)
Un très bon exemple en est lors de la définition de connexions de base de données ou de constantes qui nécessitent de déclarer la variable comme statique privée .
Un autre exemple courant est
private static int numberOfCars=10;
public static int returnNumber(){
return numberOfCars;
}
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:
public Class Company {
private static int numCompanies;
public static int getNumCompanies(){
return numCompanies;
}
}
Alors vous pouvez sysout:
Company.getNumCompanies();
Vous pouvez également accéder à 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.
*) si une variable est déclarée comme privée, elle n'est pas visible en dehors de la classe.ceci est appelé datahiding.
*)Si une variable est déclarée comme statique la valeur de la variable est de même pour toutes les instances et nous n'avons besoin de créer un objet à appeler cette variable.nous pouvons appeler cette variable simplement par
Classname.variablename;
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 que vous attendez.
public class PrivateStatic {
private static int var = 10;
public void setVar(int newVal) {
var = newVal;
}
public int getVar() {
return var;
}
public static void main(String... args) {
PrivateStatic p1 = new Sub1();
System.out.println(PrivateStatic.var);
p1.setVar(200);
PrivateStatic p2 = new Sub2();
System.out.println(p2.getVar());
}
}
class Sub1 extends PrivateStatic {
}
class Sub2 extends PrivateStatic {
}
Les variables ThreadLocal sont généralement implémentées en tant que statique privée. De cette façon, ils ne sont pas liés à la classe et chaque thread a sa propre référence à son propre objet "threadLocal".
Dans l'exemple suivant, eye
est modifié par PersonB, tandis que leg
reste le même. En effet, une variable privée fait une copie de lui-même à 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 copie pour toutes les méthodes à partager, donc l'édition de sa valeur changera sa valeur d'origine.
public class test {
private static int eye=2;
private int leg=3;
public test (int eyes, int legs){
eye = eyes;
leg=leg;
}
public test (){
}
public void print(){
System.out.println(eye);
System.out.println(leg);
}
public static void main(String[] args){
test PersonA = new test();
test PersonB = new test(14,8);
PersonA.print();
}
}
> 14 3