"Låt oss gå vidare till ett nytt ämne. Nu skulle jag vilja diskutera statiska variabler och metoder."

"Ellie, jag har redan lärt mig om statiska variabler och metoder. Men jag skulle vilja lära mig mer detaljer."

"När vi deklarerar variabler i en klass, definierar vi om dessa variabler ska skapas bara en gång, eller om varje instans (objekt) av klassen kommer att ha sin egen kopia. Som standard skapas en ny kopia av en variabel för varje objekt . Så här ser det ut:"

Klassdeklaration
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Kod i huvudmetoden :
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);
Skärmutgång
Oscar
Missy

"Trots att de deklareras i samma klass (Cat), innehåller variablerna cat1.nameoch cat2.nameolika värden eftersom de refererar till olika objekt."
"Det känns logiskt."
"Men det finns bara en kopia av en statisk variabel för varje instans av en klass, och den måste nås med klassnamnet."

Klassdeklaration
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
    }
}
Kod i huvudmetoden:
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);
Skärmutgång:
0
1
Oscar
Missy
2

"Ok, det är också vettigt."

"Java-metoder är indelade i två kategorier. Instansmetoder anropas på ett objekt och har tillgång till objektets data. Statiska metoder har inte den åtkomsten, eftersom de helt enkelt inte har en objektreferens. De kan dock referera till klassens statiska variabler och andra statiska metoder.

Statiska metoder kan inte adressera icke-statiska metoder eller icke-statiska variabler!"

"Varför är det så, Ellie?"

"Varje instansvariabel finns i ett objekt. Den kan endast nås om du har en referens till det objektet. Ingen sådan referens är tillgänglig för en statisk metod."

"Har instansmetoder en sådan referens?"

"Ja, den skickas indirekt till instansmetoder. En referens till objektet som en instansmetod anropas på skickas indirekt till instansmetoden. Variabeln som lagrar denna referens kallas denna . Detta gör att metoden alltid kan komma åt objektets data eller anropa en annan icke-statisk metod på samma objekt.

Istället för en objektreferens skickas null till statiska metoder. Det är därför de inte kan adressera icke-statiska variabler och metoder. De har helt enkelt inte en referens till ett objekt som är associerat med dessa variabler och metoder."

"Okej, Ellie, jag förstår det."

"Så här fungerar icke-statiska metoder:

Hur koden ser ut
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Vad händer egentligen
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
När du anropar en metod med <objekt> punkt <metodnamn>, anropar du faktiskt en klassmetod och skickar samma objekt som det första argumentet. Inuti metoden kallas objektet 'detta' . Alla operationer i metoden utförs på detta objekt och dess data."

"Så här fungerar statiska metoder:

Hur koden ser ut
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Vad händer egentligen
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
När du anropar en statisk metod skickas inget objekt till den. Med andra ord, "detta" är lika med null . Det är därför en statisk metod inte kan komma åt icke-statiska variabler och metoder (eftersom den inte har något att implicit överföra till icke-statiska metoder)."

"En variabel eller metod är statisk om den har nyckelordet static framför sig."

"Varför behövs sådana metoder om de är så kraftigt begränsade?"

"Tja, sådana metoder har sina fördelar."

"För det första behöver vi inte skicka en objektreferens för att använda statiska metoder och variabler. "

"För det andra är det ibland nödvändigt att ha en och endast en kopia av en variabel. Till exempel System.out (den statiska ut-variabeln i klassen System)."

"För det tredje, ibland behöver du anropa en metod innan du kan skapa objekt."

"Ellie, kan du ge mig ett exempel på detta?"

"Varför tror du att main() -metoden är statisk? Den är statisk så att programmeraren kan anropa den direkt efter att ha laddat en klass i minnet, innan några objekt har skapats."