Milik Class, Bukan Milik Objek
Sebagian besar field dan method yang sudah kamu tulis sejauh ini adalah milik objek: setiap kali kamu memanggil new, setiap instance mendapat salinan field-nya sendiri, dan method berjalan terhadap state milik objek tertentu itu. Kata kunci static membalik hal itu. Member static adalah milik class itu sendiri: hanya ada satu salinan yang dipakai bersama oleh setiap instance, dan salinan itu ada baik kamu membuat objek maupun tidak.
Satu perbedaan itu menjelaskan field static, method static, konstanta, bahkan kenapa main selalu static.
Field static yang Dipakai Bersama
Field non-static memberi setiap objek tempatnya sendiri. Field static memberi class satu tempat yang dipakai bersama oleh semua. Contoh klasiknya adalah counter yang menghitung berapa banyak objek yang sudah dibuat:
Perhatikan bahwa kamu membaca counter itu sebagai User.count, lewat nama class, karena nilainya bukan milik satu User tertentu. Sebaliknya, setiap name hidup di dalam objeknya masing-masing. Ubah count lewat instance mana pun, dan setiap instance melihat nilai barunya, karena hanya ada satu.
Method static
Method static juga milik class, jadi kamu memanggilnya lewat class tanpa objek:
Inilah pola di balik library standar: Math.max, Integer.parseInt, Arrays.sort, dan List.of semuanya static, yaitu perilaku utilitas yang tidak butuh objek untuk bekerja. Pakai method static kalau pekerjaannya hanya bergantung pada argumennya, bukan pada state per objek.
Jebakan Besar: static Tidak Bisa Melihat Instance
Method static berjalan tanpa objek, jadi tidak ada this. Artinya, method itu tidak bisa menyentuh field instance atau memanggil method instance secara langsung, karena tidak ada objek tertentu tempat membacanya. Inilah error pemula yang paling umum seputar static:
class Account {
int balance = 100; // instance field
static int show() {
return balance; // COMPILE ERROR: non-static field 'balance'
} // cannot be referenced from a static context
}
Solusinya adalah mengubah method itu menjadi method instance (hapus static, supaya method punya this), atau mengirim objeknya secara eksplisit:
Arah sebaliknya tidak masalah: method instance boleh bebas membaca field static dan memanggil method static, karena data tingkat class yang dipakai bersama itu selalu ada.
Konstanta dengan static final
Gabungkan static dengan final, dan kamu mendapatkan konstanta: satu nilai bersama yang tidak pernah bisa berubah. Menurut konvensi, namanya ditulis dalam UPPER_SNAKE_CASE:
static final adalah cara idiomatis untuk menyatakan "nilai tetap yang menjadi milik tipe ini", seperti Integer.MAX_VALUE atau Math.PI di library standar. Menjadikannya static berarti kamu tidak membuang satu salinan per objek; menjadikannya final berarti tidak ada yang bisa mengisinya ulang.
Blok Inisialisasi static
Field static yang sederhana bisa langsung diinisialisasi di barisnya. Kalau penyiapannya butuh logika sungguhan, misalnya membangun tabel pencarian dengan HashMap atau membaca konfigurasi, pakai blok static. Blok ini berjalan sekali, saat class pertama kali dimuat, sebelum ada objek apa pun:
Blok itu hanya berjalan satu kali berapa pun kamu memakai class-nya, sehingga menjadi tempat yang tepat untuk penyiapan satu kali yang berlaku untuk seluruh class.
Kapan Memakai static
Pedoman singkatnya:
- Pakai field static hanya untuk data yang benar-benar dipakai bersama oleh semua instance, seperti counter, cache, atau konstanta. Kalau dua objek wajar saja menyimpan nilai yang berbeda, data itu seharusnya field instance.
- Pakai method static kalau hasilnya hanya bergantung pada argumen, bukan pada state objek mana pun (fungsi utilitas murni).
- Jadikan member instance sebagai pilihan default. Terlalu banyak memakai
staticdiam-diam mengubah programmu menjadi tumpukan state global, yang sulit diuji dan dipahami.staticadalah pengecualian, bukan titik awal.
Berikutnya: Enum
Konstanta static final cocok untuk satu nilai tetap, tetapi kalau kamu punya kumpulan kecil nilai tetap yang saling berkaitan, seperti arah mata angin, hari dalam seminggu, atau status pesanan, Java punya tipe khusus yang lebih aman dan lebih ekspresif daripada konstanta yang tersebar. Itulah enum, dan itu topik halaman berikutnya.
Pertanyaan yang sering diajukan
Apa arti static di Java?
static berarti sebuah field atau method adalah milik class itu sendiri, bukan milik objek tertentu. Hanya ada tepat satu salinan field static yang dipakai bersama oleh setiap instance, dan method static dipanggil lewat class (Math.max(...)) tanpa butuh objek. Sebaliknya, member non-static (instance) punya salinan baru untuk setiap objek.
Apa perbedaan variabel static dan variabel instance di Java?
Variabel instance punya satu nilai per objek, jadi dua objek bisa menyimpan nilai yang berbeda. Variabel static punya satu nilai yang dipakai bersama oleh semua objek dari class itu, jadi mengubahnya lewat satu objek (atau lewat nama class) akan terlihat oleh semua objek lain. Pakai field instance untuk state per objek, dan field static untuk data yang memang global bagi class tersebut, seperti counter atau konstanta.
Kenapa method main di Java bersifat static?
JVM perlu memanggil main sebelum ada objek apa pun dari class-mu. Karena method static adalah milik class, bukan milik instance, runtime bisa langsung memanggil Main.main(args) tanpa membuat objek Main lebih dulu. Itulah sebabnya signature-nya selalu public static void main(String[] args).