Was ist die Verwendung einer privaten statischen Variablen in Java?

156

Wenn eine Variable als deklariert ist public static varName;, kann ich von überall als darauf zugreifenClassName.varName . Mir ist auch bekannt, dass statische Mitglieder von allen Instanzen einer Klasse gemeinsam genutzt und nicht in jeder Instanz neu zugewiesen werden.

Bekannt , dass folgende eine Variable als private static varName;jede andere von Deklaration einer Variablen private varName;?

In beiden Fällen kann nicht als ClassName.varNameoder als zugegriffen werdenClassInstance.varName von einer anderen Klasse .

Gibt die Deklaration der Variablen als statisch andere besondere Eigenschaften?

Vaibhav Jani
quelle
5
Java-Variablennamen dürfen keine Bindestriche (-) enthalten.
Martijn Courteaux

Antworten:

127

Natürlich kann darauf zugegriffen werden als ClassName.var_name, aber nur innerhalb der Klasse, in der es definiert ist - das liegt daran, dass es als definiert ist private.

public staticoder private staticVariablen werden häufig für Konstanten verwendet. Zum Beispiel mögen viele Leute es nicht, Konstanten in ihrem Code "hart zu codieren"; Sie möchten eine public staticoder eine private staticVariable mit einem aussagekräftigen Namen erstellen und diesen in ihrem Code verwenden, wodurch der Code besser lesbar wird. (Sie sollten auch solche Konstanten erstellenfinal ).

Beispielsweise:

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

        // ...
    }
}

Ob Sie es schaffen publicoder privatedavon abhängen, ob die Variablen außerhalb der Klasse sichtbar sein sollen oder nicht.

Jesper
quelle
6
Was ist für den Zugriff als erforderlich ClassName.var_nam? Wo ich direkt darauf zugreifen kann: var_naminnerhalb der Klasse
Vaibhav Jani
12
Es ist nicht notwendig , über den Klassennamen darauf zuzugreifen, aber einige Leute halten es für einen guten Stil, um es von einer nicht statischen Variablen zu unterscheiden.
Jesper
5
Was ist notwendig, um mit einer statischen Variablen darauf zuzugreifen? Wir können "private final String JDBC_PASSWORD =" password ";" anstatt eine statische Variable für diese Kennwortzeichenfolge zu verwenden.
Chaitanya
48
@chaitanya Es ist eine Konstante. Warum möchten Sie eine Kopie der Variablen für jede Instanz der Klasse haben, indem Sie sie nicht statisch machen?
Jesper
16
static ist eine Variable auf Klassenebene, die gemeinsam verwendet wird und für alle Instanzen dieser Klasse nur eine Kopie vorhanden ist. Die Regel gilt unabhängig davon, ob es sich um eine private oder eine öffentliche Regel handelt. private sagt nur, dass ich nicht möchte, dass die Außenwelt meinen variablen Wert beschädigt (für nicht endgültige Statiken). Wenn eine Statik endgültig ist, kann es nicht schaden, sie als öffentlich zu machen, da niemand ihren Wert ändern kann.
user1923551
94

Statische Variablen haben einen einzigen Wert für alle Instanzen einer Klasse.

Wenn Sie etwas machen würden wie:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

und dann wolltest du deinen Namen ändern, das ist in Ordnung, mein Name bleibt gleich. Wenn Sie es jedoch so ändern wollten, dass Sie 17 Augen hatten, dann hätte jeder auf der Welt auch 17 Augen.

TofuBeer
quelle
3
Dies gilt nicht für private statische Variablen, es sei denn, Sie schreiben auch Zugriffsmethoden für die private Variable, da von außerhalb der Klasse nicht auf sie zugegriffen werden kann.
Ganesh Krishnan
2
Nicht wahr @GaneshKrishnan, jede Instanz der Klasse hat Zugriff auf beide Variablen. Natürlich können Sie erwarten, dass der Autor der Klasse nichts Dummes tut. Mit Reflection und JNI sind alle Wetten ungültig.
TofuBeer
46

Private statische Variablen sind genauso nützlich wie private Instanzvariablen: Sie speichern den Status, auf den nur durch Code innerhalb derselben Klasse zugegriffen wird. Die Zugänglichkeit (privat / öffentlich / usw.) und die Instanz / statische Natur der Variablen sind vollständig orthogonale Konzepte.

Ich würde es vermeiden, statische Variablen als von "allen Instanzen" der Klasse gemeinsam zu betrachten - das bedeutet, dass es mindestens eine Instanz geben muss, damit der Status vorhanden ist. Nein - eine statische Variable ist dem Typ selbst anstelle einer beliebigen zugeordnet Instanzen des Typs.

Wenn Sie also einen Status wünschen, der dem Typ und nicht einer bestimmten Instanz zugeordnet ist, und diesen Status privat halten möchten (z. B. möglicherweise einen kontrollierten Zugriff über Eigenschaften zulassen), ist es sinnvoll, eine private statische Variable zu haben.

Abgesehen davon würde ich dringend empfehlen, dass der einzige Variablentyp, den Sie öffentlich (oder sogar nicht privat) machen, Konstanten sind - statische Endvariablen unveränderlicher Typen. Alles andere sollte privat sein, um API und Implementierung (unter anderem) zu trennen.

Jon Skeet
quelle
Können Sie etwas mehr über den Unterschied zwischen privatem statischem und privatem nicht statischem Variablenzugriff in einer Klasse erklären?
Dharmendra
1
@ Dharmendra: Mir ist nicht klar, was du meinst. Der private Teil ist irrelevant - was genau verwirrt Sie über den Unterschied zwischen statischen Variablen und Instanzvariablen?
Jon Skeet
Was ist der Unterschied in der Zugänglichkeit, wenn wir statische und nicht statische Variablen innerhalb der einzelnen Klasse verwenden, in der sie deklariert sind?
Dharmendra
2
@ YogGuru: Ich sehe die Relevanz der Frage nicht. Machen Sie es privat, wenn Sie möchten, dass es privat ist, und statisch, wenn Sie möchten, dass es statisch ist. Sie sind orthogonal.
Jon Skeet
1
@ryvantage: Nein, überhaupt nicht. Eine statische Methode konnte problemlos darauf zugreifen.
Jon Skeet
11

Nun, Sie haben Recht, öffentliche statische Variablen werden verwendet, ohne eine Instanz der Klasse zu erstellen, private statische Variablen jedoch nicht. Der Hauptunterschied zwischen ihnen und der Verwendung der privaten statischen Variablen besteht darin, dass Sie eine Variable in einer statischen Funktion verwenden müssen. Für die statischen Funktionen können Sie nur statische Variablen verwenden, sodass Sie sie privat machen, um nicht von anderen Klassen auf sie zuzugreifen. Dies ist der einzige Fall, für den ich private statische Daten verwende.

Hier ist ein Beispiel:

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
quelle
3
Ich denke, diese Antwort gefällt mir am besten. +1. Die Verwendung von static in einer privaten Variablen ist nur dann sinnvoll, wenn eine statische Methode darauf zugreifen würde.
Mukus
Ohne der Klasse einen richtigen Namen zu geben, kann man nicht wirklich sagen, ob dies ein gültiger Anwendungsfall ist. Wenn die Klasse aufgerufen würde Person, wäre dies wahrscheinlich ein Fehler, da Sie nicht mehrere Personen unterschiedlichen Alters haben könnten (wenn dies ein beabsichtigter Anwendungsfall wäre).
DanMan
Ich stimme @Mukus zu. Dies könnte die einzig richtige Antwort auf diese Frage sein. Ich denke, OP versteht Statik bereits, aber die Leute scheinen es noch einmal erklären zu wollen. Er fragt nach einem bestimmten Szenario. Die Möglichkeit, mit statischen Methoden auf Variablen zuzugreifen, ist die Funktionalität, die 'private static' hinzufügt. Ich möchte nur hinzufügen, dass es auch verschachtelten statischen KLASSEN Zugriff auf die Variablen ermöglicht.
Pinkerton
1
Was ist mit der Erinnerung? Mit static erstellen Sie nur eine Kopie für die Klasse anstelle einer Kopie für jede Instanz. Und natürlich würden Sie mit einer Konstanten immer nur eine Kopie für die Klasse benötigen. Spart dies Speicher?
Pinkerton
1
Ich habe es nachgeschlagen. Die Antwort auf meine vorherige Frage lautet: Ja, es spart Speicher
Pinkerton
8

Nun, private staticVariablen können verwendet werden, um Daten über Instanzen dieser Klasse hinweg gemeinsam zu nutzen. Sie haben zwar Recht, dass wir nicht private staticmit Konstrukten wie ClassName.memberoder auf die Variablen zugreifen können, ClassInstance.memberaber das Mitglied ist immer über Methoden dieser Klasse oder Instanzen dieser Klasse sichtbar. In der Tat können Instanzen dieser Klasse immer auf ein Mitglied verweisen.

Swaranga Sarma
quelle
6

Was ist die Verwendung einer privaten statischen Klassenvariablen?

Angenommen, Sie haben eine Bibliotheksbuchklasse. Jedes Mal, wenn Sie ein neues Buch erstellen, möchten Sie ihm eine eindeutige ID zuweisen. Eine Möglichkeit besteht darin, einfach bei 0 zu beginnen und die ID-Nummer zu erhöhen. Aber woher kennen alle anderen Bücher die zuletzt erstellte ID-Nummer? Einfach, speichern Sie es als statische Variable. Müssen Benutzer wissen, dass die tatsächliche interne ID-Nummer für jedes Buch gilt? Nein, diese Informationen sind privat.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

Dies ist ein erfundenes Beispiel, aber ich bin sicher, Sie können sich leicht Fälle vorstellen, in denen alle Klasseninstanzen Zugriff auf allgemeine Informationen haben sollen, die von allen anderen privat gehalten werden sollten. Oder selbst wenn Sie nicht können, ist es eine gute Programmierpraxis, die Dinge so privat wie möglich zu gestalten. Was wäre, wenn Sie dieses numBooks-Feld versehentlich öffentlich gemacht hätten, obwohl Buchbenutzer nichts damit anfangen sollten? Dann könnte jemand die Anzahl der Bücher ändern, ohne ein neues Buch zu erstellen.

Sehr hinterhältig!

iheanyi
quelle
6

Bekannt , dass folgende eine Variable als private static varName;jede andere von Deklaration einer Variablen private varName;?

Ja, beide sind unterschiedlich. Und der erste wird aufgerufen, class variableweil er dafür einen einzelnen Wert enthält, classwährend der andere aufgerufen wird, instance variableweil er für verschiedene Werte unterschiedliche Werte enthalten kann instances(Objects). Die erste wird nur einmal in jvm erstellt und die andere wird einmal pro Instanz erstellt. Wenn Sie also 10 Instanzen haben, haben Sie 10 verschiedene private varName;in jvm.

Gibt die Deklaration der Variablen staticandere spezielle Eigenschaften?

Ja, statische Variablen erhalten andere Eigenschaften als normale Instanzvariablen. Ich habe bereits einige erwähnt und lassen Sie uns hier einige sehen: class variables(Instanzvariablen, die als statisch deklariert sind) können direkt unter Verwendung des Klassennamens wie aufgerufen werden ClassName.varName. Und jedes Objekt dieser Klasse kann auf seinen Wert zugreifen und ihn ändern, im Gegensatz zu Instanzvariablen, auf die nur die jeweiligen Objekte zugreifen. Klassenvariablen können in statischen Methoden verwendet werden.

Was ist die Verwendung von a private static variablein Java?

Logischerweise unterscheidet private static variablees sich nicht von public static variabledem ersten, der Ihnen mehr Kontrolle gibt. IMO, können Sie buchstäblich ersetzen public static variabledurch private static variablemit Hilfe von public staticGetter und Setter - Methoden.

Ein weit verbreiteter Bereich private static variableist die Implementierung eines einfachen SingletonMusters, bei dem Sie nur eine einzige Instanz dieser Klasse auf der ganzen Welt haben. Hier staticspielt der Bezeichner eine entscheidende Rolle, damit diese einzelne Instanz für die Außenwelt zugänglich ist (natürlich spielt auch die öffentliche statische Getter-Methode die Hauptrolle).

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

    private Singleton(){}

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

Das private Schlüsselwort wird für den Variablenzugriff innerhalb der Klasse verwendet und bleibt statisch in dem Sinne, dass wir auch auf die Variable in der statischen Methode zugreifen können, aber die Referenzvariable kann nicht auf die statische Methode zugreifen.

Raam
quelle
3

Eine andere Perspektive:

  1. Eine Klasse und ihre Instanz sind zur Laufzeit zwei verschiedene Dinge. Eine Klasseninformation wird von allen Instanzen dieser Klasse "geteilt".
  2. Die nicht statischen Klassenvariablen gehören zu Instanzen und die statische Variable gehört zur Klasse.
  3. So wie Instanzvariablen privat oder öffentlich sein können, können statische Variablen auch privat oder öffentlich sein.
Santosh
quelle
1

Wenn Sie in einer statischen Methode eine Variable verwenden, muss die Variable beispielsweise auch statisch sein:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
Neifen
quelle
3
Nun, es sei denn, Ihre Methode bezieht sich natürlich auf eine Instanz der Klasse.
Jon Skeet
1

Statische Variablen sind diejenigen Variablen, die für alle Instanzen einer Klasse gleich sind. Wenn eine Instanz sie ändert, wird der Wert der statischen Variablen für alle anderen Instanzen aktualisiert

Nagesh Tripathi
quelle
1

Für einige Leute ist dies sinnvoller, wenn sie es in verschiedenen Sprachen sehen. Deshalb habe ich auf meiner Seite ein Beispiel in Java und PHP geschrieben, in dem ich einige dieser Modifikatoren erkläre. Möglicherweise denken Sie falsch darüber nach.

Sie sollten sich meine Beispiele ansehen, wenn es unten keinen Sinn ergibt. Gehen Sie hier http://www.siteconsortium.com/h/D0000D.php

Das Fazit ist jedoch, dass es ziemlich genau das ist, was es sagt. Es ist eine statische Mitgliedsvariable, die privat ist. Wenn Sie beispielsweise ein Singleton-Objekt erstellen möchten, warum sollten Sie die Variable SingletonExample.instance öffentlich machen? Wenn Sie dies getan haben, könnte eine Person, die die Klasse verwendet, den Wert leicht überschreiben.

Das ist alles was es ist.

    öffentliche Klasse SingletonExample {
      private statische SingletonExample-Instanz = null;
      privater statischer int-Wert = 0;
      private SingletonExample () {
        ++ this.value;
      }}
      public static SingletonExample getInstance () {
        if (Instanz! = null)
        Instanz zurückgeben;
        synchronisiert (SingletonExample.class) {
        instance = new SingletonExample ();
        Instanz zurückgeben;
        }}
      }}
      public void printValue () {
        System.out.print (this.value);
      }}

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

JTHouseCat
quelle
1

Wenn Sie in Ihrer Klasse private statische Variablen verwenden, können statische innere Klassen in Ihrer Klasse Ihre Variablen erreichen. Dies ist perfekt für die Kontextsicherheit.

Erdal76t
quelle
0

Wenn eine Variable als public static definiert ist, kann von jeder Klasse aus über ihren Klassennamen auf sie zugegriffen werden.

Normalerweise werden Funktionen als öffentliche statische Elemente definiert, auf die nur durch Aufrufen des implementierenden Klassennamens zugegriffen werden kann.

Ein sehr gutes Beispiel dafür ist die sleep()Methode in der Thread-Klasse

Thread.sleep(2500);

Wenn eine Variable als private statische Variable definiert ist, kann nur innerhalb dieser Klasse auf sie zugegriffen werden, sodass kein Klassenname erforderlich ist, oder Sie können den Klassennamen (bis zu Ihnen) weiterhin verwenden. Der Unterschied zwischen privatem Variablennamen und privatem statischem Variablennamen besteht darin, dass auf private statische Variablen nur mit statischen Methoden der Klasse zugegriffen werden kann, während auf private Variablen mit jeder Methode dieser Klasse zugegriffen werden kann (außer mit statischen Methoden).

Ein sehr gutes Beispiel hierfür ist das Definieren von Datenbankverbindungen oder Konstanten, bei denen Variablen als private statische Werte deklariert werden müssen.

Ein weiteres häufiges Beispiel ist

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
ron_ron
quelle
0

Ich bin neu in Java, aber eine Möglichkeit, statische Variablen zu verwenden, wie ich davon ausgehe, dass viele Leute dies tun, besteht darin, die Anzahl der Instanzen der Klasse zu zählen. z.B:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

Dann können Sie sysout:

Company.getNumCompanies();

Sie können auch von jeder Instanz der Klasse auf numCompanies zugreifen (was ich nicht vollständig verstehe), aber es wird nicht "statisch" sein. Ich habe keine Ahnung, ob dies die beste Vorgehensweise ist oder nicht, aber es macht für mich Sinn.

Pyetti
quelle
0

*) Wenn eine Variable als privat deklariert ist, ist sie außerhalb der Klasse nicht sichtbar. Dies wird als Datahiding bezeichnet.

*) Wenn eine Variable als statisch deklariert ist, ist der Wert der Variablen für alle Instanzen gleich und wir müssen kein Objekt erstellen, um diese Variable aufzurufen. Wir können diese Variable einfach aufrufen

classname.variablename;

Deepak Bala
quelle
0

Private statische Variablen werden auch in der Unterklasse gemeinsam genutzt. Wenn Sie in einer Unterklasse geändert haben und die andere Unterklasse den geänderten Wert erhält, entspricht dieser möglicherweise nicht Ihren Erwartungen.

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
quelle
0

ThreadLocalVariablen werden normalerweise als implementiert private static. Auf diese Weise sind sie nicht an die Klasse gebunden und jeder Thread hat seinen eigenen Verweis auf sein eigenes "ThreadLocal" -Objekt.

Mehmet Erdemsoy
quelle
3
Ich verstehe diese Antwort nicht. Was meinst du?
H. Rabiee
-1

Im folgenden Beispiel eyewird von PersonB geändert, während es gleich legbleibt. Dies liegt daran, dass eine private Variable eine Kopie von sich selbst in die Methode erstellt, sodass ihr ursprünglicher Wert gleich bleibt. Während ein privater statischer Wert nur eine Kopie für alle zu teilenden Methoden enthält, ändert das Bearbeiten seines Werts seinen ursprünglichen Wert.

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
quelle