İçeriğe geç

final ve static — Kilitli Olan ve Ortak Olan

Başlangıç 8 dk Çok sık karşılaşılır

Ö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ı.

Her nesnenin kendi defteri var; static alan ise duvardaki tek ortak panodur.
Adım adım oku
  1. Duvarda tek bir ortak pano var: static int toplam, değeri 0.
  2. Her new ile yeni bir nesne, yani kendi defteri olan yeni bir öğrenci geliyor.
  3. Her yeni nesne ortak panodaki sayıyı bir artırıyor.
  4. Üç nesne, üç ayrı defter, ama tek bir pano: toplam 3.
  1. Bayt: Her nesnenin sayacı ayrı olsun istedim, ama hepsi aynı sayıyı gösteriyor!

  2. Sen: Sayacın başında static mi yazıyor?

  3. Bayt: Evet... o zaman defterimize değil, duvardaki panoya yazmışım.

  4. 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.

Defter ve pano
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.

Hızlı kontrolBaşlangıç

Program ne yazdırır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Sayac.java
1class Sayac {
2 static int ortak = 0;
3 int kendi = 0;
4
5 void artir() { ortak++; kendi++; }
6}
7
8Sayac a = new Sayac();
9Sayac b = new Sayac();
10a.artir();
11b.artir();
12b.artir();
13System.out.println(Sayac.ortak + " " + a.kendi + " " + b.kendi);
Java 21UTF-8LF

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(...).

Ok kilitli, kutu değil
final List<String> liste = new ArrayList<>();
liste.add("elma"); // serbest: kutunun içi değişiyor
liste = new ArrayList<>(); // derleme hatası: ok kilitli
final List<String> sabit = List.of("elma");
sabit.add("armut"); // çalışırken hata: List.of değişmez
Kafam 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 868063

List<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.

    Hız
    Adım 0

    Ş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.

    1. Varsayılanla oynat. final: ekleme çalıştı, yeniden atama derlenmedi, başkasının eklediği EUR listede göründü.
    2. “unmodifiableList” seç. Görünüm üzerinden eklemek yasak, ama kaynak değişince görünüm de değişti.
    3. “List.copyOf” seç. Liste baştan sona [TRY] kaldı.
    Hızlı kontrolBaşlangıç

    `final List<String> liste = new ArrayList<>();` satırından sonra hangisi derleme hatası verir?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Bir listenin ne değişkeninin ne de içeriğinin değişmemesini istiyorsun. Hangisi bunu sağlar?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Satır satır: sayaç nereye yazılıyor?

    İki alanın farkını üç nesneyle izleyelim.

    Defter mi, pano mu?

    Sinif.java
    şu an çalışan satırOgrenci ali = new Ogrenci();
    2Ogrenci ayse = new Ogrenci();
    3ali.notSayisi++;
    4ali.notSayisi++;
    5System.out.println(Ogrenci.toplam + " " + ali.notSayisi + " " + ayse.notSayisi);

    Debug

    Adım 1/4

    ali Yeni bir nesne: kendi defteri açılır, ortak pano bir artar.

    Ogrenci.toplam
    = 1
    ali.notSayisi
    = 0
    Java 21UTF-8LF1:1

    Sol/sağ ok tuşlarıyla da gezebilirsin.

    Hızlı kontrolBaşlangıç

    Bu static metot neden derlenmez? ```java class Hesap { BigDecimal bakiye; static BigDecimal goster() { return bakiye; } } ```

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    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.

    Sabitler
    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.

    Hızlı kontrolBaşlangıç

    Her alanı gerçek bir sabit olup olmadığına göre ayır.

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Sınıflandırılmamış

    Gerçek sabit

    Tek kopya, bir daha atanamaz ve içi değişmez.

      Sabit değil

      Bir şekilde hâlâ değişebilir.

        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
        Proje dosyaları

        src/main/java/com/bank/account/ AccountNumbers.java Sabitler ve ortak sayaç: sayaç birden çok thread'den güvenle artsın diye AtomicLong.

        src/main/java/com/bank/account/AccountNumbers.java
        public final class AccountNumbers {
        static final String BANK_CODE = "0001";
        // One counter shared by every account; AtomicLong keeps concurrent increments safe.
        private static final AtomicLong NEXT = new AtomicLong(1);
        private AccountNumbers() {
        }
        static String next() {
        return BANK_CODE + "-" + String.format("%08d", NEXT.getAndIncrement());
        }
        }

        src/main/java/com/bank/account/ Account.java Her hesabın kendi numarası final: bir kez verilir, bir daha değişmez.

        src/main/java/com/bank/account/Account.java
        public final class Account {
        private final String number; // assigned once, never changes
        private BigDecimal balance = BigDecimal.ZERO;
        public Account() {
        this.number = AccountNumbers.next();
        }
        public String number() {
        return number;
        }
        }

        src/main/java/com/bank/account/ Main.java Çıktı yorumlarda.

        src/main/java/com/bank/account/Main.java
        public class Main {
        public static void main(String[] args) {
        System.out.println(new Account().number()); // 0001-00000001
        System.out.println(new Account().number()); // 0001-00000002
        }
        }

        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.

        Hızlı kontrolOrta

        Yoğun saatte bazı kullanıcılar başka birinin adını görüyor. Hatanın kaynağı hangi satır?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        Hatalı satıra dokun, sonra kontrol et.

        WelcomeService.java
        Java 21UTF-8LF

        Kendini sına

        Şimşek turu1/4

        static bir alanın her nesnede ayrı bir kopyası vardır.

        Soru 1/3Başlangıç

        `static` bir alan ne zaman doğru seçimdir?

        Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

        Aklında kalacak üç şey

        1. 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. 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. 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.
        Sonraki kapı İki nesne equals ile eşit, ama HashMap birini koyduğun yerde bulamıyor. Nasıl olur? HashMap, equals ve hashCode · 10 dk

        5 kart sonraki derste seni bekliyor

        0/3 kart bu dersten toplandı

        Bu dersin üstüne kurulanlar

        Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.