The static Keyword
Scrii public static void main încă din prima zi, dar nu te-ai întrebat niciodată cu adevărat ce înseamnă static. E momentul să afli
Cuvântul-cheie static înseamnă „asta aparține clasei însăși, nu vreunui obiect individual"
Câmpuri Static vs Câmpuri de Instanță
Imaginează-ți un club de noapte din Vice City care ține evidența vizitatorilor. Fiecare vizitator are propriul nume, dar numărul total de vizite este partajat între toți: aparține clubului, nu vreunei persoane:
class Vizitator {
String nume;
static int totalVizite = 0;
Vizitator(String nume) {
this.nume = nume;
totalVizite++;
}
}
public class Main {
public static void main(String[] args) {
Vizitator v1 = new Vizitator("Tommy");
Vizitator v2 = new Vizitator("Lance");
Vizitator v3 = new Vizitator("Cortez");
System.out.println("Total vizite: " + Vizitator.totalVizite);
}
}
Afișează
Total vizite: 3
Observă câteva lucruri:
totalViziteestestatic: există o singură copie partajată de toate obiectele Vizitator- De fiecare dată când creăm un nou Vizitator, constructorul mărește
totalVizitecu 1 - Îl accesăm cu
Vizitator.totalVizite(numele clasei), nu cuv1.totalVizite
Între timp, nume este un câmp de instanță: fiecare vizitator are propriul lui nume
Metode Statice
Metodele statice aparțin și ele clasei. Le-ai folosit tot timpul:
public class Main {
public static void main(String[] args) {
int maiMare = Math.max(10, 20); // Math este clasa, max este o metoda statica
}
}
Nu creezi un obiect Math ca să folosești max(). Este un utilitar care nu are nevoie de starea vreunui obiect
Iată cum să scrii propria ta versiune:
class AjutorMate {
static int patrat(int n) {
return n * n;
}
static int aduna(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(AjutorMate.patrat(5));
System.out.println(AjutorMate.aduna(3, 7));
}
}
Afișează
25
10
Niciun obiect necesar. Apelează-le direct pe clasă
De Ce Este main() Static?
Când pornește programul tău, încă nu există niciun obiect. Java are nevoie de o cale de a începe execuția fără să creeze mai întâi un obiect. De asta este main static: este o metodă la nivel de clasă care rulează fără să aibă nevoie de o instanță
public class Main {
public static void main(String[] args) {
// Asta ruleaza prima. Niciun obiect nu exista inca.
// De aici, CREEZI obiecte si le apelezi metodele.
}
}
Static Nu Poate Accesa Instanța
O metodă statică nu are this: nu există niciun obiect asociat cu ea. Așa că nu poate accesa câmpuri de instanță sau metode de instanță:
class Exemplu {
int x = 10; // camp de instanta
static int y = 20; // camp static
static void afiseaza() {
System.out.println(y); // OK - y este static
// System.out.println(x); // EROARE - x are nevoie de un obiect
}
void arata() {
System.out.println(x); // OK - metoda de instanta are un obiect
System.out.println(y); // OK - campurile statice sunt mereu accesibile
}
}
Regula: instanța poate accesa static-ul, dar static-ul nu poate accesa instanța. Gândește-te așa: clasa există chiar și când nu există niciun obiect, deci codul static nu poate presupune că vreun obiect este prin preajmă
Numărarea Instanțelor: Un Tipar Clasic
Folosirea unui câmp static pentru a urmări câte obiecte au fost create este unul dintre cele mai comune tipare statice:
class Inamic {
String tip;
static int numarInamici = 0;
Inamic(String tip) {
this.tip = tip;
numarInamici++;
}
}
public class Main {
public static void main(String[] args) {
Inamic e1 = new Inamic("Goon");
Inamic e2 = new Inamic("Boss");
Inamic e3 = new Inamic("Sniper");
Inamic e4 = new Inamic("Goon");
System.out.println("Inamici aparuti: " + Inamic.numarInamici);
}
}
Afișează
Inamici aparuti: 4
Misiune: Lista de la Intrarea Clubului
Clubul Malibu al lui Tommy ține evidența cui intră. Fiecare vizitator are numele lui, dar numărul total de intrări este partajat: aparține clubului, nu vreunei persoane.
Creează o clasă Vizitator cu:
- Un câmp de instanță
String nume - Un câmp
static int totalVizitecare începe de la 0 - Un constructor care primește un nume și incrementează
totalVizite
În main, stochează numele vizitatorilor într-un array String[] nume (pornește cu "Tommy", "Lance", "Cortez"). Parcurge array-ul cu o buclă și creează câte un Vizitator pentru fiecare nume. Apoi afișează numărul total de vizite.
Exemplu: trei vizitatori înregistrați la intrare
3