Si une variable est déclarée en tant que public static varName;
, je peux y accéder de n'importe où en tant que 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-ce que déclarer une variable en tant que private static varName;
est différent de déclarer une variable private varName;
?
Dans les deux cas, il est impossible d'y accéder en tant que ClassName.varName
ou ClassInstance.varName
à partir d'une autre classe.
Déclarer la variable comme statique lui donne-t-il d'autres propriétés spéciales?
Bien sûr, on peut y accéder en tant que ClassName.var_name
, mais uniquement à l'intérieur de la classe dans laquelle il est défini - c'est parce que c'est private
.
Les variables public static
ou private static
sont souvent utilisées pour les constantes. Par exemple, beaucoup de gens n'aiment pas "coder en dur" les constantes dans leur code; ils aiment créer une variable public static
ou private static
avec un nom explicite et l'utiliser dans leur code, ce qui devrait le rendre plus lisible. (Vous devez également créer de telles constantes final
).
Par 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);
// ...
}
}
Que vous le fassiez public
ou private
dépend de si vous voulez que les variables soient visibles en dehors de la classe ou non.
Les 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 puis vous vouliez changer de nom, ça va, mon nom reste le même. Si, toutefois, vous vouliez changer pour que vous ayez 17 yeux, alors tout le monde dans le monde aurait également 17 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 n'a accès que par le code de 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 un instance pour que l'état soit présent. Non - une variable statique est associée au type lui-même au lieu de any 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é (autorisant 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 passant, je recommanderais fortement que le type only des variables que vous rendez publiques (ou même non privées) soit des constantes - des variables finales statiques de types immuables. Tout le reste devrait être privé pour séparer l'API et la mise en œuvre (entre autres).
Eh bien, les variables private static
peuvent être utilisées pour partager des données entre instances de cette classe. Bien que vous ayez raison, nous ne pouvons pas accéder aux variables private static
à l'aide de constructions telles que ClassName.member
ou ClassInstance.member
, mais le membre sera toujours visible à partir des méthodes de cette classe ou de ses instances. En pratique, les instances de cette classe pourront toujours se référer à membre.
Vous avez raison, les variables statiques publiques sont utilisées sans créer d’instance de la classe, mais pas les variables statiques privées. La principale différence entre eux et l'utilisation des variables statiques privées réside 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 depuis d'autres classes. C’est le seul cas où j’utilise des statistiques privées pour.
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 solution consiste tout 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 usagers doivent-ils savoir que le numéro d'identification interne réel est celui de chaque livre? Non, 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 exemple artificiel, mais je suis sûr que vous pouvez facilement imaginer des cas où vous voudriez que toutes les instances de classe aient accès à des informations communes qui devraient rester confidentielles. Ou même si vous ne le pouvez pas, il est recommandé de rendre les choses aussi privées que possible. Et si vous rendiez accidentellement ce champ numBooks public, même si les utilisateurs de Book 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 en tant que
private static varName;
différent de déclarer une variableprivate varName;
?
Oui, les deux sont différents. Et le premier s'appelle class variable
car il contient une valeur unique pour cette class
alors que le second est appelé instance variable
car il peut contenir une valeur différente pour différentes instances(Objects)
. Le premier est créé une seule fois dans jvm et un autre par instance: si vous avez 10 instances, vous aurez 10 private varName;
différents dans jvm.
Est-ce que déclarer la variable en tant que
static
lui donne une autre particularité 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-unes et voyons-en quelques-unes ici: class variables
(les variables d'instance déclarées statiques) sont accessibles directement à l'aide d'un nom de classe comme ClassName.varName
. Et tout objet de cette classe peut accéder à sa valeur et la modifier, contrairement aux variables d'instance accessibles uniquement par ses objets respectifs. Les variables de classe peuvent être utilisées 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
mais 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.
Un domaine largement utilisé de private static variable
concerne la mise en œuvre du modèle Singleton
simple dans lequel vous ne disposez que d'une seule instance de cette classe dans le monde entier. Ici, l'identificateur static
joue un rôle crucial pour rendre cette instance unique accessible au monde extérieur (bien sûr, la méthode d'accesseur public statique joue également le rôle principal).
public class Singleton {
private static Singleton singletonInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return Singleton.singletonInstance;
}
}
Le mot-clé privé utilisera pour l'accès à la variable dans la classe et en conservant statique dans le sens où nous pouvons également accéder à la variable dans la méthode statique, mais la variable de référence ne peut pas accéder à la méthode statique.
Une autre perspective:
Lorsque vous utilisez une variable dans une méthode statique, celle-ci doit également être statique. Par exemple:
private static int a=0;
public static void testMethod() {
a=1;
}
Pour certaines personnes, cela a plus de sens si elles le voient dans quelques langues différentes. J'ai donc écrit un exemple en Java et PHP sur ma page où j'explique certains de ces modificateurs. Vous pensez peut-être à ce sujet de manière incorrecte.
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, c’est que c’est à peu près exactement ce qu’il est dit. C'est une variable membre statique privée. Par exemple, si vous voulez créer un objet Singleton, pourquoi voulez-vous que la variable SingletonExample.instance soit publique? Si vous le faisiez, une personne utilisant la classe pourrait facilement écraser la valeur.
C'est tout ce que c'est.
Classe publique SingletonExample { privé statique SingletonExample instance = null; private static int value = 0; SingletonExample privé () { ++ this.value; } public statique SingletonExample getInstance () { if (instance! = null) instance de retour; synchronized (SingletonExample.class) { instance = new SingletonExample (); instance de retour; } } 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 Static Inner de votre classe peuvent atteindre vos variables. C'est parfaitement bon pour la sécurité du contexte.
Les variables statiques sont les variables communes à toutes les instances d'une classe. Si une instance le modifie, la valeur de la variable statique serait mise à jour pour toutes les autres instances.
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, dans ce 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 static static privé . Ainsi, elles ne sont pas liées à la classe et chaque thread a sa propre référence à son propre objet "threadLocal".
Je suis nouveau sur Java, mais une des façons d’utiliser des variables statiques, comme beaucoup de gens le supposent, consiste à compter le nombre d’instances de la classe. par exemple.:
public Class Company {
private static int numCompanies;
public static int getNumCompanies(){
return numCompanies;
}
}
Ensuite, vous pouvez sysout:
Company.getNumCompanies();
Vous pouvez également accéder à numCompanies à partir de chaque instance de la classe (ce que je ne comprends pas bien), mais cela ne se fera pas de manière "statique". Je ne sais pas si c'est une pratique exemplaire ou non, mais cela me semble sensé.
Si une variable est définie comme publique statique, elle est accessible via son nom de classe à partir de n’importe quelle classe.
Habituellement, les fonctions sont définies en tant que public statique auquel on peut accéder simplement en appelant le nom de la classe d'implémentation.
La méthode sleep()
dans la classe Thread en est un très bon exemple.
Thread.sleep(2500);
Si une variable est définie en tant que variable privée privée, elle est accessible uniquement dans cette classe. Par conséquent, aucun nom de classe n'est requis ou vous pouvez toujours utiliser le nom de la classe (jusqu'à vous) . les variables statiques 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 de cela est la définition de connexions ou de constantes de base de données nécessitant la déclaration de variable en tant que statique privée.
Un autre exemple courant est
private static int numberOfCars=10;
public static int returnNumber(){
return numberOfCars;
}
*) Si une variable est déclarée privée, elle n’est pas visible en dehors de la classe. C’est ce qu’on appelle masquer des données.
*) Si une variable est déclarée statique, sa valeur est la même pour toutes les instances et il n'est pas nécessaire de créer un objet pour appeler cette variable. Nous pouvons appeler cette variable simplement
classname.variablename;