web-dev-qa-db-fra.com

Quelle est l'utilisation d'une variable statique privée en Java?

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?

134
Vaibhav Jani

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.

105
Jesper

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.

89
TofuBeer

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).

42
Jon Skeet

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.

8
Swaranga Sarma

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;
   }
}
8
Farid Farhat

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!

5
iheanyi

Déclare une variable en tant que private static varName; différent de déclarer une variable private 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;
    }
}
5
avr

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.

3
Raam

Une autre perspective: 

  1. Une classe et son instance sont deux choses différentes au moment de l'exécution. Une information de classe est "partagée" par toutes les instances de cette classe.
  2. Les variables de classe non statiques appartiennent aux instances et la variable statique à la classe. 
  3. Tout comme une instance, les variables peuvent être privées ou publiques, les variables statiques peuvent également être privées ou publiques. 
2
Santosh

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;  
}
1
Neifen

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 (); 
 } 
 } 

1
JTHouseCat

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. 

1
Erdal76t

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.

1
Nagesh Tripathi

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 {
}
0
djiao

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".

0
Mehmet Erdemsoy

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é.

0
pyetti

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;

}
0
ronak Hingar

*) 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;

0
Deepak Bala