"Passiamo a un nuovo argomento. Ora vorrei discutere di variabili e metodi statici."

"Ellie, ho già imparato a conoscere le variabili ei metodi statici. Ma mi piacerebbe saperne di più sui dettagli."

"Quando dichiariamo variabili in una classe, definiamo se queste variabili verranno create solo una volta o se ogni istanza (oggetto) della classe avrà la propria copia. Per impostazione predefinita, viene creata una nuova copia di una variabile per ogni oggetto Ecco come appare:"

Dichiarazione di classe
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Codice nel metodo principale :
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);
Uscita sullo schermo
Oscar
Missy

"Nonostante siano dichiarate nella stessa classe (Cat), le variabili cat1.namee cat2.namecontengono valori diversi perché fanno riferimento a oggetti diversi."
"Ciò ha senso."
"Tuttavia, esiste solo una copia di una variabile statica per ogni istanza di una classe, ed è necessario accedervi utilizzando il nome della classe."

Dichiarazione di classe
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
    }
}
Codice nel metodo principale:
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);
Uscita sullo schermo:
0
1
Oscar
Missy
2

"OK, anche questo ha senso."

"I metodi Java sono divisi in due categorie. I metodi di istanza vengono chiamati su un oggetto e hanno accesso ai dati di quell'oggetto. I metodi statici non hanno tale accesso, poiché semplicemente non hanno un riferimento all'oggetto. Tuttavia, possono fare riferimento al variabili statiche della classe e altri metodi statici.

I metodi statici non possono indirizzare metodi non statici o variabili non statiche!"

"Perché è così, Ellie?"

"Ogni variabile di istanza è contenuta in un oggetto. È possibile accedervi solo se si dispone di un riferimento a quell'oggetto. Nessun riferimento di questo tipo è disponibile per un metodo statico."

"I metodi di istanza hanno un tale riferimento?"

"Sì, viene passato indirettamente ai metodi di istanza. Un riferimento all'oggetto su cui viene chiamato un metodo di istanza viene passato indirettamente al metodo di istanza. La variabile che memorizza questo riferimento si chiama this . Ciò consente al metodo di accedere sempre all'oggetto data o chiamare un altro metodo non statico sullo stesso oggetto.

Invece di un riferimento a un oggetto, null viene passato ai metodi statici. Ecco perché non possono indirizzare variabili e metodi non statici. Semplicemente non hanno un riferimento a un oggetto associato a queste variabili e metodi."

"Va bene, Ellie, lo capisco."

"Ecco come funzionano i metodi non statici:

Come appare il codice
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Cosa succede davvero
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Quando chiami un metodo usando <oggetto> punto <nome metodo>, in realtà stai chiamando un metodo di classe e passando lo stesso oggetto come primo argomento. All'interno del metodo, l'oggetto si chiama 'this' . Tutte le operazioni nel metodo vengono eseguite su questo oggetto e sui suoi dati."

"Ecco come funzionano i metodi statici:

Come appare il codice
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Cosa succede davvero
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Quando chiami un metodo statico, non gli viene passato alcun oggetto. In altre parole, 'this' è uguale a null . Ecco perché un metodo statico non può accedere a variabili e metodi non statici (poiché non ha nulla da passare implicitamente a metodi non statici)."

"Una variabile o un metodo è statico se ha davanti la parola chiave static."

"Perché sono necessari tali metodi se sono così severamente limitati?"

"Beh, questi metodi hanno i loro vantaggi."

"In primo luogo, non dobbiamo passare un riferimento a un oggetto per utilizzare metodi e variabili statici. "

"Secondo, a volte è necessario avere una e una sola copia di una variabile. Ad esempio, System.out (la variabile out statica della classe System)."

"In terzo luogo, a volte è necessario chiamare un metodo prima di poter creare oggetti."

"Ellie, puoi farmi un esempio di questo?"

"Perché pensi che il metodo main () sia statico? È statico, quindi il programmatore può chiamarlo immediatamente dopo aver caricato una classe in memoria, prima che qualsiasi oggetto sia stato creato."