"Să trecem la un subiect nou. Acum, aș dori să discut despre variabile și metode statice."

„Ellie, am învățat deja despre variabilele și metodele statice. Dar aș dori să aflu mai multe detalii.”

„Când declarăm variabile într-o clasă, definim dacă aceste variabile vor fi create o singură dată sau dacă fiecare instanță (obiect) a clasei va avea propria sa copie. În mod implicit, o nouă copie a unei variabile este creată pentru fiecare obiect. . Așa arată:"

Declarație de clasă
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Cod în metoda principală :
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Ieșire pe ecran
Oscar
Missy

„În ciuda faptului că sunt declarate în aceeași clasă (Cat), variabilele cat1.nameși cat2.nameconțin valori diferite, deoarece fac referire la obiecte diferite.”
"Are sens."
„Cu toate acestea, există o singură copie a unei variabile statice pentru fiecare instanță a unei clase și trebuie accesată folosind numele clasei.”

Declarație de clasă
class Cat                   // Сlass
{
    String name;            // Instance (non-static) variable
    static int catCount;    // Static variable

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   // Increment the static variable by 1
    }
}
Cod în metoda principală:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
Ieșire ecran:
0
1
Oscar
Missy
2

„OK, și asta are sens”.

„Metodele Java sunt împărțite în două categorii. Metodele de instanță sunt apelate pe un obiect și au acces la datele acelui obiect. Metodele statice nu au acest acces, deoarece pur și simplu nu au o referință la obiect. Cu toate acestea, pot face referire la variabilele statice ale clasei și alte metode statice.

Metodele statice nu pot aborda metode non-statice sau variabile non-statice!"

— De ce, Ellie?

„Fiecare variabilă de instanță este conținută într-un obiect. Poate fi accesată numai dacă aveți o referință la acel obiect. Nicio referință nu este disponibilă pentru o metodă statică.”

„Metodele de instanță au o astfel de referință?”

„Da, este transmisă indirect metodelor de instanță. O referință la obiectul pe care este apelată o metodă de instanță este transmisă indirect metodei de instanță. Variabila care stochează această referință se numește this . Acest lucru permite metodei să acceseze întotdeauna obiectul date sau apelați o altă metodă non-statică pe același obiect.

În loc de referință la obiect, null este transmis metodelor statice. De aceea nu pot aborda variabile și metode non-statice. Pur și simplu nu au o referință la un obiect asociat cu aceste variabile și metode.”

— Bine, Ellie, înțeleg asta.

„Așa funcționează metodele non-statice:

Cum arată codul
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Ce se întâmplă cu adevărat
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Când apelați o metodă folosind <obiect> punct <nume metodă>, de fapt apelați o metodă de clasă și treceți același obiect ca prim argument. În interiorul metodei, obiectul este numit „acest lucru” . Toate operațiunile din metodă sunt efectuate asupra acestui obiect și a datelor sale.”

„Iată cum funcționează metodele statice:

Cum arată codul
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Ce se întâmplă cu adevărat
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Când apelați o metodă statică, nu i se trece niciun obiect. Cu alte cuvinte, „acest lucru” este egal cu null . De aceea o metodă statică nu poate accesa variabile și metode non-statice (din moment ce nu are nimic de transmis implicit la metode non-statice)."

„O variabilă sau o metodă este statică dacă are cuvântul cheie static în fața ei.”

„De ce sunt necesare astfel de metode dacă sunt atât de sever limitate?”

„Ei bine, astfel de metode au beneficiile lor.”

„În primul rând, nu trebuie să transmitem o referință la obiect pentru a folosi metode și variabile statice.

„În al doilea rând, uneori este necesar să existe una și o singură copie a unei variabile. De exemplu, System.out (variabila static out a clasei System).”

"Third, sometimes you need to call a method before you are able to create objects."

"Ellie, can you give me an example of this?"

"Why do you think the main() method is static? It's static so the programmer can call it immediately after loading a class into memory, before any objects have been created."