Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

Class loading

ClassLoader-lər və delegation

Class-ları üç əsas ClassLoader yükləyir. Hər biri əvvəl sorğunu parent-ə verir, parent tapmasa, özü axtarır.

Bunun sayəsində öz java.lang.String class-ını yazsan da, JDK-nınkı yüklənir.

Düymələrlə class seç və sorğunun yolunu izlə.

Üç mərhələ

Class əvvəl yüklənir, sonra link olunur, sonra initialize olunur. Hər biri bir dəfə baş verir.

Preparation mərhələsində static field-lər default dəyər alır, sənin yazdığın dəyər isə yalnız Initialization mərhələsində gəlir.

JVM class-ı ilk real istifadəyə qədər initialize etmir.

Static və constructor sırası

Bu sıranı müsahibələrdə çox soruşurlar: əvvəl static hissə, parent-dən child-a. Sonra hər new üçün instance hissəsi, yenə parent-dən child-a.

Bir class daxilində field-lər və bloklar yazılma sırası ilə işləyir. Constructor gövdəsi ən sondadır.

Çıxışın sətir-sətir necə yarandığını izlə.

Constructor-da virtual method

name "Aysel" kimi yazılıb, amma ilk çıxış name=null-dur.

Parent constructor virtual method çağırır, Java isə child-ın versiyasını seçir. Bu anda child-ın field-ləri hələ set olunmayıb.

Qayda: constructor-da override oluna bilən method çağırma.

Initialization nə vaxt olur?

Real istifadə tələb olunur: new, static method, constant olmayan static field.

static final int X = 5 compile-time constant-dır, dəyər compile zamanı köçürülür. static final Integer Y isə constant deyil.

Child adı ilə parent field-inə müraciət yalnız parent-i, array yaratmaq isə heç nəyi initialize etmir.

İki tələ

Static field-lər sətir sırası ilə işləyir. a c-ni oxuyanda c hələ 0-dır, 10 yox.

<clinit>-də exception olsa, class birdəfəlik sıradan çıxır: birinci dəfə ExceptionInInitializerError, sonra hər dəfə NoClassDefFoundError.

İkinci xəta əsl səbəbi gizlədir, ona görə log-da birinci xətanı axtar.