"Lad os gå videre til et nyt emne. Nu vil jeg gerne diskutere statiske variabler og metoder."

"Ellie, jeg har allerede lært om statiske variabler og metoder. Men jeg vil gerne lære flere detaljer."

"Når vi erklærer variabler i en klasse, definerer vi, om disse variable skal oprettes én gang, eller om hver instans (objekt) af klassen vil have sin egen kopi. Som standard oprettes en ny kopi af en variabel for hvert objekt. . Sådan ser det ud:"

Klasseerklæring
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Kode i hovedmetoden :
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ærmudgang
Oscar
Missy

"På trods af at de er erklæret i samme klasse (Cat), indeholder variablerne cat1.nameog forskellige værdier, fordi de refererer til forskellige objekter." "Det giver mening." "Der findes dog kun én kopi af en statisk variabel for hver forekomst af en klasse, og den skal tilgås ved hjælp af klassenavnet."cat2.name

Klasseerklæring
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
    }
}
Kode i hovedmetoden:
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ærmudgang:
0
1
Oscar
Missy
2

"OK, det giver også mening."

"Java-metoder er opdelt i to kategorier. Forekomstmetoder kaldes på et objekt og har adgang til det objekts data. Statiske metoder har ikke den adgang, da de simpelthen ikke har en objektreference. De kan dog referere til klassens statiske variable og andre statiske metoder.

Statiske metoder kan ikke adressere ikke-statiske metoder eller ikke-statiske variabler!"

"Hvorfor er det, Ellie?"

"Hver instansvariabel er indeholdt i et objekt. Den kan kun tilgås, hvis du har en reference til det objekt. En sådan reference er ikke tilgængelig for en statisk metode."

"Har instansmetoder sådan en reference?"

"Ja, den videregives indirekte til instansmetoder. En reference til objektet, som en instansmetode kaldes på, videregives indirekte til instansmetoden. Variablen, der gemmer denne reference, kaldes denne . Dette gør det muligt for metoden altid at få adgang til objektets data eller kalde en anden ikke-statisk metode på det samme objekt.

I stedet for en objektreference videregives null til statiske metoder. Det er derfor, de ikke kan adressere ikke-statiske variabler og metoder. De har simpelthen ikke en reference til et objekt forbundet med disse variabler og metoder."

"Ok, Ellie, jeg forstår det."

"Sådan fungerer ikke-statiske metoder:

Hvordan ser koden ud
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Hvad sker der virkelig
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Når du kalder en metode ved hjælp af <objekt> prik <metodenavn>, kalder du faktisk en klassemetode og sender det samme objekt som det første argument. Inde i metoden kaldes objektet 'dette' . Alle handlinger i metoden udføres på dette objekt og dets data."

"Sådan fungerer statiske metoder:

Hvordan ser koden ud
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Hvad sker der virkelig
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Når du kalder en statisk metode, sendes intet objekt til den. Med andre ord er 'dette' lig med null . Det er derfor, en statisk metode ikke kan få adgang til ikke-statiske variabler og metoder (da den ikke har noget, der implicit kan overføres til ikke-statiske metoder)."

"En variabel eller metode er statisk, hvis den har nøgleordet static foran sig."

"Hvorfor er sådanne metoder nødvendige, hvis de er så stærkt begrænsede?"

"Tja, sådanne metoder har deres fordele."

"For det første behøver vi ikke sende en objektreference for at bruge statiske metoder og variabler. "

"For det andet er det nogle gange nødvendigt at have én og kun én kopi af en variabel. For eksempel System.out (den statiske ud-variabel i System-klassen)."

"For det tredje, nogle gange skal du kalde en metode, før du er i stand til at skabe objekter."

"Ellie, kan du give mig et eksempel på dette?"

"Hvorfor tror du, at main() -metoden er statisk? Den er statisk, så programmøren kan kalde den umiddelbart efter indlæsning af en klasse i hukommelsen, før nogen objekter er blevet oprettet."