Java – static kavramı

Java’da static kavramı
static terimi, fizik derslerinden hatırlayacağımız “statik elektrik” başlığındakinden farklı bir şey değildir.
Burada statik , durgun anlamında kullanılmıştır. static, kelime anlamı olarak da “sabit, durgun, gelişme değişme göstermeyen” dir.static teriminin ne olduğunu bilmeseniz de aslında zaten bunu kullanıyorsunuz.. Hatırlayın
–> public static void main(String[] args)
static terimi “reserved word” denilen sözcüklerden biridir. yani siz bu isimle bir değişken tanıtamazsınız. (Zaten kod yazmak için kullandığınız bu kelimeyi renkli gösterecektir.)

static; değişken(variable)’lerden, method’lardan ve inner-class’lardan önce kullanılabilir.
Teker teker ele alalım.
1) Static Variables(Statik Değişkenler)
Static değişkenler, değerlerini programın çalışma sürecinin başında alır. Tanıtıldığı class’tan bağımsız bulunurlar. Başka kod parçalarında onlara ulaşabilmek için, genelde yapılan;
public class MyBag{
int bagSize;
}
MyBag bag=new MyBag();
“bag.bagSize” yerine static değişkenlere ulaşmak için class ismi kullanılır. “Math.PI” gibi. Yani “MyBag.bagSize”.
Şöyle bir örnekle olaya farklı bir açıdan yaklaşalım:
Bu class’taki count değişkeni, temel olarak, bu class tipinden kaç nesne oluşturulduğunu tutar.
MyClass isimli classımız.

staticSimple classımızda da ondan 2 tane instance oluşturduk.

program çalıştığı ilk anda hafıza kullanımımız.

obj1 oluşturulunca.

programın sonunda.

output dosyamız.

Static kullanmasaydık nasıl olacaktı bir de ona bakalım:


hafıza:

son satırı sildik çünkü MyClass.count artık hata verir.

Bu durumda ise, gördüğünüz gibi, her obje kendi içinde değeri 1 olan bir değişken barındırmış oldu. Fakat bu bizim istediğimiz durum değil.
İstediğimiz şeyi burada “static” kullanarak yapabiliriz.
_____
static kelimesi, kodlamada, final tipindeki değişkenlerde kullanılırsa çok yerinde olur.
Mesela maksimum olacak final tipinde bir sayı var. Bunu her objenin içinde ayrı ayrı tutmak fazladan hafıza kullanmamıza neden olur.
Ama biz bunu static yaparsak, bu class’tan oluşturacağımız her obje için toplamda sadece 1 tane MAX değişkeni olur.

2)Static Methods(Statik Metodlar)
Statik metodlar da bulundukları class’tan bağımsız çalışabilirler. Değişkenlerde olduğu gibi, bunları da class ismi ile çağırarak kullanırız. “Math.pow(5,3)” gibi. (Mathematik kütüphanesindeki
üs alma method’u. Veya “Integer.parseInt(str);” gibi.

Statik metodlar içerisinde, statik tanımlanmış ögeler ve parametreler dışındaki ögeleri kullanamazsınız. Çünkü sistemi yukarıda bahsettiğim gibi, instance olmadan(yani new HerhangiClass() diyerek
bir şey oluşturmadan) kullanılmasıdır. siz sabit bir metodda sabit olmayan ögelere erişemezsiniz.

Statik metod veya variable kullanabilmek için class’ın static olması gerekmez. Zaten yazdığınızda hata alırsınız. (static class, sadece aşağıda bahsedilen durumda hata vermez.)

static ögelere, className.methodName() ve className.variableName şeklinde ulaşabilirsiniz.



3) static inner-classes(Statik alt sınıflar)
bunlara inner class da denir. (Grafik çalıştığınızda göreceğiniz) ButtonListener’lar için genelde inner class’lar yazılır.

Buna da şöyle ulaşılır.

output:

Mantığı aslında yukarıdakilerden çok da farklı değil anlayacağınız gibi.
className.innerClassName.methodName();
className.innerClassName.variableName;

inner class’a, ötekinin içinde bir alt yapı olması sebebiyle ancak bu şekilde ulaşabiliyoruz.

Evet, burada, daha önce söylediklerimin tamamen zıddı şeylerle karşı karşıya kalıyoruz. inner class’ların içinde static bir değişken veya metod çağırmak istediğimizde, inner class da static olmak
zorundadır.
Kaldırdığımızda, derleyicimiz bize,
“error: Illegal static declaration in inner class staticExercise.subClass” şeklinde hata verir.

Fakat bu son kısım olan static inner class’lar çok önemli değil. Genel olarak işiniz düşmeyecek. Düştüğünde de zaten derleyiciniz size yol gösterecektir.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s