Java ile Static İfadesi Kullanımı
Statik ifadeler sadece bir yerde çalışır ve sadece bir kere çalışır.İşin en basit hali bu.Static bir değişken herhangi bir class yapısına bağlı değildir. Bellekte tek biryerde tutulur.Static metodların çalışma durumlarıyla aynıdır. Static olan verileri yönetirler. Ve aynı zamanda girdi noktaları olarak kullanılırlar. Fakat onları normal metodların içinde çağırabiliriz.
Alan ve Metod : Aşağıda örneğini yapacağımız programda iki tane alan bulunmaktadır. Int tipinde sayac adında static bir alan ve main adında girdi noktası şeklinde bir fonksiyon bulunur bu fonksiyon programın akışını kontrol eder. Main fonksiyonu, sayac ifadesine static ifadesini kullandığı için erişebilir...
public class Program {
static int sayac; //sayac adındaki değişkenimi static ifadesi ile oluşturdum
public static void main(String[] args) {
// Sayacımı arttır komutu
Program.sayac++;
System.out.println(Program.sayac);
// arttırmayı tekrarlıyorum
// ... bellek temizlenmediği için aynısının üzerinden sayar
Program.sayac++;
System.out.println(Program.sayac);
}
}
1
2
Bellek Bölgeleri: Static ifadeler bellekte tek bir alan kullanır. Biz sayacı arttırdığımızda o aynı alanda tutulur. Yani tekrar kullanılmak üzere sıfırlanmaz veya silinmez. Bu cümle braz karışık gelebilir fakat bu çalışma mantığı işlemcinin bellekleme mantığına göre çalışmaktadır. Bu yüzden anlattığım şekilde çalışır.
Not: Static ifadeler consolda daha çok kullanılır. System.out.println("deneme"); metodu ile consol ekranına bişeyler yazdırabiliriz.
Static ifadeler ve normal ifadeler:Programın üzerinde düşünelim. Static ve static olmayan ikitane class yapısına sahip. Static olanı Program.size şeklinde çağırıyoruz.
Fakat kodların çalışması için ilk olarak oluşturulması gerekir yani en üste yazılası gerekmektedir. Bu tipsel değil kullanımdır. Şimdi Bunlar ile ilgili bir uygulama yapalım
public class Program {
static int boyut = 100;
int kod = 1000;
public static void main(String[] args) {
//Static değişkeni direk olarak Program ile çağırıyorsun
System.out.println(Program.boyut);
// Normal değişkeni programın tipiyle çağırıyorsun
Program p = new Program();
System.out.println(p.kod);
}
}
100
1000
Final ve static karşılaştırması : Final tipindeki bir alan program içinde değiştirilemez. Static alan değiştirilebilir. Eğer final tipindeki bir değişikeni değiştirmeyi denerseniz program hata verecektir.
Final: Const veri tipiyle aynıdır. İkisindede tanımlanan değişken sabittir yani değiştirilemez. Static:Tek bir yerlik anlamına gelir. Programda değiştiriliebilir.
public class Program {
static int dgskn1 = 5;
final int dgskn2 = 100;
public static void main(String[] args) {
dgskn1 ++; // bu doğru kullanım
dgskn2 ++; // Program burda hata verecektir.
}
}
Exception in thread "main" java.lang.Error:
Unresolved compilation problem:
Cannot make a static reference to the non-static field _code
Static Metod Performansı: Derleyiciler programın kullanacağı argument nesnelerini kendiliğinden oluştururlar Bunların çalışma sürelerini bir zamanlayalım ve performans farklarını görelim...
Sonuç olarak static değişkenler daha hızlı yanıt verdi. Normal değişkenlerin yaptığı bazı işlemleri yapmadığı için daha hızlı ve basitçe döner Şimdi performans ile ilgili uygulamaya geçelim
public class Program {
int normalDegisken(int a) {
// Normal bir değişkeni çağırma metodu
return a * 2;
}
static int staticDegisken(int a) {
// Burdada static değişkeni çağıran metod
return a * 2;
}
public static void main(String[] args) throws Exception {
Program p = new Program();
long t1 = System.currentTimeMillis();
// ... Normal mdegiskenli metodu cağırıyoruz
for (int x = 0; x < 100; x++) {
for (int i = 0; i < 10000000; i++) {
if (p.normalDegisken(i) < 0) {
throw new Exception();
}
}
}
long t2 = System.currentTimeMillis();
// ... Burdada static değişkenli metodu çağırıyruz
for (int x = 0; x < 100; x++) {
for (int i = 0; i < 10000000; i++) {
if (Program.staticDegisken(i) < 0) {
throw new Exception();
}
}
}
long t3 = System.currentTimeMillis();
// ... EN son aradaki farklarıda ekrana yazdıralım
System.out.println(t2 - t1);
System.out.println(t3 - t2);
}
}
955 ms, normal değişkenin çağrıldığı fonksiyon
880 ms, static değişkenin çağrıldığı fonksiyon
Burak Hamdi Tufan
İyi Çalışmalar
Comments