1. Variabile statice

Când o clasă este încărcată în memorie, un obiect static este creat imediat. Acest obiect stochează variabile de clasă statică (câmpuri de clasă statică). Obiectul static există chiar dacă nu au fost create obiecte obișnuite (non-statice) ale clasei.

Când declarăm variabile într-o clasă, indicăm dacă acestea vor fi create o singură dată sau dacă ar trebui să existe instanțe distincte ale acestor variabile în fiecare obiect. În mod implicit, o nouă copie a fiecărei variabile este creată pentru fiecare obiect.

O variabilă statică este legată de obiectul static al clasei și există întotdeauna o singură instanță a acesteia.

Pentru a crea o variabilă statică într-o clasă, trebuie să scrieți staticcuvântul cheie înaintea numelui său. Formatul general pentru declararea unei variabile statice este:

static Type name = value;

Dacă unei variabile statice nu i se atribuie o valoare inițială, aceasta este inițializată cu o valoare implicită:

Tip Valoare implicită
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(același lucru ca
0
)
boolean
false
Object
și orice cursuri
null

Exemple:

Cod Notă
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

În interiorul unei clase, vă puteți referi la variabilele sale statice pur și simplu folosind numele acestora. Dar pentru a le accesa dintr-o altă clasă, trebuie să scrieți numele clasei înainte de numele variabilei statice.

ClassName.variable

Exemplu:

Variabil Clasă Accesarea unei variabile în afara clasei sale
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Variabila este private. Nu este vizibil în afara clasei.
private static int count = 0;
Counter
Variabila este private. Nu este vizibil în afara clasei.
private static boolean flag;
Arithmetic
Variabila este private. Nu este vizibil în afara clasei.


2. Diferența dintre variabilele statice și nestatice

Variabilele non-statice (obișnuite) ale unei clase sunt declarate în același mod ca și cele statice, doar fără cuvântul staticcheie.

Care este diferența dintre variabilele obișnuite și variabilele statice?

Variabilele obișnuite ale unei clase sunt legate de obiectele clasei (instanțe ale clasei), în timp ce variabilele statice sunt legate de obiectul static al clasei.

Dacă există mai multe instanțe ale unei clase, fiecare dintre ele are propria sa copie a variabilelor non-statice (obișnuite). Variabilele statice ale unei clase sunt întotdeauna stocate în obiectul său static și există doar o singură instanță a acestora.

Puteți accesa variabilele (câmpurile) obișnuite ale unei clase doar dacă aveți o referință la un obiect al clasei. Și metodele din interiorul clasei, desigur.

Exemplu:

Accesarea unui câmp al unei clase folosind o referință de obiect
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);
   }
}

Puteți accesa variabile statice de oriunde (după luarea în considerare a modificatorilor de vizibilitate): din metode obișnuite, din metode statice din aceeași clasă, din metode din alte clase etc.

Exemplu:

Accesarea unui câmp static al unei clase fără a utiliza o referință la obiect
public class DataInfo
{
   public static int value = 100;
}

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

Cum este organizată memoria:

Să presupunem că avem o Personclasă cu 4 câmpuri: două sunt statice și două nu.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Imediat după încărcarea clasei

Când mașina Java a terminat de încărcat Personclasa, memoria va arăta astfel:

După crearea primului obiect

Dacă creăm un Personobiect, atunci imaginea devine astfel:

Diferența dintre variabilele statice și nestatice 2

Vă rugăm să rețineți că, deși ambele obiecte au două variabile, acestea sunt variabile diferite: obiectele obișnuite au variabile obișnuite, iar obiectul static are variabilele statice.

Avem nevoie de mai multe obiecte

Să mai creăm două Personobiecte. Acum memoria va arăta astfel:

Diferența dintre variabilele statice și nestatice 3

Vă rugăm să rețineți că fiecare obiect are propriile sale variabile de vârstă și nume.



3. Eliminarea și adăugarea staticmodificatorului

De la static la obișnuit

Ce se întâmplă dacă luăm o variabilă statică și o transformăm într-una obișnuită prin eliminarea staticmodificatorului ei? De exemplu, static int sumvariabila.

Codul modificat va arăta astfel:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

Acum memoria arată așa:

Diferența dintre variabilele statice și non-statice

Variabila statică a dispărut din obiectul static, iar acum fiecare obiect obișnuit are propria sa sumvariabilă.

De la obișnuit la static

Putem face opusul: adăugați modificatorul staticla variabilele obișnuite ale unei clase. Ele vor dispărea din toate obiectele obișnuite și vor apărea în obiectul static. Să presupunem că decidem să facem variabilele ageși namestatice. Apoi codul va arăta astfel:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

Și acum memoria va arăta așa:

Eliminarea și adăugarea modificatorului static