1. Variabili statiche
Quando una classe viene caricata in memoria, viene creato immediatamente un oggetto statico . Questo oggetto memorizza variabili di classe statiche (campi di classe statici). L'oggetto statico esiste anche se non sono stati creati oggetti ordinari (non statici) della classe.
Quando dichiariamo variabili in una classe, indichiamo se verranno create solo una volta o se dovrebbero esserci istanze distinte di queste variabili in ogni oggetto. Per impostazione predefinita, viene creata una nuova copia di ogni variabile per ogni oggetto.
Una variabile statica è legata all'oggetto statico della classe e ne esiste sempre una singola istanza.
Per creare una variabile statica in una classe, devi scrivere la static
parola chiave prima del suo nome. Il formato generale per dichiarare una variabile statica è:
static Type name = value;
Se a una variabile statica non viene assegnato un valore iniziale, viene inizializzata con un valore predefinito:
Tipo | Valore di default |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(la stessa cosa di
) |
|
|
e qualsiasi classe |
|
Esempi:
Codice | Nota |
---|---|
|
|
|
|
|
|
|
|
|
All'interno di una classe, puoi fare riferimento alle sue variabili statiche semplicemente usando i loro nomi. Ma per accedervi da un'altra classe, devi scrivere il nome della classe prima del nome della variabile statica.
ClassName.variable
Esempio:
Variabile | Classe | Accesso a una variabile al di fuori della sua classe |
---|---|---|
|
|
|
|
|
|
|
|
La variabile è private . Non è visibile al di fuori della classe. |
|
|
La variabile è private . Non è visibile al di fuori della classe. |
|
|
La variabile è private . Non è visibile al di fuori della classe. |
2. Differenza tra variabili statiche e non statiche
Le variabili non statiche (ordinarie) di una classe sono dichiarate allo stesso modo di quelle statiche, solo senza la static
parola chiave.
Qual è la differenza tra variabili ordinarie e variabili statiche?
Le variabili ordinarie di una classe sono legate agli oggetti della classe (istanze della classe), mentre le variabili statiche sono legate all'oggetto statico della classe.
Se sono presenti più istanze di una classe, ognuna di esse ha la propria copia delle variabili non statiche (ordinarie). Le variabili statiche di una classe sono sempre memorizzate nel suo oggetto statico ed esiste solo una singola istanza di esse.
Puoi accedere alle variabili ordinarie (campi) di una classe solo se hai un riferimento a un oggetto della classe. E all'interno dei metodi della classe, ovviamente.
Esempio:
Accesso a un campo di una classe utilizzando un riferimento a un oggetto |
---|
|
Puoi accedere alle variabili statiche da qualsiasi luogo (dopo aver tenuto conto dei modificatori di visibilità): da metodi ordinari, da metodi statici della stessa classe, da metodi di altre classi, ecc.
Esempio:
Accesso a un campo statico di una classe senza utilizzare un riferimento a un oggetto |
---|
|
Come è organizzata la memoria:
Diciamo di avere una Person
classe con 4 campi: due sono statici e due no.
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
Subito dopo aver caricato la classe
Quando la macchina Java ha finito di caricare la Person
classe, la memoria sarà simile a questa:
Dopo aver creato il primo oggetto
Se creiamo un Person
oggetto, allora l'immagine diventa questa:
Si noti che sebbene entrambi gli oggetti abbiano due variabili, si tratta di variabili diverse: gli oggetti ordinari hanno variabili ordinarie e l'oggetto statico ha le variabili statiche.
Abbiamo bisogno di più oggetti
Creiamo altri due Person
oggetti. Ora la memoria sarà simile a questa:
Si prega di notare che ogni oggetto ha le proprie variabili età e nome.
3. Rimozione e aggiunta del static
modificatore
Da statico a ordinario
Cosa succede se prendiamo una variabile statica e la trasformiamo in una normale rimuovendo il suo static
modificatore? Ad esempio, la static int sum
variabile.
Il codice modificato sarà simile al seguente:
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
Ora la memoria ha questo aspetto:
La variabile statica è scomparsa dall'oggetto statico e ora ogni oggetto ordinario ha la sua sum
variabile.
Da ordinario a statico
Possiamo fare il contrario: aggiungere il static
modificatore alle variabili ordinarie di una classe. Scompariranno da tutti gli oggetti ordinari e appariranno nell'oggetto statico. Supponiamo di decidere di rendere statiche le variabili age
e name
. Quindi il codice sarà simile a questo:
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
E ora la memoria sarà così:
GO TO FULL VERSION