"La oss gå videre til et nytt emne. Nå vil jeg gjerne diskutere statiske variabler og metoder."

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

"Når vi erklærer variabler i en klasse, definerer vi om disse variablene skal opprettes bare én gang, eller om hver forekomst (objekt) av klassen skal ha sin egen kopi. Som standard opprettes en ny kopi av en variabel for hvert objekt . Slik ser det ut:"

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);
Skjermutgang
Oscar
Missy

"Til tross for at de er erklært i samme klasse (Cat), inneholder variablene cat1.nameog cat2.nameforskjellige verdier fordi de refererer til forskjellige objekter."
"Det gir mening."
"Men det finnes bare én kopi av en statisk variabel for hver forekomst av en klasse, og den må nås ved å bruke klassenavnet."

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);
Skjermutgang:
0
1
Oscar
Missy
2

"OK, det gir også mening."

"Java-metoder er delt inn i to kategorier. Forekomstmetoder kalles på et objekt og har tilgang til objektets data. Statiske metoder har ikke den tilgangen, siden de rett og slett ikke har en objektreferanse. De kan imidlertid referere til klassens statiske variabler og andre statiske metoder.

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

"Hvorfor er det det, Ellie?"

"Hver forekomstvariabel er inneholdt i et objekt. Den kan bare nås hvis du har en referanse til det objektet. Ingen slik referanse er tilgjengelig for en statisk metode."

"Har instansmetoder en slik referanse?"

"Ja, den sendes indirekte til instansmetoder. En referanse til objektet som en instansmetode kalles på, sendes indirekte til instansmetoden. Variabelen som lagrer denne referansen kalles denne . Dette gjør at metoden alltid får tilgang til objektets data eller kalle en annen ikke-statisk metode på samme objekt.

I stedet for en objektreferanse, sendes null til statiske metoder. Det er derfor de ikke kan adressere ikke-statiske variabler og metoder. De har rett og slett ikke en referanse til et objekt knyttet til disse variablene og metodene."

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

"Slik fungerer ikke-statiske metoder:

Hvordan ser koden ut
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Hva skjer egentlig
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Når du kaller en metode ved å bruke <objekt> punkt <metodenavn>, kaller du faktisk en klassemetode og sender det samme objektet som det første argumentet. Inne i metoden kalles objektet 'dette' . Alle operasjoner i metoden utføres på dette objektet og dets data."

"Slik fungerer statiske metoder:

Hvordan ser koden ut
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Hva skjer egentlig
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Når du kaller en statisk metode, sendes ingen objekter til den. Med andre ord, "dette" er lik null . Det er derfor en statisk metode ikke kan få tilgang til ikke-statiske variabler og metoder (siden den ikke har noe å implisitt overføre til ikke-statiske metoder).

"En variabel eller metode er statisk hvis den har nøkkelordet static foran seg."

"Hvorfor trengs slike metoder hvis de er så sterkt begrenset?"

"Vel, slike metoder har sine fordeler."

"For det første trenger vi ikke sende en objektreferanse for å bruke statiske metoder og variabler. "

"For det andre er det noen ganger nødvendig å ha én og bare én kopi av en variabel. For eksempel System.out (den statiske ut-variabelen til System-klassen)."

"For det tredje, noen ganger må du kalle en metode før du er i stand til å lage objekter."

"Ellie, kan du gi meg et eksempel på dette?"

"Hvorfor tror du main() -metoden er statisk? Den er statisk, slik at programmereren kan kalle den umiddelbart etter at en klasse er lastet inn i minnet, før noen objekter har blitt opprettet."