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?

129
demandé sur blacktide 2011-09-02 10:24:14

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.

98
répondu Jesper 2011-09-02 06:33:00

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.

88
répondu TofuBeer 2011-09-02 06:27:56

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

42
répondu Jon Skeet 2011-09-02 16:06:05

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.

8
répondu Swaranga Sarma 2011-09-02 06:30:14

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;
   }
}
7
répondu Farid Farhat 2011-09-02 06:45:50

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!

5
répondu iheanyi 2013-11-09 20:55:02

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;
    }
}
5
répondu avr 2016-06-21 07:04:00

Une autre perspective:

  1. 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.
  2. les variables de classe non statiques appartiennent aux instances et la variable statique appartient à la classe.
  3. tout comme les variables d'une instance peuvent être privées ou publiques, les variables statiques peuvent également être privées ou publiques.
2
répondu Santosh 2011-09-02 06:41:43

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.

2
répondu Raam 2017-01-21 10:42:06

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;  
}
1
répondu Neifen 2011-09-02 08:15:51

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

1
répondu Nagesh Tripathi 2013-11-23 04:42:04

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

1
répondu JTHouseCat 2014-01-23 20:28:05

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.

1
répondu Erdal76t 2016-01-12 09:54:27

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;

}
0
répondu ronak Hingar 2014-02-10 04:12:08

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.

0
répondu pyetti 2014-04-10 01:12:54

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

0
répondu Deepak Bala 2015-09-22 09:10:17

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 {
}
0
répondu djiao 2015-10-14 15:04:50

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

0
répondu Mehmet Erdemsoy 2017-06-22 13:02:57

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

-1
répondu Yiqin Dai 2017-01-21 10:32:55