Java’da Static Anahtar Kelimesi

Yağmur Erdoğan
3 min readMar 7, 2021

Her nesnenin kendine has durum kümesi vardır ve bu kümedeki değişkenlerin değerleri birbirinden bağımsızdır. Nesne değişkenleri (instance variables) ya da alanları (field) dediğimiz kavramlar nesnenin kendisine has kavramlardır ve diğer nesnelerinkinden bağımsız değişebilirler.

Daha kolay bir şekilde ifade edeyim; bir Araba sınıfımızın olduğunu düşünelim. Bu Araba sınıfından mercedes ve audi gibi nesneler oluşturalım. Araba sınıfının içinde oluşturduğum bir maksimum hız limiti mercedes nesnesinde farklı iken audi nesnesinde farklı bir değer alabilir. mercedes nesnesinde verilen değer audi nesnesindeki değeri etkilemez.

Bazen öyle veriler olur ki değeri, o sınıftan oluşturulacak tüm nesnelerde aynıdır. Bu gibi bir durumla karşılaşıldığında tüm nesnelerde tek tek aynı değeri veren bir şeyi yeniden tanımlamaya gerek yoktur. Bu hem gereksiz alan kaplar hem de ileride bir gün bu değer değiştiğinde tüm sınıflardan tek tek bu değeri güncellememiz gerekir. Bu doğru bir kullanım değildir.

Değeri nesneden nesneye değişmeyen, her nesne için aynı olan değişkene sınıf değişkeni(class variable) denir. Sınıf değişkenleri yüklenen sınıfların bilgisinin saklandığı “metaspace” isimli bellekte bulunur. Bu sınıf değişkenleri static anahtar kelimesi ile nitelendirilir.

Türkiye’de yaşayan Türk vatandaşlarını ele alacağımız bir Citizen class’ı oluşturalım.

Bu sınıftaki nationality dışındaki değişkenler Türkiye’de yaşayan Türk vatandaşlarının hepsinde farklılık gösterir ve ayırt edicidir. İki kişinin TC kimlik numarasının aynı olması söz konusu değildir. Ancak nationality yani uyruk hepsinde Türkiye Cumhuriyeti olduğu için bunu oluşturacağımız her yeni Citizen nesnesinde yeniden tanımlamamıza gerek yoktur.

Örnekte de görüldüğü üzere static değişkenler nesnelerin ortak durumunu oluşturur. static değişkenin sahip olduğu tek bir değer vardır ve bu da sınıfta bulunur. static değişkenlere ulaşırken nesneye ihtiyaç yoktur, sınıf üzerinden ulaşılır.

static değişkenlere, bulunduğu sınıftan oluşturulan nesnelerin referansı üzerinden de ulaşılabilir.

Ancak biz nesne değişkenlerine bu şekilde ulaştığımız için burada static değişken de sanki nesne değişkeniymiş gibi bir algı yaratabilir. Bu yüzden static değişkenlere bu şekilde ulaşmak yerine sınıf ismiyle ulaşmak daha doğrudur.

Bu kullanımda daha açık görüleceği üzere nationality değişkeninin değeri sanki Akın ve Yağmur’da farklıymış gibi, c1 ve c2 nesnelerinde farklı değerlere sahipmiş gibi bir izlenim vermektedir. Ancak durum böyle değildir. Bu yüzden ilk kullanımda olduğu gibi class ismi ile ulaşmak daha doğrudur.

static anahtar kelimesi sadece değişkenler üzerinde kullanılmaz. static kelimesi ile sınıf metotları yani static metotlar da oluşturabiliriz.

static metotlar da static değişkenler gibi sınıfın bir parçasıdır ve bu metotlara ulaşmak için nesneye ihtiyaç yoktur. static metotlara static değişkenler gibi hem sınıf ile hem de içinde bulunduğu sınıftan oluşturulan nesnelerden ulaşılabilir. Ancak yine sınıf üzerinden ulaşmak daha doğrudur.

En çok bilinen static metot main metodudur. main metodu her zaman ilk çalışan metot olduğu için çağrılırken bir nesneye ihtiyaç duymamalıdır.

Nesne metotları, static olsun veya olmasın tüm değişken ve metotlara ulaşabilirken static metotlar sadece static değişkenlere ve diğer static metotlara doğrudan ulaşabilirler, nesne değişkenlerine ve metotlarına ulaşamazlar.

Dikkat edilmesi gereken bir nokta daha vardır;

Aynı kapsamda ve aynı isimde bir yerel bir de nesne değişkeni var ise doğrudan erişimde yerel değişkene ulaşılır. Nesne değişkenine ulaşmak için this kullanılması gerekir.

Buna benzer durum sınıf değişkenlerinde de söz konusudur.

static bir kapsamda kapsamda aynı isimde bir yerel bir de sınıf değişkeni var ise doğrudan erişimde yine yerel değişkene ulaşılır. Sınıf değişkenine ulaşmak için bu sefer this yerine sınıf ismi kullanılır. Çünkü this zaten nesne ile alakalı bir yapıdır ve static bir kapsamda nesneden söz edemeyiz.

Son olarak static final şeklinde oluşturulan sabitlerden bahsetmek istiyorum. final ile değerinin değişmeyeceğini, static ile de bu değerin her yerde aynı olduğunu belirttiğimiz bir sabite tanımlamış oluruz. Bu sabitler tanımlanırken büyük harflerle yazılır ve birden çok kelimeden oluşuyorsa “_” ile ayrılır. Örneğin;

Kotlin ve C# gibi dillerde bulunan “const” anahtar kelimesi Java’daki değeri değişmeyen, değişken oluşturan final ile eşdeğerdir.

Kaynak

📕 Akın Kaldıroğlu - Java ile Nesne-Merkezli Programlamaya Giriş

Static benim uzun bir süre anlayamadığım, tam oturtamadığım bir kavram oldu. Akın Bey’in eğitiminde bu kavramı güzelce anlayabildiğim için onun da izniyle onun örneklerini kullanarak paylaşmak istedim. Umarım faydalı bir içerik olmuştur, soru işaretlerini ortadan kaldırmıştır 🙏🏻

--

--