Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

Class loading

ClassLoader'lar ve delegation

Class'ları üç temel ClassLoader yükler. Her biri önce sorguyu parent'a verir, parent bulamazsa kendisi arar.

Bu sayede kendi java.lang.String class'ını yazsan da JDK'nınki yüklenir.

Düğmelerle class seç ve sorgunun yolunu izle.

Üç aşama

Class önce yüklenir, sonra link edilir, sonra initialize edilir. Her biri bir kez olur.

Preparation aşamasında static field'lar default değer alır, senin yazdığın değer ise yalnızca Initialization aşamasında gelir.

JVM class'ı ilk gerçek kullanıma kadar initialize etmez.

Static ve constructor sırası

Bu sıra mülakatlarda çok sorulur: önce static kısım, parent'tan child'a. Sonra her new için instance kısmı, yine parent'tan child'a.

Bir class içinde field'lar ve block'lar yazılış sırasıyla çalışır. Constructor gövdesi en sondadır.

Çıktının satır satır nasıl oluştuğunu izle.

Constructor'da virtual method

name "Aysel" olarak yazılmış, ama ilk çıktı name=null.

Parent constructor virtual method çağırır, Java ise child'ın sürümünü seçer. Bu anda child'ın field'ları henüz set edilmemiştir.

Kural: constructor içinde override edilebilir method çağırma.

Initialization ne zaman olur?

Gerçek kullanım gerekir: new, static method, constant olmayan static field.

static final int X = 5 compile-time constant'tır, değer compile sırasında kopyalanır. static final Integer Y ise constant değildir.

Child adıyla parent field'ına erişmek yalnızca parent'ı initialize eder, array oluşturmak hiçbir şeyi etmez.

İki tuzak

Static field'lar satır sırasıyla çalışır. a, c değerini okurken c hâlâ 0'dır, 10 değil.

<clinit> içinde exception olursa class kalıcı olarak bozulur: ilk seferde ExceptionInInitializerError, sonra her seferde NoClassDefFoundError.

İkinci hata asıl nedeni gizler, bu yüzden log'da ilk hatayı ara.