"Mari kita beralih kepada topik baharu. Sekarang, saya ingin membincangkan pembolehubah statik dan kaedah."

"Ellie, saya sudah belajar tentang pembolehubah statik dan kaedah. Tetapi saya ingin mengetahui lebih banyak butiran."

"Apabila kami mengisytiharkan pembolehubah dalam kelas, kami menentukan sama ada pembolehubah ini akan dibuat sekali sahaja, atau jika setiap contoh (objek) kelas akan mempunyai salinannya sendiri. Secara lalai, salinan baharu pembolehubah dicipta untuk setiap objek . Beginilah rupanya:"

Pengisytiharan kelas
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Kod dalam kaedah utama :
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);
Output skrin
Oscar
Missy

"Walaupun diisytiharkan dalam kelas yang sama (Cat), pembolehubah cat1.namedan cat2.namemengandungi nilai yang berbeza kerana ia merujuk objek yang berbeza."
"Yang masuk akal."
"Walau bagaimanapun, hanya satu salinan pembolehubah statik wujud untuk setiap contoh kelas, dan ia mesti diakses menggunakan nama kelas."

Pengisytiharan kelas
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 dalam kaedah utama:
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);
Output skrin:
0
1
Oscar
Missy
2

"OK, itu juga masuk akal."

"Kaedah Java dibahagikan kepada dua kategori. Kaedah contoh dipanggil pada objek dan mempunyai akses kepada data objek itu. Kaedah statik tidak mempunyai akses itu, kerana mereka tidak mempunyai rujukan objek. Walau bagaimanapun, mereka boleh merujuk pembolehubah statik kelas dan kaedah statik lain.

Kaedah statik tidak boleh menangani kaedah bukan statik atau pembolehubah bukan statik!"

"Kenapa ni, Ellie?"

"Setiap pembolehubah contoh terkandung dalam objek. Ia boleh diakses hanya jika anda mempunyai rujukan kepada objek itu. Tiada rujukan sedemikian tersedia untuk kaedah statik."

"Adakah kaedah contoh mempunyai rujukan sedemikian?"

"Ya, ia dihantar kepada kaedah instance secara tidak langsung. Rujukan kepada objek di mana kaedah instance dipanggil secara tidak langsung dihantar ke kaedah instance. Pembolehubah yang menyimpan rujukan ini dipanggil ini . Ini membenarkan kaedah untuk sentiasa mengakses objek data atau panggil kaedah bukan statik lain pada objek yang sama.

Daripada rujukan objek, null dihantar kepada kaedah statik. Itulah sebabnya mereka tidak dapat menangani pembolehubah dan kaedah bukan statik. Mereka tidak mempunyai rujukan kepada objek yang dikaitkan dengan pembolehubah dan kaedah ini."

"OK, Ellie, saya faham."

"Beginilah cara kaedah bukan statik berfungsi:

Bagaimana rupa kod itu
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Apa sebenarnya yang berlaku
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Apabila anda memanggil kaedah menggunakan <object> dot <method name>, anda sebenarnya memanggil kaedah kelas dan menghantar objek yang sama seperti hujah pertama. Di dalam kaedah, objek dipanggil 'ini' . Semua operasi dalam kaedah dilakukan pada objek ini dan datanya."

"Begini cara kaedah statik berfungsi:

Bagaimana rupa kod itu
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Apa sebenarnya yang berlaku
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Apabila anda memanggil kaedah statik, tiada objek dihantar kepadanya. Dalam erti kata lain, 'ini' sama dengan null . Itulah sebabnya kaedah statik tidak boleh mengakses pembolehubah dan kaedah bukan statik (kerana ia tidak mempunyai apa-apa untuk dihantar secara tersirat kepada kaedah bukan statik)."

"Pembolehubah atau kaedah adalah statik jika ia mempunyai kata kunci statik di hadapannya."

"Mengapa kaedah sedemikian diperlukan jika ia sangat terhad?"

"Nah, kaedah sedemikian mempunyai faedahnya."

"Pertama, kita tidak perlu menghantar rujukan objek untuk menggunakan kaedah statik dan pembolehubah. "

"Kedua, kadangkala perlu mempunyai satu dan hanya satu salinan pembolehubah. Contohnya, System.out (pembolehubah statik keluar kelas Sistem)."

"Ketiga, kadangkala anda perlu memanggil kaedah sebelum anda dapat mencipta objek."

"Ellie, boleh awak berikan saya contoh tentang ini?"

"Mengapa anda fikir kaedah main() adalah statik? Ia statik supaya pengaturcara boleh memanggilnya serta-merta selepas memuatkan kelas ke dalam ingatan, sebelum sebarang objek dicipta."