"Enter"a basıp içeriğe geçin

Java’da SIB – (Static Initialization Blok), Static Variables (Statik Değişkenler) ve Static Methods (Statik Metotlar)

Bu makalede Java class’larında kullanılabilecek statik elemanlardan bahsedeceğim.

Ön Not: Bu konuyu anlatırken JVM (Java Virtual Machine)’ın yapısından da çok yüzeysel olarak bahsetmek durumunda kalacağım.

SIBStatik değişkenler ve statik metodlar, bir class’da yer alabilecek statik üyelerdir. Bu statik üyelerin her biri class hafızasında (Class Memory) tutulurlar. Class hafızasının ne olduğunu makalenin devamında ayrıntılı bir şekilde irdeliyor olacağız. Statik elemanlara erişim, statik olmayan elemanlara erişimden farklı olarak gerçekleştirilir. Biliyorsunuz statik olmayan elemanlara arişmek için yeni nesne oluşturmamız ( MerhabaDunya merhabaDunya = new MerhabaDunya() ) gerekiyordu. Statik elemanlara erişim için yeni bir nesne oluşturmaya gerek yoktur. Calss adı kullanılarak bu statik elemanlara erişebilirsiniz.  MerhabaDunya.merhaba(); gibi bir kullanım buna örnek gösterilebilir.

Static Initialization Blok’larda sadece statik değişkenlere değer atama işlemleri yapılabilir. Bu blokun bir ismi yoktur. statik anahtar kelimesi ile birlikte “{” ve “}” işaretleri kullanılarak oluşturulurlar.

static {
    //statik değişkenlere değer atama işlemleri
}

Aşağıda yazan programa göz atın.

class StatikElemanlar {
    static int statikDegisken;
 
    static {
        System.out.println("StatikElemanlar SIB");
        statikDegisken = 10;
    }
 
    static void statikMetot() {
        System.out.println("Statik Metot içindeyiz");
        System.out.println(statikDegisken);
    }
}
 
public class AnaClass {
    static {
        System.out.println("AnaClass SIB");
    }
 
    public static void main(String[] args) {
        //Class adı kullanılarak statik üyelere direkt olarak erişiliyor.
        StatikElemanlar.statikDegisken = 20;
        StatikElemanlar.statikMetot();
    }
}

Konunun tam olarak anlaşılabilmesi için yukarıdaki programı adım adım incelememiz gerekmektedir.

Adım 1:
“java AnaClass” komutunu kullandığımızda, java komutu, kendine tahsis edilen belleği Heap ve Stack olmak üzere iki parçaya böler. İlk olarak java komutu işlemleri yapabilmesi için stack’a atılır. java komutu belleğe yüklendikten sonra çalışmaya başlar. Çalışmaya başladıktan sonra yapacağı ilk işlem, AnaClass‘ın heap hafızada var olup olmadığına bakmak olacaktır. Eğer yoksa AnaClass’ın yükleme işlemleri başlatılır. Heap’den rastgele bir bellek alanı AnaClass’ın kullanımına tahsis edilir. Bu alana, Class Hafızası (Class Memory) adı verilir. Statik elemanlar işte bu class hafızasında tutulurlar. AnaClass’ın class hafızasında tutulacak yanlızca 1 adet statik elemanı vardır.  Bu eleman “main(…” metodudur.

Adım 2:
Bütün statik elemanların yüklenmesinden sonra, SIB – Static Initialization Blok çalıştırılır. (Unutmayın, SIB’ler heap hafızada  tutulmazlar. Sadece stack’a atılırlar ve çalışmaları biter bitmez bellekten atılırlar.) SIB bloku içerisinde bulunan sadece bir ifade vardır (Satır 17). SIB çalıştığı için bu satırda çalıştırılır ve konsola “AnaClass SIB” yazısı yazdırılır. Ardından SIB bellekten atılır.

Adım 3:
Şimdi java komutu, main() metodunu çalıştıracaktır. main() metodu stack’e atılır. Önce ilk satır (Satır 22) çalıştırılır. Öncelikle StatikElemanlar bellekte yüklü olarak bulunmakta mı diye bakılır. Eğer yüklü değil ise StatikElemanlar yükleme işlemi başlatılır. StatikElemanlar class’ının kullanımı için heap’de rastgele hafıza alanı tahsis edilir. Ardından bu class’a ait olan statikDegisken ve statikMetot() bu class hafıza alanına atılır. statikDegisken bir global değişkendir. Bu değişkene varsayılan olarak bir değer atılır. örnekte 0 (sıfır).

Adım 4:
StatikElamanlar’a ait bütün statik elemanlar yüklendikten sonra StatikElamanlar’ın SIB bloku çalıştırılır. İlk ifade (Statır 5) çalıştırılır. Bu satır konsola “StatikElemanlar SIB” yazdırır. İkinci ifade ile statikDegisken değişkenine 10 değer atanır. Geriye yürütülecek başka ifade kalmadığı için SIB hafızadan atılır.

Adım 5:

Şimdi main() metodunu tekrar kontrol edelim. İlk ifade ile StatikElemanlar class’ına ait statikDegisken değişkenine varsayılan olarak 0 değerinin atıldığını hatırlayalım. Class hafızasında bulunan bu değişkene şimdi de 20 değerini atayan satır işletilir. İkinci ifade ile (Satır 23) StatikElemanlar’a ait statikMetot() çalıştırılmak için çağrılıyor.

Adım 6:
StatikElemanlar’a ait statikMetot() çalıştırılmak için stack’e atılıyor. İlk ifade (Satır 10) yürütülüyor ve consola “Statik Metot içindeyiz” yazılıyor. İkinci ifade (Satır 11) yürütülüyor ve statikDegisken’in değeri “20” olarak ekrana yazdırılıyor. Geriye yürütülecek bir ifade kalmadığı için staticMetot() stack’den atılıyor. main() metodunu tekrar kontrol ettiğimizde, içinde yürütülecek başka bir ifade kalmadığı için, o da stack’den atılıyor.

Son olarak örnek programımızın consola sırası ile ne yazdığını bir kez daha gösterelim.

“AnaClass SIB”

“StatikElemanlar SIB”

“Statik Metot içindeyiz”

“20”

Anlamadığınız bir konu veya sormak istediğiniz herhangi bir şey varsa, lütfen benimle yorum yazarak iletişime geçiniz.

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir