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 static
cuvâ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ă |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(același lucru ca
) |
|
|
și orice cursuri |
|
Exemple:
Cod | Notă |
---|---|
|
|
|
|
|
|
|
|
|
Î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 |
---|---|---|
|
|
|
|
|
|
|
|
Variabila este private . Nu este vizibil în afara clasei. |
|
|
Variabila este private . Nu este vizibil în afara clasei. |
|
|
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 static
cheie.
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 |
---|
|
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 |
---|
|
Cum este organizată memoria:
Să presupunem că avem o Person
clasă 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 Person
clasa, memoria va arăta astfel:
După crearea primului obiect
Dacă creăm un Person
obiect, atunci imaginea devine astfel:
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ă Person
obiecte. Acum memoria va arăta astfel:
Vă rugăm să rețineți că fiecare obiect are propriile sale variabile de vârstă și nume.
3. Eliminarea și adăugarea static
modificatorului
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 static
modificatorului ei? De exemplu, static int sum
variabila.
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:
Variabila statică a dispărut din obiectul static, iar acum fiecare obiect obișnuit are propria sa sum
variabilă.
De la obișnuit la static
Putem face opusul: adăugați modificatorul static
la 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 name
statice. 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:

GO TO FULL VERSION