Field dan method yang kita tulis sejauh ini dimiliki tiap object: dua object RekeningBank menyimpan dua salinan saldo yang berbeda. Kebutuhan data kadang berlaku sebaliknya, misalnya jumlah seluruh rekening yang pernah dibuat; data itu satu untuk semua object, bukan milik salah satunya. Anggota static menyediakan tempat bagi data dan perilaku yang melekat pada class, bukan pada object.

Anggota Instance dan Anggota static #

SifatAnggota instanceAnggota static
KepemilikanTiap object menyimpan salinan sendiriSatu salinan untuk seluruh class
Cara aksesMelalui variabel object: rekening.SaldoMelalui nama class: RekeningBank.TotalRekening
Konteks thisTersedia di dalam methodTidak ada; kode berjalan tanpa object tertentu

Kata static ditulis pada deklarasi anggota, misalnya public static int TotalRekening. Runtime mengalokasikan anggota static sekali, terlepas dari banyaknya object yang dibuat, dan object tidak membawa salinannya. Gunakan anggota static hanya untuk data yang memang berlaku umum bagi seluruh class; data yang wajar berbeda antar object, seperti saldo dan pemilik, tetap menjadi anggota instance.

Contoh: Penghitung Total Rekening #

csharp
public class RekeningBank
{
    public static int TotalRekening = 0;

    public string Nomor;
    public string Pemilik;
    public int Saldo;

    public RekeningBank(string nomor, string pemilik)
    {
        Nomor = nomor;
        Pemilik = pemilik;
        TotalRekening += 1;
    }

    public static void TampilkanTotal()
    {
        Console.WriteLine($"Total rekening terdaftar: {TotalRekening}");
    }

    public void TampilkanInfo()
    {
        Console.WriteLine($"Rekening {Nomor} a.n. {Pemilik} - Saldo: Rp{Saldo}");
    }
}

RekeningBank.TampilkanTotal();

RekeningBank rekeningBudi = new RekeningBank("REK-8001", "Budi");
RekeningBank rekeningSiti = new RekeningBank("REK-8002", "Siti");

rekeningBudi.TampilkanInfo();
rekeningSiti.TampilkanInfo();

RekeningBank.TampilkanTotal();

Output yang Dihasilkan:

text
Total rekening terdaftar: 0
Rekening REK-8001 a.n. Budi - Saldo: Rp0
Rekening REK-8002 a.n. Siti - Saldo: Rp0
Total rekening terdaftar: 2

Mari kita telaah baris demi baris:

  1. public static int TotalRekening = 0;: satu salinan milik class, diinisialisasi sekali sebelum object pertama dibuat.
  2. TotalRekening += 1; di dalam constructor: setiap new menambah penghitung yang sama, karena static field berada di luar data object.
  3. RekeningBank.TampilkanTotal() sebelum pembuatan object: penghitung masih 0, membuktikan anggota static dapat diakses tanpa satu object pun.
  4. Dua pemanggilan TampilkanInfo(): method instance membaca data masing-masing object; saldo keduanya Rp0 karena constructor bab ini hanya mengisi nomor dan pemilik.
  5. RekeningBank.TampilkanTotal() terakhir: penghitung menunjukkan 2, sesuai jumlah object yang telah dibuat.

Anggota static sudah lama kita pakai tanpa disadari: Console.WriteLine adalah static method dari class Console, sedangkan int.Parse dan Math.Max juga dipanggil lewat nama class-nya, bukan lewat object.