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 staticparola 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
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(la stessa cosa di
0
)
boolean
false
Object
e qualsiasi classe
null

Esempi:

Codice Nota
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

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
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
La variabile è private. Non è visibile al di fuori della classe.
private static int count = 0;
Counter
La variabile è private. Non è visibile al di fuori della classe.
private static boolean flag;
Arithmetic
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 staticparola 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
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

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
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Come è organizzata la memoria:

Diciamo di avere una Personclasse 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 Personclasse, la memoria sarà simile a questa:

Dopo aver creato il primo oggetto

Se creiamo un Personoggetto, allora l'immagine diventa questa:

Differenza tra variabili statiche e non statiche 2

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 Personoggetti. Ora la memoria sarà simile a questa:

Differenza tra variabili statiche e non statiche 3

Si prega di notare che ogni oggetto ha le proprie variabili età e nome.



3. Rimozione e aggiunta del staticmodificatore

Da statico a ordinario

Cosa succede se prendiamo una variabile statica e la trasformiamo in una normale rimuovendo il suo staticmodificatore? Ad esempio, la static int sumvariabile.

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:

Differenza tra variabili statiche e non statiche

La variabile statica è scomparsa dall'oggetto statico e ora ogni oggetto ordinario ha la sua sumvariabile.

Da ordinario a statico

Possiamo fare il contrario: aggiungere il staticmodificatore 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 agee 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ì:

Rimozione e aggiunta del modificatore statico