"Térjünk át egy új témára. Most a statikus változókról és módszerekről szeretnék beszélni."

"Ellie, már tanultam a statikus változókról és módszerekről. De szeretnék több részletet megtudni."

"Amikor változókat deklarálunk egy osztályban, akkor meghatározzuk, hogy ezek a változók csak egyszer jönnek-e létre, vagy az osztály minden példányának (objektumának) lesz saját másolata. Alapértelmezés szerint minden objektumhoz létrejön egy változó új másolata . Így néz ki:"

Osztálynyilatkozat
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Kód a módszerben:
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);
Képernyő kimenet
Oscar
Missy

"Annak ellenére, hogy ugyanabban az osztályban (Cat) vannak deklarálva, a cat1.nameés változók cat2.namekülönböző értékeket tartalmaznak, mert különböző objektumokra hivatkoznak."
"Ennek van értelme."
"A statikus változónak azonban csak egy példánya létezik egy osztály minden példányához, és azt az osztálynévvel kell elérni."

Osztálynyilatkozat
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
    }
}
Kód a fő módszerben:
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);
Képernyő kimenet:
0
1
Oscar
Missy
2

"Rendben, ennek is van értelme."

"A Java metódusok két kategóriába sorolhatók. A példánymetódusokat egy objektum hívja meg, és hozzáférésük van az objektum adataihoz. A statikus metódusoknak nincs ilyen hozzáférésük, mivel egyszerűen nincs objektumhivatkozásuk. Azonban hivatkozhatnak az objektumra. osztály statikus változói és egyéb statikus módszerek.

A statikus módszerek nem kezelhetnek nem statikus módszereket vagy nem statikus változókat!"

– Miért, Ellie?

"Minden példányváltozót egy objektum tartalmaz. Csak akkor érhető el, ha van hivatkozása az objektumra. Statikus metódusokhoz nem érhető el ilyen hivatkozás."

"A példánymetódusoknak van ilyen hivatkozása?"

"Igen, közvetetten adják át a példánymetódusoknak. Az objektumra való hivatkozás, amelyen egy példánymetódus meghívásra kerül, közvetetten átkerül a példánymetódushoz. A hivatkozást tároló változó neve ez . Ez lehetővé teszi, hogy a metódus mindig hozzáférjen az objektumhoz adatokat, vagy hívjon meg egy másik, nem statikus metódust ugyanazon az objektumon.

Objektumhivatkozás helyett nullát ad át a statikus metódusoknak. Ezért nem tudják kezelni a nem statikus változókat és metódusokat. Egyszerűen nincs hivatkozásuk ezekhez a változókhoz és metódusokhoz társított objektumra."

– Rendben, Ellie, megértem.

"Így működnek a nem statikus módszerek:

Hogy néz ki a kód
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Mi történik valójában
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Ha egy metódust az <object> dot <metódus neve> használatával hív meg, akkor valójában egy osztálymetódus hívja meg, és ugyanazt az objektumot adja át az első argumentumként. A metóduson belül az objektumot 'this'-nek hívják . A metódusban szereplő összes művelet ezen az objektumon és annak adatain történik."

"Íme, hogyan működnek a statikus módszerek:

Hogy néz ki a kód
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Mi történik valójában
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Ha statikus metódust hívunk meg, a rendszer nem ad át neki objektumot. Más szavakkal, "ez" egyenlő null . Ez az oka annak, hogy egy statikus metódus nem tud hozzáférni nem statikus változókhoz és metódusokhoz (mivel nincs mit átadnia a nem statikus metódusoknak).

"Egy változó vagy metódus statikus, ha előtte van a static kulcsszó."

– Miért van szükség ilyen módszerekre, ha ilyen szigorúan korlátozottak?

– Nos, az ilyen módszereknek megvannak az előnyei.

"Először is, nem kell objektumhivatkozást átadnunk a statikus metódusok és változók használatához. "

"Másodszor, néha szükség van egy változó egy példányára. Például System.out (a System osztály statikus out változója)."

"Harmadszor, néha meg kell hívnia egy metódust, mielőtt objektumokat tudna létrehozni."

– Ellie, tudnál erre példát mondani?

"Miért gondolod, hogy a main() metódus statikus? Statikus, így a programozó azonnal meghívhatja, miután betöltött egy osztályt a memóriába, még mielőtt bármilyen objektum létrejött volna."