JAVA BLOKLAR VE BİRKAÇ MÜLAKAT SORUSU ÖRNEĞİ

Serdar A.
5 min readJul 17, 2022

Java’da methodlar ve yapıcı methodlar (constructors) dışında bir de Initialization Blocks olarak adlandırılan blok alanlar vardır.

Bu bloklarda ikiye ayrılır:

  • Static Initialization Blocks
  • Instance Initialization Blocks

Static Initialization Blocks

Static keyword ile tanımlanan class loader class’ı load ederken çalışan bloklardır

static block

Instance Initialization Blocks

Java compiler kodu compile ederken initializer bloğu her constructor method başlangıcına kopyalar. Böylelikle bütün constructor methodlar aynı initializer bloğu paylaşır, ortak bir blok alanı olur. Ayrıca sub class bu initializer bloğu da kullanma imkanına sahip olur.

instance initialize block

Kısaca özetlersek static bloklar class load edilirken çalışır, instance initialize bloklar constructor’dan önce çalışır, birden fazla constructor method varsa bu bloğu paylaşır.

Tüm bu bilgilerin ışığında birkaç tane mülakat sorusu üzerinden bu bilgilerimizi kullanalım.

Örnek-1

Aşağıdaki kod bloğunda çıktının ne olmasını beklersiniz?

interview-question-1

static blok alanının ilk çalışmasını bekleriz. Bu yüzden ilk çıktımız

Static Initialization Block

Daha sonra main methodunun çalışmasını bekleriz. Bu yüzden ikinci çıktımız

Main Class

Daha sonra ExampleBlocks objesinden 1 tane instance yaratıyoruz. Bu instance yaratılırken beklenen initialize bloğun çalışması. Bu yüzden üçüncü çıktımız

Instance Initialization Block

Daha sonra ExampleBlocks objesinden 1 tane daha instance yaratıyoruz. Bu instance da yaratılırken beklentimiz initialize bloğunun çalışması. Bu yüzden dördüncü çıktımız da

Instance Initialization Block

Örnek-2

Aşağıdaki kod bloğunun çıktısının ne olmasını beklersiniz?

interview-question-2

Kodu incelediğimizde 2 tane static blog, 2 tane initialize blog, 1 tane constructor blog tanımlanmış. Main içerisinde de bu class dan 2 tane instance yaratılmış.

Static bloğun ilk çalışmasını beklediğimiz için ve kodda derlenmeye yukardan aşağıya başladığı için ilk çıktımız

1 — Static Block

İkinci çıktımızın ise

2 — Static Block

Daha sonra main methoduna geldiğimizde öncelikle çıktı olarak

Main Class

yazmasını bekleriz.

Daha sonra main methodunda ExampleBlocks objesinden 1 tane instance yaratıyoruz. Biraz önceki bilgilerimiz ışığında initialize bloklar constructor methodlardan önce çalıştığı için çıktımızın öncelikle instance blok olmasını bekleriz. Ancak 2 tane instance blok var burada. Kodların çalışması yukardan aşağıya doğru olduğu için öncelikle çıktı olarak

1 — Instance Block

Sonra

2 — Instance Block

çıktı olarak üretilmesini bekleriz. Arkasından elbette constructor methodunun çalışacağını bildiğimiz için çıktı olarak

Default Constructor

yazacaktır.

Kritik noktaya geldik. Bu çıktı ins1 nesnesi içindi. Şimdi main methodunda ExampleBlocks nesnesinden 1 tane daha üretildiği için ins2 nesnesi içinde ins1 nesnesindeki tüm süreçler geçerli olacaktır. Buna göre çıktımız sırasıyla

1 — Instance Block

2 — Instance Block

Default Constructor

olacaktır.

Örnek-3

İşin içine biraz da OOP sıkıştıralım :)

Aşağıdaki kod bloğunda çıktının ne olmasını beklersiniz?

İlk başta biraz zor gibi görünse de birlikte inceleyelim.

ExampleBlocks class ımız var. İçinde 1 tane static, 2 tane instance initialize blok ve 1 tane de constructor var.

SubClass1 class ExampleBlocks objesinden türetilmiş. İçerisinde 1 tane static, 1 tane instance initialize ve 1 tane constructor blok tanımlı.

SubClass4 class da SubClass1 objesinden türetilmiş. İçerisinde 1 tane static, 1 tane instance initialize ve 1 tane constructor tanımlı.

SubClass2 class da SubClass1 objesinden türetilmiş. İçerisinde 2 tane static, 2 tane instance initialize ve 2 tane constructor tanımlı.

Main methodumuza geçmeden önce de. Main method tanımlı SubClass2 class ının altında SubClass3 ve ClassNotSub class ımız var. SubClass3 SubClass2 dan türetilmiş ve içinde 1 tane static, 1 tane instance initialize ve 1 tane constructor tanımlı.ClassNotSub herhangi bir kalıtıma uğramamış ve içerisinde 1 tane static ve 1 tane instance initialize blok var

Main methoduna bakarsak da, SubClass2 ye ait main methodunu print eden bir kod bloğu var, SubClass2 class dan 1 tane instance yaratılmış ve arkasından da gene bir print kodu ve SubClass3 ve ClassNotSub class ından birer tane instance yaratılmış.

Gelelim çıktıya

Öncelikle nerden başlıyoruz, tabii ki static bloklardan. Peki parent’tan child’a doğru mu yoksa child’dan parent’a doğru mu? Classloader’a göre önce hangisi load ediliyorsa :)

O zaman buna göre çıktı static bloglar için

1.) ExampleBlocks static init block

1.) SubClass1 static init block

1.) SubClass2 static init block

2.) SubClass2 static init block

SubClass4,SubClass3 ve ClassNotSub class için static bloklar nerede peki? Şu aşamada SubClass4, SubClass3 ve ClassNotSub load edilip, initialize olmadığı için şu an static bloglar çalıştırılmadı.

Daha sonra çıktımıza devam edelim.

1) SubClass2 main method (main method içinde ilk kod bloğu)

Daha sonra (parent nesnenin instance initialize ve constructor blokları)

1.) ExampleBlocks Instance Init Block

2.) ExampleBlocks Instance Init Block

ExampleBlocks — No-Arg Constructor

Daha sonra (SubClass2’nin bir üst parent nesnesi initialize ve constructor blokları)

1.) SubClass1 Instance Init Block

SubClass1 — No-Arg Constructor

Daha sonra (SubClass2 nin instance initialize blokları ve sonra constructor bloğu)

1.) SubClass2 Instance Init Block

2.) SubClass2 Instance Init Block

10

SubClass2 — No-Arg Constructor

Daha sonra

2) SubClass2 main method

Daha sonra

1.) SubClass3 static init block ( SubClass3 load ve initialize ediliyor main method içinde)

Daha sonra

1.) ExampleBlocks Instance Init Block (parent nesne instance init)

2.) ExampleBlocks Instance Init Block (parent nesne instance init)

ExampleBlocks — No-Arg Constructor (parent nesne constructor)

1.) SubClass1 Instance Init Block (parent nesne instance init)

SubClass1 — No-Arg Constructor (parent nesne constructor)

1.) SubClass2 Instance Init Block (parent nesne instance init)

2.) SubClass2 Instance Init Block (parent nesne instance init)

10

SubClass2 — No-Arg Constructor (parent nesne constructor)

Daha sonra SubClass3 instance içerisinde initialize ve constructor blokları

1.) SubClass3 Instance Init Block

SubClass3 — No-Arg Constructor

Daha sonra ClassNotSub nesnesi main method içerisinde load ve init ediliyor

1.) ClassNotSub static init block

2.) ClassNotSub Instance Init Block

Ve bitti.

SubClass4 için static blok çıktısı nerede peki? Kodu incelediğimizde SubClass4 class için bir instance yaratmadık. Bu yüzden bir çıktı da bulunmuyor.

Umarım verdiğim örneklerle konuyu daha iyi anlatabilmişimdir.

İyi günler dilerim.

--

--

Serdar A.
Serdar A.

Written by Serdar A.

Senior Software Developer & Architect at Havelsan Github: https://github.com/serdaralkancode #Java & #Spring & #BigData & #React & #Microservice

No responses yet