final ve static — Kilitli Olan ve Ortak Olan
Önce şunu oku: Stack, Heap ve Pass-by-Value
30 saniyede özet
static bir alan sınıfın tüm nesneleri arasında tek bir ortak kopyadır. final ise bir değişkene yalnızca bir kez atama yapılabileceğini söyler; gösterdiği nesnenin içini dondurmaz.
Sınıfta herkesin kendi defteri var, ama duvarda tek bir ortak pano duruyor. Birinin panoya yazdığını herkes görüyor.
Java’da iki küçük kelime tam bunu anlatır: biri ortak panoyu, öteki mürekkeple yazılmış, bir daha değiştirilemeyen satırı.
Adım adım oku
- Duvarda tek bir ortak pano var: static int toplam, değeri 0.
- Her new ile yeni bir nesne, yani kendi defteri olan yeni bir öğrenci geliyor.
- Her yeni nesne ortak panodaki sayıyı bir artırıyor.
- Üç nesne, üç ayrı defter, ama tek bir pano: toplam 3.
-
Bayt: Her nesnenin sayacı ayrı olsun istedim, ama hepsi aynı sayıyı gösteriyor!
-
Sen: Sayacın başında static mi yazıyor?
-
Bayt: Evet... o zaman defterimize değil, duvardaki panoya yazmışım.
-
Bayt: İki küçük kelime, iki büyük fark. Gel ikisini de tanıyalım.
static: herkesin ortak panosu
Sıradan bir alan her nesnede ayrı ayrı durur. Başına static yazılmış bir alan ise sınıfa aittir ve tek bir kopyası vardır; buna static alanNesneye değil sınıfa ait olan alan. Kaç nesne üretilirse üretilsin tek bir kopyası vardır ve hepsi onu paylaşır.Sınıf adıyla okunur (Ogrenci.toplam). Değişebilen bir static alan, birden çok thread ya da istek aynı anda yazdığında sessizce karışır; bu yüzden çoğu zaman yalnızca sabitler için kullanılır.Sözlükte gör → denir.
class Ogrenci { static int toplam = 0; // duvardaki pano: tek kopya int notSayisi = 0; // defter: her nesnede ayrı
Ogrenci() { toplam++; // herkes aynı panoya yazar }}Static bir metot da nesneye değil sınıfa aittir. Bu yüzden içinden notSayisi gibi bir nesnenin alanına doğrudan ulaşamaz: hangi öğrencinin defteri olduğunu bilmez.
Kafam karıştı, daha basit anlat
Nesne başına ayrı bir değer istiyorsan static yazma. Tüm nesnelerin paylaştığı tek bir değer istiyorsan static yaz.
Program ne yazdırır?
final: bir kez atanır
`final List<String> liste = new ArrayList<>();` yazdıktan sonra `liste.add("elma");` satırı derlenir mi? Cevabı göster
Derlenir. final, liste değişkeninin başka bir listeyi göstermesini yasaklar. Gösterdiği listenin içine eleman eklemek serbesttir.
final bir değişkene yalnızca bir kez değer atanabileceğini söyler. Sonra ona yeni bir değer atamaya çalışırsan derleyici durdurur.
Bir nesneyi gösteren değişkende final oku kilitler, kutunun içini değil. İçi de değişmesin istiyorsan nesnenin kendisi immutableOluşturulduktan sonra içi değişmeyen nesne. Anahtar olarak güvenlidir, çünkü hashCode'u hiç değişmez.Sözlükte gör → olmalıdır, örneğin List.of(...).
final List<String> liste = new ArrayList<>();liste.add("elma"); // serbest: kutunun içi değişiyorliste = new ArrayList<>(); // derleme hatası: ok kilitli
final List<String> sabit = List.of("elma");sabit.add("armut"); // çalışırken hata: List.of değişmezKafam karıştı, daha basit anlat
final bir kutuya yapıştırılmış etiket gibidir: etiket başka kutuya taşınamaz. Ama kutunun içine eşya koymak hâlâ mümkündür.
Ok mu kilitli, kutu mu?
Tohum 868063List<String> kaynak = new ArrayList<>(List.of("TRY"));
final List<String> liste = kaynak;
Oynat ya da adımla: her adımda bir satır çalışır.
Şu an ne oldu?
final List<String> liste = kaynak;
kaynak = [TRY]. Üç şey olacak: ekleme, yeniden atama, başkasının değişikliği.
Görevler0/3
Ekleme çalışsın ama yeniden atama derlenmesinaçık
İpucu
Varsayılan ayarlar yeter.
Değiştirilemez sandığın bir listenin değiştiğini göraçık
İpucu
Salt okunur bir pencere.
Liste baştan sona [TRY] kalsınaçık
İpucu
Kendi değişmez kopyası olsun.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. final: ekleme çalıştı, yeniden atama derlenmedi, başkasının eklediği EUR listede göründü.
- “unmodifiableList” seç. Görünüm üzerinden eklemek yasak, ama kaynak değişince görünüm de değişti.
- “List.copyOf” seç. Liste baştan sona [TRY] kaldı.
`final List<String> liste = new ArrayList<>();` satırından sonra hangisi derleme hatası verir?
Bir listenin ne değişkeninin ne de içeriğinin değişmemesini istiyorsun. Hangisi bunu sağlar?
Satır satır: sayaç nereye yazılıyor?
İki alanın farkını üç nesneyle izleyelim.
Defter mi, pano mu?
Ogrenci ali = new Ogrenci();Ogrenci ayse = new Ogrenci();ali.notSayisi++;ali.notSayisi++;System.out.println(Ogrenci.toplam + " " + ali.notSayisi + " " + ayse.notSayisi);Debug
ali Yeni bir nesne: kendi defteri açılır, ortak pano bir artar.
- Ogrenci.toplam
- = 1
- ali.notSayisi
- = 0
Sol/sağ ok tuşlarıyla da gezebilirsin.
Bu static metot neden derlenmez? ```java class Hesap { BigDecimal bakiye; static BigDecimal goster() { return bakiye; } } ```
Sabitler: static final
İkisini birleştirince gerçek bir sabit elde edersin: tek kopya ve bir daha atanamaz. Adları geleneksel olarak büyük harfle yazılır.
static final int MAKS_DENEME = 3;static final String BANKA_KODU = "0001";static final List<String> PARA_BIRIMLERI = List.of("TRY", "USD", "EUR");Son satıra dikkat: listenin kendisi de değişmez olduğu için bu gerçek bir sabittir. static final ile değişebilen bir liste ise hâlâ herkesin yazabildiği bir panodur.
Kafam karıştı, daha basit anlat
Sabit, herkesin okuyabildiği ama kimsenin değiştiremediği bir tabeladır. Tabelayı static final ile duvara çakarsın, içine de değişmeyen bir değer koyarsın.
Her alanı gerçek bir sabit olup olmadığına göre ayır.
Bir bankada hesap numaraları tam bu iki kelimeyle üretilir: banka kodu bir sabittir, sıradaki numara ise bütün hesapların paylaştığı tek bir sayaçtır.
Derinleş · Hesap numarası üretmek: ortak sayaç ve sabit 3 dosya · ~32 satır · ilk okumada atlayabilirsin
Tuzaklar
Static alanda istek verisi. Spring servisleri tek bir nesnedir ve aynı anda birçok isteği karşılar. static ya da sıradan bir alana “şu anki kullanıcı” yazarsan istekler birbirinin verisini görür.
Hiç boşalmayan static liste. Static bir koleksiyon program kapanana kadar yaşar. İçine ekleyip hiç silmezsen bellek yavaş yavaş dolar.
final’i değişmez sanmak. final yalnızca oku kilitler. İçerik de sabit kalsın istiyorsan değişmez bir tip kullan: List.of, record, String.
Yoğun saatte bazı kullanıcılar başka birinin adını görüyor. Hatanın kaynağı hangi satır?
Kendini sına
static bir alanın her nesnede ayrı bir kopyası vardır.
`static` bir alan ne zaman doğru seçimdir?
Aklında kalacak üç şey
- 1 static alan nesneye değil sınıfa aittir: kaç nesne olursa olsun tek bir kopyası vardır ve hepsi onu paylaşır.
- 2 final bir değişkene yalnızca bir kez değer atanabilir. Bir listeyi final yapmak listeyi değil, değişkenin gösterdiği yeri kilitler.
- 3 Gerçek bir sabit static final ve değişmez bir değerdir; değişebilen bir static alan ise herkesin yazabildiği ortak bir panodur.
5 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.
- Core Java & EşzamanlılıkEnum — Sabit Bir Seçenek ListesiSipariş durumunu metin olarak tuttun ve biri KARGODAA yazdı. Kod bunu neden fark etmedi?Derse git
- Nesne Yönelimli ProgramlamaDeğişmez Sınıf Tasarlamak — Bir Kez Kur, Hep GüvenBir record oluşturdun ve hiç dokunmadın, ama içindeki liste bir gün değişmiş çıktı. Kim değiştirdi?Derse git
- Nesne Yönelimli Programlamaİç İçe Sınıflar — static, Inner, Anonim ve YerelHesap ekranı kapandı ama hesap bellekten hiç gitmedi. Onu küçük bir hatırlatıcı mı tutuyor?Derse git