A che serve una variabile statica privata in Java?


156

Se una variabile viene dichiarata come public static varName;, allora posso accedervi da qualsiasi luogo come ClassName.varName. Sono anche consapevole che i membri statici sono condivisi da tutte le istanze di una classe e non sono riallocati in ciascuna istanza.

Dichiarare una variabile come private static varName;diversa dal dichiarare una variabile private varName;?

In entrambi i casi non è possibile accedervi come ClassName.varNameo come ClassInstance.varNameda qualsiasi altra classe.

Dichiarare la variabile come statica fornisce altre proprietà speciali?


5
I nomi delle variabili Java non possono contenere trattini (-).
Martijn Courteaux,

Risposte:


127

Naturalmente è possibile accedervi come ClassName.var_name, ma solo dall'interno della classe in cui è definito - questo perché è definito come private.

public statico le private staticvariabili vengono spesso utilizzate per le costanti. Ad esempio, molte persone non amano "costare" le costanti nel loro codice; a loro piace creare una public statico una private staticvariabile con un nome significativo e usarlo nel loro codice, il che dovrebbe renderlo più leggibile. (Dovresti anche creare tali costanti final).

Per esempio:

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

        // ...
    }
}

Se lo fai publico privatedipende dal fatto che desideri che le variabili siano visibili all'esterno della classe o meno.


6
Cosa è necessario per accedere a ClassName.var_nam? Dove posso accedervi direttamente: var_namall'interno della classe
Vaibhav Jani,

12
Non è necessario accedervi tramite il nome della classe, ma alcune persone pensano che sia di buon stile, per distinguerlo da una variabile non statica.
Jesper,

5
cosa è necessario per accedervi usando la variabile statica, possiamo scrivere "String finale privata JDBC_PASSWORD =" password ";" invece di utilizzare la variabile statica per questa stringa di password.
Chaitanya,

48
@chaitanya È una costante. Perché dovresti avere una copia della variabile per ogni istanza della classe rendendola non statica?
Jesper,

16
static è una variabile a livello di classe, che è comune ed esiste solo una copia per tutte le istanze di quella classe. La regola è applicabile sia essa privata o pubblica. private dice solo che non voglio che il mondo esterno danneggi il mio valore variabile (per statica non finale). Se una statica è definitiva, non vi è alcun danno nel renderla pubblica, poiché nessuno può modificarne il valore.
user1923551

94

Le variabili statiche hanno un singolo valore per tutte le istanze di una classe.

Se dovessi fare qualcosa del genere:

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

e poi volevi cambiare il tuo nome, va bene, il mio nome rimane lo stesso. Se, tuttavia, volessi cambiarlo in modo da avere 17 occhi, anche tutti nel mondo avrebbero anche 17 occhi.


3
Ciò non si applica alle variabili statiche private a meno che non si scrivano anche metodi di accesso per la variabile privata poiché non è possibile accedervi dall'esterno della classe.
Ganesh Krishnan,

2
Non vero @GaneshKrishnan, qualsiasi istanza della classe ha accesso ad entrambe le variabili. Naturalmente puoi aspettarti che l'autore della classe non faccia qualcosa di stupido. Inoltre, con reflection e JNI, tutte le scommesse sono disattivate.
TofuBeer,

46

Le variabili statiche private sono utili allo stesso modo delle variabili di istanza private: memorizzano lo stato a cui si accede solo dal codice all'interno della stessa classe. L'accessibilità (privato / pubblico / ecc.) E l'istanza / natura statica della variabile sono concetti interamente ortogonali.

Vorrei evitare di pensare di variabili statiche come essere condivisa tra "tutte le istanze" della classe - che suggerisce ci deve essere almeno un esempio per lo stato di essere presente. No: una variabile statica è associata al tipo stesso anziché a qualsiasi istanza del tipo.

Quindi, ogni volta che si desidera uno stato associato al tipo piuttosto che un'istanza particolare e si desidera mantenere tale stato privato (magari consentendo l'accesso controllato tramite proprietà, ad esempio), ha senso disporre di una variabile statica privata.

Inoltre, consiglio vivamente che l' unico tipo di variabili rese pubbliche (o anche non private) siano le costanti: variabili finali statiche di tipi immutabili. Tutto il resto dovrebbe essere privato per separare API e implementazione (tra le altre cose).


Puoi spiegare un po 'di più sulla differenza di accesso alle variabili statiche private e private non statiche in una classe?
Dharmendra,

1
@Dharmendra: Non mi è chiaro cosa intendi. La parte privata è irrilevante: cosa ti confonde esattamente sulla differenza tra variabili statiche e variabili di istanza?
Jon Skeet,

Qual è la differenza di accessibilità quando utilizziamo variabili statiche e non statiche all'interno della singola classe in cui sono dichiarate?
Dharmendra,

2
@YogGuru: non vedo la rilevanza della domanda. Rendilo privato se vuoi che sia privato e statico se vuoi che sia statico. Sono ortogonali.
Jon Skeet,

1
@ryvantage: No, per niente. Un metodo statico potrebbe accedervi senza problemi.
Jon Skeet,

11

Bene, hai ragione, le variabili statiche pubbliche vengono utilizzate senza creare un'istanza della classe, ma non le variabili statiche private. La differenza principale tra loro e dove uso le variabili statiche private è quando è necessario utilizzare una variabile in una funzione statica. Per le funzioni statiche puoi usare solo variabili statiche, quindi le rendi private per non accedervi da altre classi. Questo è l'unico caso per cui utilizzo la statica privata.

Ecco un esempio:

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

3
Penso che questa risposta mi piaccia di più. +1. L'unica volta che ha senso usare statica in una variabile privata è se un metodo statico dovesse accedervi.
Mukus,

Senza dare alla classe un nome proprio non si può davvero dire se si tratta di un caso d'uso valido. Ad esempio, se si chiamasse la classe Person, probabilmente sarebbe un bug, perché non si potrebbero avere più persone di età diversa (se quello fosse un caso d'uso previsto).
DanMan

Accetto @Mukus. Questa potrebbe essere l'unica vera risposta a questa domanda. Penso che OP capisca già l'elettricità statica, ma le persone sembrano voler spiegarlo di nuovo. Sta chiedendo uno scenario specifico. La possibilità di accedere alle variabili nei metodi statici è la funzionalità aggiunta da "statico privato". Voglio solo aggiungere che consente anche alle CLASSI statiche nidificate di accedere alle variabili.
Pinkerton,

1
E la memoria? Con static, creeresti solo una copia per la classe anziché una copia per ogni istanza. E ovviamente con una costante, avrai solo bisogno di una copia per la classe. Questo fa risparmiare memoria?
Pinkerton,

1
Ho cercato. La risposta alla mia domanda precedente è: sì, fa risparmiare memoria
Pinkerton,

8

Bene, le private staticvariabili possono essere usate per condividere dati tra istanze di quella classe. Mentre hai ragione, non possiamo accedere alle private staticvariabili usando costrutti come ClassName.membero ClassInstance.memberma il membro sarà sempre visibile dai metodi di quella classe o istanze di quella classe. Quindi in effetti le istanze di quella classe saranno sempre in grado di fare riferimento al membro.


6

A che serve una variabile di classe statica privata?

Supponiamo che tu abbia un libro della biblioteca Class. Ogni volta che crei un nuovo libro, desideri assegnargli un ID univoco. Un modo è semplicemente iniziare da 0 e incrementare il numero ID. Ma come fanno tutti gli altri libri a conoscere l'ultimo numero ID creato? Semplice, salvalo come variabile statica. I clienti devono sapere che il numero ID interno effettivo è per ciascun libro? No. Quelle informazioni sono private.

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

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

Questo è un esempio inventato, ma sono sicuro che puoi facilmente pensare ai casi in cui desideri che tutte le istanze di classe abbiano accesso a informazioni comuni che dovrebbero essere private da chiunque altro. O anche se non puoi, è buona prassi di programmazione rendere le cose il più private possibile. E se avessi accidentalmente reso pubblico quel campo di numBooks, anche se gli utenti di Book non dovevano farci nulla. Quindi qualcuno potrebbe cambiare il numero di libri senza creare un nuovo libro.

Molto subdolo!


6

Dichiarare una variabile come private static varName;diversa dal dichiarare una variabile private varName;?

Sì, entrambi sono diversi. E il primo viene chiamato class variableperché contiene un valore singolo per quello classmentre l'altro viene chiamato instance variableperché può contenere un valore diverso per diverso instances(Objects). Il primo viene creato una sola volta in jvm e l'altro viene creato una volta per istanza, cioè se hai 10 istanze, ne avrai 10 diverse private varName;in jvm.

Dichiarare la variabile come staticconferisce altre proprietà speciali?

Sì, le variabili statiche ottengono proprietà diverse rispetto alle normali variabili di istanza. Ne ho già citati alcuni e ne vediamo alcuni qui: class variables(le variabili di istanza dichiarate come statiche) sono accessibili direttamente usando il nome della classe come ClassName.varName. E qualsiasi oggetto di quella classe può accedere e modificare il suo valore a differenza delle variabili di istanza a cui accedono solo i suoi rispettivi oggetti. Le variabili di classe possono essere utilizzate in metodi statici.

Qual è l'uso di a private static variablein Java?

Logicamente, private static variablenon è diverso da public static variablepiuttosto il primo ti dà più controllo. IMO, è possibile sostituire letteralmente public static variableda private static variablecon l'aiuto dei public staticmetodi getter e setter.

Un'area ampiamente utilizzata private static variableè l'implementazione di un Singletonmodello semplice in cui avrai un'unica istanza di quella classe in tutto il mondo. Qui l' staticidentificatore gioca un ruolo cruciale per rendere quella singola istanza accessibile al mondo esterno (ovviamente anche il metodo del getter statico pubblico svolge un ruolo principale).

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

    private Singleton(){}

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

4

La parola chiave privata utilizzerà per l'accesso alla variabile all'interno della classe e mantenendo statica nel senso che possiamo accedere alla variabile anche con il metodo statico ma la variabile di riferimento non può accedere con il metodo statico.


3

Un'altra prospettiva:

  1. Una classe e la sua istanza sono due cose diverse in fase di esecuzione. Le informazioni di una classe vengono "condivise" da tutte le istanze di quella classe.
  2. Le variabili di classe non statiche appartengono alle istanze e la variabile statica appartiene alla classe.
  3. Proprio come le variabili di un'istanza possono essere private o pubbliche, anche le variabili statiche possono essere private o pubbliche.

1

Quando in un metodo statico si utilizza una variabile, anche la variabile deve essere statica come esempio:

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

3
Bene, a meno che al tuo metodo non sia dato un riferimento a un'istanza della classe ovviamente.
Jon Skeet,

1

Le variabili statiche sono quelle variabili che sono comuni per tutte le istanze di una classe ... se un'istanza la modifica .. allora il valore della variabile statica verrebbe aggiornato per tutte le altre istanze


1

Per alcune persone questo ha più senso se lo vedono in un paio di lingue diverse, quindi ho scritto un esempio in Java e PHP sulla mia pagina in cui spiego alcuni di questi modificatori. Potresti pensare a questo in modo errato.

Dovresti guardare i miei esempi se non ha senso sotto. Vai qui http://www.siteconsortium.com/h/D0000D.php

La linea di fondo è che è praticamente esattamente quello che dice che è. È una variabile membro statica che è privata. Ad esempio, se si desidera creare un oggetto Singleton, perché si desidera rendere pubblica la variabile SingletonExample.instance. Se lo facessi, una persona che stava usando la classe potrebbe facilmente sovrascrivere il valore.

Questo è tutto.

    classe pubblica SingletonExample {
      istanza SingletonExample statica privata = null;
      valore int statico privato = 0;
      private SingletonExample () {
        ++ this.value;
      }
      public statico SingletonExample getInstance () {
        if (esempio! = null)
        istanza di ritorno;
        sincronizzato (SingletonExample.class) {
        istanza = new SingletonExample ();
        istanza di ritorno;
        }
      }
      public void printValue () {
        System.out.print (this.value);
      }

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


1

Se usi variabili statiche private nella tua classe, le classi Static Inner nella tua classe possono raggiungere le tue variabili. Questo è perfettamente buono per la sicurezza del contesto.


0

Se una variabile viene definita come statica pubblica, è possibile accedervi tramite il nome della sua classe da qualsiasi classe.

Di solito le funzioni sono definite come statiche pubbliche a cui è possibile accedere semplicemente chiamando il nome della classe di implementazione.

Un ottimo esempio è il sleep()metodo nella classe Thread

Thread.sleep(2500);

Se una variabile è definita come statica privata, è possibile accedervi solo all'interno di quella classe, quindi non è necessario alcun nome di classe o è comunque possibile utilizzare il nome della classe (fino a te). La differenza tra var_name privato e var_name statico privato è che è possibile accedere alle variabili statiche private solo con metodi statici della classe mentre alle variabili private è possibile accedere con qualsiasi metodo di quella classe (eccetto i metodi statici)

Ne è un ottimo esempio la definizione di connessioni al database o costanti che richiedono la dichiarazione della variabile come statica privata.

Un altro esempio comune è

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}

0

Sono nuovo di Java, ma un modo in cui utilizzo variabili statiche, come suppongo che facciano molte persone, è contare il numero di istanze della classe. per esempio:

public Class Company {
    private static int numCompanies;

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

Quindi puoi sysout:

Company.getNumCompanies();

Puoi anche accedere a numCompanies da ogni istanza della classe (che non capisco completamente), ma non sarà in un "modo statico". Non ho idea se questa è la migliore pratica o meno, ma per me ha senso.


0

*) Se una variabile viene dichiarata come privata, allora non è visibile al di fuori della classe.

*) Se una variabile viene dichiarata come statica, il valore della variabile è lo stesso per tutte le istanze e non è necessario creare un oggetto per chiamare quella variabile. Possiamo chiamarla semplicemente

classname.variablename;


0

la variabile statica privata verrà condivisa anche nella sottoclasse. Se hai cambiato in una sottoclasse e l'altra sottoclasse otterrà il valore modificato, nel qual caso potrebbe non essere quello che ti aspetti.

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

ThreadLocalle variabili sono in genere implementate come private static. In questo modo, non sono associati alla classe e ogni thread ha il proprio riferimento al proprio oggetto "ThreadLocal".


3
Non capisco questa risposta. Cosa intendi?
H.Rabiee,

-1

Nel seguente esempio, eyeviene modificato da PersonB, mentre legrimane invariato. Questo perché una variabile privata crea una copia di se stessa nel metodo, in modo che il suo valore originale rimanga lo stesso; mentre un valore statico privato ha solo una copia per tutti i metodi da condividere, quindi modificando il suo valore cambierà il suo valore originale.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.