Java Static Anatomisi
Static konusunu anlamak için öncelikle bu kelimenin anlamını ve kullanım amacını iyi anlamak gerekir. Static, anlam olarak “durağan” anlamına gelmektedir. Çünkü static kelimesinin türkçe çevrimlerine baktığınızda “değişmez” anlamına geldiğini de göreceksiniz fakat Java’da static bunu garantilemez, yani değişebilir (“final” ile karıştırmayalım, başka bir makalede değineceğim).
JVM, static anahtar kelimesini arar ve bunları sınıf belleğinde (Class memory) tutar. Yani anlayacağınız static anahtar kelimesi, nesnelere değil sınıflara aittir. Bu sebepledir ki herhangi bir sınıfın herhangi bir örneği ile ilişkilendirilmediğinden, override geçerli değildir. Ek olarak statiklerin, programın çalışma süresinin tamamına uyan ömürleri vardır. Bu demektir ki, sınıfınızı kullandıktan sonra bile, tüm bu static değişkenlere çöp toplayacılar (Garbage Collector) dokunamaz.
Peki bu Static anahtar kelimesini nerelerde kullanabiliriz ?
- Değişkenler (Class variable)
- Yöntemler (Class method)
- Bloklar (Blocks)
- İç içe geçmiş sınıflarda (Nested Class)
Java’daki statik anahtar kelimesi ağırlıklı olarak bellek yönetimi için kullanılır. Nedir bu bellek yönetimi ? Şöyle bir örnek vererek rutini koruyalım. Matematik işlemleri yapan bir math sınıfı yazıyorsunuz. Pi sayısının her zaman sabit ve durağan olması gerekmez mi ? Bu sebeple math sınıfınızda sınıf değişkeni olarak static olarak tanımlayabilirsiniz.
1 |
static final double PI = 3.141592653589793; |
Başka sınıflarda Pİ sayısını almak için tekrar tekrar nesne üretip boşuna belleği hunharca kullanımıza gerek yoktur.
Başka örnekler de verecek olursak, tarih işlemlerini yapan bif sınıf tasarlamak istiyorsunuz. Haftanın günleri her zaman ortak kullanımdır. Yani haftanın günlerini almak için tekrar tekrar sınıfınızdan nesne üretmeye gerek yoktur, bu belleğe yüklenmek demektir. Belleği boşuna kullanmaktadır. Bu sebeple haftanın günlerini static olarak tanımlayabilirsiniz. Aynı mantık ile metotlarınızı da static yapabilirsiniz.
1 |
static final String[] haftaninGunleri = {"PAZARTESİ", "SALI", "ÇARŞAMBA", "PERŞEMBE", "CUMA", "CUMARTESİ", "PAZAR"}; |
” Bütün sınıflar için ortak mı olacak ? ” Eğer bu sorunun cevabını veriyorsa static adını hak ediyordur.
Nerelerde kullanılmaz ?
- Yapılandırıcılarda (Constructor)
- Arayüzlerde (Interfaces) (Java 8 de interfacelerde kullanılıyor oldu)
- İç Sınıf metodlarında (Inner Class methods)
- Yerel değişkenlerde (Local Variables)
- Class (Not Nested)
- Method Local Inner Class(Difference then nested class)
- Instance Variables
Static Kullanmalı mıyız ? Kullanmamalı mıyız ?
Static’lerin kullanımı hep tartılşılmıştır. Bir yandan avantaj sağlarken aslında bir yandan da dezavantaj mı sağlıyor?
Evet, gerçekten de static kullanıma çok dikkat etmeliyiz, bunu tasarımsal olarak ele alınması gereklidir. Çünkü static kullanımı Nesne Yönelimli paradigmasına aykırıdır. Özellikle, Kapsülleme (Encapsulation) ilkesini ihlal eder.
Static Örnek – 1
Static’ler compile olurken ilk bakılan anahtar kelimeler daha sonra nesnelere ve nesne değişkenlerine bakılır. İlk static alanlar bakıldıgından static içerisinde sadece staticler kullanılabilir. Örneğin ;
1 2 3 4 5 6 7 |
<span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">class</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">JavaExample </span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">{</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">int</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> a = 40</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">; // non-static</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">public</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">static</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">void</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> main</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">(</span><span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">String</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> args</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">[])</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">{</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">System</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">out</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">println</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">(</span><span class="pun" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">a</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">);</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">}</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">}</span> |
Yukarıdaki kod örneği derleme anında hata verecektir. “Non-static field ‘a’ cannot be referenced from a static context” uyarısı alınacaktır.
Static Örnek – 2
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">class</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">JavaExample</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">{</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">static</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">int</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> num</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">;</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">static</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">String</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> mystr</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">;</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">static</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">{</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> num </span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">=</span> <span class="lit" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">97</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">;</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> mystr </span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">=</span> <span class="str" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">"Static keyword in Java"</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">;</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">}</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">public</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">static</span> <span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">void</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> main</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">(</span><span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">String</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> args</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">[])</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">{</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">System</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">out</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">println</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">(</span><span class="str" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">"Value of num: "</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">+</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">num</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">);</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">System</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">out</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">.</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">println</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">(</span><span class="str" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">"Value of mystr: "</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">+</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">mystr</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">);</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">}</span> <span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">}</span> |
Output:
1 2 |
<span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">Value</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> of num</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">:</span> <span class="lit" style="color: #800000;" data-blogger-escaped-style="box-sizing: border-box; color: maroon;">97</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">Value</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> of mystr</span><span class="pun" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;">:</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">Static</span><span class="pln" style="color: #000000;" data-blogger-escaped-style="box-sizing: border-box; color: black;"> keyword </span><span class="kwd" style="color: #00008b;" data-blogger-escaped-style="box-sizing: border-box; color: darkblue;">in</span> <span class="typ" style="color: #2b91af;" data-blogger-escaped-style="box-sizing: border-box; color: #2b91af;">Java</span> |
Ellerinize sağlık çok güzel ve faydalı bir yazı olmuş, kafamın karıstığı bir noktada sizin yazınız sayesinde aydınlandım 🙂 tekrar teşekkürler.
Yararlı olmasına çok sevindim. Çok teşekkürler 🙂