Qual è l’uso di una variabile statica privata in Java?

Se una variabile è dichiarata come public static varName; , quindi posso accedervi da qualsiasi luogo come ClassName.varName . Sono anche consapevole del fatto che i membri statici sono condivisi da tutte le istanze di una class e non sono riallocati in ogni istanza.

Sta dichiarando una variabile come private static varName; diverso dal dichiarare una variabile private varName; ?

In entrambi i casi non è ansible accedere come ClassName.varName o ClassInstance.varName da qualsiasi altra class.

Dichiarare la variabile come statica dà altre proprietà speciali?

Ovviamente si può accedere come ClassName.var_name , ma solo dall’interno della class in cui è definito, perché è private .

public static variabili public static o private static vengono spesso utilizzate per le costanti. Ad esempio, molte persone non amano le costanti “hard-code” nel loro codice; a loro piace creare una variabile public static o private static con un nome significativo e utilizzarla nel loro codice, che dovrebbe rendere il codice più leggibile. (Dovresti anche rendere costanti tali 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); // ... } } 

Sia che tu lo renda public o private dipende dal fatto che tu voglia che le variabili siano visibili al di fuori della class o meno.

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

Se dovessi fare qualcosa come:

 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, comunque volessi cambiarlo in modo da avere 17 occhi, allora tutti nel mondo avrebbero anche 17 occhi.

Le variabili statiche private sono utili nello stesso modo in cui le variabili di istanza private sono utili: memorizzano lo stato a cui accede solo dal codice all’interno della stessa class. L’accessibilità (privata / pubblica / ecc.) E la natura istanza / statica della variabile sono concetti interamente ortogonali.

Eviterei di pensare che le variabili statiche siano condivise tra “tutte le istanze” della class, il che suggerisce che ci deve essere almeno un’istanza per la presenza dello stato. No: una variabile statica è associata al tipo stesso anziché a qualsiasi istanza del tipo.

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

Per inciso, raccomando vivamente che l’ unico tipo di variabili che rendi pubbliche (o anche non private) siano costanti – variabili finali statiche di tipi immutabili. Tutto il resto dovrebbe essere privato per separare API e implementazione (tra le altre cose).

Bene, private static variabili private static possono essere utilizzate per condividere i dati tra le istanze di quella class. Sebbene tu abbia ragione, non possiamo accedere alle variabili private static usando costrutti come ClassName.member o ClassInstance.member ma il membro sarà sempre visibile dai metodi di quella class o delle istanze di quella class. Quindi, in effetti, le istanze di quella class saranno sempre in grado di riferirsi al membro.

Bene, hai ragione, le variabili statiche pubbliche vengono utilizzate senza creare un’istanza della class, ma le variabili statiche private non lo sono. La principale differenza tra loro e il punto in cui utilizzo le variabili statiche private è quando è necessario utilizzare una variabile in una funzione statica. Per le funzioni statiche è ansible utilizzare solo variabili statiche, in modo da renderle private per non accedervi da altre classi. Questo è l’unico caso per cui utilizzo statico privato.

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 classs age = yourAge; } } 

Qual è l’uso di una variabile di class statica privata?

Diciamo che hai un libro in biblioteca. Ogni volta che crei un nuovo libro, devi assegnargli un ID univoco. Un modo è semplicemente iniziare da 0 e incrementare il numero di identificazione. Ma come fanno tutti gli altri libri a conoscere l’ultimo numero ID creato? Semplice, salvalo come variabile statica. Gli utenti devono sapere che il numero di identificazione interno effettivo è per ogni libro? No. Quell’informazione è privata.

 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 forzato, ma sono sicuro che si può facilmente pensare ai casi in cui si desidera che tutte le istanze di class abbiano accesso a informazioni comuni che devono essere mantenute private da tutti gli altri. O anche se non è ansible, è buona pratica di programmazione rendere le cose il più private ansible. Che cosa succede se accidentalmente hai reso pubblico quel campo di numBooks, anche se gli utenti di Book non dovevano fare nulla con esso. Quindi qualcuno potrebbe cambiare il numero di libri senza creare un nuovo libro.

Molto subdolo!

Sta dichiarando una variabile come private static varName; diverso dal dichiarare una variabile private varName; ?

Sì, entrambi sono diversi. E il primo è chiamato class variable perché contiene un singolo valore per quella class mentre l’altro è chiamato instance variable perché può contenere un valore diverso per instances(Objects) diverse instances(Objects) . Il primo viene creato una sola volta in jvm e l’altro viene creato una volta per istanza, ovvero se si hanno 10 istanze allora si avranno 10 private varName; in jvm.

Dichiarare la variabile come static dà altre proprietà speciali?

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

Qual è l’uso di una private static variable in Java?

Logicamente, private static variable non è diversa dalla public static variable ma la prima fornisce un maggiore controllo. IMO, puoi letteralmente sostituire public static variable private static variable con l’aiuto dei metodi public static getter e setter pubblici.

Un’area ampiamente utilizzata della private static variable è in fase di implementazione del semplice schema Singleton cui si avrà un’unica istanza di quella class nel mondo intero. Qui l’identificatore static gioca un ruolo cruciale per rendere l’unica istanza accessibile al mondo esterno (ovviamente il metodo getter statico pubblico svolge anche il ruolo principale).

 public class Singleton { private static Singleton singletonInstance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return Singleton.singletonInstance; } } 

Un’altra prospettiva:

  1. Una class e la sua istanza sono due cose diverse in fase di esecuzione. Un’informazione di class è “condivisa” da tutte le istanze di quella class.
  2. Le variabili di class non statiche appartengono alle istanze e la variabile statica appartiene alla class.
  3. Proprio come le variabili di istanza possono essere private o pubbliche, le variabili statiche possono anche essere private o pubbliche.

La parola chiave privata verrà utilizzata per l’accesso alle variabili all’interno della class e per mantenere la staticità nel senso in cui è ansible accedere alla variabile nel metodo statico, ma la variabile di riferimento non può accedere nel metodo statico.

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

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

Le variabili statiche sono quelle variabili che sono comuni a tutte le istanze di una class … se una istanza la modifica … allora il valore della variabile statica verrebbe aggiornato per tutte le altre istanze

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 dove spiego alcuni di questi modificatori. Potresti pensare a questo in modo errato.

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

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

Questo è tutto.

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

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

Se si utilizzano variabili statiche private nella class, le classi Static Inner della class possono raggiungere le variabili. Questo è perfettamente buono per la sicurezza del contesto.

Se una variabile è definita come statica pubblica, è ansible accedervi tramite il suo nome di class da qualsiasi class.

Di solito le funzioni sono definite come statiche pubbliche a cui è ansible accedere solo chiamando il nome della class di implementazione.

Un ottimo esempio di questo è il metodo sleep() nella class Thread

 Thread.sleep(2500); 

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

Un ottimo esempio di ciò è la definizione di connessioni o costanti di database che richiedono la dichiarazione di variabili come statiche private.

Un altro esempio comune è

 private static int numberOfCars=10; public static int returnNumber(){ return numberOfCars; } 

Sono nuovo di Java, ma un modo in cui utilizzo variabili statiche, come presumo molte persone, è quello di contare il numero di istanze della class. 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 class (che non capisco completamente), ma non sarà in un “modo statico”. Non ho idea se questa è la pratica migliore o no, ma ha senso per me.

*) Se una variabile è dichiarata come privata, non è visibile al di fuori della class. Viene chiamata datahiding.

*) Se una variabile è dichiarata statica, il valore della variabile è uguale per tutte le istanze e non è necessario creare un object per chiamare tale variabile. Possiamo chiamare tale variabile semplicemente

classname.variablename;

anche la variabile statica privata verrà condivisa in sottoclass. Se sei cambiato in una sottoclass e l’altra sottoclass 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 { } 

Le variabili ThreadLocal sono in genere implementate come private static. In questo modo, non sono legati alla class e ogni thread ha il proprio riferimento al proprio object “threadLocal”.

Nell’esempio seguente, l’ eye viene modificato da PersonB, mentre la leg rimane la stessa. Questo perché una variabile privata fa una copia di se stessa al 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 modificarne il 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