Menu

Java Statik Üyeler: static Alanlar ve Metotlar

Java'da static anahtar sözcüğünün ne yaptığı, static alan ve metotların nesnelere değil sınıfa nasıl ait olduğu ve static bloklara ve sabitlere ne zaman başvurulacağı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Nesneye Değil Sınıfa Ait Olmak

Şimdiye kadar yazdığınız alanların ve metotların çoğu nesnelere aittir: her new çağrısında her örnek alanların kendi kopyasını alır ve metotlar o belirli nesnenin durumu üzerinde çalışır. static anahtar sözcüğü bunu tersine çevirir. Bir static üye sınıfın kendisine aittir - tüm örnekler tarafından paylaşılan tek bir kopyası vardır ve siz hiç nesne oluşturmasanız bile var olur.

Bu tek ayrım; static alanları, static metotları, sabitleri ve hatta main'in neden her zaman static olduğunu açıklar.

Paylaşılan bir static Alan

static olmayan bir alan her nesneye kendi yuvasını verir. Bir static alan ise sınıfa herkesin paylaştığı tek bir yuva verir. Klasik örnek, kaç nesne oluşturulduğunu izleyen bir sayaçtır:

Sayacı User.count olarak, yani sınıf adı üzerinden okuduğunuza dikkat edin; çünkü değer herhangi bir User'a ait değildir. Öte yandan her name, kendi nesnesinin içinde yaşar. count'u herhangi bir örnek üzerinden değiştirin, tüm örnekler yeni değeri görür; çünkü ondan yalnızca bir tane vardır.

static Metotlar

Bir static metot da sınıfa aittir, bu yüzden onu bir nesne olmadan sınıf üzerinden çağırırsınız:

Bu, tam olarak standart kütüphanenin ardındaki kalıptır: Math.max, Integer.parseInt, Arrays.sort ve List.of hepsi static'tir - üzerinde çalışacak bir nesneye ihtiyaç duymayan yardımcı davranışlardır. İş yalnızca argümanlarına bağlıysa, herhangi bir nesneye özgü duruma değilse, bir static metoda başvurun.

Büyük Tuzak: static, instance'ı Göremez

Bir static metot herhangi bir nesne olmadan çalışır, dolayısıyla this yoktur. Bu, örnek alanlarına doğrudan erişemeyeceği ya da örnek metotlarını doğrudan çağıramayacağı anlamına gelir - bunları okuyacağı belirli bir nesne yoktur. Bu, static ile yapılan en yaygın başlangıç hatasıdır:

class Account {
    int balance = 100;          // örnek alanı

    static int show() {
        return balance;         // DERLEME HATASI: static olmayan 'balance' alanına
    }                           // statik bir bağlamdan erişilemez
}

Çözüm ya metodu bir örnek metodu yapmaktır (static'i kaldırın, böylece bir this'i olur) ya da nesneyi açıkça parametre olarak geçirmektir:

Ters yön sorunsuzdur: bir örnek metodu static alanları serbestçe okuyabilir ve static metotları çağırabilir; çünkü sınıf düzeyindeki paylaşılan veriler her zaman vardır.

static final ile Sabitler

static'i final ile birleştirirseniz bir sabit elde edersiniz: asla değişemeyen, paylaşılan tek bir değer. Geleneksel olarak bunlar UPPER_SNAKE_CASE biçiminde adlandırılır:

static final, "türe ait sabit bir değer" ifadesinin deyimsel yoludur - standart kütüphanedeki Integer.MAX_VALUE ya da Math.PI gibi şeyler. Onu static yapmak her nesne için bir kopya israf etmediğiniz; final yapmak ise kimsenin ona yeniden değer atayamayacağı anlamına gelir.

static Başlatıcı Bloklar

Basit bir static alan satır içinde başlatılabilir. Kurulum gerçek bir mantık gerektirdiğinde - bir arama tablosu oluşturmak, yapılandırma okumak - bir static blok kullanın. Bu blok, sınıf ilk yüklendiğinde, herhangi bir nesne var olmadan önce bir kez çalışır:

Sınıfı kaç kez kullanırsanız kullanın blok yalnızca bir kez tetiklenir; bu da onu tek seferlik, sınıf çapındaki kurulum için doğru yer yapar.

static Ne Zaman Kullanılır

Hızlı bir pratik kural:

  • Bir static alanı yalnızca gerçekten tüm örnekler arasında paylaşılan veriler için kullanın - bir sayaç, bir önbellek, bir sabit. İki nesne makul biçimde farklı değerler tutabiliyorsa, bunun yerine bir örnek alanı olmalıdır.
  • Bir static metodu, sonuç yalnızca argümanlara bağlıysa, herhangi bir nesnenin durumuna bağlı değilse kullanın (saf yardımcı fonksiyonlar).
  • Varsayılan olarak örnek (instance) üyeleri tercih edin. static'i aşırı kullanmak, programınızı sessizce test edilmesi ve üzerine akıl yürütülmesi zor bir küresel durum yığınına dönüştürür. static istisnadır, başlangıç noktası değil.

Sıradaki: Enum'lar

Bir static final sabit, tek bir sabit değer için yeterlidir; ancak elinizde ilişkili değerlerden oluşan küçük, sabit bir küme olduğunda - yönler, haftanın günleri, sipariş durumları - Java'nın bu amaca özel, dağınık sabitlerden daha güvenli ve daha anlamlı bir türü vardır. İşte bu enum'dur ve sıradaki sayfanın konusudur.

Sıkça Sorulan Sorular

Java'da static ne anlama gelir?

static, bir alanın veya metodun belirli bir nesneye değil sınıfın kendisine ait olduğu anlamına gelir. Bir static alanın tüm örnekler tarafından paylaşılan tam olarak tek bir kopyası vardır ve bir static metot, bir nesneye ihtiyaç duymadan sınıf üzerinden (Math.max(...)) çağrılır. Buna karşılık static olmayan (örnek/instance) üyeler her nesne için yeni bir kopya alır.

Java'da static ile örnek (instance) değişkenleri arasındaki fark nedir?

Bir örnek değişkeninin her nesne için bir değeri vardır - iki nesne farklı değerler tutabilir. Bir static değişkenin ise sınıfın tüm nesneleri arasında paylaşılan tek bir değeri vardır; dolayısıyla onu bir nesne üzerinden (ya da sınıf adı üzerinden) değiştirmek diğer tüm nesnelerce görülür. Nesneye özgü durum için örnek alanlarını, sayaç ya da sabit gibi gerçekten sınıfa özgü genel veriler için ise static alanları kullanın.

Java'da main metodu neden static'tir?

JVM'in main'i, sınıfınızdan herhangi bir nesne var olmadan önce çağırması gerekir. Bir static metot örneğe değil sınıfa ait olduğundan, çalışma zamanı önce bir Main oluşturmaya gerek kalmadan doğrudan Main.main(args) çağrısını yapabilir. İmzanın her zaman public static void main(String[] args) olmasının nedeni budur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA