À quoi sert une variable statique privée en Java?

156

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.varNameou à ClassInstance.varNamepartir d'une autre classe.

Est-ce que déclarer la variable comme statique lui donne d'autres propriétés spéciales?

Vaibhav Jani
la source
5
Les noms de variables Java ne peuvent pas contenir de tirets (-).
Martijn Courteaux

Réponses:

127

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 comme private.

public staticou les private staticvariables 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 un public staticouprivate 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 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 publicou privateque vous souhaitiez que les variables soient visibles en dehors de la classe ou non.

Jesper
la source
6
Que faut-il pour accéder en tant que ClassName.var_nam? Où je peux y accéder directement: var_namen classe
Vaibhav Jani
12
Il n'est pas nécessaire d'y accéder via le nom de la classe, mais certaines personnes pensent que c'est un bon style, pour le distinguer d'une variable non statique.
Jesper le
5
ce qui est nécessaire pour y accéder en utilisant une variable statique, Nous pouvons écrire "private final String JDBC_PASSWORD =" password ";" au lieu d'utiliser une variable statique pour cette chaîne de mot de passe.
chaitanya
48
@chaitanya C'est une constante. Pourquoi voudriez-vous avoir une copie de la variable pour chaque instance de la classe en la rendant non statique?
Jesper le
16
static est une variable au niveau de la classe, qui est commune et une seule copie existe pour toutes les instances de cette classe. La règle est applicable qu'elle soit privée ou publique. private dit simplement que je ne veux pas que le monde extérieur corrompe ma valeur de variable (pour les statiques non finales). Si une statique est définitive, il n'y a aucun mal à la rendre publique, car personne ne peut changer sa valeur.
user1923551
94

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

TofuBière
la source
3
Cela ne s'applique pas aux variables statiques privées, sauf si vous écrivez également des méthodes d'accesseur pour la variable privée car elles ne sont pas accessibles depuis l'extérieur de la classe.
Ganesh Krishnan
2
Ce n'est pas vrai @GaneshKrishnan, toute instance de la classe a accès aux deux variables. Naturellement, vous pouvez vous attendre à ce que l'auteur du cours ne fasse rien de stupide. De plus, avec réflexion et JNI, tous les paris sont ouverts.
TofuBeer
46

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

Jon Skeet
la source
Pouvez-vous expliquer un peu plus la différence entre l'accès aux variables statiques privées et privées non statiques dans une classe?
Dharmendra le
1
@Dharmendra: Ce que vous voulez dire n'est pas clair pour moi. La partie privée n'est pas pertinente - qu'est-ce qui vous déroute exactement sur la différence entre les variables statiques et les variables d'instance?
Jon Skeet le
Quelle est la différence d'accessibilité lorsque nous utilisons des variables statiques et non statiques dans la classe unique où elles sont déclarées?
Dharmendra le
2
@YogGuru: Je ne vois pas la pertinence de la question. Rendez-le privé si vous voulez qu'il soit privé et statique si vous voulez qu'il soit statique. Ils sont orthogonaux.
Jon Skeet
1
@ryvantage: Non, pas du tout. Une méthode statique pourrait y accéder sans problème.
Jon Skeet
11

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:

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;
   }
}
Farid Farhat
la source
3
Je pense que j'aime cette réponse le plus. +1. Le seul moment où il est judicieux d'utiliser statique dans une variable privée est si une méthode statique y accède.
Mukus
Sans donner à la classe un nom propre, vous ne pouvez pas vraiment dire s'il s'agit d'un cas d'utilisation valide. Par exemple, si la classe était appelée 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).
DanMan
Je suis d'accord @Mukus. Cela pourrait être la seule vraie réponse à cette question. Je pense qu'OP comprend déjà la statique, mais les gens semblent vouloir l'expliquer à nouveau. Il pose des questions sur un scénario spécifique. La possibilité d'accéder aux variables dans les méthodes statiques est la fonctionnalité ajoutée par «statique privée». Je veux juste ajouter également que cela permet également aux classes statiques imbriquées d'accéder aux variables.
Pinkerton
1
Et la mémoire? Avec statique, vous ne créeriez qu'une seule copie pour la classe au lieu d'une copie pour chaque instance. Et évidemment, avec une constante, vous n'avez besoin que d'un seul exemplaire pour la classe. Cela économise-t-il de la mémoire?
Pinkerton
1
Je l'ai cherché. La réponse à ma question précédente est: oui, ça économise de la mémoire
Pinkerton
8

Eh bien, les private staticvariables 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 aux private staticvariables en utilisant des constructions comme ClassName.memberou, ClassInstance.membermais 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.

Swaranga Sarma
la source
6

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

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 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!

iheanyi
la source
6

La déclaration d'une variable private static varName;est-elle différente de la déclaration d'une variable private varName;?

Oui, les deux sont différents. Et le premier est appelé class variableparce qu'il contient une valeur unique pour cela classtandis que l'autre est appelé instance variableparce qu'il peut contenir une valeur différente pour différents instances(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érentes private varName;dans jvm.

Est-ce que déclarer la variable comme staticlui donne d'autres propriétés spéciales?

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 comme ClassName.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.

A quoi sert un private static variableen Java?

Logiquement, private static variablen'est pas différent depublic static variable premier qui vous donne plus de contrôle. IMO, vous pouvez littéralement remplacer public static variablepar private static variableà l'aide des public staticméthodes getter et setter.

Un domaine largement utilisé private static variableest dans l'implémentation d'un Singletonmodèle simple où vous n'aurez qu'une seule instance de cette classe dans le monde entier. Ici, l' staticidentifiant 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).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
avr
la source
4

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.

Raam
la source
3

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 à des instances et la variable statique appartient à la classe.
  3. Tout comme les variables d'instance peuvent être privées ou publiques, les variables statiques peuvent également être privées ou publiques.
Santosh
la source
1

Lorsque dans une méthode statique vous utilisez une variable, la variable doit également être statique à titre d'exemple:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
Neifen
la source
3
Eh bien, à moins que votre méthode ne fasse référence à une instance de la classe bien sûr.
Jon Skeet le
1

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

Nagesh Tripathi
la source
1

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.

    classe publique SingletonExample {
      instance de SingletonExample statique privée = null;
      valeur int statique privée = 0;
      Private SingletonExample () {
        ++ this.value;
      }
      public static SingletonExample getInstance () {
        if (instance! = null)
        instance de retour;
        synchronisé (SingletonExample.class) {
        instance = new SingletonExample ();
        instance de retour;
        }
      }
      public void printValue () {
        System.out.print (this.value);
      }

      public static void main (String [] args) {
        Instance SingletonExample = getInstance ();
        instance.printValue ();
        instance = getInstance ();
        instance.printValue ();
         }
    }

JTHouseCat
la source
1

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.

Erdal76t
la source
0

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 Thread

Thread.sleep(2500);

Si 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

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
ron_ron
la source
0

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

Ensuite, vous pouvez sysout:

Company.getNumCompanies();

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.

pyetti
la source
0

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

Deepak Bala
la source
0

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.

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 {
}
Djiao
la source
0

ThreadLocalles variables sont généralement implémentées comme private 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".

Mehmet Erdemsoy
la source
3
Je ne comprends pas cette réponse. Que voulez-vous dire?
H.Rabiee
-1

Dans l'exemple suivant, eyeest modifié par PersonB, tandis que legreste 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.

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

Yiqin Dai
la source