it-swarm.com.de

Was ist die Verwendung einer privaten statischen Variablen in Java?

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

Unterscheidet sich die Deklaration einer Variablen als private static varName; von der Deklaration einer Variablen private varName;?

In beiden Fällen kann von keiner anderen Klasse aus auf ClassName.varName oder ClassInstance.varName zugegriffen werden.

Gibt die Deklaration der Variablen als statisch andere besondere Eigenschaften an?

134
Vaibhav Jani

Natürlich kann es als ClassName.var_name aufgerufen werden, aber nur innerhalb der Klasse, in der es definiert ist - weil private ist.

public static- oder private static-Variablen werden häufig für Konstanten verwendet. Zum Beispiel mögen es viele Leute nicht, Konstanten in ihrem Code "hart zu codieren"; Sie möchten eine public static- oder private static-Variable mit einem aussagekräftigen Namen erstellen und diese in ihrem Code verwenden, wodurch der Code lesbarer werden soll. (Sie sollten auch solche Konstanten final machen).

Zum Beispiel:

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 public oder private festlegen, hängt davon ab, ob die Variablen außerhalb der Klasse sichtbar sein sollen oder nicht.

105
Jesper

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

Wenn Sie so etwas machen würden:

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, hätte jeder auf der Welt auch 17 Augen.

89
TofuBeer

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

Ich möchte vermeiden, dass statische Variablen als "alle Instanzen" der Klasse geteilt werden. Dies legt nahe, dass mindestens eine one - Instanz vorhanden sein muss, damit der Status vorhanden ist. Nein - Dem Typ selbst ist eine statische Variable anstelle von any -Instanzen des Typs zugeordnet.

Jedes Mal, wenn Sie einen Zustand wünschen, der mit dem Typ und nicht mit einer bestimmten Instanz verknüpft ist, und Sie diesen Zustand privat halten möchten (z. B. den kontrollierten Zugriff über Eigenschaften), ist es sinnvoll, eine private statische Variable zu haben.

Abgesehen davon würde ich nachdrücklich empfehlen, dass die Variablen only, die Sie öffentlich (oder sogar nicht privat) machen, Konstanten sind - statische Endvariablen von unveränderlichen Typen. Alles andere sollte privat sein, um API und Implementierung (unter anderem) voneinander zu trennen.

42
Jon Skeet

Nun, private static-Variablen können verwendet werden, um Daten über Instanzen dieser Klasse gemeinsam zu nutzen. Wenn Sie richtig sind, können wir nicht auf die private static-Variablen mit Konstrukten wie ClassName.member oder ClassInstance.member zugreifen, aber der Member ist immer für Methoden dieser Klasse oder Instanzen dieser Klasse sichtbar. In der Tat können Instanzen dieser Klasse immer auf Member verweisen.

8
Swaranga Sarma

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 als privat definieren, um nicht auf andere Klassen zuzugreifen. Das ist der einzige Fall, für den ich private Statik benutze.

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

Was ist die Verwendung einer privaten statischen Klassenvariablen?

Nehmen wir an, Sie haben eine Bibliotheksbuchklasse. Jedes Mal, wenn Sie ein neues Buch erstellen, möchten Sie ihm eine eindeutige ID zuweisen. Eine Möglichkeit ist, einfach bei 0 zu beginnen und die ID-Nummer zu erhöhen. Aber woher wissen 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? 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 mir sicher, dass Sie leicht an Fälle denken können, in denen alle Klasseninstanzen Zugriff auf allgemeine Informationen haben sollen, die von allen anderen geheim gehalten werden sollten. Oder auch wenn Sie dies nicht können, ist es eine gute Programmierpraxis, die Dinge so privat wie möglich zu gestalten. Was wäre, wenn Sie versehentlich das Feld numBooks öffentlich gemacht hätten, obwohl Book-Benutzer damit nichts anfangen sollten. Dann könnte jemand die Anzahl der Bücher ändern, ohne ein neues Buch zu erstellen. 

Sehr hinterlistig!

5
iheanyi

Deklariert eine Variable als private static varName;, die sich von .__ unterscheidet. eine Variable deklarieren private varName;?

Ja, beide sind unterschiedlich. Die erste heißt class variable, weil sie einen einzigen Wert für diese class enthält, während die andere instance variable heißt, da sie unterschiedliche Werte für verschiedene instances(Objects) enthalten kann. Die erste Instanz wird nur einmal in jvm erstellt, und eine andere wird einmal pro Instanz erstellt. Wenn Sie also 10 Instanzen haben, haben Sie 10 verschiedene private varName; in jvm. 

Erklärt die Variable als static, gibt sie eine andere Besonderheit Eigenschaften?

Ja, statische Variablen erhalten einige andere Eigenschaften als normale Instanzvariablen. Ich habe schon einige erwähnt und hier einige sehen: Auf class variables (Instanzvariablen, die als statisch deklariert sind) kann direkt über den Klassennamen wie ClassName.varName zugegriffen werden. Jedes Objekt dieser Klasse kann auf seinen Wert zugreifen und diesen ändern, im Gegensatz zu Instanzvariablen, auf die nur die entsprechenden Objekte zugreifen. Klassenvariablen können in statischen Methoden verwendet werden. 

Was ist die Verwendung eines private static variable in Java?

Logischerweise unterscheidet sich private static variable nicht von public static variable, sondern der erste gibt Ihnen mehr Kontrolle. IMO, Sie können public static variable durch private static variable mithilfe von public static Getter- und Setter-Methoden buchstäblich ersetzen. 

Ein weit verbreiteter Bereich von private static variable ist die Implementierung eines einfachen Singleton-Musters, in dem Sie nur eine Instanz dieser Klasse in der ganzen Welt haben werden. Hier spielt static bezeichner eine entscheidende Rolle, um die Einzelinstanz für die Außenwelt zugänglich zu machen (natürlich spielt auch die öffentliche statische Getter-Methode eine Hauptrolle). 

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

    private Singleton(){}

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

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

3
Raam

Eine andere Perspektive: 

  1. Eine Klasse und ihre Instanz sind zwei verschiedene Dinge zur Laufzeit. 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 eine Instanzvariable privat oder öffentlich sein kann, können statische Variablen auch privat oder öffentlich sein. 
2
Santosh

Wenn Sie in einer statischen Methode eine Variable verwenden, muss auch die Variable statisch sein. __ als Beispiel: 

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
1
Neifen

Für manche Leute ist dies sinnvoller, wenn sie in mehreren Sprachen angezeigt werden. Daher habe ich ein Beispiel in Java und PHP auf meiner Seite 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

Die Quintessenz ist jedoch, dass es ziemlich genau das ist, was es sagt. Es ist eine statische Membervariable, die privat ist. Wenn Sie z. B. ein Singleton-Objekt erstellen möchten, sollten Sie die SingletonExample.instance-Variable als öffentlich deklarieren. Wenn Sie eine Person gemacht haben, die die Klasse verwendet, kann der Wert leicht überschrieben werden.

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; 
 synchronized (SingletonExample.class) {
 Instanz = neues SingletonExample (); 
 Instanz zurückgeben; 
 } 
 } 
 public void printValue () {
 System.out.print (this.value); 
 } 

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

1
JTHouseCat

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

1
Erdal76t

Statische Variablen sind die Variablen, die für alle Instanzen einer Klasse üblich sind. Wenn sich eine Instanz ändert, werden die statischen Variablen für alle anderen Instanzen aktualisiert

1
Nagesh Tripathi

private statische Variablen werden ebenfalls in der Unterklasse geteilt. Wenn Sie in einer Unterklasse geändert haben und die andere Unterklasse den geänderten Wert erhält, kann dies nicht der Fall sein, den Sie erwarten.

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

ThreadLocal-Variablen werden normalerweise als private Statik implementiert ..__ Auf diese Weise sind sie nicht an die Klasse gebunden und jeder Thread hat seine eigene Referenz auf sein eigenes "threadLocal" -Objekt.

0
Mehmet Erdemsoy

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 aus auf numCompanies zugreifen (was ich nicht ganz verstehe), aber es ist nicht "statisch". Ich habe keine Ahnung, ob dies die beste Praxis ist oder nicht, aber es ist für mich sinnvoll.

0
pyetti

Wenn eine Variable als öffentliche Statik definiert ist, kann von jeder Klasse aus auf ihren Klassennamen zugegriffen werden.

Normalerweise werden Funktionen als öffentliche Statik definiert, auf die nur durch Aufruf 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 Statik definiert ist, kann auf diese Klasse nur innerhalb dieser Klasse zugegriffen werden, so dass kein Klassenname erforderlich ist oder Sie können den Klassennamen (bis zu Ihnen) weiterhin verwenden Auf statische Variablen kann nur mit statischen Methoden der Klasse zugegriffen werden, während auf private Variablen mit jeder Methode dieser Klasse (außer statischen Methoden) zugegriffen werden kann.

Ein sehr gutes Beispiel dafür ist die Definition von Datenbankverbindungen oder Konstanten, für die eine Variable als private Statik deklariert werden muss.

Ein anderes allgemeines Beispiel ist 

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
0
ronak Hingar

*) Wenn eine Variable als privat deklariert ist, ist sie außerhalb der Klasse nicht sichtbar. Sie 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

klassenname.Variablenname;

0
Deepak Bala